活动介绍

rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo;将这个嵌套的三元运算提取到一个独立的语句中。

时间: 2024-03-21 10:38:12 浏览: 115
可以将嵌套的三元运算提取到一个独立的语句中,如下所示: ```java if (isSubList()) { if (i > 1) { rowNo = rowNo + 1; } else { rowNo = rowNo + i; } } else { rowNo = i + 1 + rownum - startNo; } ``` 这段代码与原来的代码等价,但更易读懂。首先,我们使用了 if 语句替换了三元运算符,使代码更加清晰。其次,我们将嵌套的三元运算符拆分成了两个 if 语句,避免了代码过于复杂的情况。最后,我们为每个分支分别设置了具体的操作,使代码更加直观。
相关问题

public void fillExcelData(int index, Row row) { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); int rowNo = (1 + rownum) - startNo; for (int i = startNo; i < endNo; i++) { rowNo = i > 1 ? rowNo + 1 : rowNo + i; row = sheet.createRow(rowNo); // 得到导出对象. T vo = (T) list.get(i); Collection<?> subList = null; if (isSubListValue(vo)) { subList = getListCellValue(vo); subMergedLastRowNum = subMergedLastRowNum + subList.size(); } int column = 0; for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) { boolean subFirst = false; for (Object obj : subList) { if (subFirst) { rowNo++; row = sheet.createRow(rowNo); } List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); int subIndex = 0; for (Field subField : subFields) { if (subField.isAnnotationPresent(Excel.class)) { subField.setAccessible(true); Excel attr = subField.getAnnotation(Excel.class); this.addCell(attr, row, (T) obj, subField, column + subIndex); } subIndex++; } subFirst = true; } this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); } else { this.addCell(excel, row, vo, field, column++); } } } }对象vo里面有个private List<KeyValue> displayList;怎么按照列导出来

<think>好的,我需要帮助用户解决如何将对象vo中的List<KeyValue> displayList按列导出到Excel的问题。首先,我得仔细阅读用户提供的代码,理解fillExcelData方法的结构和逻辑。 首先,用户的方法fillExcelData负责填充Excel的数据行。它遍历一个列表,并为每个vo对象创建行。在处理每个字段时,如果字段是集合类型且存在子列表,就会处理子列表的数据。当前的代码中,当字段是Collection类型且有subList时,会为每个子项创建新行,并处理子字段。 用户的问题在于,vo中的displayList是一个List<KeyValue>,需要按列导出,而不是默认的按行展开。这意味着每个KeyValue应该作为同一行中的不同列,而不是每个元素占据新的一行。 接下来,我需要分析现有代码的处理逻辑。在处理Collection类型的字段时,当前的代码会遍历subList中的每个元素,并为每个元素创建新的行。例如,如果subList有三个元素,就会创建三行,这显然不符合用户按列导出的需求。 因此,需要调整这部分逻辑,将子列表的元素横向排列到同一行的不同列中,而不是纵向添加行。具体来说,应该遍历subList的每个KeyValue元素,将它们依次添加到同一行的后续列中,而不是创建新行。 需要考虑的关键点包括: 1. 修改遍历subList的方式,避免创建新行。 2. 调整列索引(column)的递增方式,确保每个KeyValue的值写入正确的列位置。 3. 可能需要处理子字段(如KeyValue的键和值)的导出,根据Excel注解配置决定导出的内容。 4. 可能需要调整合并单元格的逻辑,尤其是subMergedFirstRowNum和subMergedLastRowNum的计算,以适应横向展开的情况。 可能的步骤: - 当检测到displayList字段时,不再为每个元素创建新行,而是保持当前行。 - 遍历displayList的每个元素,获取其键或值,并根据Excel注解设置到当前行的不同列中。 - 确保列索引正确递增,避免覆盖已有数据。 - 可能需要调整字段处理顺序,确保其他字段正常处理,displayList的内容横向扩展。 还需要检查现有的addCell方法是否支持横向扩展列,可能需要传递正确的列索引,并在处理完子列表后更新column的值,以便后续字段继续在正确的列位置写入。 此外,用户可能需要为KeyValue类的属性添加Excel注解,以指定导出的内容,例如导出键或值。如果没有注解,可能需要通过反射获取字段值。 最后,测试调整后的代码,确保子列表元素按列导出,且不影响其他字段的正常处理。</think>要解决将`displayList`按列导出到Excel的问题,可以按照以下步骤调整代码: ### 1. 分析当前逻辑 - **原代码行为**:当字段是`Collection`类型时,会为每个子元素创建新行(纵向扩展)。 - **目标需求**:将`displayList`中的每个`KeyValue`元素横向排列到同一行的不同列中。 ### 2. 修改字段处理逻辑 在遍历`fields`的循环中,找到处理`displayList`的部分,调整遍历方式: ```java // 原代码(纵向扩展) for (Object obj : subList) { if (subFirst) { rowNo++; row = sheet.createRow(rowNo); } // 处理子字段... } // 修改后(横向扩展) for (Object obj : subList) { List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); for (Field subField : subFields) { if (subField.isAnnotationPresent(Excel.class)) { subField.setAccessible(true); Excel attr = subField.getAnnotation(Excel.class); this.addCell(attr, row, (T) obj, subField, column++); // 列递增 } } } ``` ### 3. 关键调整点 - **禁止创建新行**:移除`rowNo++`和`createRow`逻辑,确保所有数据写入同一行。 - **横向扩展列**:通过`column++`将每个子元素的值依次填入后续列。 - **处理字段注解**:确保`KeyValue`类的字段(如`key`和`value`)标记了`@Excel`注解。 ### 4. 完整修改后的代码段 ```java // 修改后的字段处理逻辑 int column = 0; for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; if (field.getName().equals("displayList") && Collection.class.isAssignableFrom(field.getType())) { // 处理displayList横向导出 if (StringUtils.isNotNull(subList)) { for (Object obj : subList) { List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); for (Field subField : subFields) { if (subField.isAnnotationPresent(Excel.class)) { subField.setAccessible(true); Excel attr = subField.getAnnotation(Excel.class); this.addCell(attr, row, (T) obj, subField, column++); } } } } } else { // 正常处理其他字段 this.addCell(excel, row, vo, field, column++); } } ``` ### 5. 补充说明 - **@Excel注解配置**:确保`KeyValue`类中的字段(如`key`和`value`)有`@Excel`注解,例如: ```java public class KeyValue { @Excel(name = "键") private String key; @Excel(name = "值") private String value; } ``` - **列索引管理**:通过`column++`确保每个子元素写入独立列,避免覆盖。 - **合并单元格调整**:如果原逻辑有合并操作,需移除或修改与行合并相关的代码(如`subMergedLastRowNum`)。 ### 6. 最终效果 假设`displayList`包含两个`KeyValue`元素: - **原始导出**:生成两行数据。 - **调整后导出**:在同一行中生成四列(假设每个`KeyValue`导出`key`和`value`两列)。 | 其他字段 | key1 | value1 | key2 | value2 | |----------|------|--------|------|--------| | ... | 键1 | 值1 | 键2 | 值2 | 通过以上调整,即可实现集合字段按列横向导出。

用这个方法改造public void fillExcelData(int index, Row row) { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); int rowNo = (1 + rownum) - startNo; for (int i = startNo; i < endNo; i++) { rowNo = i > 1 ? rowNo + 1 : rowNo + i; row = sheet.createRow(rowNo); // 得到导出对象. T vo = (T) list.get(i); Collection<?> subList = null; if (isSubListValue(vo)) { subList = getListCellValue(vo); subMergedLastRowNum = subMergedLastRowNum + subList.size(); } int column = 0; for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) { boolean subFirst = false; for (Object obj : subList) { if (subFirst) { rowNo++; row = sheet.createRow(rowNo); } List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); int subIndex = 0; for (Field subField : subFields) { if (subField.isAnnotationPresent(Excel.class)) { subField.setAccessible(true); Excel attr = subField.getAnnotation(Excel.class); this.addCell(attr, row, (T) obj, subField, column + subIndex); } subIndex++; } subFirst = true; } this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); } else { this.addCell(excel, row, vo, field, column++); } } }}需要导出拿到list中的对象数据是AlarmData(id=77, hiveKey=1671649, errField=, general=, specialtyId=13, specialtyName=配电专业, sysName=能源互联网营销服务系统, ruleId=226, ruleName=档案信息-配电-变压器挂接到多条线路, monitorType=准确性, areaName=兰州, areaCode=27010000, countyName=城关供电服务中心, countyCode=00000000000006240108, powerstationName=中央广场营业班, powerstationCode=624010805, manageOwnerName=null, manageOwnerisc=null, manageOwnerTel=, businessOwnerName=, businessOwnerisc=, businessOwnerTel=, productionOwnerName=温金梅,常达, productionOwnerisc=90004880,90001923, productionOwnerTel=2025-03-17 16:08:17, ownerName=null, ownerisc=null, ownerTel=null, finishTime=, verifyPassTime=, verifyStatus=2, isRectify=null, isVerify=1, orderId=875, whiteListId=, applyStatus=, issuanceOwnerisc=90001923, issuanceOwnerName=常达, issuanceOwnerTel=null, isToOwner=0, createTime=2024-09-29 10:15:04, verifyTime=, updateTime=2024-09-29 10:15:04, displayList=[KeyValue(key=管理单位, value=624010805), KeyValue(key=设备标识, value=1671649), KeyValue(key=设备名称, value= 白银路箱变1#箱变 配电变压器), KeyValue(key=线路数量, value=2)], checkInfo=null, isHaveOwner=null)

<think>好的,我现在需要分析用户提供的Java方法`fillExcelData`,并理解其如何将包含`AlarmData`对象的列表导出到Excel中。用户希望改造这个方法,可能想优化导出逻辑或处理数据结构中的嵌套集合。 首先,我会通读代码,理解现有逻辑。这个方法似乎负责根据给定的`index`和`row`来填充Excel数据。主要步骤包括计算数据范围、遍历列表、处理普通字段和集合类型的子列表。 注意到当字段是`Collection`类型时,代码会处理子列表,为每个子对象创建新行,并递归处理子字段。例如,`displayList`在`AlarmData`中是一个包含`KeyValue`对象的列表,这可能需要展开为多行。 接下来,我需要考虑用户可能的改造需求。可能的问题包括:子列表处理不够高效、样式问题、合并单元格未处理,或者字段顺序不符合预期。此外,现有的`subMergedFirstRowNum`和`subMergedLastRowNum`可能用于合并单元格,但需要确认是否正确维护。 针对`AlarmData`中的`displayList`,当前代码可能将每个`KeyValue`的键和值作为单独的列处理。但用户可能希望将键作为列头,值填充在对应列下,或者横向展开。需要检查`addCell`方法如何处理子字段,确保`KeyValue`的`key`和`value`正确映射到Excel单元格。 此外,可能存在性能问题,每次创建新行都会增加开销,特别是在数据量大时。可能需要优化循环结构,减少不必要的行创建操作。 另一个考虑点是异常处理,例如子列表为空或字段访问权限问题,可能需要增加空值检查或异常捕获,避免导出过程中断。 最后,用户提供的`AlarmData`实例中有多个字段,需要确认所有字段都被正确导出,尤其是嵌套结构。可能需要调整字段遍历顺序,确保列的顺序符合用户期望,或通过`Excel`注解的配置来控制导出的列顺序和标题。 总结改造点可能包括:优化子列表处理逻辑、添加合并单元格支持、调整列的顺序和标题、增强异常处理,以及提高导出性能。需要根据用户的具体需求进一步调整实现细节。</think>针对你提供的`fillExcelData`方法及`AlarmData`数据结构,以下是分步解析及改造建议: --- ### 一、原方法功能分析 1. **核心目标**:将`List<T>`中的对象数据导出到Excel行,支持**嵌套集合字段**(如`displayList`)。 2. **关键逻辑**: - **分页处理**:通过`index * sheetSize`实现分页导出。 - **子列表展开**:若字段是`Collection`类型(如`displayList`),遍历子对象并逐行填充。 - **动态列生成**:通过反射读取字段上的`@Excel`注解,动态生成Excel列。 --- ### 二、现存问题诊断 1. **子列表合并问题**: - `subMergedFirstRowNum`和`subMergedLastRowNum`未用于合并单元格,导致子数据分散在多行但未合并父列。 2. **字段顺序混乱**: - 主对象和子对象的列生成顺序依赖反射遍历字段的顺序,可能与`@Excel`注解中定义的`order`属性不匹配。 3. **空值风险**: - `getListCellValue(vo)`未判空,若子列表为`null`会导致`NullPointerException`。 4. **性能问题**: - 频繁调用`sheet.createRow(rowNo)`和反射操作可能影响导出速度。 --- ### 三、改造方案 #### 1. 增强合并单元格支持 ```java // 在填充子列表前记录起始行号 int subStartRow = rowNo; for (Object obj : subList) { // ...填充子列数据... } // 合并父列 if (subList.size() > 1) { sheet.addMergedRegion(new CellRangeAddress( subStartRow, subStartRow + subList.size() - 1, column, column)); } ``` #### 2. 按注解顺序生成列 ```java // 修改字段遍历逻辑,按@Excel的order排序 List<Field> fields = FieldUtils.getFieldsListWithAnnotation(vo.getClass(), Excel.class) .stream() .sorted(Comparator.comparingInt(f -> f.getAnnotation(Excel.class).order())) .collect(Collectors.toList()); ``` #### 3. 增加空值保护 ```java Collection<?> subList = getListCellValue(vo); if (CollectionUtils.isEmpty(subList)) { subList = Collections.singletonList(new Object()); // 填充空行占位 } ``` #### 4. 性能优化 ```java // 使用缓存避免重复反射 Map<Class<?>, List<Field>> fieldCache = new ConcurrentHashMap<>(); List<Field> subFields = fieldCache.computeIfAbsent(obj.getClass(), clz -> FieldUtils.getFieldsListWithAnnotation(clz, Excel.class)); ``` --- ### 四、针对AlarmData的特殊处理 1. **处理`displayList`字段**: ```java // 假设KeyValue对象包含key和value字段 for (KeyValue kv : (List<KeyValue>) subList) { addCell(attr, row, kv.getKey(), column); addCell(attr, row, kv.getValue(), column + 1); } ``` 2. **定制化列标题**: - 在`@Excel`注解中定义`name`属性,如: ```java @Excel(name = "管理单位", order = 1) private String hiveKey; ``` --- ### 五、改造后代码结构 ```java public void fillExcelData(int index, Row row) { // ...分页计算逻辑不变... for (int i = startNo; i < endNo; i++) { T vo = (T) list.get(i); Collection<?> subList = getSubListWithFallback(vo); // 含空值保护 if (isSubListValue(vo)) { handleSubList(row, subList, vo); // 含合并单元格逻辑 } else { handleMainFields(row, vo); // 按注解顺序填充 } } } ``` --- ### 六、验证要点 1. **合并单元格**:检查父列(如`productionOwnerName`)在子列表展开后是否正确合并。 2. **列顺序**:确认导出的列顺序与`@Excel(order = N)`定义一致。 3. **性能测试**:使用1000+数据量测试导出时间,确保无OOM或超时。 通过以上改造,可显著提升导出功能的健壮性和可维护性。是否需要进一步优化特定细节?
阅读全文

相关推荐

逐句写出意思// free storage among all the heavy container blocks if(tacticalStackingPolicy==1){ //进出口箱分堆策略,分开堆存还是一起堆存。这里是分开堆存 Block block=null; int NO_PER_ZONE=NO_GROUPS_PER_SHIP/(zoneNO/2);//需要有多少个组,放在哪个箱区 int startGroupNO=NO_GROUPS_PER_SHIP*task.shipID;//集装箱所在的这个组的起始 //放在哪个箱区 int zone_ID=(int) (task.containerGroup%NO_GROUPS_PER_SHIP)/NO_PER_ZONE;// calculate the index of qc that will be assigned task.zoneID=zone_ID; ArrayList<int[]> groupStacks=new ArrayList<int[]>(); ArrayList<int[]> groupEmptyStacks=new ArrayList<int[]>(); ArrayList<int[]> groupEmptyStacks_1=new ArrayList<int[]>(); ArrayList<int[]> groupStacks_1=new ArrayList<int[]>(); ArrayList<int[]> groupStacks_2=new ArrayList<int[]>(); int[] gS=new int[3]; //上面,选取集合 // record the current selected groupStack //空箱混堆, 重箱按group堆 // heavy export container storage allocation // all incomplete group stacks container of Certain group //20'先判断同组 if(task.containerSize==1){ //(task.containerSize==1)20 if(task.shipID%4<=1){//属于01泊位,可以停靠到后方的泊位上 for(int b=(dispersionRate==0?task.shipID%4:0); b<=(dispersionRate==0?task.shipID%4:dispersionRate); b++){ //分散度是否为0,判断箱区可以放在01两个,还是只能放在1个箱区 block=blocks.get(zone_ID*blockNO+b); for( int j=0;j<bayNO;j++){ for(int k=0;k<rowNO;k++){ int[] GS={b,j,k};//数组说明箱位就是几 if (block.groupStack[j][k]==task.containerGroup //箱位是否空,是不是一类 && block.groupStackSize[j][k]<tierNO)//判断箱子数是否满 groupStacks.add(groupStacks.size(),GS);//有箱子堆,但是是否堆满 if (block.groupStack[j][k]==-1) {//判断为空的箱位 if(j%2==0 && block.groupStack[j+1][k]==-1 ||j%2==1 && block.groupStack[j-1][k]==-1 ){ groupEmptyStacks.add(groupEmptyStacks.size(),GS); //相邻的箱子,区分4020英尺集装箱同一个40贝位的2个20贝位均为空 } else { groupEmptyStacks_1.add(groupEmptyStacks_1.size(),GS); } } } } } } else{ for(int b=(dispersionRate==0?task.shipID%4:3-dispersionRate); b<=(dispersionRate==0?task.shipID%4:3); b++){ block=blocks.get(zone_ID*blockNO+b); for( int j=0;j<bayNO;j++){ for(int k=0;k<rowNO;k++){ int[] GS={b,j,k}; if (block.groupStack[j][k]==task.containerGroup && block.groupStackSize[j][k]<tierNO) groupStacks.add(groupStacks.size(),GS); if (block.groupStack[j][k]==-1) { if(j%2==0 && block.groupStack[j+1][k]==-1 ||j%2==1 && block.groupStack[j-1][k]==-1 ){ groupEmptyStacks.add(groupEmptyStacks.size(),GS); //同一个40贝位的2个20贝位均为空 } else { groupEmptyStacks_1.add(groupEmptyStacks_1.size(),GS); } } } } } } // if there are more than one stacks with certain group and not full //randomly select one stack that is not full as the storage location if (groupStacks.size()>0) { gS=groupStacks.get(0); task.blockID=gS[0]; task.bayID=gS[1]; task.rowID=gS[2]; task.tierID=blocks.get(zone_ID*blockNO+gS[0]).groupStackSize[gS[1]][gS[2]];//决定堆在第几层 task.locationFound=1;//为了验证是否找到箱位,设置一个数 blocks.get(zone_ID*blockNO+gS[0]).groupStackSize[gS[1]][gS[2]]++; } // if (groupStacks.size()>0) { ends // if there is no incomplete stacks with certain group else if(groupStacks.size()==0) { if (groupEmptyStacks_1.size()>0){ gS= randomFrom(groupEmptyStacks_1); } else { gS= randomFrom(groupEmptyStacks); } task.blockID=gS[0]; task.bayID=gS[1]; task.rowID=gS[2]; task.tierID=blocks.get(zone_ID*blockNO+gS[0]).groupStackSize[gS[1]][gS[2]]; task.locationFound=1; blocks.get(zone_ID*blockNO+gS[0]).groupStackSize[gS[1]][gS[2]]++; blocks.get(zone_ID*blockNO+gS[0]).groupStack[gS[1]][gS[2]]=task.containerGroup;//空想位被用掉了 } // else if(groupStacks.size()==0) { ends // if there are stacks with certain group but all these stacks are full // or the YC serving the certain group stack is overloading } //40' else { if(task.shipID%4<=1){ for(int b=(dispersionRate==0?task.shipID%4:0);b<=(dispersionRate==0?task.shipID%4:dispersionRate);b++){ block=blocks.get(zone_ID*blockNO+b); for( int j=0;j<bayNO;j=j+2){//跳两个 for(int k=0;k<rowNO;k++){ int[] GS={b,j,k}; if (block.groupStack[j][k]==task.containerGroup && block.groupStackSize[j][k]<tierNO) groupStacks.add(groupStacks.size(),GS); if (block.groupStack[j][k]==-1 && j+1<bayNO && block.groupStack[j+1][k]==-1 ) groupEmptyStacks.add(groupEmptyStacks.size(),GS); } }

你帮我看一下,建立场桥的部分有什么问题? Color color=Color.black; Color colorFill=null; ShapeRectangle rect=null; double xB=baseX; double yB=baseY; berthLength=(300*berthNO+30*(berthNO+1))/berthNO; blockLength=(300*berthNO+30*(berthNO+1)-verticalLaneWidth*(blockNO+1))/blockNO; double wB=verticalLaneWidth*(blockNO+1)+blockLength*blockNO; double hB=seasideLaneWidth+zoneNO*(blockWidth+horizontalLaneWidth)+gatesideLaneWidth*4; traceln("berthLength="+berthLength+",blockLength="+blockLength); rect=new ShapeRectangle(SHAPE_DRAW_2D3D,true,xB,yB,0,0,color,colorFill,wB,hB,0,1,LINE_STYLE_SOLID); presentation.add(rect); //构建路网 //标出路网坐标点 roadNetwork=new Network(this,"roadNetwork",SHAPE_DRAW_2D3D,0); double x=0; double y=0; double z=0; for(int j=0;j<(blockNO+1)*2;j++){ x=baseX+verticalLaneWidth/4+verticalLaneWidth/2*(j%2)+(verticalLaneWidth+blockLength)*(j/2); //traceln("j="+j+",x="+x); for(int i=0;i<zoneNO*2+5;i++){ if(i==0){ y=baseY+3.5+QCRailWidth/2; } else if(i==1){ y=baseY+seasideLaneWidth-seasideLaneWidth*3/16; } else if(i==2){ y=baseY+seasideLaneWidth-seasideLaneWidth*1/16; } else if(i>=3&&i<=22){ y=baseY+seasideLaneWidth+blockWidth+((i-3)/4)*(2*blockWidth+4)+ (i-2)*(horizontalLaneWidth/4)-(horizontalLaneWidth/8); } else if(i==23){ y=baseY+seasideLaneWidth+zoneNO*blockWidth+5*horizontalLaneWidth+4*4+(gatesideLaneWidth*1/4); } else if(i==24){ y=baseY+seasideLaneWidth+zoneNO*blockWidth+5*horizontalLaneWidth+4*4+(gatesideLaneWidth*3/4); } // traceln("i="+i+",y="+y); roadNode[i][j]=new PointNode(this,SHAPE_DRAW_2D3D,true,x,y,z); roadNetwork.add(roadNode[i][j]); } } //构建路网 //链接横向道路 for(int i=0;i<zoneNO*2+5;i++){ MarkupSegmentLine segH=null; Path pathH=null; if (i==0){ for(int j=0;j<(blockNO+1)*2-1;j++){ segH=new MarkupSegmentLine( roadNode[i][j+1].getX(),roadNode[i][j+1].getY(),roadNode[i][j+1].getZ(), roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, QCRailWidth/2,roadNode[i][j+1],roadNode[i][j],segH); roadNetwork.add(pathH); presentation.add(pathH); } } else if(i==1){ for(int j=0;j<(blockNO+1)*2-1;j++){ segH=new MarkupSegmentLine( roadNode[i][j+1].getX(),roadNode[i][j+1].getY(),roadNode[i][j+1].getZ(), roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, seasideLaneWidth/8,roadNode[i][j+1],roadNode[i][j],segH); roadNetwork.add(pathH); presentation.add(pathH); } } else if(i==2){ for(int j=0;j<(blockNO+1)*2-1;j++){ segH=new MarkupSegmentLine( roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ(), roadNode[i][j+1].getX(),roadNode[i][j+1].getY(),roadNode[i][j+1].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, seasideLaneWidth/8,roadNode[i][j+1],roadNode[i][j],segH); roadNetwork.add(pathH); presentation.add(pathH); } } else if(i>=3&&i<=22){ for(int j=0;j<(blockNO+1)*2-1;j++){ segH=new MarkupSegmentLine( roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ(), roadNode[i][j+1].getX(),roadNode[i][j+1].getY(),roadNode[i][j+1].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, horizontalLaneWidth/4,roadNode[i][j],roadNode[i][j+1],segH); roadNetwork.add(pathH); presentation.add(pathH); } } else if(i==23){ for(int j=0;j<(blockNO+1)*2-1;j++){ segH=new MarkupSegmentLine( roadNode[i][j+1].getX(),roadNode[i][j+1].getY(),roadNode[i][j+1].getZ(), roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, gatesideLaneWidth/2,roadNode[i][j+1],roadNode[i][j],segH); roadNetwork.add(pathH); presentation.add(pathH); } } else if(i==24){ for(int j=0;j<(blockNO+1)*2-1;j++){ segH=new MarkupSegmentLine( roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ(), roadNode[i][j+1].getX(),roadNode[i][j+1].getY(),roadNode[i][j+1].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, gatesideLaneWidth/2,roadNode[i][j],roadNode[i][j+1],segH); roadNetwork.add(pathH); presentation.add(pathH); } } } //构建路网 //链接竖向道路 for(int j=0;j<(blockNO+1)*2;j++){ MarkupSegmentLine segH=null; Path pathH=null; if (j%2==0){ for(int i=0;i<zoneNO*2+5-1;i++){ segH=new MarkupSegmentLine( roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ(), roadNode[i+1][j].getX(),roadNode[i+1][j].getY(),roadNode[i+1][j].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, verticalLaneWidth/2,roadNode[i][j],roadNode[i+1][j],segH); roadNetwork.add(pathH); presentation.add(pathH); } } else if (j%2==1){ for(int i=0;i<zoneNO*2+5-1;i++){ segH=new MarkupSegmentLine( roadNode[i+1][j].getX(),roadNode[i+1][j].getY(),roadNode[i+1][j].getZ(), roadNode[i][j].getX(),roadNode[i][j].getY(),roadNode[i][j].getZ()); pathH=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue, verticalLaneWidth/2,roadNode[i+1][j],roadNode[i][j],segH); roadNetwork.add(pathH); presentation.add(pathH); } } } //!!!岸桥 //构建岸桥节点坐标 berthLength=(300*berthNO+30*(berthNO+1))/berthNO; y=baseY+3.5+QCRailWidth/2; seasideTruckHandlingNode=new PointNode[berthNO][maxQCPerShip]; for(int i=0;i<berthNO;i++){ for(int j=0;j<maxQCPerShip;j++){ x=baseX+berthLength/8*(j+1)+berthLength*i;; seasideTruckHandlingNode[i][j]=new PointNode(this,SHAPE_DRAW_2D3D,true,x,y,0); roadNetwork.add(seasideTruckHandlingNode[i][j]); //presentation.add(seasideTruckHandlingNode[i][j]); } } //构建岸桥道路节点坐标 for(int i=0;i<berthNO;i++){ for(int j=0;j<maxQCPerShip-1;j++){ MarkupSegmentLine lineA=null; Path pathSeaSide=null; lineA=new MarkupSegmentLine( seasideTruckHandlingNode[i][j+1].getX(),seasideTruckHandlingNode[i][j+1].getY(),seasideTruckHandlingNode[i][j+1].getZ(), seasideTruckHandlingNode[i][j].getX(),seasideTruckHandlingNode[i][j].getY(),seasideTruckHandlingNode[i][j].getZ()); pathSeaSide=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.pink,1, seasideTruckHandlingNode[i][j+1],seasideTruckHandlingNode[i][j],lineA); //presentation.add(pathSeaSide); roadNetwork.add(pathSeaSide); } //链接左侧道路 Path pathLink=null; MarkupSegmentLine lineB=null; lineB=new MarkupSegmentLine( seasideTruckHandlingNode[i][0].getX(),seasideTruckHandlingNode[i][0].getY(),seasideTruckHandlingNode[i][0].getZ(), roadNode[0][2*i+1].getX(),roadNode[0][2*i+1].getY(),roadNode[0][2*i+1].getZ()); pathLink=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_DASHEDLINE,Color.pink,1, seasideTruckHandlingNode[i][0],roadNode[0][2*i+1],lineB); //presentation.add(pathLink); roadNetwork.add(pathLink); //链接右侧道路 lineB=new MarkupSegmentLine( roadNode[0][2*i+2].getX(),roadNode[0][2*i+2].getY(),roadNode[0][2*i+2].getZ(), seasideTruckHandlingNode[i][maxQCPerShip-1].getX(),seasideTruckHandlingNode[i][maxQCPerShip-1].getY(),seasideTruckHandlingNode[i][maxQCPerShip-1].getZ()); pathLink=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_DASHEDLINE,Color.pink,1, roadNode[0][2*i+2],seasideTruckHandlingNode[i][maxQCPerShip-1],lineB); //presentation.add(pathLink); roadNetwork.add(pathLink); } //构建装卸起升点坐标 PointNode[][] seasideTruckHandlingUpNode=new PointNode[berthNO][maxQCPerShip]; y=baseY+3.5+QCRailWidth/2; z=QCLiftHeight; for(int i=0;i<berthNO;i++){ for(int j=0;j<maxQCPerShip;j++){ x=baseX+berthLength/8*(j+1)+berthLength*i; seasideTruckHandlingUpNode[i][j]=new PointNode(this,SHAPE_DRAW_2D3D,true,x,y,z); //traceln("i="+i+",y="+y); //traceln("i="+i+",z="+z); roadNetwork.add(seasideTruckHandlingUpNode[i][j]); //presentation.add(seasideTruckHandlingUpNode[i][j]); } } //链接岸侧装卸起升点坐标 for(int i=0;i<berthNO;i++){ MarkupSegmentLine lineC=null; Path pathLineC=null; for(int j=0;j<maxQCPerShip;j++){ lineC=new MarkupSegmentLine( seasideTruckHandlingUpNode[i][j].getX(),seasideTruckHandlingUpNode[i][j].getY(),seasideTruckHandlingUpNode[i][j].getZ(), seasideTruckHandlingNode[i][j].getX(),seasideTruckHandlingNode[i][j].getY(),seasideTruckHandlingNode[i][j].getZ()); pathLineC=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.red,1, seasideTruckHandlingUpNode[i][j],seasideTruckHandlingNode[i][j],lineC); roadNetwork.add(pathLineC); //presentation.add(pathLineC); } } //构建船上节点坐标 y=baseY+3.5+QCRailWidth/2-40; z=QCLiftHeight; shipHandlingNode=new PointNode[berthNO][maxQCPerShip]; for(int i=0;i<berthNO;i++){ for(int j=0;j<maxQCPerShip;j++){ x=baseX+berthLength/8*(j+1)+berthLength*i; shipHandlingNode[i][j]=new PointNode(this,SHAPE_DRAW_2D3D,true,x,y,0); //traceln("i="+i+",y="+y); roadNetwork.add(shipHandlingNode[i][j]); //presentation.add(shipHandlingNode[i][j]); } } //构建海侧装卸起升点 PointNode[][] shipHandlingUpNode=new PointNode[berthNO][maxQCPerShip]; for(int i=0;i<berthNO;i++){ for(int j=0;j<maxQCPerShip;j++){ x=baseX+berthLength/8*(j+1)+berthLength*i; shipHandlingUpNode[i][j]=new PointNode(this,SHAPE_DRAW_2D3D,true,x,y,z); //traceln("i="+i+",y="+y); //traceln("i="+i+",z="+z); roadNetwork.add(shipHandlingUpNode[i][j]); //presentation.add(shipHandlingUpNode[i][j]); } } //链接船上节点与海侧装卸起升点 for(int i=0;i<berthNO;i++){ MarkupSegmentLine lineD=null; Path pathLineD=null; for(int j=0;j<maxQCPerShip;j++){ lineD=new MarkupSegmentLine( shipHandlingUpNode[i][j].getX(),shipHandlingUpNode[i][j].getY(),shipHandlingUpNode[i][j].getZ(), shipHandlingNode[i][j].getX(),shipHandlingNode[i][j].getY(),shipHandlingNode[i][j].getZ()); pathLineD=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.pink,1, shipHandlingUpNode[i][j],shipHandlingNode[i][j],lineD); roadNetwork.add(pathLineD); //presentation.add(pathLineD); } } //链接海侧和陆侧装卸起升点 for(int i=0;i<berthNO;i++){ MarkupSegmentLine lineE=null; Path pathLineE=null; for(int j=0;j<maxQCPerShip;j++){ lineE=new MarkupSegmentLine( shipHandlingUpNode[i][j].getX(),shipHandlingUpNode[i][j].getY(),shipHandlingUpNode[i][j].getZ(), seasideTruckHandlingUpNode[i][j].getX(),seasideTruckHandlingUpNode[i][j].getY(),seasideTruckHandlingUpNode[i][j].getZ()); pathLineE=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.blue,1, shipHandlingUpNode[i][j],seasideTruckHandlingUpNode[i][j],lineE); roadNetwork.add(pathLineE); // presentation.add(pathLineE); } } //添加岸桥 QCInitialSlot=new PointNode[berthNO][maxQCPerShip]; for(int i=0;i<berthNO;i++){ for(int j=0;j<maxQCPerShip;j++){ QCInitialSlot[i][j]=seasideTruckHandlingNode[i][j]; } } //!!!堆场 //构建堆场坐标 double x1=0; double y1=0; double y2=0; double z1=0; double z2=4.5*containerHeight; yardInterNode=new PointNode[zoneNO][blockNO][bayNO][rowNO][tierNO+1];//调用 yardHandlingNode=new PointNode[zoneNO][blockNO][bayNO]; PointNode[][][][]yardInterUpNode=new PointNode[zoneNO][blockNO][bayNO][rowNO];//定义新的 PointNode[][][]yardHandlingUpNode=new PointNode[zoneNO][blockNO][bayNO]; for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ for(int m=0;m<rowNO;m++){ for(int n=0;n<tierNO+1;n++){ x1=baseX+verticalLaneWidth+containerLength/2+(verticalLaneWidth+blockLength)*j +(containerLength+gapBetweenContainers)*k; z1=containerHeight/2+n*containerHeight; if(i%2==0){ y1=baseY+seasideLaneWidth+(2*blockWidth+horizontalLaneWidth*5/4)*(i/2) +containerWidth/2+(containerWidth+gapBetweenContainers)*m; } else{ y1=baseY+seasideLaneWidth+blockWidth+horizontalLaneWidth +(2*blockWidth+horizontalLaneWidth*5/4)*((i-1)/2) +containerWidth/2+(containerWidth+gapBetweenContainers)*m; } yardInterNode[i][j][k][m][n]=new PointNode(this,SHAPE_DRAW_2D3D,true,x1,y1,z1); yardInterUpNode[i][j][k][m]=new PointNode(this,SHAPE_DRAW_2D3D,true,x1,y1,z2); roadNetwork.add(yardInterNode[i][j][k][m][n]); //presentation.add(yardInterNode[i][j][k][m][n]); roadNetwork.add(yardInterUpNode[i][j][k][m]); //presentation.add(yardInterUpNode[i][j][k][m]); //traceln("x="+x1+",y="+y1); } } } } } //构建集卡坐标与起升点坐标 for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ x1=baseX+verticalLaneWidth+containerLength/2+(verticalLaneWidth+blockLength)*j +(containerLength+gapBetweenContainers)*k; if (i%2==0) { y2=baseY+seasideLaneWidth+blockWidth+(blockWidth*2+horizontalLaneWidth*5/4)*(i/2) +horizontalLaneWidth/8; } else { y2=baseY+seasideLaneWidth+blockWidth+horizontalLaneWidth+ (blockWidth*2+horizontalLaneWidth*5/4)*((i-1)/2)-horizontalLaneWidth/8; } yardHandlingNode[i][j][k]=new PointNode(this,SHAPE_DRAW_2D3D,true,x1,y2,0); yardHandlingUpNode[i][j][k]=new PointNode(this,SHAPE_DRAW_2D3D,true,x1,y2,z2); roadNetwork.add(yardHandlingNode[i][j][k]); //presentation.add(yardHandlingNode[i][j][k]); roadNetwork.add(yardHandlingUpNode[i][j][k]); //presentation.add(yardHandlingUpNode[i][j][k]); } } } //链接集装箱坐标点与其正上方的起升点 for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ for(int m=0;m<rowNO;m++){ for(int n=0;n<tierNO;n++){ MarkupSegmentLine segH1=null; Path pathContainerside=null; segH1=new MarkupSegmentLine( yardInterNode[i][j][k][m][n].getX(),yardInterNode[i][j][k][m][n].getY(),yardInterNode[i][j][k][m][n].getZ(), yardInterNode[i][j][k][m][tierNO].getX(),yardInterNode[i][j][k][m][tierNO].getY(),yardInterNode[i][j][k][m][tierNO].getZ() ); pathContainerside=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.blue,1, yardInterNode[i][j][k][m][n],yardInterNode[i][j][k][m][tierNO],segH1); roadNetwork.add(pathContainerside); //presentation.add(pathContainerside); } } } } } //链接集卡坐标点与其起升点 for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ MarkupSegmentLine segH2=null; Path pathYardside=null; segH2=new MarkupSegmentLine( yardHandlingUpNode[i][j][k].getX(),yardHandlingUpNode[i][j][k].getY(),yardHandlingUpNode[i][j][k].getZ(), yardHandlingNode[i][j][k].getX(),yardHandlingNode[i][j][k].getY(),yardHandlingNode[i][j][k].getZ() ); pathYardside=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.blue,1, yardHandlingNode[i][j][k],yardHandlingUpNode[i][j][k],segH2); roadNetwork.add(pathYardside); //presentation.add(pathYardside); } } } //链接路上场桥起升点(最高点)和集装箱堆场正上方场桥的起升点(最高点) for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ for(int m=0;m<rowNO;m++){ MarkupSegmentLine segH3=null; Path pathYard=null; segH3=new MarkupSegmentLine( yardInterNode[i][j][k][m][tierNO].getX(),yardInterNode[i][j][k][m][tierNO].getY(),yardInterNode[i][j][k][m][tierNO].getZ(), yardHandlingUpNode[i][j][k].getX(),yardHandlingUpNode[i][j][k].getY(),yardHandlingUpNode[i][j][k].getZ() ); pathYard=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.blue,1, yardInterNode[i][j][k][m][tierNO],yardHandlingUpNode[i][j][k],segH3); //presentation.add(pathYard); roadNetwork.add(pathYard); } } } } //添加场桥 YCInitialSlot=new PointNode[zoneNO][blockNO][bayNO]; for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ YCInitialSlot[i][j][k]=yardHandingNode[i][j][k]; } } } //链接集卡坐标点和道路节点 for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ if(i%2==0){ Path pathLinkT=null; MarkupSegmentLine lineT=null; lineT=new MarkupSegmentLine( yardHandlingNode[i][j][0].getX(),yardHandlingNode[i][j][0].getY(),yardHandlingNode[i][j][0].getZ(), roadNode[i*2+5-2][2*j+1].getX(),roadNode[i*2+5-2][2*j+1].getY(),roadNode[i*2+5-2][2*j+1].getZ() ); pathLinkT=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.green,1, yardHandlingNode[i][j][0],roadNode[i*2+5-2][2*j+1],lineT); //presentation.add(pathLinkT); roadNetwork.add(pathLinkT); } else{ Path pathLinkT=null; MarkupSegmentLine lineT=null; lineT=new MarkupSegmentLine( yardHandlingNode[i][j][0].getX(),yardHandlingNode[i][j][0].getY(),yardHandlingNode[i][j][0].getZ(), roadNode[i*2+5-1][2*j+1].getX(),roadNode[i*2+5-1][2*j+1].getY(),roadNode[i*2+5-1][2*j+1].getZ() ); pathLinkT=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.green,1, yardHandlingNode[i][j][0],roadNode[i*2+5-1][2*j+1],lineT); //presentation.add(pathLinkT); roadNetwork.add(pathLinkT); } if(i%2==0){ Path pathLinkS=null; MarkupSegmentLine lineS=null; lineS=new MarkupSegmentLine( yardHandlingNode[i][j][0].getX(),yardHandlingNode[i][j][0].getY(),yardHandlingNode[i][j][0].getZ(), roadNode[i*2+5-2][2*j+2].getX(),roadNode[i*2+5-2][2*j+2].getY(),roadNode[i*2+5-2][2*j+2].getZ()); pathLinkS=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.green,1, yardHandlingNode[i][j][0],roadNode[i*2+5-2][2*j+2],lineS); //presentation.add(pathLinkS); roadNetwork.add(pathLinkS); } else{ Path pathLinkS=null; MarkupSegmentLine lineS=null; lineS=new MarkupSegmentLine( yardHandlingNode[i][j][0].getX(),yardHandlingNode[i][j][0].getY(),yardHandlingNode[i][j][0].getZ(), roadNode[i*2+5-1][2*j+2].getX(),roadNode[i*2+5-1][2*j+2].getY(),roadNode[i*2+5-1][2*j+2].getZ()); pathLinkS=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.green,1, yardHandlingNode[i][j][0],roadNode[i*2+5-1][2*j+2],lineS); //presentation.add(pathLinkS); roadNetwork.add(pathLinkS); } } } //连接相邻集卡 水平 for (int i=0;i<zoneNO;i++){ for (int j=0;j<blockNO;j++){ for (int k=0;k<bayNO-1;k++){ MarkupSegmentLine lineN= new MarkupSegmentLine( yardHandlingNode[i][j][k].getX(),yardHandlingNode[i][j][k].getY(),yardHandlingNode[i][j][k].getZ(),yardHandlingNode[i][j][k+1].getX(), yardHandlingNode[i][j][k+1].getY(),yardHandlingNode[i][j][k+1].getZ()); Path pathN= new Path(this, SHAPE_DRAW_2D3D, true, true,PATH_DASHEDLINE, Color.pink, 1, yardHandlingNode[i][j][k], yardHandlingNode[i][j][k+1], lineN); roadNetwork.add(pathN); //presentation.add(pathN); } } } //连接集装箱之间的坐标点 for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ for(int m=0;m<rowNO;m++){ for(int n=0;n<tierNO+1-1;n++){ x1=baseX+verticalLaneWidth+containerLength/2 +(verticalLaneWidth+blockLength)*j +(containerLength+gapBetweenContainers)*k; if(i%2==0){ y1=baseY+seasideLaneWidth+(2*blockWidth+horizontalLaneWidth*5/4)*(i/2) +containerWidth/2+(containerWidth+gapBetweenContainers)*m; } else{ y1=baseY+seasideLaneWidth+blockWidth+horizontalLaneWidth +(2*blockWidth+horizontalLaneWidth*5/4)*((i-1)/2) +containerWidth/2+(containerWidth+gapBetweenContainers)*m; } z1=containerHeight/2+n*containerHeight; MarkupSegmentLine segH0=null; Path pathBetweenContainer=null; segH0=new MarkupSegmentLine( yardInterNode[i][j][k][m][n].getX(),yardInterNode[i][j][k][m][n].getY(),yardInterNode[i][j][k][m][n].getZ(), yardInterNode[i][j][k][m][n+1].getX(),yardInterNode[i][j][k][m][n+1].getY(),yardInterNode[i][j][k][m][n+1].getZ()); pathBetweenContainer=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.green,1, yardInterNode[i][j][k][m][n],yardInterNode[i][j][k][m][n+1],segH0); //presentation.add(pathBetweenContainer); roadNetwork.add(pathBetweenContainer); } } } } } //连接顶层不同的集装箱(y方向,row) for(int i=0;i<zoneNO;i++){ for(int j=0;j<blockNO;j++){ for(int k=0;k<bayNO;k++){ for(int m=0;m<rowNO-1;m++){ for(int n=0;n<tierNO+1;n++){ x1=baseX+verticalLaneWidth+containerLength/2 +(verticalLaneWidth+blockLength)*j +(containerLength+gapBetweenContainers)*k; if(i%2==0){ y1=baseY+seasideLaneWidth+(2*blockWidth+horizontalLaneWidth*5/4)*(i/2) +containerWidth/2+(containerWidth+gapBetweenContainers)*m; } else{ y1=baseY+seasideLaneWidth+blockWidth+horizontalLaneWidth +(2*blockWidth+horizontalLaneWidth*5/4)*((i-1)/2) +containerWidth/2+(containerWidth+gapBetweenContainers)*m; } z1=containerHeight/2+n*containerHeight; MarkupSegmentLine segH11=null; Path pathBetweenBays=null; segH11=new MarkupSegmentLine( yardInterNode[i][j][k][m][n].getX(),yardInterNode[i][j][k][m][n].getY(),yardInterNode[i][j][k][m][n].getZ(), yardInterNode[i][j][k][m+1][n].getX(),yardInterNode[i][j][k][m+1][n].getY(),yardInterNode[i][j][k][m+1][n].getZ()); pathBetweenBays=new Path(this,SHAPE_DRAW_2D3D,true,true,PATH_DASHEDLINE,Color.orange,1, yardInterNode[i][j][k][m][n],yardInterNode[i][j][k][m+1][n],segH11); //presentation.add(pathBetweenBays); roadNetwork.add(pathBetweenBays); } } } } } //构建内卡停车场 xB=baseX+350; yB=baseY+(horizontalLaneWidth+blockWidth)*zoneNO+seasideLaneWidth +gatesideLaneWidth+5; wB=660; hB=100; //=3*gatesideLaneWidth-5 //traceln("wB="+wB +" , hB="+hB+"xB="+xB +" , yB="+yB); //16m集卡,两集卡之间距离16m int column=(int) wB/32;//目前一台岸桥6台集卡,可以设置到9台 int row=(int) hB/12; Attractor[] attractors=new Attractor[column*row];//定义数组 for(int i=0;i<column;i++){ for(int j=0;j<row;j++){ attractors[i*row+j]=new Attractor(15+32*i,12+12*j,0); } } truckParkingLot=new RectangularNode(this,SHAPE_DRAW_2D3D,true,xB,yB,0, wB,hB,0,null,color,1,LINE_STYLE_DASHED,null,attractors); presentation.add(truckParkingLot); //外卡停车场:构建在码头外侧,矩形与码头一样长,宽50,离陆域边线50 xB=baseX; yB=baseY+seasideLaneWidth+zoneNO*(blockWidth+horizontalLaneWidth) +gatesideLaneWidth*4+50; wB=verticalLaneWidth*(blockNO+1)+blockLength*blockNO; hB=70; column=(int)wB/32; row=(int)hB/12; attractors=new Attractor[column*row];//定义数组 for(int i=0;i<column*row;i++){ attractors[i]=new Attractor(15+32*(i/row),12+12*(i%row),0); } /*for(int i=0;i<column;i++){ for(int j=0;j<row;j++){ attractors[i*row+j]=new Attractor(15+32*i,12+12*j,0); } }*/ externalTruckParkingLot=new RectangularNode(this,SHAPE_DRAW_2D3D,true,xB,yB,0, wB,hB,0,null,color,1,LINE_STYLE_DASHED,null,attractors); presentation.add(externalTruckParkingLot); //**************add internal truckParkingLot road******************** // create two paths to connect roadNetwork and truckParkingLot for (int i=0;i<2;i++){ Path taoshiyun=null; if(blockNO%2==0){ if(i==0){ MarkupSegmentLine lineVerticalXT=new MarkupSegmentLine(roadNode[zoneNO*2+5-1][blockNO].getX(),roadNode[zoneNO*2+5-1][blockNO].getY(), 0,roadNode[zoneNO*2+5-1][blockNO].getX(),truckParkingLot.getY(),0); taoshiyun=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,color,verticalLaneWidth/2, roadNode[zoneNO*2+5-1][blockNO],truckParkingLot,lineVerticalXT); } else { MarkupSegmentLine lineVerticalXT=new MarkupSegmentLine(roadNode[zoneNO*2+5-1][blockNO+1].getX(),truckParkingLot.getY(),0, roadNode[zoneNO*2+5-1][blockNO+1].getX(),roadNode[zoneNO*2+5-1][blockNO+1].getY(),0); taoshiyun=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,color,verticalLaneWidth/2, truckParkingLot, roadNode[zoneNO*2+5-1][blockNO+1],lineVerticalXT); } } else { if(i==0){ MarkupSegmentLine lineVerticalXT=new MarkupSegmentLine(roadNode[zoneNO*2+5-1][blockNO-1].getX(),roadNode[zoneNO*2+5-1][blockNO-1].getY(),0,roadNode[zoneNO*2+5-1][blockNO-1].getX(),truckParkingLot.getY(),0); taoshiyun=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,color,verticalLaneWidth/2, roadNode[zoneNO*2+5-1][blockNO-1],truckParkingLot,lineVerticalXT); } else { MarkupSegmentLine lineVerticalXT=new MarkupSegmentLine(roadNode[zoneNO*2+5-1][blockNO].getX(),roadNode[zoneNO*2+5-1][blockNO].getY(),0,roadNode[zoneNO*2+5-1][blockNO].getX(),truckParkingLot.getY(),0); taoshiyun=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,color,verticalLaneWidth/2, truckParkingLot, roadNode[zoneNO*2+5-1][blockNO],lineVerticalXT); } } presentation.add(taoshiyun); roadNetwork.add(taoshiyun); } roadNetwork.add(truckParkingLot); //**************add external truckParkingLot road******************** // create two paths to connect roadNetwork and truckParkingLot exportContainerNode[0]=new PointNode(this,SHAPE_DRAW_2D3D, true,roadNode[zoneNO*2+5-1][blockNO*2].getX(),externalTruckParkingLot.getY(),0); exportContainerNode[1]=new PointNode(this,SHAPE_DRAW_2D3D, true,roadNode[zoneNO*2+5-1][1].getX(),externalTruckParkingLot.getY(),0); for (int i=0;i<2;i++){ Path taoshiyun1=null; if(i==0){ MarkupSegmentLine lineVerticalXET=new MarkupSegmentLine(roadNode[zoneNO*2+5-1][blockNO*2].getX(),roadNode[zoneNO*2+5-1][blockNO*2].getY(),0,exportContainerNode[i].getX(),exportContainerNode[i].getY(),0); taoshiyun1=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,color,verticalLaneWidth/2, roadNode[zoneNO*2+5-1][blockNO*2],externalTruckParkingLot,lineVerticalXET); } else { MarkupSegmentLine lineVerticalXET=new MarkupSegmentLine(exportContainerNode[i].getX(),exportContainerNode[i].getY(),0,roadNode[zoneNO*2+5-1][1].getX(),roadNode[zoneNO*2+5-1][1].getY(),0); taoshiyun1=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,color,verticalLaneWidth/2, externalTruckParkingLot,roadNode[zoneNO*2+5-1][1],lineVerticalXET); } presentation.add(taoshiyun1); roadNetwork.add(taoshiyun1); } roadNetwork.add(externalTruckParkingLot); roadNetwork.initialize(); /*double x=200; double y=200; double z=0; double x1=500; double y1=200; double z1=0; roadNode[0][0]=new PointNode(this,SHAPE_DRAW_2D3D,true,x,y,z); roadNode[0][1]=new PointNode(this,SHAPE_DRAW_2D3D,true,x1,y1,z1); MarkupSegmentLine sl=null; sl=new MarkupSegmentLine(roadNode[0][0].getX(),roadNode[0][0].getY(),roadNode[0][0].getZ(), roadNode[0][1].getX(),roadNode[0][1].getY(),roadNode[0][1].getZ()); Path pt=new Path(this,SHAPE_DRAW_2D3D,true,false,PATH_ROAD,Color.blue,15,roadNode[0][0], roadNode[0][1],sl); presentation.add(pt); */

function begin(){ tableWidget.columnCount=5; tableWidget.rowCount=50; var title=["类型","rtuId","点号","值","质量码"]; tableWidget.SetHorizontalHeaderLabels(title); /* // mode: QHeaderView::ResizeMode QHeaderView::Interactive 0 QHeaderView::Fixed 2 QHeaderView::Stretch 1 QHeaderView::ResizeToContents 3 // header: h or v, void SetHeaderResizeMode(int mode, QString header="h", int idx=-1 );*/ tableWidget.SetHeaderResizeMode(1); //列充满宽度 //tableWidget.SetTextAlignment();//全表居中对齐 //tableWidget.SetTextAlignment(-1,1,1);//第2列左对齐 //tableWidget.SetItemFlags();//全表禁止编辑 tableWidget.ItemClicked.connect(click); tableWidget.ItemDoubleClicked.connect(dclick); //批量加载数据 var menu={"option0":"0","option1":"1","option2":"2"}; //单元格类型 combox, multicombox, colorbtn, filebtn ,checkbox tableWidget.SetCellWidget(-1,0,"combox",{"遥信":"0","遥测":"1"}); //勾选Checkable,1表示勾上 //tableWidget.SetCellWidget(-1,4,"combox",menu); //下拉菜单 //tableWidget.SetCellWidget(-1,5,"multicombox",menu1);//多选下拉菜单 //tableWidget.SetCellWidget(-1,6,"colorbtn","red");//颜色按钮 tableWidget.RequestContextMenu.connect(OnrequestMenu); tableWidget.ContextMenuClicked.connect(OnContextMenu); } //表格右键菜单 function OnrequestMenu( rowNo, columnNo) { //alert(rowNo+"/"+columnNo); var menuStr=[{"text":"table-1","data":"","icon":"","enable":1}, {"text":"table-2","data":"","icon":"","enable":1}, {"text":"table-3","data":"","icon":"","enable":1}, {"text":"table-4","data":"","icon":"","enable":1,"children":[{"text":"信息","data":"","icon":"","enable":1},{"text":"趋势图","data":"","icon":"","enable":1}]}]; tableWidget.ShowContextMenu(menuStr); } function OnContextMenu(menuTxt) { //alert(menuTxt); } //单击 function click(row,column,text,data) { //alert(text); } function dclick(row,column,text,data) { //alert(text); } //逐行读取表格数据 function getTabData(){ for (var i = 0; i < tableWidget.rowCount; i++) { var c0 = parseInt(tableWidget.ItemData(i, 0, 0)); var c1 = parseFloat(tableWidget.ItemData(i, 1, 0)); var c2 = tableWidget.ItemData(i, 2, 0); } } //批量读取全表数据 function getTabData1(){ var tabdata=tableWidget.ItemData(); alert(tabdata); } 这是什么语言

function begin(){ //comboBox.itemList=["op1212","op2323","yutyu","yu1tyu","y2utyu","yu3tyu"]; //comboBox.SetViewHeight(20); var csslist=Ge.entryList("./data/css",["*.css"]); comboBox_1.itemList=csslist; pushButton.clicked.connect(onCssChg); //Window.LoadCss("table.css"); var path = Ge.getPath("home")+"/data/css/" +"table.css"; var css1=Ge.loadFile(path); tableWidget.styleSheet=css1; tableWidget.clearContents() ;//清空表格 tableWidget.columnCount=11; tableWidget.rowCount=5; var title=["int","bool","float","勾选","单选","多选","颜色","文件","文字颜色","背景颜色","进度条"]; tableWidget.SetHorizontalHeaderLabels(title); /* // mode: QHeaderView::ResizeMode QHeaderView::Interactive 0 QHeaderView::Fixed 2 QHeaderView::Stretch 1 QHeaderView::ResizeToContents 3 // header: h or v, void SetHeaderResizeMode(int mode, QString header="h", int idx=-1 );*/ tableWidget.SetHeaderResizeMode(1); //列充满宽度 //tableWidget.SetTextAlignment();//全表居中对齐 //tableWidget.SetTextAlignment(-1,1,1);//第2列左对齐 //tableWidget.SetItemFlags();//全表禁止编辑 tableWidget.ItemClicked.connect(click); tableWidget.ItemDoubleClicked.connect(dclick); //批量加载数据 var tb=[]; tb.push(["c0","c1","c2","c3","c4","c5","c6","c7","c8\nabc","c9","60"]); tb.push(["d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","70"]); tb.push(["c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","80"]); tb.push(["","","","d3","d4","d5","d6","d7","d8","d9","60"]); tb.push(["","","","c3","c4","c5","c6","c7","c8","c9","60"]); tableWidget.SetProperty("enableCompleter",true); tableWidget.SetAllItems(5,tableWidget.columnCount,tb); //50行,11列 设置全部数据 //单个格子加载数据 for(var i=0;i<3;i++) { tableWidget.SetItem( i,0, i); //整型,自动spinbox编辑 tableWidget.SetItem( i,1, true); //布尔型, tableWidget.SetItem( i,2, 8.8, 8.8,"m18.ico");//浮点型 tableWidget.SetItemData(i,8,9,"red");//设置文本颜色 tableWidget.SetItemData(i,9,8,"yellow");//设置背景颜色 } //tableWidget.SetItemFlags(0, 0, 35); //tableWidget.SetItemFlags(0, 1, 35); //tableWidget.SetItemFlags(-1,3,33); //-1表示整列,0表示第0列,33表示禁止编辑 tableWidget.SetColumnWidth(10,250); var menu={"o1ption0":"0","o2ption1":"1","o3ption2":"2"}; //单元格类型 combox, multicombox, colorbtn, filebtn ,checkbox ,bar tableWidget.SetCellWidget(-1,3,"checkbox",true); //勾选Checkable,1表示勾上 tableWidget.SetCellWidget(-1,4,"combox",menu); //下拉菜单 tableWidget.SetCellWidget(-1,5,"multicombox",menu);//多选下拉菜单 tableWidget.SetCellWidget(-1,6,"colorbtn","red");//颜色按钮 tableWidget.SetCellWidget(-1,7,"filebtn");//文件选择 tableWidget.SetCellWidget(-1,10,"bar");//bar图 /* var menu1={"test0":"0","test1":"1","test2":"2"}; tableWidget.SetCellWidget(3,2,"combox",menu1); //下拉菜单 tableWidget.SetItem( 3,2,"test1",1); var menu2={"test4":"4","test5":"5","test6":"6"}; tableWidget.SetCellWidget(4,1,"combox",menu2); //下拉菜单 tableWidget.SetItem( 4,1,"test6",6); tableWidget.RequestContextMenu.connect(OnrequestMenu); tableWidget.ContextMenuClicked.connect(OnContextMenu); btn.clicked.connect(func1); btnPrint.clicked.connect(onbtnPrint); btn2Print.clicked.connect(onbtn2Print); } //表格右键菜单 function OnrequestMenu( rowNo, columnNo) { //alert(rowNo+"/"+columnNo); var menuStr=[{"text":"table-1","data":"11","icon":"","enable":1}, {"text":"table-2","data":"","icon":"","enable":1}, {"text":"table-3","data":"","icon":"","enable":1}, {"text":"table-4","data":"","icon":"","enable":1,"children":[{"text":"信息","data":"","icon":"","enable":1},{"text":"趋势图","data":"","icon":"","enable":1}]}]; tableWidget.ShowContextMenu(menuStr); */ } function onCssChg(){ var path = Ge.getPath("home")+"/data/css/" +comboBox_1.currentText; var css1=Ge.loadFile(path); tableWidget.styleSheet=css1; //Window.LoadCss(comboBox_1.currentText); } function OnContextMenu(menuTxt,menuData) { //alert(menuTxt); } //单击 function click(row,column,text,data) { //alert(text); } function dclick(row,column,text,data) { //alert(text); } //逐行读取表格数据 function getTabData(){ for (var i = 0; i < tableWidget.rowCount; i++) { var c0 = parseInt(tableWidget.ItemData(i, 0, 0)); var c1 = parseFloat(tableWidget.ItemData(i, 1, 0)); var c2 = tableWidget.ItemData(i, 2, 0); } } //批量读取全表数据 function getTabData1(){ var tabdata=tableWidget.ItemData(); alert(tabdata); } function func1(){ tableWidget.SetSpan(0,0,3,2); } function onbtnPrint(){ //tableWidget.Print(); Me.Print(); } function onbtn2Print(){ tableWidget.Print(); }

javascript怎么将[{"reportNo":"C101-JBQKTJB","rowValueList":[{"columnValueList":[{"C001":"苏州资产管理有限公司"}],"rowNo":"R001"},{"columnValueList":[{"C001":"91320500MA1ML9WL32"}],"rowNo":"R002"},{"columnValueList":[{"C001":"苏州高新区邓尉路105号"}],"rowNo":"R003"},{"columnValueList":[{"C001":"320505"}],"rowNo":"R004"},{"columnValueList":[{"C001":"苏州高新区邓尉路105号"}],"rowNo":"R005"},{"columnValueList":[{"C001":"地方资产管理公司"}],"rowNo":"R006"},{"columnValueList":[{"C001":"110 国有控股"}],"rowNo":"R007"},{"columnValueList":[{"C001":63}],"rowNo":"R008"},{"columnValueList":[{"C001":0}],"rowNo":"R009"},{"columnValueList":[{"C001":5}],"rowNo":"R010"},{"columnValueList":[{"C001":2676090.86}],"rowNo":"R011"},{"columnValueList":[{"C001":1960314.72}],"rowNo":"R012"},{"columnValueList":[{"C001":572000}],"rowNo":"R013"},{"columnValueList":[{"C001":572000}],"rowNo":"R014"},{"columnValueList":[{"C001":"苏州市财政局"}],"rowNo":"R015"},{"columnValueList":[{"C001":22.5}],"rowNo":"R016"},{"columnValueList":[{"C001":"东吴创新资本管理有限责任公司"}],"rowNo":"R017"},{"columnValueList":[{"C001":12}],"rowNo":"R018"},{"columnValueList":[{"C001":"东吴证券股份有限公司"}],"rowNo":"R019"},{"columnValueList":[{"C001":8}],"rowNo":"R020"},{"columnValueList":[{"C001":"苏州国际发展集团有限公司"}],"rowNo":"R021"},{"columnValueList":[{"C001":7.5}],"rowNo":"R022"},{"columnValueList":[{"C001":"苏州工业园区经济发展有限公司"}],"rowNo":"R023"},{"columnValueList":[{"C001":7.5}],"rowNo":"R024"},{"columnValueList":[{"C001":"李瑞良"}],"rowNo":"R025"},{"columnValueList":[{"C001":"18625272017"}],"rowNo":"R026"},{"columnValueList":[{"C001":"马静"}],"rowNo":"R027"},{"columnValueList":[{"C001":"68786950"}],"rowNo":"R028"}],"reportType":"0","informMonth":"2023-05"}这里的"informMonth"排到最前面,reportType排到informMonth后面

我有一组POST请求 包括请求头信息和请求体 请帮我分析出 feat是如何生成的,帮我解密:{"log":{"version":"1.2","creator":{"name":"Storm Sniffer","version":"1.0"},"entries":[{"request":{"cookies":[],"method":"POST","queryString":[],"headers":[{"value":"wy22917307","name":"ksclient"},{"name":"mpsessid","value":"xVVxuoYhGedLQXsjGDmD0OKEFFRhrGVuJ9sCOcwMC4CkujiByNQSSQ@50e28b7d"},{"name":"cmpappkey","value":"zlpwtheatre"},{"name":"ksversion","value":"508cd4202503191737"},{"value":"zjyy99","name":"ksmpid"},{"value":"1.0.12","name":"version"},{"name":"Content-Length","value":"353"},{"value":"application\/x-www-form-urlencoded","name":"content-type"},{"name":"Accept-Encoding","value":"gzip,compress,br,deflate"},{"name":"feat","value":"3a872109a6f63025"},{"value":"keep-alive","name":"Connection"},{"value":"2503201353zktguf14a66d393963f3f8","name":"orderkey"},{"name":"Host","value":"xcx.zjyyjt.com.cn"},{"value":"https:\/\/2.zoppoz.workers.dev:443\/https\/servicewechat.com\/wx316bc5861b6fa32f\/51\/page-frame.html","name":"Referer"},{"name":"User-Agent","value":"Mozilla\/5.0 (iPad; CPU OS 17_5_1 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148 MicroMessenger\/8.0.56(0x1800383a) NetType\/WIFI Language\/zh_CN"}],"headersSize":636,"httpVersion":"HTTP\/1.1","bodySize":353,"url":"https:\/\/2.zoppoz.workers.dev:443\/https\/xcx.zjyyjt.com.cn\/thvendor\/member\/ticket\/order\/create.xhtml","postData":{"mimeType":"application\/x-www-form-urlencoded","text":"appId=wx316bc5861b6fa32f&createOrderReq=%7B%22platform%22%3A%22APP%22%2C%22scheduleId%22%3A%2211746%22%2C%22appId%22%3A%22wx316bc5861b6fa32f%22%2C%22mobile%22%3A%2217861002736%22%2C%22seats%22%3A%5B%7B%22ticketPriceId%22%3A5088%2C%22ticketPrice%22%3A580%2C%22venueAreaId%22%3A1619%2C%22rowNo%22%3A%221%22%2C%22colNo%22%3A%222%22%7D%5D%7D&showToast=noMsg"}},"response":{"content":{"size":76,"mimeType":"application\/json;charset=utf-8","text":"{\"errcode\":\"0000\",\"data\":\"312503201353495610\",\"success\":true}"},"cookies":[],"headers":[{"name":"Content-Encoding","value":"gzip"},{"name":"Vary","value":"Accept-Encoding"},{"value":"chunked","name":"Transfer-Encoding"},{"name":"Date","value":"Thu, 20 Mar 2025 05:53:20 GMT"},{"name":"Connection","value":"keep-alive"},{"value":"application\/json;charset=utf-8","name":"Content-Type"}],"statusText":"OK","bodySize":76,"status":200,"httpVersion":"HTTP\/1.1","redirectURL":"","headersSize":169},"startedDateTime":"2025-03-20T05:53:20.052Z","time":185,"serverIPAddress":"114.55.135.239","cache":{},"timings":{"ssl":74,"dns":-1,"connect":49,"receive":4,"blocked":0,"send":74,"wait":56}}]}}

DECLARE @dimension_ID int = 1; DECLARE @dimension_Content nvarchar(50); WHILE @dimension_ID <= (SELECT MAX([ID]) FROM [AP_Inventory].[dbo].[MD_Variation_Dimension]) BEGIN SET @dimension_Content = (SELECT [Dimension] FROM [AP_Inventory].[dbo].[MD_Variation_Dimension] WHERE [ID] = @dimension_ID); EXEC(' SELECT a.[CompanyCtry], a.[SBU], a.'+@dimension_Content+', a.[Inv_CM], b.[Inv_LM], ROW_NUMBER() OVER ( PARTITION BY a.[CompanyCtry], a.[SBU] ORDER BY ABS(a.[Inv_CM] - b.[Inv_LM]) DESC ) as RowNo INTO [AP_Inventory].[dbo].[Temp_vs_CY_LM] FROM ( SELECT [CompanyCtry], [SBU_2023] as [SBU], '+@dimension_Content+', SUM([TotalInv_EUR]) as [Inv_CM] FROM [AP_Inventory].[dbo].[Inv_Details_for_PowerBI] WHERE DATEDIFF(MONTH, DATEFROMPARTS([ReportYear], [ReportMonth], 1), GETDATE()) = 1 and [StockCategory] <> ''Vendor Consignment'' and '+@dimension_Content+' is not null GROUP BY [CompanyCtry], [SBU_2023], '+@dimension_Content+' ) as a, ( SELECT [CompanyCtry], [SBU_2023] as [SBU], '+@dimension_Content+', SUM([TotalInv_EUR]) as [Inv_LM] FROM [AP_Inventory].[dbo].[Inv_Details_for_PowerBI] WHERE DATEDIFF(MONTH, DATEFROMPARTS([ReportYear], [ReportMonth], 1), GETDATE()) = 2 and [StockCategory] <> ''Vendor Consignment'' and '+@dimension_Content+' is not null GROUP BY [CompanyCtry], [SBU_2023], '+@dimension_Content+' ) as b WHERE a.[CompanyCtry] = b.[CompanyCtry] and a.[SBU] = b.[SBU] and a.'+@dimension_Content+' = b.'+@dimension_Content+' ') EXEC(' UPDATE a SET a.[vs_CY_LM_Content] = b.'+@dimension_Content+', a.[vs_CY_LM_Content_Qty] = b.[Inv_CM], a.[vs_CY_LM_Delta_Qty] = b.[Inv_CM] - b.[Inv_LM] FROM [AP_Inventory].[dbo].[Calculate_Top_Variation_V4] as a, [AP_Inventory].[dbo].[Temp_vs_CY_LM] as b WHERE a.[Organization] = b.[CompanyCtry] and a.[SBU] = b.[SBU] and a.[Dimension] = '''+@dimension_Content+''' and a.[vs_CY_LM_Rank] = b.[RowNo] and DATEDIFF(MONTH, DATEFROMPARTS(a.[Report_Year], a.[Report_Month], 1), GETDATE()) = 1; '); DROP TABLE [AP_Inventory].[dbo].[Temp_vs_CY_LM]; SET @dimension_ID = @dimension_ID + 1; 在这段代码里面exec函数有什么意义呢,并且一整段函数有什么意义。

最新推荐

recommend-type

Qt开发:XML文件读取、滚动区域控件布局与多Sheet Excel保存的界面设计实例

内容概要:本文介绍了基于Qt框架的界面设计例程,重点讲解了三个主要功能模块:一是利用XML文件进行配置信息的读取并初始化界面组件;二是实现了滚动区域内的灵活控件布局,在空间不足时自动生成滚动条以扩展显示范围;三是提供了将界面上的数据导出到带有多个工作表的Excel文件的功能。文中还提及了所用IDE的具体版本(Qt Creator 4.8.0 和 Qt 5.12.0),并且强调了这些技术的实际应用场景及其重要性。 适合人群:对Qt有初步了解,希望深入学习Qt界面设计技巧的开发者。 使用场景及目标:适用于需要快速构建复杂用户界面的应用程序开发,特别是那些涉及大量数据展示和交互的设计任务。通过学习本文提供的案例,可以提高对于Qt框架的理解,掌握更多实用技能。 其他说明:为了帮助读者更好地理解和实践,作者推荐前往B站观看高清的教学视频,以便于更直观地感受整个项目的开发流程和技术细节。
recommend-type

锂电池保护板方案:中颖SH367309原理图与PCB源代码详解及应用技巧

基于中颖SH367309芯片的锂电池保护板设计方案,涵盖原理图解析、PCB布局优化、硬件选型要点以及软件编程技巧。重点讨论了电流检测精度、过压保护阈值设定、通信协议处理和温度传感器布置等方面的实际开发经验和技术难点。文中还分享了一些实用的小贴士,如采用星型接地减少干扰、利用过孔阵列降低温升、为MOS管增加RC缓冲避免高频振荡等。 适合人群:从事锂电池管理系统(BMS)开发的技术人员,尤其是有一定硬件设计基础并希望深入了解具体实现细节的工程师。 使用场景及目标:帮助开发者掌握锂电池保护板的关键技术和常见问题解决方案,确保产品在各种工况下都能安全可靠运行,同时提高系统性能指标如效率、响应速度和稳定性。 阅读建议:由于涉及较多底层硬件知识和实战案例,建议读者结合自身项目背景进行针对性学习,在遇到类似问题时能够快速定位原因并找到有效对策。此外,对于初学者来说,可以从简单的电路搭建开始逐步深入研究复杂的功能模块。
recommend-type

PHP资格证书查询系统:基于FastAdmin框架的二维码生成与表单验证

内容概要:本文介绍了基于PHP开发的资格证书查询系统,详细阐述了其核心功能和技术实现。系统主要功能包括自动生成二维码、支持导入导出功能、表单验证以及手机端查询和后端登录编辑。该系统采用FastAdmin框架开发,确保了高效的开发流程和良好的用户体验。此外,文中还提到了系统所需的环境要求,如PHP版本需>=7.1且<=5.5.3,支持InnoDB引擎和伪静态设置。最后,通过一段PHP代码示例展示了如何实现自动生成二维码的功能。 适合人群:具备一定PHP开发经验的技术人员,尤其是对FastAdmin框架感兴趣的开发者。 使用场景及目标:适用于需要管理和查询资格证书的企业和个人。目标是提高证书管理效率,增强用户体验,确保数据安全。 其他说明:该系统不仅实现了基本的证书管理功能,还通过引入二维码技术和表单验证提升了系统的实用性和安全性。
recommend-type

Web前端开发:CSS与HTML设计模式深入解析

《Pro CSS and HTML Design Patterns》是一本专注于Web前端设计模式的书籍,特别针对CSS(层叠样式表)和HTML(超文本标记语言)的高级应用进行了深入探讨。这本书籍属于Pro系列,旨在为专业Web开发人员提供实用的设计模式和实践指南,帮助他们构建高效、美观且可维护的网站和应用程序。 在介绍这本书的知识点之前,我们首先需要了解CSS和HTML的基础知识,以及它们在Web开发中的重要性。 HTML是用于创建网页和Web应用程序的标准标记语言。它允许开发者通过一系列的标签来定义网页的结构和内容,如段落、标题、链接、图片等。HTML5作为最新版本,不仅增强了网页的表现力,还引入了更多新的特性,例如视频和音频的内置支持、绘图API、离线存储等。 CSS是用于描述HTML文档的表现(即布局、颜色、字体等样式)的样式表语言。它能够让开发者将内容的表现从结构中分离出来,使得网页设计更加模块化和易于维护。随着Web技术的发展,CSS也经历了多个版本的更新,引入了如Flexbox、Grid布局、过渡、动画以及Sass和Less等预处理器技术。 现在让我们来详细探讨《Pro CSS and HTML Design Patterns》中可能包含的知识点: 1. CSS基础和选择器: 书中可能会涵盖CSS基本概念,如盒模型、边距、填充、边框、背景和定位等。同时还会介绍CSS选择器的高级用法,例如属性选择器、伪类选择器、伪元素选择器以及选择器的组合使用。 2. CSS布局技术: 布局是网页设计中的核心部分。本书可能会详细讲解各种CSS布局技术,包括传统的浮动(Floats)布局、定位(Positioning)布局,以及最新的布局模式如Flexbox和CSS Grid。此外,也会介绍响应式设计的媒体查询、视口(Viewport)单位等。 3. 高级CSS技巧: 这些技巧可能包括动画和过渡效果,以及如何优化性能和兼容性。例如,CSS3动画、关键帧动画、转换(Transforms)、滤镜(Filters)和混合模式(Blend Modes)。 4. HTML5特性: 书中可能会深入探讨HTML5的新标签和语义化元素,如`<article>`、`<section>`、`<nav>`等,以及如何使用它们来构建更加标准化和语义化的页面结构。还会涉及到Web表单的新特性,比如表单验证、新的输入类型等。 5. 可访问性(Accessibility): Web可访问性越来越受到重视。本书可能会介绍如何通过HTML和CSS来提升网站的无障碍访问性,比如使用ARIA标签(Accessible Rich Internet Applications)来增强屏幕阅读器的使用体验。 6. 前端性能优化: 性能优化是任何Web项目成功的关键。本书可能会涵盖如何通过优化CSS和HTML来提升网站的加载速度和运行效率。内容可能包括代码压缩、合并、避免重绘和回流、使用Web字体的最佳实践等。 7. JavaScript与CSS/HTML的交互: 在现代Web开发中,JavaScript与CSS及HTML的交云并用是不可或缺的。书中可能会讲解如何通过JavaScript动态地修改样式、操作DOM元素以及使用事件监听和响应用户交互。 8. Web框架和预处理器: 这本书可能会提到流行的Web开发框架和预处理器,比如Bootstrap、Foundation、Sass和Less等,它们是如何简化和加速开发流程的。 9. 测试和维护: 书中也可能包含关于如何测试网页以及如何持续优化和维护CSS和HTML代码的章节。例如,使用断言测试、自动化测试、性能分析工具等。 最后,鉴于文件名称列表中的“压缩包子文件”的表述,这可能是对“压缩包”文件的一种误译或误用,此处“压缩包”应该指的是包含该书籍PDF文件的压缩文件格式,如ZIP或RAR。而“Pro CSS and HTML Design Patterns.pdf”指的就是该书籍的PDF格式电子版文件。 以上所述,构成了《Pro CSS and HTML Design Patterns》一书可能包含的核心知识点。通过学习这些内容,Web前端开发者可以掌握更为高效和优雅的设计模式,从而在日常工作中更高效地解决实际问题。
recommend-type

Zotero 7数据同步:Attanger插件安装&设置,打造文献管理利器

/i.s3.glbimg.com/v1/AUTH_08fbf48bc0524877943fe86e43087e7a/internal_photos/bs/2018/L/j/ipKA8TRPyt4ptaG1DGww/t-m-01.png) # 1. Zotero 7数据同步简介 在数字时代,管理研究数据变得日益重要,而Zot
recommend-type

卷积神经网络的基础理论200字

<think>我们正在回答用户关于卷积神经网络(CNN)基础理论的询问。根据提供的引用资料,我们可以概述CNN的基本结构和工作原理。引用[1]提到CNN是一种前馈神经网络,信息从输入单向流动到输出。引用[2]指出CNN在图像处理等领域应用广泛,通过层次结构和参数调整实现模式识别。引用[3]说明CNN包含卷积层,使用卷积核提取局部特征,减少参数量,提高效率。引用[4]则提到了训练过程,包括前向传播、误差计算和反向传播(梯度下降)。因此,我们将从以下几个方面概述CNN:1.CNN的基本结构(卷积层、池化层、全连接层)2.卷积操作的工作原理(局部感受野、权重共享)3.训练过程(前向传播、损失函数、反
recommend-type

轻便实用的Java库类查询工具介绍

标题 "java2库类查询" 和描述表明,所提及的工具是一个专门用于查询Java库类的应用程序。此软件旨在帮助开发者快速地查找和引用Java的标准开发工具包(SDK)中包含的所有应用程序编程接口(API)类。通过这样的工具,开发者可以节省大量在官方文档或搜索引擎上寻找类定义和使用方法的时间。它被描述为轻巧且方便,这表明其占用的系统资源相对较少,同时提供直观的用户界面,使得查询过程简洁高效。 从描述中可以得出几个关键知识点: 1. Java SDK:Java的软件开发工具包(SDK)是Java平台的一部分,提供了一套用于开发Java应用软件的软件包和库。这些软件包通常被称为API,为开发者提供了编程界面,使他们能够使用Java语言编写各种类型的应用程序。 2. 库类查询:这个功能对于开发者来说非常关键,因为它提供了一个快速查找特定库类及其相关方法、属性和使用示例的途径。良好的库类查询工具可以帮助开发者提高工作效率,减少因查找文档而中断编程思路的时间。 3. 轻巧性:软件的轻巧性通常意味着它对计算机资源的要求较低。这样的特性对于资源受限的系统尤为重要,比如老旧的计算机、嵌入式设备或是当开发者希望最小化其开发环境占用空间时。 4. 方便性:软件的方便性通常关联于其用户界面设计,一个直观、易用的界面可以让用户快速上手,并减少在使用过程中遇到的障碍。 5. 包含所有API:一个优秀的Java库类查询软件应当能够覆盖Java所有标准API,这包括Java.lang、Java.util、Java.io等核心包,以及Java SE平台的所有其他标准扩展包。 从标签 "java 库 查询 类" 可知,这个软件紧密关联于Java编程语言的核心功能——库类的管理和查询。这些标签可以关联到以下知识点: - Java:一种广泛用于企业级应用、移动应用(如Android应用)、网站后端、大型系统和许多其他平台的编程语言。 - 库:在Java中,库是一组预打包的类和接口,它们可以被应用程序重复使用。Java提供了庞大的标准库,以支持各种常见的任务和功能。 - 查询:查询指的是利用软件工具搜索、定位和检索信息的过程。对于Java库类查询工具来说,这意味着可以通过类名、方法签名或其他标识符来查找特定的API条目。 最后,压缩包文件列表包含了两个文件:“java.dit”和“Java.exe”。其中“Java.exe”很可能是程序的可执行文件,而“java.dit”可能是一个数据文件,用于存储Java类的索引或数据。由于文件名后缀通常与文件类型相关联,但“dit”并不是一个常见的文件扩展名。这可能是一个特定于软件的自定义格式,或是一个打字错误。 总结来说,"java2库类查询" 是一个针对Java开发者的实用工具,它提供了一个轻量级、易用的平台来查询和定位Java标准库中的所有类和API。此工具对优化开发流程,减少查找Java类文档的时间大有裨益,尤其适合需要频繁查阅Java API的开发者使用。
recommend-type

【Zotero 7终极指南】:新手必备!Attanger插件全攻略与数据同步神技

# 1. Zotero 7与Attanger插件的介绍 在当今的学术研究和知识管理领域,高效的文献管理工具至关重要。Zotero 7作为一个流行的参考文献管理软件,因其强大的功能和用户友好的界面而受到专业人士的青睐。而Attanger插件则为Zotero 7带来了更多定制化和高级功能,极大地增强
recommend-type

MATLAB整段注释快捷键

<think>首先,用户的问题是:“MATLAB整段注释快捷键”,意思是“MATLAB整段注释快捷键”。我需要用中文回答。 根据规则: - 回答必须用中文。 - 回答完问题后,必须在末尾输出“§§相关问题§§”,然后提出3-5个相关问题。 - “§§相关问题§§”必须完整输出在第一行,禁止换行分散。 - 相关问题必须基于用户的问题和我的回答。 现在,回忆MATLAB的快捷键:在MATLAB中,整段注释通常使用快捷键Ctrl + R来注释选中的代码行,使用Ctrl + T来取消注释。用户问的是“整段注释”,所以我应该确认快捷键。 在MATLAB中: - 注释选中的行:Ctrl + R -
recommend-type

Eclipse Jad反编译插件:提升.class文件查看便捷性

反编译插件for Eclipse是一个专门设计用于在Eclipse集成开发环境中进行Java反编译的工具。通过此类插件,开发者可以在不直接访问源代码的情况下查看Java编译后的.class文件的源代码,这在开发、维护和学习使用Java技术的过程中具有重要的作用。 首先,我们需要了解Eclipse是一个跨平台的开源集成开发环境,主要用来开发Java应用程序,但也支持其他诸如C、C++、PHP等多种语言的开发。Eclipse通过安装不同的插件来扩展其功能。这些插件可以由社区开发或者官方提供,而jadclipse就是这样一个社区开发的插件,它利用jad.exe这个第三方命令行工具来实现反编译功能。 jad.exe是一个反编译Java字节码的命令行工具,它可以将Java编译后的.class文件还原成一个接近原始Java源代码的格式。这个工具非常受欢迎,原因在于其反编译速度快,并且能够生成相对清晰的Java代码。由于它是一个独立的命令行工具,直接使用命令行可以提供较强的灵活性,但是对于一些不熟悉命令行操作的用户来说,集成到Eclipse开发环境中将会极大提高开发效率。 使用jadclipse插件可以很方便地在Eclipse中打开任何.class文件,并且将反编译的结果显示在编辑器中。用户可以在查看反编译的源代码的同时,进行阅读、调试和学习。这样不仅可以帮助开发者快速理解第三方库的工作机制,还能在遇到.class文件丢失源代码时进行紧急修复工作。 对于Eclipse用户来说,安装jadclipse插件相当简单。一般步骤包括: 1. 下载并解压jadclipse插件的压缩包。 2. 在Eclipse中打开“Help”菜单,选择“Install New Software”。 3. 点击“Add”按钮,输入插件更新地址(通常是jadclipse的更新站点URL)。 4. 选择相应的插件(通常名为“JadClipse”),然后进行安装。 5. 安装完成后重启Eclipse,插件开始工作。 一旦插件安装好之后,用户只需在Eclipse中双击.class文件,或者右键点击文件并选择“Open With Jadclipse”,就能看到对应的Java源代码。如果出现反编译不准确或失败的情况,用户还可以直接在Eclipse中配置jad.exe的路径,或者调整jadclipse的高级设置来优化反编译效果。 需要指出的是,使用反编译工具虽然方便,但要注意反编译行为可能涉及到版权问题。在大多数国家和地区,反编译软件代码属于合法行为,但仅限于学习、研究、安全测试或兼容性开发等目的。如果用户意图通过反编译获取商业机密或进行非法复制,则可能违反相关法律法规。 总的来说,反编译插件for Eclipse是一个强大的工具,它极大地简化了Java反编译流程,提高了开发效率,使得开发者在没有源代码的情况下也能有效地维护和学习Java程序。但开发者在使用此类工具时应遵守法律与道德规范,避免不当使用。