|
@@ -0,0 +1,677 @@
|
|
|
+package com.jeeplus.modules.sg.substation.util;
|
|
|
+
|
|
|
+import com.jeeplus.common.utils.StringUtils;
|
|
|
+import com.jeeplus.common.utils.excel.ImportExcel;
|
|
|
+import com.jeeplus.common.utils.sg.ExcelUtil;
|
|
|
+import com.jeeplus.modules.sg.overheadline.entity.JkxlDetailFee;
|
|
|
+import com.jeeplus.modules.sg.overheadline.util.DoubleUtil;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+
|
|
|
+public class SubstationUtil {
|
|
|
+
|
|
|
+ //节点归属,表示节点为主要生产工程下节点
|
|
|
+ public static final Integer NODE_BELONG_ZY = 1;
|
|
|
+ //节点归属,表示节点为辅助生产工程下节点
|
|
|
+ public static final Integer NODE_BELONG_FZ = 2;
|
|
|
+ //节点归属,表示节点为与站点有关的单项工程下节点
|
|
|
+ public static final Integer NODE_BELONG_DX = 3;
|
|
|
+// 角标正则表达式
|
|
|
+ public static final String MARK_EXP = "(\\d|\\.)+";
|
|
|
+ /*
|
|
|
+ 下面节点名称数组都是以结算书中结构进行组织,名称后缀有_HUI表示包含父节点
|
|
|
+ */
|
|
|
+ //主要生产建筑
|
|
|
+ public static final String MADE_WBS_JDQS = "JDQS"; //结算书中继电器室节点虚拟wbs
|
|
|
+ public static final String MADE_WBS_PDZZS = "PDZZS"; //结算书中配电装置室节点虚拟wbs
|
|
|
+ public static final String[] WBS_JZ_ZYSCJZ_HUI = {"21110000","21111000","2111N000","2111P000","2111Q000","2111R000",MADE_WBS_JDQS,MADE_WBS_PDZZS};
|
|
|
+ public static final String[] NODE_JZ_ZYSCJZ_HUI = {"主要生产建筑","主控通信楼","固定串联补偿装置控制室","可控高压电抗器晶闸管阀室","可控串联补偿装置控制室",
|
|
|
+ "静止无功补偿装置晶闸管阀室","继电器室","配电装置室"};
|
|
|
+ public static final String[] WBS_JZ_JDQS = {"21112000","21113000","21114000","21115000","21116000","21117000","21118000","21119000","2111A000"};
|
|
|
+ public static final String[] NODE_JZ_JDQS = {"1000kV继电器室","750kV继电器室","500kV继电器室","330kV继电器室","220kV继电器室","110kV继电器室","66kV继电器室",
|
|
|
+ "35kV继电器室","10kV继电器室"};
|
|
|
+ public static final String[] WBS_JZ_PDZZS = {"2111B000","2111C000","2111D000","2111F000","2111G000","2111H000","2111J000","2111K000", "2111L000","2111M000"};
|
|
|
+ public static final String[] NODE_JZ_PDZZS = {"站用配电装置室","1000kV配电装置室","750kV配电装置室","500kV配电装置室","330kV配电装置室","220kV配电装置室",
|
|
|
+ "110kV配电装置室","66kV配电装置室","35kV配电装置室","10kV配电装置室"};
|
|
|
+ //配电装置建筑
|
|
|
+ public static final String MADE_WBS_GJJSBJC = "GJJSBJC";//结算书中构架及设备基础节点虚拟wbs
|
|
|
+ public static final String[] WBS_JZ_PDZZJZ_HUI = {"21120000","21121000","2112B000","2112C000","2112D000","2112F000","2112G000","2112H000","2112J000","2112K000","2112L000","2112M000",MADE_WBS_GJJSBJC};
|
|
|
+ public static final String[] NODE_JZ_PDZZJZ_HUI = {"配电装置建筑","主变压器系统","高压电抗器系统","串联补偿系统","低压电容器","低压电抗器","静止无功补偿装置",
|
|
|
+ "站用变压器系统","避雷针塔","电缆沟道","栅栏及地坪","配电装置区域地面封闭","构架及设备基础"};
|
|
|
+ public static final String[] WBS_JZ_ZBYQXT = {"21121100","21121200","21121300","21121400","21121500"};
|
|
|
+ public static final String[] NODE_JZ_ZBYQXT = {"构支架及基础","主变压器设备基础","主变压器油坑及卵石","防火墙","事故油池"};
|
|
|
+ public static final String[] WBS_JZ_GYDKQXT = {"2112B100","2112B200","2112B300","2112B400","2112B500"};
|
|
|
+ public static final String[] NODE_JZ_GYDKQXT = {"构支架及基础","高压电抗器设备基础","高抗油池及卵石","防火墙","事故油池"};
|
|
|
+ public static final String[] WBS_JZ_CLBCXT = {"2112C100","2112C200","2112C300","2112C400"};
|
|
|
+ public static final String[] NODE_JZ_CLBCXT = {"串联补偿设备平台基础","串联补偿设备平台结构","构支架及基础","设备支架及基础"};
|
|
|
+ public static final String[] WBS_JZ_JZWGBCZZ = {"2112G100","2112G200"};
|
|
|
+ public static final String[] NODE_JZ_JZWGBCZZ = {"构支架及基础","静止无功补偿装置设备基础"};
|
|
|
+ public static final String[] WBS_JZ_ZYBYQXT = {"2112H100","2112H200"};
|
|
|
+ public static final String[] NODE_JZ_ZYBYQXT = {"站用变压器设备基础","防火墙"};
|
|
|
+ public static final String[] WBS_JZ_GJJSBJC = {"21122100","21122200","21123100","21123200","21124100","21124200","21125100","21125200","21126100","21126200","21127100","21127200"
|
|
|
+ ,"21128100","21128200","21129100","21129200","2112A100","2112A200"};
|
|
|
+ public static final String[] NODE_JZ_GJJSBJC = {"1000kV构架及基础","1000kV设备支架及基础","750kV构架及基础","750kV设备支架及基础","500kV构架及基础","500kV设备支架及基础",
|
|
|
+ "330kV构架及基础","330kV设备支架及基础","220kV构架及基础","220kV设备支架及基础","110kV构架及基础","110kV设备支架及基础",
|
|
|
+ "66kV构架及基础","66kV设备支架及基础","35kV构架及基础","35kV设备支架及基础","10kV构架及基础","10kV设备支架及基础"};
|
|
|
+ //供水系统建筑
|
|
|
+ public static final String[] WBS_JZ_GSXTJZ_HUI = {"21130000","21131000","21132000","21133000","21134000","21135000"};
|
|
|
+ public static final String[] NODE_JZ_GSXTJZ_HUI = {"供水系统建筑","站区供水管道","供水系统设备","综合水泵房","深井","蓄水池"};
|
|
|
+ //消防系统
|
|
|
+ public static final String[] WBS_JZ_XFXT_HUI = {"21140000","21141000","21142000","21143000","21144000","21145000","21146000"};
|
|
|
+ public static final String[] NODE_JZ_XFXT_HUI = {"消防系统","消防水泵房","雨淋阀室","站区消防管道","消防器材","特殊消防系统","消防水池"};
|
|
|
+ //辅助生产建筑
|
|
|
+ public static final String[] WBS_JZ_FZSCJZ_HUI = {"21210000","21211000","21212000","21213000"};
|
|
|
+ public static final String[] NODE_JZ_FZSCJZ_HUI = {"辅助生产建筑","综合楼","警卫室","雨水泵房"};
|
|
|
+ //站区性建筑
|
|
|
+ public static final String[] WBS_JZ_ZQXJZ_HUI = {"21220000","21221000","21222000","21223000","21224000"};
|
|
|
+ public static final String[] NODE_JZ_ZQXJZ_HUI = {"站区性建筑","场地平整","站区道路及广场","站区排水","围墙及大门"};
|
|
|
+ //特殊构建物
|
|
|
+ public static final String[] WBS_JZ_TSGZW_HUI = {"21230000","21231000","21232000","21233000"};
|
|
|
+ public static final String[] NODE_JZ_TSGZW_HUI = {"特殊构筑物","挡土墙及挡水墙","防洪排水沟","护坡"};
|
|
|
+ //站区绿化
|
|
|
+ public static final String WBS_JZ_ZQLH = "21240000";
|
|
|
+ public static final String NODE_JZ_ZQLH = "站区绿化";
|
|
|
+// 与站址相关单项工程
|
|
|
+ public static final String[] WBS_JZ_DXGC_HUI = {"2130000","21310000","21320000","21330000","21340000","21350000","21360000"};
|
|
|
+ public static final String[] NODE_JZ_DXGC_HUI = {"与站址有关的单项工程","地基处理","站外道路","站外水源","站外排水","施工降水","临时工程"};
|
|
|
+
|
|
|
+
|
|
|
+ //主变压器系统
|
|
|
+ public static final String[] WBS_AZ_ZBYQXT_HUI = {"23110000","23111000"};
|
|
|
+ public static final String[] NODE_AZ_ZBYQXT_HUI = {"主变压器系统","主变压器"};
|
|
|
+ //配电装置
|
|
|
+ public static final String[] WBS_AZ_PDZZ_HUI = {"23120000","23121000","23122000"};
|
|
|
+ public static final String[] NODE_AZ_PDZZ_HUI = {"配电装置","屋内配电装置","屋外配电装置"};
|
|
|
+ //无功补偿
|
|
|
+ public static final String[] WBS_AZ_WGBC_HUI = {"23130000","23131000","23132000","23133000","23134000","23135000"};
|
|
|
+ public static final String[] NODE_AZ_WGBC_HUI = {"无功补偿","高压电抗器","串联补偿装置","低压电容器","低压电抗器","静止无功补偿装置"};
|
|
|
+ public static final String[] WBS_AZ_GYDKQ = {"23131100","23131200"};
|
|
|
+ public static final String[] NODE_AZ_GYDKQ = {"固定高压电抗器","可控高压电抗器"};
|
|
|
+ public static final String[] WBS_AZ_CLBCZZ = {"23132100","23132200"};
|
|
|
+ public static final String[] NODE_AZ_CLBCZZ = {"固定串联补偿装置","可控串联补偿装置"};
|
|
|
+ //控制及直流系统
|
|
|
+ public static final String MADE_WBS_KZZL = "KZZL"; //结算书中辅助设备与设施节点虚拟wbs
|
|
|
+ public static final String[] WBS_AZ_KZZL_HUI = {"23140000","23141000","23142000","23143000","23144000","23145000",MADE_WBS_KZZL};
|
|
|
+ public static final String[] NODE_AZ_KZZL_HUI = {"控制及直流系统","计算机监控系统","继电保护","直流系统及不间断电源","智能辅助控制系统","在线监测系统","辅助设备与设施"};
|
|
|
+ //站用电系统
|
|
|
+ public static final String[] WBS_AZ_ZYDXT_HUI = {"23150000","23151000","23152000","23153000"};
|
|
|
+ public static final String[] NODE_AZ_ZYDXT_HUI = {"站用电系统","站用变压器","站用配电装置","站区照明"};
|
|
|
+ //电缆及接地
|
|
|
+ public static final String[] WBS_AZ_DLJJD_HUI = {"23160000","23161000","23162000"};
|
|
|
+ public static final String[] NODE_AZ_DLJJD_HUI = {"电缆及接地","全站电缆","全站接地"};
|
|
|
+ public static final String[] WBS_AZ_QZDL = {"23161100","23161200","23161300","23161400"};
|
|
|
+ public static final String[] NODE_AZ_QZDL = {"电力电缆","控制电缆","电缆辅助设施","电缆防火"};
|
|
|
+ //通信及运动系统
|
|
|
+ public static final String[] WBS_AZ_TXJYDXT_HUI = {"23170000","23171000","23172000"};
|
|
|
+ public static final String[] NODE_AZ_TXJYDXT_HUI = {"通信及远动系统","通信系统","远动及计费系统"};
|
|
|
+ //全站调试
|
|
|
+ public static final String[] WBS_AZ_QZTS_HUI = {"23180000","23181000","23182000","23183000"};
|
|
|
+ public static final String[] NODE_AZ_QZTS_HUI = {"全站调试","分系统调试","整套启动调试","特殊项目调试"};
|
|
|
+// 辅助生产工程
|
|
|
+ public static final String[] WBS_AZ_FZSCGC_HUI = {"23200000","23210000","23220000","23230000"};
|
|
|
+ public static final String[] NODE_AZ_FZSCGC_HUI ={"辅助生产工程","检修及修配设备","试验设备","油及SF6处理设备"};
|
|
|
+ //站外电源
|
|
|
+ public static final String[] WBS_AZ_ZWDY_HUI = {"23310000","23311000","23312000"};;
|
|
|
+ public static final String[] NODE_AZ_ZWDY_HUI = {"站外电源","站外电源线路","站外电源间隔"};
|
|
|
+ //站外通信
|
|
|
+ public static final String[] WBS_AZ_ZWTX_HUI = {"23320000","23321000"};;
|
|
|
+ public static final String[] NODE_AZ_ZWTX_HUI = {"站外通信","站外通信线路"};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 建筑安装总节点的基础数据
|
|
|
+ * 其中“直接工程费”从 hz“合计”行获取。“人工费”,“投标人采购”,“招标人采购”、“机械费”qd获取
|
|
|
+ *
|
|
|
+ * @param qd 建筑/安装工程量清单计价表
|
|
|
+ * @param hz 建筑/安装工程费用汇总表
|
|
|
+ * @param wbs 总节点wbs编码
|
|
|
+ * @param str 总结点名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getTotalBaseInfo(ImportExcel qd,ImportExcel hz,String wbs,String str){
|
|
|
+ double[] doubles = ExcelUtil.getDoubleArray(qd,str,2,new int[]{12,13, 14, 15, 17});
|
|
|
+ double d = ExcelUtil.getDouble(hz,SubstationInfo.QT_HJ,0,3); //直接工程费
|
|
|
+ if(d == 0.00){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ JkxlDetailFee jkxlDetailFee = new JkxlDetailFee();
|
|
|
+ jkxlDetailFee.setWbsCode(wbs);
|
|
|
+ jkxlDetailFee.setOriginalTotalCost(doubles[0]);
|
|
|
+ jkxlDetailFee.setOriginalRgCost(doubles[1]);
|
|
|
+ jkxlDetailFee.setOriginalFbrCost(doubles[3]);
|
|
|
+ jkxlDetailFee.setOriginalCbrCost(doubles[2]);
|
|
|
+ jkxlDetailFee.setOriginalJxCost(doubles[4]);
|
|
|
+ jkxlDetailFee.setZjgcFee(d);
|
|
|
+ return jkxlDetailFee;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 节点的基础数据,若该分部分项节点在汇总表找不到直接工程费,则判断此分部分项为空
|
|
|
+ * 其中“直接工程费”从hz中找到值为str行获取。“合计”、“人工费”,“投标人采购”,“招标人采购”、“机械费”从qd
|
|
|
+ * 中找到值包含str行获取
|
|
|
+ * 注意:这里查找的节点数据,一定是清单表和汇总表中都有的
|
|
|
+ * @param qd 建筑/安装工程量清单计价表
|
|
|
+ * @param hz 建筑/安装工程费用汇总表
|
|
|
+ * @param wbs 节点wbs编码
|
|
|
+ * @param str 节点名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getBaseInfo(ImportExcel qd,ImportExcel hz,String wbs,String str){
|
|
|
+ double[] doubles = ExcelUtil.getBashArray(qd,str,2,new int[]{12,13, 14, 15, 17});
|
|
|
+ double d = ExcelUtil.getDouble(hz,str,1,3); //直接工程费
|
|
|
+ if(d == 0.00){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ JkxlDetailFee jkxlDetailFee = new JkxlDetailFee();
|
|
|
+ jkxlDetailFee.setWbsCode(wbs);
|
|
|
+ jkxlDetailFee.setOriginalTotalCost(doubles[0]);
|
|
|
+ jkxlDetailFee.setOriginalRgCost(doubles[1]);
|
|
|
+ jkxlDetailFee.setOriginalFbrCost(doubles[3]);
|
|
|
+ jkxlDetailFee.setOriginalCbrCost(doubles[2]);
|
|
|
+ jkxlDetailFee.setOriginalJxCost(doubles[4]);
|
|
|
+ jkxlDetailFee.setZjgcFee(d);
|
|
|
+ return jkxlDetailFee;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取多个节点的基础数据
|
|
|
+ * @param qd 建筑/安装工程量清单计价表
|
|
|
+ * @param hz 建筑/安装工程费用汇总表
|
|
|
+ * @param wbs 节点wbs编码
|
|
|
+ * @param nodes 节点名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static List<JkxlDetailFee> getBaseInfos(ImportExcel qd,ImportExcel hz,String[] wbs,String[] nodes){
|
|
|
+ List<JkxlDetailFee> fees = new ArrayList<>();
|
|
|
+ for(int i=0;i<wbs.length;i++){
|
|
|
+ JkxlDetailFee fee = getBaseInfo(qd,hz,wbs[i],nodes[i]);
|
|
|
+ if(fee != null){
|
|
|
+ fees.add(fee);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return fees;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *获取mainFee所有子节点基础数据,若无子节点则返回父节点基础数据。
|
|
|
+ *
|
|
|
+ * @param qd 清单计价表
|
|
|
+ * @param mainFee 父节点
|
|
|
+ * @param wbs 子节点wbs编码
|
|
|
+ * @param nodes 子节点名称
|
|
|
+ * @param type 节点归属,1:节点属于主要生产工程 2:节点属于辅助生产工程 3:与站址有关的单项工程
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static void getSubBaseInfos(ImportExcel qd,JkxlDetailFee mainFee,String mainNode,String[] wbs,String[] nodes,Integer type){
|
|
|
+ if(mainFee == null){
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+ String cornerMark = getNodeMark(qd,mainNode,2);
|
|
|
+ if(cornerMark==null){
|
|
|
+ throw new RuntimeException(getWrongMessage(qd));
|
|
|
+ }
|
|
|
+ List<String> subNodes = getSubNodes(qd,cornerMark,2,type);
|
|
|
+ List<String> leftNodes = new ArrayList<>(subNodes);
|
|
|
+ if(subNodes!=null&&subNodes.size()>0){
|
|
|
+// 这里用map处理是因为下文用了contain方法,防止出现多个结算书节点匹配上同一个标准节点名称,后者替换前者额情况出现
|
|
|
+ Map<Integer,JkxlDetailFee> map = new HashMap<>();
|
|
|
+ double totalSum = 0.00;
|
|
|
+ for(int i=0;i<subNodes.size();i++){
|
|
|
+ String node = subNodes.get(i);
|
|
|
+ for(int j=0;j<nodes.length;j++){
|
|
|
+ if(node.contains(nodes[j])){
|
|
|
+ JkxlDetailFee fee = map.get(j);
|
|
|
+ if(fee==null){
|
|
|
+ fee = new JkxlDetailFee(wbs[j]);
|
|
|
+ map.put(j,fee);
|
|
|
+ }
|
|
|
+ double[] doubles = ExcelUtil.getDoubleArray(qd,node,2,new int[]{12,13, 14, 15, 17});
|
|
|
+ fee.setOriginalTotalCost(DoubleUtil.add(fee.getOriginalTotalCost(),doubles[0]));
|
|
|
+ fee.setOriginalRgCost(DoubleUtil.add(fee.getOriginalRgCost(),doubles[1]));
|
|
|
+ fee.setOriginalCbrCost(DoubleUtil.add(fee.getOriginalCbrCost(),doubles[2]));
|
|
|
+ fee.setOriginalFbrCost(DoubleUtil.add(fee.getOriginalFbrCost(),doubles[3]));
|
|
|
+ fee.setOriginalJxCost(DoubleUtil.add(fee.getOriginalJxCost(),doubles[4]));
|
|
|
+ totalSum = DoubleUtil.add(totalSum,doubles[0]);
|
|
|
+ leftNodes.remove(node);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(map.isEmpty()){
|
|
|
+ throw new RuntimeException(getWrongMessage(qd));
|
|
|
+ }
|
|
|
+ List<JkxlDetailFee> subFees = new ArrayList<>();
|
|
|
+ for(JkxlDetailFee fee:map.values()){
|
|
|
+ subFees.add(fee);
|
|
|
+ }
|
|
|
+// 若结算书子节点存在与标准节点名对应不上的将值放入第一个节点
|
|
|
+ if(leftNodes.size()>0){
|
|
|
+ JkxlDetailFee firstSubFee = subFees.get(0);
|
|
|
+ for(int i=0;i< leftNodes.size();i++){
|
|
|
+ String node = leftNodes.get(i);
|
|
|
+ double[] doubles = ExcelUtil.getDoubleArray(qd,node,2,new int[]{12,13, 14, 15, 17});
|
|
|
+ firstSubFee.setOriginalTotalCost(DoubleUtil.add(firstSubFee.getOriginalTotalCost(),doubles[0]));
|
|
|
+ firstSubFee.setOriginalRgCost(DoubleUtil.add(firstSubFee.getOriginalRgCost(),doubles[1]));
|
|
|
+ firstSubFee.setOriginalCbrCost(DoubleUtil.add(firstSubFee.getOriginalCbrCost(),doubles[2]));
|
|
|
+ firstSubFee.setOriginalFbrCost(DoubleUtil.add(firstSubFee.getOriginalFbrCost(),doubles[3]));
|
|
|
+ firstSubFee.setOriginalJxCost(DoubleUtil.add(firstSubFee.getOriginalJxCost(),doubles[4]));
|
|
|
+ totalSum = DoubleUtil.add(totalSum,doubles[0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+// 子节点的直接工程费,用父节点直接工程费根据分部分项费用进行分摊,这里没有做子节点差额处理
|
|
|
+ for(int i=0;i<subFees.size();i++){
|
|
|
+ JkxlDetailFee fee = subFees.get(i);
|
|
|
+ fee.setZjgcFee(DoubleUtil.round2(mainFee.getZjgcFee()*fee.getOriginalTotalCost()/totalSum));
|
|
|
+ }
|
|
|
+ mainFee.setNodes(subFees);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *获取节点及其子节点基础数据,若无子节点则返回父节点基础数据。
|
|
|
+ *
|
|
|
+ * @param qd 清单计价表
|
|
|
+ * @param hz 汇总表
|
|
|
+ * @param wbs 父节点及其子节点wbs编码,其中父节点wbs放在第一个
|
|
|
+ * @param nodes 父节点及其子节点名称,其中父节点放在第一个
|
|
|
+ * @param type 节点归属,1:节点属于主要生产工程 2:节点属于辅助生产工程 3:与站址有关的单项工程
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getSubBaseInfos(ImportExcel qd,ImportExcel hz,String[] wbs,String[] nodes,Integer type){
|
|
|
+ JkxlDetailFee mainFee = getBaseInfo(qd,hz,wbs[0],nodes[0]);
|
|
|
+ if(mainFee == null){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ String[] subWbs = Arrays.copyOfRange(wbs,1,wbs.length);
|
|
|
+ String[] subNodes = Arrays.copyOfRange(nodes,1,nodes.length);
|
|
|
+ getSubBaseInfos(qd,mainFee,nodes[0],subWbs,subNodes,type);
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取建筑‘主要生产建筑’及其子节点基础数据
|
|
|
+ * @param jzqd 建筑工程量清单计价表
|
|
|
+ * @param jzhz 建筑工程汇总表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getZyscjz(ImportExcel jzqd, ImportExcel jzhz){
|
|
|
+ JkxlDetailFee mainFee = getSubBaseInfos(jzqd,jzhz,WBS_JZ_ZYSCJZ_HUI,NODE_JZ_ZYSCJZ_HUI,NODE_BELONG_ZY);
|
|
|
+ if(mainFee!=null){
|
|
|
+ List<JkxlDetailFee> subFees = mainFee.getNodes();
|
|
|
+ List<JkxlDetailFee> addFees = new ArrayList<>();
|
|
|
+ if(subFees!=null&&subFees.size()>0){
|
|
|
+ for(int i=0;i<subFees.size();i++){
|
|
|
+ JkxlDetailFee fee = subFees.get(i);
|
|
|
+ if(fee.getWbsCode().equals(MADE_WBS_JDQS)){
|
|
|
+ getSubBaseInfos(jzqd,fee,"继电器室",WBS_JZ_JDQS,NODE_JZ_JDQS,NODE_BELONG_ZY);
|
|
|
+ addFees.addAll(fee.getNodes());
|
|
|
+ subFees.remove(fee);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(fee.getWbsCode().equals(MADE_WBS_PDZZS)){
|
|
|
+ getSubBaseInfos(jzqd,fee,"配电装置室",WBS_JZ_PDZZS,NODE_JZ_PDZZS,NODE_BELONG_ZY);
|
|
|
+ addFees.addAll(fee.getNodes());
|
|
|
+ subFees.remove(fee);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ subFees.addAll(addFees);
|
|
|
+ }
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取建筑‘配电装置建筑’及其子节点基础数据
|
|
|
+ * @param jzqd 建筑工程量清单计价表
|
|
|
+ * @param jzhz 建筑工程汇总表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getPdzzjz(ImportExcel jzqd, ImportExcel jzhz){
|
|
|
+ JkxlDetailFee mainFee = getSubBaseInfos(jzqd,jzhz,WBS_JZ_PDZZJZ_HUI,NODE_JZ_PDZZJZ_HUI,NODE_BELONG_ZY);
|
|
|
+ if(mainFee!=null){
|
|
|
+ List<JkxlDetailFee> subFees = mainFee.getNodes();
|
|
|
+ if(subFees!=null&&subFees.size()>0){
|
|
|
+ List<JkxlDetailFee> addFees = new ArrayList<>();
|
|
|
+ for(int i=0;i<subFees.size();i++){
|
|
|
+ JkxlDetailFee fee = subFees.get(i);
|
|
|
+ if(fee.getWbsCode().equals("21121000")){
|
|
|
+ getSubBaseInfos(jzqd,fee,"主变压器系统",WBS_JZ_ZBYQXT,NODE_JZ_ZBYQXT,NODE_BELONG_ZY);
|
|
|
+ continue; //处理主变压器系统子节点
|
|
|
+ }
|
|
|
+ if(fee.getWbsCode().equals("2112B000")){
|
|
|
+ getSubBaseInfos(jzqd,fee,"高压电抗器系统",WBS_JZ_GYDKQXT,NODE_JZ_GYDKQXT,NODE_BELONG_ZY);
|
|
|
+ continue; //处理高压电抗器系统子节点
|
|
|
+ }
|
|
|
+ if(fee.getWbsCode().equals("2112C000")){
|
|
|
+ getSubBaseInfos(jzqd,fee,"串联补偿系统",WBS_JZ_CLBCXT,NODE_JZ_CLBCXT,NODE_BELONG_ZY);
|
|
|
+ continue; //处理串联补偿系统子节点
|
|
|
+ }
|
|
|
+ if(fee.getWbsCode().equals("2112G000")){
|
|
|
+ getSubBaseInfos(jzqd,fee,"静止无功补偿装置",WBS_JZ_JZWGBCZZ,NODE_JZ_JZWGBCZZ,NODE_BELONG_ZY);
|
|
|
+ continue; //处理静止无功补偿装置子节点
|
|
|
+ }
|
|
|
+ if(fee.getWbsCode().equals("2112H000")){
|
|
|
+ getSubBaseInfos(jzqd,fee,"站用变压器系统",WBS_JZ_ZYBYQXT,NODE_JZ_ZYBYQXT,NODE_BELONG_ZY);
|
|
|
+ continue; //处理站用变压器系统子节点
|
|
|
+ }
|
|
|
+ if(fee.getWbsCode().equals(MADE_WBS_GJJSBJC)){
|
|
|
+ getSubBaseInfos(jzqd,fee,"构架及设备基础",WBS_JZ_GJJSBJC,NODE_JZ_GJJSBJC,NODE_BELONG_ZY);
|
|
|
+ subFees.remove(fee);
|
|
|
+ addFees = gjjsbjcDeal(fee.getNodes()); //处理构架及设备基础
|
|
|
+ }
|
|
|
+ }
|
|
|
+ subFees.addAll(addFees);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取建筑‘与站址有关的单项工程’及其子节点基础数据
|
|
|
+ * @param jzqd 建筑工程量清单计价表
|
|
|
+ * @param jzhz 建筑工程汇总表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getDxgc(ImportExcel jzqd, ImportExcel jzhz){
|
|
|
+ JkxlDetailFee mainFee = getBaseInfo(jzqd,jzhz,WBS_JZ_DXGC_HUI[0],NODE_JZ_DXGC_HUI[0]);
|
|
|
+ if(mainFee!=null){
|
|
|
+ String[] subWbs = Arrays.copyOfRange(WBS_JZ_DXGC_HUI,1,WBS_JZ_DXGC_HUI.length);
|
|
|
+ String[] subNodes = Arrays.copyOfRange(NODE_JZ_DXGC_HUI,1,NODE_JZ_DXGC_HUI.length);
|
|
|
+ List<JkxlDetailFee> nodes = getBaseInfos(jzqd,jzhz,subWbs,subNodes);
|
|
|
+ mainFee.setNodes(nodes);
|
|
|
+ }
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取安装‘无功补偿’及其子节点基础数据
|
|
|
+ * @param azqd 安装工程量清单计价表
|
|
|
+ * @param azhz 安装工程汇总表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getWgbc(ImportExcel azqd, ImportExcel azhz){
|
|
|
+ JkxlDetailFee mainFee = getSubBaseInfos(azqd,azhz,WBS_AZ_WGBC_HUI,NODE_AZ_WGBC_HUI,NODE_BELONG_ZY);
|
|
|
+ if(mainFee!=null){
|
|
|
+ List<JkxlDetailFee> subFees = mainFee.getNodes();
|
|
|
+ if(subFees!=null&&subFees.size()>0){
|
|
|
+ for(int i=0;i<subFees.size();i++){
|
|
|
+ JkxlDetailFee fee = subFees.get(i);
|
|
|
+ if(fee.getWbsCode().equals("23131000")){
|
|
|
+ getSubBaseInfos(azqd,fee,"高压电抗器",WBS_AZ_GYDKQ,NODE_AZ_GYDKQ,NODE_BELONG_ZY);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(fee.getWbsCode().equals("23132000")){
|
|
|
+ getSubBaseInfos(azqd,fee,"串联补偿装置",WBS_AZ_CLBCZZ,NODE_AZ_CLBCZZ,NODE_BELONG_ZY);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取安装‘控制及直流系统’及其子节点基础数据
|
|
|
+ * @param azqd 安装工程量清单计价表
|
|
|
+ * @param azhz 安装工程汇总表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getKzzl(ImportExcel azqd, ImportExcel azhz){
|
|
|
+ JkxlDetailFee mainFee = getSubBaseInfos(azqd,azhz,WBS_AZ_KZZL_HUI,NODE_AZ_KZZL_HUI,NODE_BELONG_ZY);
|
|
|
+ if(mainFee!=null){
|
|
|
+ List<JkxlDetailFee> subFees = mainFee.getNodes();
|
|
|
+ int index = -1;
|
|
|
+ if(subFees!=null&&subFees.size()>0){
|
|
|
+ for(int i=0;i<subFees.size();i++){
|
|
|
+ JkxlDetailFee fee = subFees.get(i);
|
|
|
+ if(fee.getWbsCode().equals(MADE_WBS_KZZL)){
|
|
|
+ index = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+// 表示结算书有额外的节点“辅助设备与设施”
|
|
|
+ if(index != -1){
|
|
|
+ JkxlDetailFee extraFee = subFees.get(index);
|
|
|
+ subFees.remove(index);
|
|
|
+// 如果只有这个额外节点,就把数据放在“在线监测系统”
|
|
|
+ if(subFees.size()==0){
|
|
|
+ JkxlDetailFee fee = new JkxlDetailFee("23145000");
|
|
|
+ subFees.add(fee);
|
|
|
+ }
|
|
|
+ JkxlDetailFee addedFee = subFees.get(0);
|
|
|
+ addedFee.setOriginalTotalCost(DoubleUtil.add(addedFee.getOriginalTotalCost(),extraFee.getOriginalTotalCost()));
|
|
|
+ addedFee.setOriginalRgCost(DoubleUtil.add(addedFee.getOriginalRgCost(),extraFee.getOriginalRgCost()));
|
|
|
+ addedFee.setOriginalCbrCost(DoubleUtil.add(addedFee.getOriginalCbrCost(),extraFee.getOriginalCbrCost()));
|
|
|
+ addedFee.setOriginalFbrCost(DoubleUtil.add(addedFee.getOriginalFbrCost(),extraFee.getOriginalFbrCost()));
|
|
|
+ addedFee.setOriginalJxCost(DoubleUtil.add(addedFee.getOriginalJxCost(),extraFee.getOriginalJxCost()));
|
|
|
+ addedFee.setZjgcFee(DoubleUtil.add(addedFee.getZjgcFee(),extraFee.getZjgcFee()));
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ throw new RuntimeException(getWrongMessage(azqd));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取安装‘无功补偿’及其子节点基础数据
|
|
|
+ * @param azqd 安装工程量清单计价表
|
|
|
+ * @param azhz 安装工程汇总表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getDljjd(ImportExcel azqd, ImportExcel azhz){
|
|
|
+ JkxlDetailFee mainFee = getSubBaseInfos(azqd,azhz,WBS_AZ_DLJJD_HUI,NODE_AZ_DLJJD_HUI,NODE_BELONG_ZY);
|
|
|
+ if(mainFee!=null){
|
|
|
+ List<JkxlDetailFee> subFees = mainFee.getNodes();
|
|
|
+ if(subFees!=null&&subFees.size()>0){
|
|
|
+ for(int i=0;i<subFees.size();i++){
|
|
|
+ JkxlDetailFee fee = subFees.get(i);
|
|
|
+ if(fee.getWbsCode().equals("23161000")){
|
|
|
+ getSubBaseInfos(azqd,fee,"全站电缆",WBS_AZ_QZDL,NODE_AZ_QZDL,NODE_BELONG_ZY);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 获取安装‘辅助生产工程’及其子节点基础数据
|
|
|
+ * @param jzqd 建筑工程量清单计价表
|
|
|
+ * @param jzhz 建筑工程汇总表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JkxlDetailFee getFzscgc(ImportExcel jzqd, ImportExcel jzhz){
|
|
|
+ JkxlDetailFee mainFee = getBaseInfo(jzqd,jzhz,WBS_AZ_FZSCGC_HUI[0],NODE_AZ_FZSCGC_HUI[0]);
|
|
|
+ if(mainFee!=null){
|
|
|
+ String[] subWbs = Arrays.copyOfRange(WBS_AZ_FZSCGC_HUI,1,WBS_AZ_FZSCGC_HUI.length);
|
|
|
+ String[] subNodes = Arrays.copyOfRange(NODE_AZ_FZSCGC_HUI,1,NODE_AZ_FZSCGC_HUI.length);
|
|
|
+ List<JkxlDetailFee> nodes = getBaseInfos(jzqd,jzhz,subWbs,subNodes);
|
|
|
+ mainFee.setNodes(nodes);
|
|
|
+ }
|
|
|
+ return mainFee;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ’配电装置建筑-构架及设备基础‘专用的数据处理方法
|
|
|
+ * @param list 构架及设备基础子节点列表
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static List<JkxlDetailFee> gjjsbjcDeal(List<JkxlDetailFee> list){
|
|
|
+ Map<String,JkxlDetailFee> map = new HashMap<>();
|
|
|
+ if(list==null||list.size()==0){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ for(int i = 0;i<list.size();i++){
|
|
|
+ JkxlDetailFee fee = list.get(i);
|
|
|
+ String wbs = fee.getWbsCode();
|
|
|
+ String supWbs = wbs.substring(0,5)+"000";
|
|
|
+ JkxlDetailFee supFee = map.get(supWbs);
|
|
|
+ if(supFee==null){
|
|
|
+ supFee = new JkxlDetailFee(supWbs);
|
|
|
+ map.put(supWbs,supFee);
|
|
|
+ }
|
|
|
+ supFee.setOriginalTotalCost(DoubleUtil.add(supFee.getOriginalTotalCost(),fee.getOriginalTotalCost()));
|
|
|
+ supFee.setZjgcFee(DoubleUtil.add(supFee.getZjgcFee(),fee.getZjgcFee()));
|
|
|
+ supFee.setOriginalRgCost(DoubleUtil.add(supFee.getOriginalRgCost(),fee.getOriginalRgCost()));
|
|
|
+ supFee.setOriginalCbrCost(DoubleUtil.add(supFee.getOriginalCbrCost(),fee.getOriginalCbrCost()));
|
|
|
+ supFee.setOriginalFbrCost(DoubleUtil.add(supFee.getOriginalFbrCost(),fee.getOriginalFbrCost()));
|
|
|
+ supFee.setOriginalJxCost(DoubleUtil.add(supFee.getOriginalJxCost(),fee.getOriginalJxCost()));
|
|
|
+ List<JkxlDetailFee> subNodes = supFee.getNodes();
|
|
|
+ if(subNodes==null){
|
|
|
+ subNodes = new ArrayList<>();
|
|
|
+ supFee.setNodes(subNodes);
|
|
|
+ }
|
|
|
+ subNodes.add(fee);
|
|
|
+ }
|
|
|
+ List<JkxlDetailFee> fees = new ArrayList<>();
|
|
|
+ for(JkxlDetailFee fee:map.values()){
|
|
|
+ fees.add(fee);
|
|
|
+ }
|
|
|
+ return fees;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据角标返回子节点名称列表
|
|
|
+ * @param excel
|
|
|
+ * @param mark 角标
|
|
|
+ * @param column 在页签第column列查找子节点
|
|
|
+ * @param type 子节点归属,1:主要生产工程 2:辅助生产工程 3:与站址有关的单项工程
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static List<String> getSubNodes(ImportExcel excel,String mark,int column,int type){
|
|
|
+
|
|
|
+ int startRow = 0;
|
|
|
+ int lastRow = excel.getLastDataRowNum();
|
|
|
+ if(type==NODE_BELONG_ZY) {
|
|
|
+ for (int i = 0; i < lastRow; i++) {
|
|
|
+ String name = excel.getValue(i + 1, column);
|
|
|
+ if (name.contains("辅助生产工程")) {
|
|
|
+ lastRow = i + 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(lastRow == excel.getLastDataRowNum()){
|
|
|
+ for (int i = 0; i < lastRow; i++) {
|
|
|
+ String name = excel.getValue(i + 1, column);
|
|
|
+ if (name.contains("与站址有关的单项工程")) {
|
|
|
+ lastRow = i + 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(type==NODE_BELONG_FZ){
|
|
|
+ for (int i = 0; i < lastRow; i++) {
|
|
|
+ String name = excel.getValue(i + 1, column);
|
|
|
+ if (name.contains("辅助生产工程")) {
|
|
|
+ startRow = i + 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (int i = 0; i < lastRow; i++) {
|
|
|
+ String name = excel.getValue(i + 1, column);
|
|
|
+ if (name.contains("与站址有关的单项工程")) {
|
|
|
+ lastRow = i + 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(type==NODE_BELONG_DX){
|
|
|
+ for (int i = 0; i < lastRow; i++) {
|
|
|
+ String name = excel.getValue(i + 1, column);
|
|
|
+ if (name.contains("与站址有关的单项工程")) {
|
|
|
+ startRow = i + 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> subNodes = new ArrayList<>();
|
|
|
+ for(int i=startRow;i<lastRow;i++){
|
|
|
+ String name = excel.getValue(i+1,column);
|
|
|
+ String subNodeMark = getMark(name);
|
|
|
+// 判断角标存在、以父角标开头、在父角标后紧跟一个.且这个.是最后一个、最后一个.后面还有数字
|
|
|
+ if(subNodeMark!=null&&subNodeMark.startsWith(mark)&&subNodeMark.lastIndexOf(".")==mark.length()&&subNodeMark.length()>(mark.length()+1)){
|
|
|
+ subNodes.add(name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return subNodes;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取角标,此角标为在字符串开头的正则为//d|//.的子字符串
|
|
|
+ * @param node
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getMark(String node){
|
|
|
+ if(node != null){
|
|
|
+ Pattern pattern = Pattern.compile(MARK_EXP);
|
|
|
+ Matcher matcher = pattern.matcher(node);
|
|
|
+ if(matcher.find()){
|
|
|
+ String mark = matcher.group();
|
|
|
+ if(node.trim().startsWith(mark)){
|
|
|
+ return mark;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取节点角标,若数据不符合规范,找不到角标则返回null
|
|
|
+ *
|
|
|
+ * @param excel 结算书
|
|
|
+ * @param nodeName 查找节点名称
|
|
|
+ * @param column 查找列
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getNodeMark(ImportExcel excel,String nodeName,int column){
|
|
|
+ int lastRow = excel.getLastDataRowNum();
|
|
|
+ String mark = null;
|
|
|
+ for(int i=0;i<lastRow;i++){
|
|
|
+ String name = excel.getValue(i+1,column);
|
|
|
+ if(name.equals("")){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(name.contains(nodeName)){
|
|
|
+ Pattern pattern = Pattern.compile(MARK_EXP);
|
|
|
+ Matcher matcher = pattern.matcher(name);
|
|
|
+ if(matcher.find()){
|
|
|
+ String str = matcher.group();
|
|
|
+ if(name.trim().startsWith(str)){
|
|
|
+ mark = str;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return mark;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成错误信息
|
|
|
+ * @param excel 结算书页签
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getWrongMessage(ImportExcel excel){
|
|
|
+ if(excel != null){
|
|
|
+ return "《"+ImportExcel.getSheet(excel).getSheetName()+"》数据不规范!";
|
|
|
+ }else{
|
|
|
+ return "变电站数据处理错误!";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|