chengqiang 5 år sedan
förälder
incheckning
8a1f88889c

+ 325 - 164
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.DoubleUtil;
 import com.jeeplus.modules.sg.overheadline.util.SettementUtil;
 import com.jeeplus.modules.sg.project.entity.WbsItem;
 import com.jeeplus.modules.sg.project.service.ItemService;
@@ -41,195 +42,355 @@ public class OverheadLineService {
        return overheadLineMapper.getList(id,type);
    }
 
-
-public List<JkxlDetailFee> findList(String id,String type){
-    List<JkxlDetailFee> list = overheadLineMapper.findList(id,type);
-    double integrityFee = 0.00; //诚信扣款
-    WbsItem wbsItem = itemService.getState(id);
-    if(wbsItem != null){
-        integrityFee = wbsItem.getIntegrityFee() * -1;
-    }
-    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);
+    /**
+     * 获取导出数据
+     * @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;
         }
 
-    }
-    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)) {
-        for (JkxlDetailFee jkxlDetailFee : list) {
-            //建筑费和
-            if (jkxlDetailFee.getWbsCode().equals("21000000")) {
-                jz1 = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
-                jz2 = jkxlDetailFee.getJzFee()!=null? jkxlDetailFee.getJzFee():0.00;
+//        根据节点编码特征判断阶段费用类型为“建筑费”、“安装费”或者“其他费用”,并设置
+        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().equals("23000000")) {
-                az1 = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
-                az2 = jkxlDetailFee.getAzFee()!=null? jkxlDetailFee.getAzFee():0.00;
+            //安装
+            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.getFeeType().equals("0")&& jkxlDetailFee.getTotalFee() != null) {
-                qtTotal += jkxlDetailFee.getTotalFee();
+            //其他费用
+            if(jkxlDetailFee.getTotalFee() != null && jkxlDetailFee.getFeeType().equals("0")){
+                double qtFee = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
+                jkxlDetailFee.setQtFee(qtFee);
             }
+
         }
-        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);
+        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) {
+                //建筑费和
+                if (jkxlDetailFee.getWbsCode().equals("21000000")) {
+                    jz1 = jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
+                    jz2 = jkxlDetailFee.getJzFee()!=null? jkxlDetailFee.getJzFee():0.00;
+                }
+                //安装费和
+                if (jkxlDetailFee.getWbsCode().equals("23000000")) {
+                    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();
+                }
+//                wbs简明表示8位,最低层次wbs最后两位为0
+                String six = jkxlDetailFee.getWbsCode().substring(5,6);
+                if(lastShareWbs!=null && jkxlDetailFee.getFeeType().equals("1")&&!six.equals("0")){
+                    lastShareWbs = jkxlDetailFee.getWbsCode();
+                }
+
             }
-        }
-    }
-    //电缆导出
-    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;
+
+            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){
+                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){
+                    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));
+                        }
+                    }
+
+                }
+
             }
-            //安装和
-            if(wbs.equals("493") && !wbs1.equals("0")){
-                az1 += jkxlDetailFee.getTotalFee()!=null? jkxlDetailFee.getTotalFee():0.00;
-                az2 += jkxlDetailFee.getAzFee()!=null? jkxlDetailFee.getAzFee():0.00;
+            if(lastShareWbs.startsWith("21")){
+                totalJzShare = DoubleUtil.add(totalJzShare,diff);
+            }else{
+                totalAzShare = DoubleUtil.add(totalAzShare,diff);
             }
-            //其他费用和
-            if (jkxlDetailFee.getFeeType().equals("0")&& jkxlDetailFee.getTotalFee() != null) {
-                qtTotal += jkxlDetailFee.getTotalFee();
+            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);
+                }
             }
         }
-        //诚信扣款
-        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);
+        //电缆导出
+        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();
+                }
             }
-            //WBS电缆安装
-            if(jkxlDetailFee.getWbsCode().equals("49300000")){
-                jkxlDetailFee.setTotalFee(az1);
-                jkxlDetailFee.setAzFee(az2);
+
+            //处理税金和甲供材超供抵扣款
+            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);
+                }
 
             }
-            //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(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);
+
+
+
+
             //诚信扣款
-            if(jkxlDetailFee.getWbsCode().equals("44260000")){
-                jkxlDetailFee.setTotalFee(integrityFee);
-                jkxlDetailFee.setQtFee(integrityFee);
-            }
-        }
+            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);
 
-    }
-    //架空导出
-    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();
+                }
+                //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);
+                }
             }
+
         }
-        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);
+        //架空导出
+        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();
+                }
             }
-            //WBS架空本体工程
-            if(jkxlDetailFee.getWbsCode().equals("39000000")){
-                jkxlDetailFee.setTotalFee(az1);
-                jkxlDetailFee.setAzFee(az1);
+
+            //处理税金和甲供材超供抵扣款
+            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);
+                }
             }
-            //WBS架空其他费用
-            if(jkxlDetailFee.getWbsCode().equals("34000000")){
-                jkxlDetailFee.setTotalFee(qtTotal);
-                jkxlDetailFee.setQtFee(qtTotal);
+            //将分摊后的差额放入第一个分部分项
+            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;
+                    }
+                }
             }
-            //WBS架空诚信扣款
-            if(jkxlDetailFee.getWbsCode().equals("34260000")){
-                jkxlDetailFee.setTotalFee(integrityFee);
-                jkxlDetailFee.setQtFee(integrityFee);
+            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;
+        return list;
 
-}
+    }
 
    public JkxlDetailFee getDate(String id, String wbsCode){
        return overheadLineMapper.getData(id,wbsCode);

+ 40 - 0
src/main/java/com/jeeplus/modules/sg/overheadline/util/DoubleUtil.java

@@ -0,0 +1,40 @@
+package com.jeeplus.modules.sg.overheadline.util;
+
+import java.math.BigDecimal;
+
+public class DoubleUtil {
+
+    /**
+     * 返回double保留两位小数点的值
+     * @param num
+     * @return
+     */
+    public static double round2(double num){
+        return (double) Math.round(num * 100) / 100;
+    }
+
+    /**
+     * 返回double类型 value1减去value2的准确值
+     * @param value1
+     * @param value2
+     * @return
+     */
+    public static double sub(Double value1, Double value2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(value1));
+        BigDecimal b2 = new BigDecimal(Double.toString(value2));
+        return b1.subtract(b2).doubleValue();
+    }
+
+    /**
+     * 返回double类型 获得value1加上value2的精确值
+     * @param value1
+     * @param value2
+     * @return
+     */
+    public static double add(Double value1, Double value2) {
+        BigDecimal b1 = new BigDecimal(Double.toString(value1));
+        BigDecimal b2 = new BigDecimal(Double.toString(value2));
+        return b1.add(b2).doubleValue();
+    }
+
+}

