Sfoglia il codice sorgente

1.重寫分攤邏輯保證分攤金額和無差額
2.修改導出成果文件代碼,修正變電站類型因無第七層節點而導致導出錯誤
3.修改查找子節點方法的報錯內容

chengqiang 4 anni fa
parent
commit
2047ac43c0

+ 1 - 0
src/main/java/com/jeeplus/modules/sg/overheadline/mapper/xml/OverheadLineMapper.xml

@@ -64,6 +64,7 @@
 		 a.id as wbsId,
          a.project_id as projectId,
          a.describe,
+		 a.parent_node as parentNode,
          a.level as hierarchy,
          a.short_id as wbsCode,
          a.subject_allocate as subjectAllocate,

+ 506 - 204
src/main/java/com/jeeplus/modules/sg/overheadline/service/OverheadLineService.java

@@ -8,6 +8,7 @@ import com.jeeplus.modules.sg.overheadline.entity.Settlement;
 import com.jeeplus.modules.sg.overheadline.entity.WbsProject;
 import com.jeeplus.modules.sg.overheadline.mapper.OverheadLineMapper;
 import com.jeeplus.modules.sg.overheadline.util.BashInfo;
+import com.jeeplus.modules.sg.overheadline.util.DetailFeeUtil;
 import com.jeeplus.modules.sg.overheadline.util.DoubleUtil;
 import com.jeeplus.modules.sg.overheadline.util.SettementUtil;
 import com.jeeplus.modules.sg.project.entity.WbsItem;