+ 17 - 0
src/main/java/com/jeeplus/modules/sg/project/entity/WbsItem.java

@@ -24,7 +24,24 @@ public class WbsItem extends DataEntity<WbsItem> {
     private String unitType;
     private Double integrityFee; //诚信扣款
     private String state; //是否扣款 (1:扣 0:不扣)
+    private Double decFund;//甲供材超供抵扣工程款
+    private Double texDeal;//税金处理
 
+    public Double getDecFund() {
+        return decFund;
+    }
+
+    public void setDecFund(Double decFund) {
+        this.decFund = decFund;
+    }
+
+    public Double getTexDeal() {
+        return texDeal;
+    }
+
+    public void setTexDeal(Double texDeal) {
+        this.texDeal = texDeal;
+    }
 
     public String getUnitType() {
         return unitType;

+ 6 - 2
src/main/java/com/jeeplus/modules/sg/project/mapper/xml/ItemMapper.xml

@@ -16,7 +16,9 @@
 		a.type AS "type",
 		a.unit_type AS "unitType",
 		a.integrity_fee AS "integrityFee",
-	    a.state AS "state"
+	    a.state AS "state",
+	    a.dec_fund AS "decFund",
+	    a.tex_deal AS "texDeal"
 	</sql>
 
 	
@@ -194,7 +196,9 @@
 			update sg_wbs_item set
 			unit_type = #{item.unitType},
 			state = #{item.state},
-			integrity_fee = #{item.integrityFee}
+			integrity_fee = #{item.integrityFee},
+			dec_fund = #{item.decFund},
+			tex_deal = #{item.texDeal}
 			<where>
 				id = #{item.id}
 			</where>

+ 2 - 2
src/main/java/com/jeeplus/modules/sg/project/service/ItemService.java

@@ -103,8 +103,8 @@ public class ItemService extends CrudService<ItemMapper, WbsItem> {
     public void updateFee(List<WbsItem> list){
 //        List<WbsItem> newlist = list.stream().collect(Collectors.collectingAndThen(Collectors.
 //                toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getUnitType()))), ArrayList::new));
-      List<WbsItem> list1 = getNew(list);
-       itemMapper.updateFee(list1);
+//      List<WbsItem> list1 = getNew(list);
+       itemMapper.updateFee(list);
     }
 
     /**

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

@@ -268,41 +268,57 @@ public class ProjectController extends BaseController {
 
 
     /**
-     * 诚信扣款
-     * @param ids  项目ID
-     * @param fees  项目费用
-     * @param unitTypes  单位工程
+     * 添加诚信扣款、甲供材超供抵扣工程款、税金处理
+     * @param ids
+     * @param fees
+     * @param unitTypes
+     * @param decFunds
+     * @param texs
      * @return
      */
     @ResponseBody
     @RequestMapping("withhold")
-    public AjaxJson withhold(String ids,String fees,String unitTypes){
+    public AjaxJson withhold(String ids,String fees,String unitTypes,String decFunds,String texs){
         AjaxJson j = new AjaxJson();
         List<WbsItem> ts = new ArrayList<>();
         WbsItem wbsItem = null;
         try {
-            String[] idss = ids.split(",");
-            String[] feess = fees.split(",");
-            String[] unitTypess = unitTypes.split(",");
-            for(int i=0;i<idss.length;i++){
+            String[] idArr = ids.split(",");
+            String[] feeArr = fees.split(",");
+            String[] unitTypeArr = unitTypes.split(",");
+            String[] decFundArr = decFunds.split(",");
+            String[] texArr = texs.split(",");
+            for(int i=0;i<idArr.length;i++){
                 wbsItem = new WbsItem();
-                wbsItem.setId(idss[i]);
+                wbsItem.setId(idArr[i]);
                 //是否扣款 (1:扣 0:不扣)
-                wbsItem.setState("1");
-                String unitType = unitTypess[i];
+//                wbsItem.setState("1");
+                String unitType = unitTypeArr[i];
                 if(unitType.equals("null")){
                     unitType = null;
                 }
                 wbsItem.setUnitType(unitType);
-                String fee = feess[i];
-                double fe = 0.00;
+                String fee = feeArr[i];
                 if(fee.equals("null")){
-//                    fe = Double.valueOf(fee);
                     wbsItem.setIntegrityFee(null);
                 }else {
                     wbsItem.setIntegrityFee(Double.valueOf(fee));
                 }
+                String decFund = decFundArr[i];
+                if(decFund.equals("null")){
+                    wbsItem.setDecFund(null);
+                }else{
+                    wbsItem.setDecFund(Double.valueOf(decFund));
+                }
+                String tex = texArr[i];
+                if(tex.equals("null")){
+                    wbsItem.setTexDeal(null);
+                }else{
+                    wbsItem.setTexDeal(Double.valueOf(tex));
+                }
+
                 ts.add(wbsItem);
+
             }
             itemService.updateFee(ts);
             j.setSuccess(true);