@@ -49,12 +50,12 @@ public class OverheadLineService {
      * @return
      */
     public List<JkxlDetailFee> findList(String id,String type){
-        List<JkxlDetailFee> list = overheadLineMapper.findList(id,type);
+        List<JkxlDetailFee> oriList = overheadLineMapper.findList(id,type);
+//        获取调整金额
         double integrityFee = 0.00; //诚信扣款
         double decFund = 0.00;//甲供材超供抵扣款
         double texDeal = 0.00;//税金处理
         double totalDeal = 0.00;//需处理税金与甲供材抵扣款和
-    //    WbsItem wbsItem = itemService.getState(id);
         WbsItem wbsItem = itemService.get(id);
         if(wbsItem != null){
             if(wbsItem.getIntegrityFee() != null){
@@ -66,342 +67,643 @@ public class OverheadLineService {
             if(wbsItem.getTexDeal() != null){
                 texDeal = wbsItem.getTexDeal();
             }
-            totalDeal = decFund + texDeal;
+            totalDeal = DoubleUtil.add(decFund,texDeal);
         }
 
-//        根据节点编码特征判断阶段费用类型为“建筑费”、“安装费”或者“其他费用”,并设置
-        for(JkxlDetailFee jkxlDetailFee : list){
-            double totalFee  = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
-            //建筑
-            if(jkxlDetailFee.getWbsCode().substring(0,2).equals("21") || jkxlDetailFee.getWbsCode().substring(0,3).equals("491")){
-                jkxlDetailFee.setJzFee(totalFee);
-            }
-            //安装
-            if(jkxlDetailFee.getWbsCode().substring(0,2).equals("23") || jkxlDetailFee.getWbsCode().substring(0,3).equals("493") || jkxlDetailFee.getWbsCode().substring(0,2).equals("39")){
-                jkxlDetailFee.setAzFee(totalFee);
-            }
-            //其他费用
-            if(jkxlDetailFee.getTotalFee() != null && jkxlDetailFee.getFeeType().equals("0")){
-                double qtFee = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
-                jkxlDetailFee.setQtFee(qtFee);
-            }
-
-        }
-        double jz1 = 0.00;
-        double az1 = 0.00;
-        double jz2 = 0.00;
-        double az2 = 0.00;
+        double jz1 = 0.00;//调整前建筑费合计
+        double az1 = 0.00;//调整前安装费合计
+        double jz2 = 0.00;//调整后建筑费合计
+        double az2 = 0.00;//调整后安装费合计
         double qtTotal = 0.00;
         //变电站导出
         if(type.equals(BashInfo.PROJECT_BDZ)) {
-//            根据totalFee进行分摊,分摊至最后剩下的 找一个最低层级wbs扣减,并逐层扣减上级wbs
-            String lastShareWbs = null;
-            for (JkxlDetailFee jkxlDetailFee : list) {
-                Double totalFee = jkxlDetailFee.getTotalFee();
-                //建筑费和
-                if (jkxlDetailFee.getWbsCode().equals("21000000")) {
-                    jz1 = totalFee!=null? jkxlDetailFee.getTotalFee():0.00;
-                    jz2 = jkxlDetailFee.getJzFee()!=null? jkxlDetailFee.getJzFee():0.00;
+            List<JkxlDetailFee> list = new ArrayList<>();
+            JkxlDetailFee bdzFee = null;
+            double bdzTotal = 0.00;
+            for(JkxlDetailFee fee:oriList){
+                String feeType = fee.getFeeType();
+                Double totalFee = fee.getTotalFee();
+                //        获取totalFee不为0的本体节点
+                if(feeType.equals("1")&&totalFee!=null&&totalFee!=0.00){
+                    list.add(fee);
                 }
-                //安装费和
-                if (jkxlDetailFee.getWbsCode().equals("23000000")) {
-                    az1 = totalFee!=null? jkxlDetailFee.getTotalFee():0.00;
-                    az2 = jkxlDetailFee.getAzFee()!=null? jkxlDetailFee.getAzFee():0.00;
+                //找到变电站节点
+                if(fee.getWbsCode().equals("20000000")){
+                    bdzFee = fee;
                 }
-                //其他费用和
-                if (jkxlDetailFee.getFeeType().equals("0")&& totalFee != null) {
-                    qtTotal += totalFee;
+                //获取变电站总费用
+                if (fee.getWbsCode().equals("21000000")||fee.getWbsCode().equals("23000000")) {
+                    bdzTotal = DoubleUtil.add(totalFee,bdzTotal);
                 }
-//                wbs简明表示8位,最低层次wbs最后两位为0
-                String six = jkxlDetailFee.getWbsCode().substring(5,6);
-                if(lastShareWbs==null && jkxlDetailFee.getFeeType().equals("1")&&!six.equals("0")&&totalFee!=null&&totalFee!=0.00){
-                    lastShareWbs = jkxlDetailFee.getWbsCode();
+                //其他费用和
+                if (fee.getFeeType().equals("0")&& totalFee != null) {
+                    qtTotal = DoubleUtil.add(qtTotal,totalFee);
                 }
-
             }
+//            将变电站节点加入到list
+            bdzFee.setTotalFee(bdzTotal);
+            list.add(bdzFee);
 
             if(totalDeal!=0.00){
-                double totalJzShare = DoubleUtil.round2(totalDeal*jz1/(jz1+az1));
-                double totalAzShare = DoubleUtil.round2(totalDeal*az1/(jz1+az1));
-                //实际分摊金额与需分摊金额是否有差额
-                double diff = DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)));
-                //实际分摊与需分摊存在差额情况下 将差额分配的wbs节点及其父节点
-                String wbs1 = null;
-                String wbs2 = null;
-                String wbs3 = null;
-                String wbs4 = null;
-                if(diff != 0.00&&lastShareWbs!=null){
-                    wbs1 = lastShareWbs.substring(0,2)+"000000";
-                    wbs2 = lastShareWbs.substring(0,3)+"00000";
-                    wbs3 = lastShareWbs.substring(0,4)+"0000";
-                    wbs4 = lastShareWbs.substring(0,5)+"000";
-                }
-                //根据合计分摊至本体部分 看代码jz1=jz2 az1=az2不知道为什么要分开。
-                for(JkxlDetailFee jkxlDetailFee:list){
-                    String wbs = jkxlDetailFee.getWbsCode();
-                    Double totalFee = jkxlDetailFee.getTotalFee();
-                    if(wbs.startsWith("21")&&totalFee!=null&&totalFee!=0.00){
-                        double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
-                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
-                        jkxlDetailFee.setJzFee((DoubleUtil.sub(totalFee,share)));
-                    }
-                    if(wbs.startsWith("23")&&totalFee!=null&&totalFee!=0.00){
-                        double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
-                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
-                        jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,share));
-                    }
-                    if(diff!=0.00&&lastShareWbs!=null){
-                        if(wbs.equals(wbs1)||wbs.equals(wbs2)||wbs.equals(wbs3)||wbs.equals(wbs4)||wbs.equals(lastShareWbs)){
-                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(jkxlDetailFee.getTotalFee(),diff));
-                            if(lastShareWbs.startsWith("21")){
-                                jkxlDetailFee.setJzFee(DoubleUtil.sub(jkxlDetailFee.getJzFee(),diff));
-                            }else{
-                                jkxlDetailFee.setAzFee(DoubleUtil.sub(jkxlDetailFee.getAzFee(),diff));
-                            }
-                        }
-
-                    }else if(diff!=0.00&& lastShareWbs==null){
-                        if(jz1>0.00){
-                            lastShareWbs = "21000000";
-                        }else{
-                            lastShareWbs = "23000000";
-                        }
-                    }
-
+                JkxlDetailFee topFee = DetailFeeUtil.getTree(list);
+//                分摊金额
+                DetailFeeUtil.shareByTotal(topFee,-totalDeal);
+                DetailFeeUtil.dealBaseInfo(topFee);
+            }
+            for(JkxlDetailFee fee:list){
+                String wbs = fee.getWbsCode();
+                Double totalFee = fee.getTotalFee();
+                if(wbs.equals("21000000")){
+                    jz2 = totalFee;
                 }
-                if(lastShareWbs.startsWith("21")){
-                    totalJzShare = DoubleUtil.add(totalJzShare,diff);
-                }else{
-                    totalAzShare = DoubleUtil.add(totalAzShare,diff);
+                if(wbs.equals("23000000")){
+                    az2 = totalFee;
                 }
-                jz1 = DoubleUtil.sub(jz1,totalJzShare);
-                jz2 = DoubleUtil.sub(jz2,totalJzShare);
-                az1 = DoubleUtil.sub(az1,totalAzShare);
-                az2 = DoubleUtil.sub(az2,totalAzShare);
             }
 
-
-            qtTotal = qtTotal + integrityFee;
-            for (JkxlDetailFee jkxlDetailFee : list) {
-                //WBS首层数据
+            qtTotal = DoubleUtil.add(qtTotal,integrityFee);
+            for (JkxlDetailFee jkxlDetailFee : oriList) {
+                //WBS变电站合计
                 if(jkxlDetailFee.getWbsCode().equals("20000000")){
                     jkxlDetailFee.setJzFee(jz2);
                     jkxlDetailFee.setAzFee(az2);
-                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
+                    jkxlDetailFee.setTotalFee(DoubleUtil.add(jz2,az2,qtTotal));
                     jkxlDetailFee.setQtFee(qtTotal);
                 }
-                //WBS变电站合计
+                //WBS首层数据
                 if(jkxlDetailFee.getWbsCode().equals("10000000")){
                     jkxlDetailFee.setJzFee(jz2);
                     jkxlDetailFee.setAzFee(az2);
-                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
+                    jkxlDetailFee.setTotalFee(DoubleUtil.add(jz2,az2,qtTotal));
                     jkxlDetailFee.setQtFee(qtTotal);
                 }
                 //WBS变电站其他费用合计
                 if(jkxlDetailFee.getWbsCode().equals("24000000")){
                     jkxlDetailFee.setTotalFee(qtTotal);
-                    jkxlDetailFee.setQtFee(qtTotal);
                 }
                 //WBS变电站工程结算审核费(诚信扣款)
                 if(jkxlDetailFee.getWbsCode().equals("24260000")){
                     jkxlDetailFee.setTotalFee(integrityFee);
-                    jkxlDetailFee.setQtFee(integrityFee);
                 }
             }
         }
         //电缆导出
         if(type.equals(BashInfo.PROJECT_DLXL)){
-            for (JkxlDetailFee jkxlDetailFee : list) {
-                String wbs = jkxlDetailFee.getWbsCode().substring(0,3);
-                String wbs1 = jkxlDetailFee.getWbsCode().substring(3,4);
+            for (JkxlDetailFee fee : oriList) {
+                String wbs = fee.getWbsCode().substring(0,3);
+                String wbs1 = fee.getWbsCode().substring(3,4);
+                Double totalFee = fee.getTotalFee();
                 //建筑和
                 if(wbs.equals("491") && !wbs1.equals("0")){
-                    jz1 += jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
-                    jz2 += jkxlDetailFee.getJzFee()!=null? jkxlDetailFee.getJzFee():0.00;
+                    jz1 = DoubleUtil.add(jz1,totalFee);
                 }
                 //安装和
                 if(wbs.equals("493") && !wbs1.equals("0")){
-                    az1 += jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
-                    az2 += jkxlDetailFee.getAzFee()!=null? jkxlDetailFee.getAzFee():0.00;
+                    az1 = DoubleUtil.add(az1,totalFee);
                 }
                 //其他费用和
-                if (jkxlDetailFee.getFeeType().equals("0")&& jkxlDetailFee.getTotalFee() != null) {
-                    qtTotal += jkxlDetailFee.getTotalFee();
+                if (fee.getFeeType().equals("0")&& totalFee != null) {
+                    qtTotal = DoubleUtil.add(qtTotal,totalFee);
                 }
             }
 
+            double totalJzShare = 0.00;
+            double totalAzShare = 0.00;
             //处理税金和甲供材超供抵扣款
             if(totalDeal!=0.00){
-                double totalJzShare = 0.00;
-                double totalAzShare = 0.00;
                 //根据合计分摊至本体部分 看代码jz1=jz2 az1=az2不知道为什么要分开。
-                for(JkxlDetailFee jkxlDetailFee:list){
-                    String wbs = jkxlDetailFee.getWbsCode().substring(0,3);
-                    String wbs1 = jkxlDetailFee.getWbsCode().substring(3,4);
-                    Double totalFee = jkxlDetailFee.getTotalFee();
+                for(JkxlDetailFee fee:oriList){
+                    String wbs = fee.getWbsCode().substring(0,3);
+                    String wbs1 = fee.getWbsCode().substring(3,4);
+                    Double totalFee = fee.getTotalFee();
                     if(wbs.equals("491") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
                         double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
-                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
-                        jkxlDetailFee.setJzFee((DoubleUtil.sub(totalFee,share)));
+                        fee.setTotalFee(DoubleUtil.sub(totalFee,share));
+                        fee.setJzFee((DoubleUtil.sub(totalFee,share)));
                         totalJzShare = DoubleUtil.add(totalJzShare,share);
                     }
                     if(wbs.equals("493") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
                         double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
-                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
-                        jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,share));
+                        fee.setTotalFee(DoubleUtil.sub(totalFee,share));
+                        fee.setAzFee(DoubleUtil.sub(totalFee,share));
                         totalAzShare = DoubleUtil.add(totalAzShare,share);
                     }
 
                 }
                 //将分摊后的差额放入第一个分部分项
                 if(totalDeal!=(totalJzShare+totalAzShare)){
-                    for(JkxlDetailFee jkxlDetailFee:list){
-                        String wbs = jkxlDetailFee.getWbsCode().substring(0,3);
-                        String wbs1 = jkxlDetailFee.getWbsCode().substring(3,4);
-                        Double totalFee = jkxlDetailFee.getTotalFee();
+                    for(JkxlDetailFee fee:oriList){
+                        String wbs = fee.getWbsCode().substring(0,3);
+                        String wbs1 = fee.getWbsCode().substring(3,4);
+                        Double totalFee = fee.getTotalFee();
                         if(wbs.equals("491") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
-                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
-                            jkxlDetailFee.setJzFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
-                            totalJzShare = DoubleUtil.add(totalJzShare,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare))));
+                            fee.setTotalFee(DoubleUtil.add(totalFee,-totalDeal,totalJzShare,totalAzShare));//totalFee-(totalDeal-(totalJzShare+totalAzShare))
+                            fee.setJzFee(DoubleUtil.add(totalFee,-totalDeal,totalJzShare,totalAzShare));
+                            totalJzShare = DoubleUtil.add(totalDeal,-totalAzShare);//totalJzShare+(totalDeal-(totalJzShare+totalAzShare)
                             break;
                         }
                         if(wbs.equals("493") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
-                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
-                            jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
-                            totalAzShare = DoubleUtil.add(totalAzShare,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare))));
+                            fee.setTotalFee(DoubleUtil.add(totalFee,-totalDeal,totalJzShare,totalAzShare));
+                            fee.setAzFee(DoubleUtil.add(totalFee,-totalDeal,totalJzShare,totalAzShare));
+                            totalAzShare = DoubleUtil.add(totalDeal,-totalJzShare);
                             break;
                         }
 
                     }
                 }
-                jz1 = DoubleUtil.sub(jz1,totalJzShare);
-                jz2 = DoubleUtil.sub(jz2,totalJzShare);
-                az1 = DoubleUtil.sub(az1,totalAzShare);
-                az2 = DoubleUtil.sub(az2,totalAzShare);
             }
+            jz2 = DoubleUtil.sub(jz1,totalJzShare);
+            az2 = DoubleUtil.sub(az1,totalAzShare);
 
             //诚信扣款
-            qtTotal = qtTotal + integrityFee;
-            for (JkxlDetailFee jkxlDetailFee : list) {
+            qtTotal = DoubleUtil.add(qtTotal,integrityFee);
+            for (JkxlDetailFee fee : oriList) {
                 //WBS电缆和
-                if(jkxlDetailFee.getWbsCode().equals("40000000")){
-                    jkxlDetailFee.setJzFee(jz2);
-                    jkxlDetailFee.setAzFee(az2);
-                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
-                    jkxlDetailFee.setQtFee(qtTotal);
+                if(fee.getWbsCode().equals("40000000")){
+                    fee.setJzFee(jz2);
+                    fee.setAzFee(az2);
+                    fee.setTotalFee(DoubleUtil.add(jz2,az2,qtTotal));
+                    fee.setQtFee(qtTotal);
                 }
                 //WBS首层
-                if(jkxlDetailFee.getWbsCode().equals("10000000")){
-                    jkxlDetailFee.setJzFee(jz2);
-                    jkxlDetailFee.setAzFee(az2);
-                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
-                    jkxlDetailFee.setQtFee(qtTotal);
+                if(fee.getWbsCode().equals("10000000")){
+                    fee.setJzFee(jz2);
+                    fee.setAzFee(az2);
+                    fee.setTotalFee(DoubleUtil.add(jz2,az2,qtTotal));
+                    fee.setQtFee(qtTotal);
                 }
                 //WBS电缆建筑
-                if(jkxlDetailFee.getWbsCode().equals("49100000")){
-                    jkxlDetailFee.setTotalFee(jz1);
-                    jkxlDetailFee.setJzFee(jz2);
+                if(fee.getWbsCode().equals("49100000")){
+                    fee.setTotalFee(jz2);
                 }
                 //WBS电缆安装
-                if(jkxlDetailFee.getWbsCode().equals("49300000")){
-                    jkxlDetailFee.setTotalFee(az1);
-                    jkxlDetailFee.setAzFee(az2);
-
+                if(fee.getWbsCode().equals("49300000")){
+                    fee.setTotalFee(az2);
                 }
                 //WBS电缆本体工程
-                if(jkxlDetailFee.getWbsCode().equals("49000000")){
-                    jkxlDetailFee.setJzFee(jz2);
-                    jkxlDetailFee.setAzFee(az2);
-                    jkxlDetailFee.setTotalFee(jz1+az1);
+                if(fee.getWbsCode().equals("49000000")){
+                    fee.setJzFee(jz2);
+                    fee.setAzFee(az2);
+                    fee.setTotalFee(DoubleUtil.add(jz2,az2));
                 }
                 //WBS电缆其他费用
-                if(jkxlDetailFee.getWbsCode().equals("44000000")){
-                    jkxlDetailFee.setTotalFee(qtTotal);
-                    jkxlDetailFee.setQtFee(qtTotal);
+                if(fee.getWbsCode().equals("44000000")){
+                    fee.setTotalFee(qtTotal);
                 }
                 //诚信扣款
-                if(jkxlDetailFee.getWbsCode().equals("44260000")){
-                    jkxlDetailFee.setTotalFee(integrityFee);
-                    jkxlDetailFee.setQtFee(integrityFee);
+                if(fee.getWbsCode().equals("44260000")){
+                    fee.setTotalFee(integrityFee);
                 }
             }
 
         }
         //架空导出
         if(type.equals(BashInfo.PROJECT_JKXL)) {
-            for (JkxlDetailFee jkxlDetailFee : list) {
+            for (JkxlDetailFee fee : oriList) {
+                Double totalFee = fee.getTotalFee();
                 //本体费用求和
-                if (jkxlDetailFee.getFeeType().equals("1")&& jkxlDetailFee.getTotalFee() != null) {
-                    az1 += jkxlDetailFee.getTotalFee();
+                if (fee.getFeeType().equals("1")) {
+                    az1 = DoubleUtil.add(az1,totalFee);
                 }
                 //其他费用求和
-                if (jkxlDetailFee.getFeeType().equals("0")&& jkxlDetailFee.getTotalFee() != null) {
-                    qtTotal += jkxlDetailFee.getTotalFee();
+                if (fee.getFeeType().equals("0")) {
+                    qtTotal = DoubleUtil.add(qtTotal,totalFee);
                 }
             }
-
             //处理税金和甲供材超供抵扣款
             if(totalDeal!=0.00){
                 double totalShare = 0.00;
                 //根据合计分摊至本体部分
-                for(JkxlDetailFee jkxlDetailFee:list){
+                for(JkxlDetailFee jkxlDetailFee:oriList){
                     Double totalFee = jkxlDetailFee.getTotalFee();
                     if(jkxlDetailFee.getFeeType().equals("1") && totalFee != null && totalFee!=0.00){
                         double share = DoubleUtil.round2(totalDeal*totalFee/az1);
                         jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
-                        jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,share));
                         totalShare = DoubleUtil.add(totalShare,share);
                     }
                 }
                 //将分摊后的差额放入第一个分部分项
                 if(totalDeal!=totalShare){
-                    for(JkxlDetailFee jkxlDetailFee:list){
+                    for(JkxlDetailFee jkxlDetailFee:oriList){
                         Double totalFee = jkxlDetailFee.getTotalFee();
                         if(jkxlDetailFee.getFeeType().equals("1") && totalFee != null && totalFee!=0.00){
-                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,totalShare)));
-                            jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,totalShare)));
+                            jkxlDetailFee.setTotalFee(DoubleUtil.add(totalFee,-totalDeal,totalShare));//totalFee-(totalDeal-totalShare)
                             break;
                         }
                     }
                 }
-                az1 = DoubleUtil.sub(az1,totalDeal);
             }
-
-            qtTotal = qtTotal + integrityFee;
-            for (JkxlDetailFee jkxlDetailFee : list) {
+            az2 = DoubleUtil.sub(az1,totalDeal);
+            qtTotal = DoubleUtil.add(qtTotal,integrityFee);
+            for (JkxlDetailFee fee : oriList) {
                 //WBS架空合计
-                if(jkxlDetailFee.getWbsCode().equals("30000000")){
-                    jkxlDetailFee.setTotalFee(az1+qtTotal);
-                    jkxlDetailFee.setAzFee(az1);
-                    jkxlDetailFee.setQtFee(qtTotal);
+                if(fee.getWbsCode().equals("30000000")){
+                    fee.setTotalFee(DoubleUtil.add(az2,qtTotal));
+                    fee.setAzFee(az2);
+                    fee.setQtFee(qtTotal);
                 }
                 //WBS首层
-                if(jkxlDetailFee.getWbsCode().equals("10000000")){
-                    jkxlDetailFee.setTotalFee(az1+qtTotal);
-                    jkxlDetailFee.setAzFee(az1);
-                    jkxlDetailFee.setQtFee(qtTotal);
+                if(fee.getWbsCode().equals("10000000")){
+                    fee.setTotalFee(DoubleUtil.add(az2,qtTotal));
+                    fee.setAzFee(az2);
+                    fee.setQtFee(qtTotal);
                 }
                 //WBS架空本体工程
-                if(jkxlDetailFee.getWbsCode().equals("39000000")){
-                    jkxlDetailFee.setTotalFee(az1);
-                    jkxlDetailFee.setAzFee(az1);
+                if(fee.getWbsCode().equals("39000000")){
+                    fee.setTotalFee(az2);
                 }
                 //WBS架空其他费用
-                if(jkxlDetailFee.getWbsCode().equals("34000000")){
-                    jkxlDetailFee.setTotalFee(qtTotal);
-                    jkxlDetailFee.setQtFee(qtTotal);
+                if(fee.getWbsCode().equals("34000000")){
+                    fee.setTotalFee(qtTotal);
                 }
                 //WBS架空诚信扣款
-                if(jkxlDetailFee.getWbsCode().equals("34260000")){
-                    jkxlDetailFee.setTotalFee(integrityFee);
-                    jkxlDetailFee.setQtFee(integrityFee);
+                if(fee.getWbsCode().equals("34260000")){
+                    fee.setTotalFee(integrityFee);
                 }
             }
         }
-        return list;
+
+        //        根据节点编码特征判断 本地节点、其他费用节点的费用类型为“建筑费”、“安装费”或者“其他费用”,并设置金额。除此之外上层节点需单独设置
+        for(JkxlDetailFee fee : oriList){
+            Double totalFee  = fee.getTotalFee();
+            //建筑
+            if(fee.getWbsCode().substring(0,2).equals("21") || fee.getWbsCode().substring(0,3).equals("491")){
+                fee.setJzFee(totalFee);
+            }
+            //安装
+            if(fee.getWbsCode().substring(0,2).equals("23") || fee.getWbsCode().substring(0,3).equals("493") || fee.getWbsCode().substring(0,2).equals("39")){
+                fee.setAzFee(totalFee);
+            }
+            //其他费用
+            if(totalFee != null && fee.getFeeType().equals("0")){
+                fee.setQtFee(totalFee);
+            }
+
+        }
+        return oriList;
 
     }
 
+//    /**
+//     * 获取导出数据
+//     * @param id
+//     * @param type
+//     * @return
+//     */
+//    public List<JkxlDetailFee> findList(String id,String type){
+//        List<JkxlDetailFee> list = overheadLineMapper.findList(id,type);
+//        double integrityFee = 0.00; //诚信扣款
+//        double decFund = 0.00;//甲供材超供抵扣款
+//        double texDeal = 0.00;//税金处理
+//        double totalDeal = 0.00;//需处理税金与甲供材抵扣款和
+//    //    WbsItem wbsItem = itemService.getState(id);
+//        WbsItem wbsItem = itemService.get(id);
+//        if(wbsItem != null){
+//            if(wbsItem.getIntegrityFee() != null){
+//                integrityFee = wbsItem.getIntegrityFee() * -1;
+//            }
+//            if(wbsItem.getDecFund() != null){
+//                decFund = wbsItem.getDecFund();
+//            }
+//            if(wbsItem.getTexDeal() != null){
+//                texDeal = wbsItem.getTexDeal();
+//            }
+//            totalDeal = decFund + texDeal;
+//        }
+//
+////        根据节点编码特征判断阶段费用类型为“建筑费”、“安装费”或者“其他费用”,并设置
+//        for(JkxlDetailFee jkxlDetailFee : list){
+//            double totalFee  = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
+//            //建筑
+//            if(jkxlDetailFee.getWbsCode().substring(0,2).equals("21") || jkxlDetailFee.getWbsCode().substring(0,3).equals("491")){
+//                jkxlDetailFee.setJzFee(totalFee);
+//            }
+//            //安装
+//            if(jkxlDetailFee.getWbsCode().substring(0,2).equals("23") || jkxlDetailFee.getWbsCode().substring(0,3).equals("493") || jkxlDetailFee.getWbsCode().substring(0,2).equals("39")){
+//                jkxlDetailFee.setAzFee(totalFee);
+//            }
+//            //其他费用
+//            if(jkxlDetailFee.getTotalFee() != null && jkxlDetailFee.getFeeType().equals("0")){
+//                double qtFee = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
+//                jkxlDetailFee.setQtFee(qtFee);
+//            }
+//
+//        }
+//        double jz1 = 0.00;
+//        double az1 = 0.00;
+//        double jz2 = 0.00;
+//        double az2 = 0.00;
+//        double qtTotal = 0.00;
+//        //变电站导出
+//        if(type.equals(BashInfo.PROJECT_BDZ)) {
+////            根据totalFee进行分摊,分摊至最后剩下的 找一个最低层级wbs扣减,并逐层扣减上级wbs
+//            String lastShareWbs = null;
+//            for (JkxlDetailFee jkxlDetailFee : list) {
+//                Double totalFee = jkxlDetailFee.getTotalFee();
+//                //建筑费和
+//                if (jkxlDetailFee.getWbsCode().equals("21000000")) {
+//                    jz1 = totalFee!=null? jkxlDetailFee.getTotalFee():0.00;
+//                    jz2 = jkxlDetailFee.getJzFee()!=null? jkxlDetailFee.getJzFee():0.00;
+//                }
+//                //安装费和
+//                if (jkxlDetailFee.getWbsCode().equals("23000000")) {
+//                    az1 = totalFee!=null? jkxlDetailFee.getTotalFee():0.00;
+//                    az2 = jkxlDetailFee.getAzFee()!=null? jkxlDetailFee.getAzFee():0.00;
+//                }
+//                //其他费用和
+//                if (jkxlDetailFee.getFeeType().equals("0")&& totalFee != null) {
+//                    qtTotal += totalFee;
+//                }
+////                wbs简明表示8位,最低层次wbs最后两位为0
+//                String six = jkxlDetailFee.getWbsCode().substring(5,6);
+//                if(lastShareWbs==null && jkxlDetailFee.getFeeType().equals("1")&&!six.equals("0")&&totalFee!=null&&totalFee!=0.00){
+//                    lastShareWbs = jkxlDetailFee.getWbsCode();
+//                }
+//
+//            }
+//
+//            if(totalDeal!=0.00){
+//                double totalJzShare = DoubleUtil.round2(totalDeal*jz1/(jz1+az1));
+//                double totalAzShare = DoubleUtil.round2(totalDeal*az1/(jz1+az1));
+//                //实际分摊金额与需分摊金额是否有差额
+//                double diff = DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)));
+//                //实际分摊与需分摊存在差额情况下 将差额分配的wbs节点及其父节点
+//                String wbs1 = null;
+//                String wbs2 = null;
+//                String wbs3 = null;
+//                String wbs4 = null;
+//                if(diff != 0.00&&lastShareWbs!=null){
+//                    wbs1 = lastShareWbs.substring(0,2)+"000000";
+//                    wbs2 = lastShareWbs.substring(0,3)+"00000";
+//                    wbs3 = lastShareWbs.substring(0,4)+"0000";
+//                    wbs4 = lastShareWbs.substring(0,5)+"000";
+//                }
+//                //根据合计分摊至本体部分 看代码jz1=jz2 az1=az2不知道为什么要分开。
+//                for(JkxlDetailFee jkxlDetailFee:list){
+//                    String wbs = jkxlDetailFee.getWbsCode();
+//                    Double totalFee = jkxlDetailFee.getTotalFee();
+//                    if(wbs.startsWith("21")&&totalFee!=null&&totalFee!=0.00){
+//                        double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
+//                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
+//                        jkxlDetailFee.setJzFee((DoubleUtil.sub(totalFee,share)));
+//                    }
+//                    if(wbs.startsWith("23")&&totalFee!=null&&totalFee!=0.00){
+//                        double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
+//                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
+//                        jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,share));
+//                    }
+//                    if(diff!=0.00&&lastShareWbs!=null){
+//                        if(wbs.equals(wbs1)||wbs.equals(wbs2)||wbs.equals(wbs3)||wbs.equals(wbs4)||wbs.equals(lastShareWbs)){
+//                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(jkxlDetailFee.getTotalFee(),diff));
+//                            if(lastShareWbs.startsWith("21")){
+//                                jkxlDetailFee.setJzFee(DoubleUtil.sub(jkxlDetailFee.getJzFee(),diff));
+//                            }else{
+//                                jkxlDetailFee.setAzFee(DoubleUtil.sub(jkxlDetailFee.getAzFee(),diff));
+//                            }
+//                        }
+//
+//                    }else if(diff!=0.00&& lastShareWbs==null){
+//                        if(jz1>0.00){
+//                            lastShareWbs = "21000000";
+//                        }else{
+//                            lastShareWbs = "23000000";
+//                        }
+//                    }
+//
+//                }
+//                if(lastShareWbs.startsWith("21")){
+//                    totalJzShare = DoubleUtil.add(totalJzShare,diff);
+//                }else{
+//                    totalAzShare = DoubleUtil.add(totalAzShare,diff);
+//                }
+//                jz1 = DoubleUtil.sub(jz1,totalJzShare);
+//                jz2 = DoubleUtil.sub(jz2,totalJzShare);
+//                az1 = DoubleUtil.sub(az1,totalAzShare);
+//                az2 = DoubleUtil.sub(az2,totalAzShare);
+//            }
+//
+//
+//            qtTotal = qtTotal + integrityFee;
+//            for (JkxlDetailFee jkxlDetailFee : list) {
+//                //WBS首层数据
+//                if(jkxlDetailFee.getWbsCode().equals("20000000")){
+//                    jkxlDetailFee.setJzFee(jz2);
+//                    jkxlDetailFee.setAzFee(az2);
+//                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS变电站合计
+//                if(jkxlDetailFee.getWbsCode().equals("10000000")){
+//                    jkxlDetailFee.setJzFee(jz2);
+//                    jkxlDetailFee.setAzFee(az2);
+//                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS变电站其他费用合计
+//                if(jkxlDetailFee.getWbsCode().equals("24000000")){
+//                    jkxlDetailFee.setTotalFee(qtTotal);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS变电站工程结算审核费(诚信扣款)
+//                if(jkxlDetailFee.getWbsCode().equals("24260000")){
+//                    jkxlDetailFee.setTotalFee(integrityFee);
+//                    jkxlDetailFee.setQtFee(integrityFee);
+//                }
+//            }
+//        }
+//        //电缆导出
+//        if(type.equals(BashInfo.PROJECT_DLXL)){
+//            for (JkxlDetailFee jkxlDetailFee : list) {
+//                String wbs = jkxlDetailFee.getWbsCode().substring(0,3);
+//                String wbs1 = jkxlDetailFee.getWbsCode().substring(3,4);
+//                //建筑和
+//                if(wbs.equals("491") && !wbs1.equals("0")){
+//                    jz1 += jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
+//                    jz2 += jkxlDetailFee.getJzFee()!=null? jkxlDetailFee.getJzFee():0.00;
+//                }
+//                //安装和
+//                if(wbs.equals("493") && !wbs1.equals("0")){
+//                    az1 += jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
+//                    az2 += jkxlDetailFee.getAzFee()!=null? jkxlDetailFee.getAzFee():0.00;
+//                }
+//                //其他费用和
+//                if (jkxlDetailFee.getFeeType().equals("0")&& jkxlDetailFee.getTotalFee() != null) {
+//                    qtTotal += jkxlDetailFee.getTotalFee();
+//                }
+//            }
+//
+//            //处理税金和甲供材超供抵扣款
+//            if(totalDeal!=0.00){
+//                double totalJzShare = 0.00;
+//                double totalAzShare = 0.00;
+//                //根据合计分摊至本体部分 看代码jz1=jz2 az1=az2不知道为什么要分开。
+//                for(JkxlDetailFee jkxlDetailFee:list){
+//                    String wbs = jkxlDetailFee.getWbsCode().substring(0,3);
+//                    String wbs1 = jkxlDetailFee.getWbsCode().substring(3,4);
+//                    Double totalFee = jkxlDetailFee.getTotalFee();
+//                    if(wbs.equals("491") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
+//                        double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
+//                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
+//                        jkxlDetailFee.setJzFee((DoubleUtil.sub(totalFee,share)));
+//                        totalJzShare = DoubleUtil.add(totalJzShare,share);
+//                    }
+//                    if(wbs.equals("493") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
+//                        double share = DoubleUtil.round2(totalDeal*totalFee/(jz1+az1));
+//                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
+//                        jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,share));
+//                        totalAzShare = DoubleUtil.add(totalAzShare,share);
+//                    }
+//
+//                }
+//                //将分摊后的差额放入第一个分部分项
+//                if(totalDeal!=(totalJzShare+totalAzShare)){
+//                    for(JkxlDetailFee jkxlDetailFee:list){
+//                        String wbs = jkxlDetailFee.getWbsCode().substring(0,3);
+//                        String wbs1 = jkxlDetailFee.getWbsCode().substring(3,4);
+//                        Double totalFee = jkxlDetailFee.getTotalFee();
+//                        if(wbs.equals("491") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
+//                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
+//                            jkxlDetailFee.setJzFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
+//                            totalJzShare = DoubleUtil.add(totalJzShare,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare))));
+//                            break;
+//                        }
+//                        if(wbs.equals("493") && !wbs1.equals("0")&&totalFee!=null&&totalFee!=0.00){
+//                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
+//                            jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare)))));
+//                            totalAzShare = DoubleUtil.add(totalAzShare,DoubleUtil.sub(totalDeal,(DoubleUtil.add(totalJzShare,totalAzShare))));
+//                            break;
+//                        }
+//
+//                    }
+//                }
+//                jz1 = DoubleUtil.sub(jz1,totalJzShare);
+//                jz2 = DoubleUtil.sub(jz2,totalJzShare);
+//                az1 = DoubleUtil.sub(az1,totalAzShare);
+//                az2 = DoubleUtil.sub(az2,totalAzShare);
+//            }
+//
+//            //诚信扣款
+//            qtTotal = qtTotal + integrityFee;
+//            for (JkxlDetailFee jkxlDetailFee : list) {
+//                //WBS电缆和
+//                if(jkxlDetailFee.getWbsCode().equals("40000000")){
+//                    jkxlDetailFee.setJzFee(jz2);
+//                    jkxlDetailFee.setAzFee(az2);
+//                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS首层
+//                if(jkxlDetailFee.getWbsCode().equals("10000000")){
+//                    jkxlDetailFee.setJzFee(jz2);
+//                    jkxlDetailFee.setAzFee(az2);
+//                    jkxlDetailFee.setTotalFee(jz1+az1+qtTotal);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS电缆建筑
+//                if(jkxlDetailFee.getWbsCode().equals("49100000")){
+//                    jkxlDetailFee.setTotalFee(jz1);
+//                    jkxlDetailFee.setJzFee(jz2);
+//                }
+//                //WBS电缆安装
+//                if(jkxlDetailFee.getWbsCode().equals("49300000")){
+//                    jkxlDetailFee.setTotalFee(az1);
+//                    jkxlDetailFee.setAzFee(az2);
+//
+//                }
+//                //WBS电缆本体工程
+//                if(jkxlDetailFee.getWbsCode().equals("49000000")){
+//                    jkxlDetailFee.setJzFee(jz2);
+//                    jkxlDetailFee.setAzFee(az2);
+//                    jkxlDetailFee.setTotalFee(jz1+az1);
+//                }
+//                //WBS电缆其他费用
+//                if(jkxlDetailFee.getWbsCode().equals("44000000")){
+//                    jkxlDetailFee.setTotalFee(qtTotal);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //诚信扣款
+//                if(jkxlDetailFee.getWbsCode().equals("44260000")){
+//                    jkxlDetailFee.setTotalFee(integrityFee);
+//                    jkxlDetailFee.setQtFee(integrityFee);
+//                }
+//            }
+//
+//        }
+//        //架空导出
+//        if(type.equals(BashInfo.PROJECT_JKXL)) {
+//            for (JkxlDetailFee jkxlDetailFee : list) {
+//                //本体费用求和
+//                if (jkxlDetailFee.getFeeType().equals("1")&& jkxlDetailFee.getTotalFee() != null) {
+//                    az1 += jkxlDetailFee.getTotalFee();
+//                }
+//                //其他费用求和
+//                if (jkxlDetailFee.getFeeType().equals("0")&& jkxlDetailFee.getTotalFee() != null) {
+//                    qtTotal += jkxlDetailFee.getTotalFee();
+//                }
+//            }
+//
+//            //处理税金和甲供材超供抵扣款
+//            if(totalDeal!=0.00){
+//                double totalShare = 0.00;
+//                //根据合计分摊至本体部分
+//                for(JkxlDetailFee jkxlDetailFee:list){
+//                    Double totalFee = jkxlDetailFee.getTotalFee();
+//                    if(jkxlDetailFee.getFeeType().equals("1") && totalFee != null && totalFee!=0.00){
+//                        double share = DoubleUtil.round2(totalDeal*totalFee/az1);
+//                        jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,share));
+//                        jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,share));
+//                        totalShare = DoubleUtil.add(totalShare,share);
+//                    }
+//                }
+//                //将分摊后的差额放入第一个分部分项
+//                if(totalDeal!=totalShare){
+//                    for(JkxlDetailFee jkxlDetailFee:list){
+//                        Double totalFee = jkxlDetailFee.getTotalFee();
+//                        if(jkxlDetailFee.getFeeType().equals("1") && totalFee != null && totalFee!=0.00){
+//                            jkxlDetailFee.setTotalFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,totalShare)));
+//                            jkxlDetailFee.setAzFee(DoubleUtil.sub(totalFee,DoubleUtil.sub(totalDeal,totalShare)));
+//                            break;
+//                        }
+//                    }
+//                }
+//                az1 = DoubleUtil.sub(az1,totalDeal);
+//            }
+//
+//            qtTotal = qtTotal + integrityFee;
+//            for (JkxlDetailFee jkxlDetailFee : list) {
+//                //WBS架空合计
+//                if(jkxlDetailFee.getWbsCode().equals("30000000")){
+//                    jkxlDetailFee.setTotalFee(az1+qtTotal);
+//                    jkxlDetailFee.setAzFee(az1);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS首层
+//                if(jkxlDetailFee.getWbsCode().equals("10000000")){
+//                    jkxlDetailFee.setTotalFee(az1+qtTotal);
+//                    jkxlDetailFee.setAzFee(az1);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS架空本体工程
+//                if(jkxlDetailFee.getWbsCode().equals("39000000")){
+//                    jkxlDetailFee.setTotalFee(az1);
+//                    jkxlDetailFee.setAzFee(az1);
+//                }
+//                //WBS架空其他费用
+//                if(jkxlDetailFee.getWbsCode().equals("34000000")){
+//                    jkxlDetailFee.setTotalFee(qtTotal);
+//                    jkxlDetailFee.setQtFee(qtTotal);
+//                }
+//                //WBS架空诚信扣款
+//                if(jkxlDetailFee.getWbsCode().equals("34260000")){
+//                    jkxlDetailFee.setTotalFee(integrityFee);
+//                    jkxlDetailFee.setQtFee(integrityFee);
+//                }
+//            }
+//        }
+//        return list;
+//
+//    }
+
    public JkxlDetailFee getDate(String id, String wbsCode){
        return overheadLineMapper.getData(id,wbsCode);
    }

+ 91 - 0
src/main/java/com/jeeplus/modules/sg/overheadline/util/DetailFeeUtil.java

@@ -2,7 +2,10 @@ package com.jeeplus.modules.sg.overheadline.util;
 
 import com.jeeplus.modules.sg.overheadline.entity.JkxlDetailFee;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class DetailFeeUtil {
 
@@ -45,6 +48,29 @@ public class DetailFeeUtil {
     }
 
     /**
+     * 处理节点基本信息,保证上级节点的‘totalFee’与它的下级节点相应费用和相等
+     * 处理方式是将上级节点与下级节点相应费用和的差额放入找到的第一个非空子节点。如果下级子节点金额全为空,则直接放到第一个子节点中
+     *
+     * @param detail 节点对象,这里要保证节点及所有子节点对象都不能为空,且都有wbs编码
+     */
+    public static void dealTotalFee(JkxlDetailFee detail){
+        List<JkxlDetailFee> subNodes = detail.getNodes();
+        if(subNodes!=null && subNodes.size()>0){
+            double total = 0.00;
+            for(int i=0;i<subNodes.size();i++){
+                JkxlDetailFee node = subNodes.get(i);
+                total = DoubleUtil.add(total,node.getTotalFee());
+            }
+            JkxlDetailFee firstNode = subNodes.get(0);
+            firstNode.setTotalFee(DoubleUtil.add(firstNode.getTotalFee(),detail.getTotalFee(),-total));
+//            处理完后进行递归
+            for(int i=0;i<subNodes.size();i++){
+                dealTotalFee(subNodes.get(i));
+            }
+        }
+    }
+
+    /**
      * 处理节点分本体信息,保证上级节点的‘措施费’、‘规费’等等费用与它的下级节点相应费用和相等
      * 处理方式是将上级节点与下级节点相应费用和的差额放入找到的第一个非空子节点。如果下级子节点金额全为空,则直接放到第一个子节点中
      *
@@ -105,4 +131,69 @@ public class DetailFeeUtil {
             }
         }
     }
+
+    /**
+     * 将节点list整理到顶级节点下。这里要求所有list都在一个顶级list节点下
+     * @param list
+     * @return
+     */
+    public static JkxlDetailFee getTree(List<JkxlDetailFee> list){
+        JkxlDetailFee topNode = null;
+        Map<String,JkxlDetailFee> map = new HashMap<>();
+        for(JkxlDetailFee fee:list){
+            map.put(fee.getWbsCode(),fee);
+        }
+        for(JkxlDetailFee fee:list){
+            String parentWbs = fee.getParentNode();
+            JkxlDetailFee parentFee = map.get(parentWbs);
+            if(parentFee==null){
+                if(topNode==null){
+                    topNode = fee;
+                }else{
+                    throw new RuntimeException("数据库中结算书节点结构异常!");
+                }
+            }else{
+                List<JkxlDetailFee> subNodes = parentFee.getNodes();
+                if(subNodes==null){
+                    subNodes = new ArrayList<>();
+                    parentFee.setNodes(subNodes);
+                }
+                subNodes.add(fee);
+            }
+        }
+        return topNode;
+    }
+
+    /**
+     * 逐级根据totalFee分摊金额至totalFee上。分摊后上下级和可能存在细微算术上导致的差额,可以用DealBaseInfo方法处理
+     * @param top  分摊费用顶级节点
+     * @param fee  分摊金额
+     */
+    public static void shareByTotal(JkxlDetailFee top,double fee){
+        top.setTotalFee(DoubleUtil.add(top.getTotalFee(),fee));
+        List<JkxlDetailFee> subNodes = top.getNodes();
+        if(subNodes!=null&&subNodes.size()>0){
+            for(JkxlDetailFee node:subNodes){
+                double shareFee = DoubleUtil.round2(fee*node.getTotalFee()/top.getTotalFee());
+                shareByTotal(node,shareFee);
+            }
+        }
+    }
+
+    /**
+     * 逐级将金额平摊至所有节点上
+     * @param top 分摊费用顶级节点
+     * @param fee 分摊金额
+     */
+    public static void avgShareToTotal(JkxlDetailFee top,double fee){
+        top.setTotalFee(DoubleUtil.add(top.getTotalFee(),fee));
+        List<JkxlDetailFee> subNodes = top.getNodes();
+        if(subNodes!=null&&subNodes.size()>0){
+            int size = subNodes.size();
+            double shareFee = DoubleUtil.round2(fee/size);
+            for(JkxlDetailFee node:subNodes){
+                avgShareToTotal(node,shareFee);
+            }
+        }
+    }
 }

File diff suppressed because it is too large
+ 596 - 452
src/main/java/com/jeeplus/modules/sg/overheadline/web/OverheadLineController.java


+ 3 - 3
src/main/java/com/jeeplus/modules/sg/project/web/ProjectController.java

@@ -300,10 +300,10 @@ public class ProjectController extends BaseController {
     /**
      * 添加诚信扣款、甲供材超供抵扣工程款、税金处理
      * @param ids
-     * @param fees
+     * @param fees          诚信扣款
      * @param unitTypes
-     * @param decFunds
-     * @param texs
+     * @param decFunds      抵扣工程款
+     * @param texs          税金处理
      * @return
      */
     @ResponseBody

+ 6 - 6
src/main/java/com/jeeplus/modules/sg/substation/util/SubstationUtil.java

@@ -74,7 +74,7 @@ public class SubstationUtil {
     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[] WBS_JZ_DXGC_HUI = {"21300000","21310000","21320000","21330000","21340000","21350000","21360000"};
     public static final String[] NODE_JZ_DXGC_HUI = {"与站址有关的单项工程","地基处理","站外道路","站外水源","站外排水","施工降水","临时工程"};
 
 
@@ -215,7 +215,7 @@ public class SubstationUtil {
         }
         String cornerMark = getNodeMark(qd,mainNode,2);
         if(cornerMark==null){
-            throw new RuntimeException(getWrongMessage(qd));
+            throw new RuntimeException(getWrongMessage(qd,mainNode+"节点无法获取角标!"));
         }
         List<String> subNodes = getSubNodes(qd,cornerMark,2,type);
 //        结算书中通过角标找到的子节点 与 wbs子节点对应不上的
@@ -246,7 +246,7 @@ public class SubstationUtil {
                 }
             }
             if(map.isEmpty()){
-                throw new RuntimeException(getWrongMessage(qd));
+                throw new RuntimeException(getWrongMessage(qd,mainNode+"节点无法找到合规下级节点!"));
             }
             List<JkxlDetailFee> subFees = new ArrayList<>();
             for(JkxlDetailFee fee:map.values()){
@@ -458,7 +458,7 @@ public class SubstationUtil {
                     addedFee.setZjgcFee(DoubleUtil.add(addedFee.getZjgcFee(),extraFee.getZjgcFee()));
                 }
             }else{
-                throw new RuntimeException(getWrongMessage(azqd));
+                throw new RuntimeException(getWrongMessage(azqd,"控制及直流系统节点下找不到合规子节点!"));
             }
         }
         return mainFee;
@@ -667,9 +667,9 @@ public class SubstationUtil {
      * @param excel 结算书页签
      * @return
      */
-    public static String getWrongMessage(ImportExcel excel){
+    public static String getWrongMessage(ImportExcel excel,String msg){
         if(excel != null){
-            return "《"+ImportExcel.getSheet(excel).getSheetName()+"》数据不规范!";
+            return "《"+ImportExcel.getSheet(excel).getSheetName()+"》数据不规范!"+msg;
         }else{
             return "变电站数据处理错误!";
         }

+ 1 - 1
src/main/java/com/jeeplus/modules/sys/web/RegisterController.java

@@ -170,7 +170,7 @@ public class RegisterController extends BaseController {
 		
 		
 		addMessage(redirectAttributes, "注册用户'" + user.getLoginName() + "'成功");
-		return "redirect:" + adminPath + "/login";
+		return "redirect:" + adminPath + " 33333333333333333333333333/login";
 	}