Ver código fonte

计量公式相关

yangyj 1 ano atrás
pai
commit
f47b95c287

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimPaymentCertificate.java

@@ -26,6 +26,8 @@ public class InterimPaymentCertificate implements  DataModel{
     /**合同金额*/
     @JSONField(name = "key_2",label="合同金额",ordinal = 2)
     private String contractAmount;
+    @JSONField(name = "key_15",label="合同变更总金额",ordinal = 3)
+    private String revisedTotal;
     /**变更后的金额*/
     @JSONField(name = "key_3",label="变更后的金额",ordinal = 3)
     private String revisedAmount;
@@ -81,5 +83,6 @@ public class InterimPaymentCertificate implements  DataModel{
             BigDecimal payRatioBd = currentPeriodEndPayBd.multiply(new BigDecimal(100)).divide(BaseUtils.str2BigDecimal(this.contractAmount), 2, RoundingMode.HALF_UP);
             this.payRatio = payRatioBd.toString();
         }
+        this.revisedTotal =BaseUtils.str2BigDecimal(revisedAmount).subtract(BaseUtils.str2BigDecimal(contractAmount)).toString();
     }
 }

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimPaymentSummary.java

@@ -56,7 +56,7 @@ public class InterimPaymentSummary implements  DataModel{
 
     public void calculate(){
         /*本期累计金额*/
-        BigDecimal currentPeriodEndPayBd =new BigDecimal(currentPeriodEndPay);
+        BigDecimal currentPeriodEndPayBd =BaseUtils.str2BigDecimal(currentPeriodEndPay);
         this.previousPeriodEndPay= BaseUtils.str2BigDecimal(this.currentPeriodEndPay).subtract(BaseUtils.str2BigDecimal(this.currentPeriodPay)).toString();
         /*合同金额*/
         BigDecimal contractAmountBd =new BigDecimal(contractAmount);

+ 4 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubprojectInterimPaymentSummary.java

@@ -38,6 +38,8 @@ public class SubprojectInterimPaymentSummary  implements  DataModel{
     /**合同数量*/
     @JSONField(name = "key_3",label="合同数量",ordinal = 3)
     private String contractTotal;
+    @JSONField(name = "key_17",label="单价-ZJ",ordinal = 102)
+    private String price;
     /**变更数量*/
     @JSONField(name = "key_4",label="变更数量",ordinal = 4)
     private String changeTotal;
@@ -74,7 +76,8 @@ public class SubprojectInterimPaymentSummary  implements  DataModel{
     /**章名称*/
     @JSONField(name = "key_16",label="清单号-ZJ",ordinal = 102)
     private String chapterName;
-
+/*    @JSONField(name = "key_18",label="累计完成占合同%-ZJ",ordinal = 15)
+    private String ratio;*/
 
 
     public SubprojectInterimPaymentSummary(String itemName) {

+ 56 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiFunction;
 import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -494,12 +495,28 @@ public class ExecutorMeter extends FormulaExecutor {
             interimPaymentCertificates= new ArrayList<>(paymentCertificateMap.values());
             /*合同段支付项*/
             List<MidPayItem> midPayItemList=tec.meterInfo.getMidPayItemList();
+            Map<InterimPaymentCertificate,Map<Function<InterimPaymentCertificate,String>,Consumer<String>>> summaryConfigMap = new HashMap<>();
+            Map<Function<InterimPaymentCertificate,String>,Consumer<String>> getSetMap = new HashMap<>();
              if(Func.isNotEmpty(midPayItemList)){
                  List<InterimPaymentCertificate> payItemZj=new ArrayList<>();
                  if(MeterInfo.MB_ZJ.equals(tec.meterInfo.getConfig())){
-                     payItemZj.add(new InterimPaymentCertificate("小计"));
+                     InterimPaymentCertificate xj=new InterimPaymentCertificate("小计");
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getContractAmount,xj::setContractAmount);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getRevisedTotal,xj::setRevisedTotal);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getRevisedAmount,xj::setRevisedAmount);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodEndPay,xj::setCurrentPeriodEndPay);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodEndChangeMoney,xj::setCurrentPeriodEndChangeMoney);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getPreviousPeriodEndPay,xj::setPreviousPeriodEndPay);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getPreviousPeriodEndChangeMoney,xj::setPreviousPeriodEndChangeMoney);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodPay,xj::setCurrentPeriodPay);
+                     addGetSetConfig(xj,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodChangeMoney,xj::setCurrentPeriodChangeMoney);
+                     payItemZj.add(xj);
                      payItemZj.add(new InterimPaymentCertificate("价格调整"));
-                     payItemZj.add(new InterimPaymentCertificate("合计"));
+                     InterimPaymentCertificate hj = new InterimPaymentCertificate("合计");
+                     addGetSetConfig(hj,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodEndPay,hj::setCurrentPeriodEndPay);
+                     addGetSetConfig(hj,summaryConfigMap,InterimPaymentCertificate::getPreviousPeriodEndPay,hj::setPreviousPeriodEndPay);
+                     addGetSetConfig(hj,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodPay,hj::setCurrentPeriodPay);
+                     payItemZj.add(hj);
                      payItemZj.add(new InterimPaymentCertificate("索赔金额"));
                      payItemZj.add(new InterimPaymentCertificate("违约罚金"));
                      payItemZj.add(new InterimPaymentCertificate("迟付款利息"));
@@ -508,16 +525,17 @@ public class ExecutorMeter extends FormulaExecutor {
                      payItemZj.add(new InterimPaymentCertificate("材料设备垫付款"));
                      payItemZj.add(new InterimPaymentCertificate("扣回材料设备垫付款"));
                      payItemZj.add(new InterimPaymentCertificate("保留金"));
-                     payItemZj.add(new InterimPaymentCertificate("实际支付"));
+                     InterimPaymentCertificate sjzf=new InterimPaymentCertificate("实际支付");
+                     addGetSetConfig(sjzf,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodEndPay,sjzf::setCurrentPeriodEndPay);
+                     addGetSetConfig(sjzf,summaryConfigMap,InterimPaymentCertificate::getPreviousPeriodEndPay,sjzf::setPreviousPeriodEndPay);
+                     addGetSetConfig(sjzf,summaryConfigMap,InterimPaymentCertificate::getCurrentPeriodPay,sjzf::setCurrentPeriodPay);
+                     payItemZj.add(sjzf);
                  }
                  midPayItemList.forEach(e->{
                      InterimPaymentCertificate ipc = paymentCertificateMap.get(e.getPayNumber());
                      if(ipc==null){
-                         if(MeterInfo.MB_ZJ.equals(tec.meterInfo.getConfig())){
-                             if((e.getPayName().contains("章")||e.getPayName().contains("暂定"))){
-                                 ipc = new InterimPaymentCertificate(e.getPayName());
-                             }
-                         }else {
+                         /*浙江的按照实际的计量单元去显示*/
+                         if(!MeterInfo.MB_ZJ.equals(tec.meterInfo.getConfig())) {
                              ipc = new InterimPaymentCertificate(e.getPayName());
                          }
                      }
@@ -526,7 +544,18 @@ public class ExecutorMeter extends FormulaExecutor {
                      }
                  });
                  if(payItemZj.size()>0){
+                     dataList.stream().filter(t->t.getFormName()!=null&&t.getFormName().contains("暂定金")).findFirst().ifPresent(t->{
+                              t.setCurrentPeriodPay("");
+                              t.setCurrentPeriodEndPay("");
+                              t.setPreviousPeriodEndPay("");
+                              t.setPreviousPeriodEndChangeMoney("");
+                              t.setCurrentPeriodChangeMoney("");
+                              t.setCurrentPeriodEndChangeMoney("");
+                     });
                      dataList.addAll(payItemZj);
+                     /*分行合计列*/
+                     fieldGetSet(summaryConfigMap);
+                     /*计算合计值*/
                  }
              }
             /*数据获取end*/
@@ -691,6 +720,8 @@ public class ExecutorMeter extends FormulaExecutor {
             private Integer changeTotal =0;
             /**完成数量*/
             private Integer completed=0;
+            /**单价*/
+            private String price;
 /*            本次完成数量
             private Integer currentPeriodCompleted=0;
             累计完成数量
@@ -719,6 +750,7 @@ public class ExecutorMeter extends FormulaExecutor {
                     this.contractMoney =new BigDecimal(p.getContractMoney());
                     this.changeMoney =new BigDecimal(p.getChangeMoney());
                     this.money=p.getMoneyAsBigDecimal();
+                    this.price=p.getPrice();
             }
 
             /*同一个清单累加*/
@@ -778,6 +810,7 @@ public class ExecutorMeter extends FormulaExecutor {
                 sis.setChangeTotal(main.getChangeTotal().toString());
                 sis.setContractMoney(main.getContractMoney().toString());
                 sis.setChangeMoney(main.getChangeMoney().toString());
+                sis.setPrice(main.getPrice());
                 if(cur!=null){
                     sis.setCurrentPeriodCompleted(cur.getCompleted().toString());
                 }
@@ -800,7 +833,7 @@ public class ExecutorMeter extends FormulaExecutor {
             totalList.forEach(e->{
                 subprojectInterimPaymentSummary.add(e.copy());
             });
-            LinkedHashMap<String,List<SubprojectInterimPaymentSummary>> chapterGroup= totalList.stream().collect(Collectors.groupingBy(e->getPrefix(e.getFormNumber()),LinkedHashMap::new,Collectors.toList()));
+            LinkedHashMap<String,List<SubprojectInterimPaymentSummary>> chapterGroup= totalList.stream().sorted(Comparator.comparing(e->getPrefix(e.getFormNumber()))).collect(Collectors.groupingBy(e->getPrefix(e.getFormNumber()),LinkedHashMap::new,Collectors.toList()));
             AtomicInteger loop = new AtomicInteger(chapterGroup.size());
             List<String> chapterNames= new ArrayList<>();
             chapterGroup.forEach((k,v)->{
@@ -1295,12 +1328,21 @@ public class ExecutorMeter extends FormulaExecutor {
             pageNumber(clazz);
             FormulaUtils.put2FormData(fdm, fieldDataFcMap,dataList);
         };
-
-  /*      public void write(Object data){
-            FormulaUtils.elementFindByKey(fdm,"key_24").ifPresent(t->{
-                elementWriter.write(t,data);
+        /*批量计算列表中之前的字段和,并赋值到当前字段*/
+        public void fieldGetSet(Map<T,Map<Function<T,String>,Consumer<String>>> gsMap){
+            gsMap.forEach((b,m)->{
+                List<T> dl = dataList.stream().limit(dataList.indexOf(b)).collect(Collectors.toList());
+                m.forEach((f,c)->{
+                    c.accept(dl.stream().map(f).map(BaseUtils::str2BigDecimal).reduce(BigDecimal.ZERO,BigDecimal::add).toString());
+                });
             });
-        }*/
+        }
+
+        public void addGetSetConfig(T b,Map<T,Map<Function<T,String>,Consumer<String>>> gsMap,Function<T,String>f,Consumer<String> c){
+             Map<Function<T,String>,Consumer<String>> configMap = gsMap.computeIfAbsent(b,k->new HashMap<>());
+             configMap.put(f,c);
+        }
+
     }
     interface  Special{
         /**是否满足执行条件*/

+ 39 - 23
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1887,20 +1887,27 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public WbsTreePrivate getOriginWtp(Long pkeyId) {
-        WbsTreePrivate wtp = this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId,pkeyId).last(" limit 1"));
-        int i=10;
-        WbsTreePrivate publicWtp = wtp;
-        while (i>0) {
-            WbsTreePrivate tmp=  this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, publicWtp.getWbsId()).last(" limit 1"));
-            if (tmp == null) {
-                break;
-            }
-            publicWtp = tmp;
-            i--;
-        }
-        /*私有引用项目的wbsId其实是被复制的项目的根节点p_key_id,只有溯源才能找到真正的wbsId*/
-        wtp.setWbsId(publicWtp.getWbsId());
-        return wtp;
+       if(pkeyId!=-4) {
+           WbsTreePrivate wtp = this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, pkeyId).last(" limit 1"));
+           int i = 10;
+           WbsTreePrivate publicWtp = wtp;
+           while (i > 0) {
+               WbsTreePrivate tmp = this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, publicWtp.getWbsId()).last(" limit 1"));
+               if (tmp == null) {
+                   break;
+               }
+               publicWtp = tmp;
+               i--;
+           }
+           /*私有引用项目的wbsId其实是被复制的项目的根节点p_key_id,只有溯源才能找到真正的wbsId*/
+           wtp.setWbsId(publicWtp.getWbsId());
+           return wtp;
+       }else{
+           WbsTreePrivate wtp = new WbsTreePrivate();
+           wtp.setId(-4L);
+           wtp.setPKeyId(-4L);
+           return  wtp;
+       }
     }
 
     @Override
@@ -1938,17 +1945,26 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     @Override
     public WbsTreePrivate wtpId(Long pkeyId){
        WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
-       int loop=0;
-       while (wtc.getOldId()!=null&&loop<10){
-           loop++;
-           WbsTreeContract tmp = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,wtc.getOldId()).eq(WbsTreeContract::getProjectId,wtc.getProjectId()).last(" limit 1 "));
-           if(tmp==null){
-               return this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getOldId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()));
-           }else{
-               wtc=tmp;
+       if(new Integer(1).equals(wtc.getIsCustom())) {
+           int loop = 0;
+           while (wtc.getOldId() != null && loop < 10) {
+               loop++;
+               WbsTreeContract tmp = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, wtc.getOldId()).eq(WbsTreeContract::getProjectId, wtc.getProjectId()).last(" limit 1 "));
+               if (tmp == null) {
+                   return this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId, wtc.getOldId()).eq(WbsTreePrivate::getProjectId, wtc.getProjectId()));
+               } else {
+                   wtc = tmp;
+               }
            }
+           return this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId, wtc.getId()).eq(WbsTreePrivate::getProjectId, wtc.getProjectId()));
+       }else{
+           /*自定义节点的处理*/
+           WbsTreePrivate wtp = new WbsTreePrivate();
+           wtp.setWbsId(wtc.getWbsId());
+           wtp.setId(-4L);
+           wtp.setPKeyId(-4L);
+           return wtp;
        }
-       return this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()));
     }
     /*表id,项目id,节点Id*/
     public List<KeyMapper> listForContract(List<Long> ids,String projectId,String nodeId){

+ 13 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -150,18 +150,21 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
             List<WbsTreeContract> list = new ArrayList<>();
             if(Func.isNotBlank(one.getTreeCode())){
                 List<String> treeCodes= FormulaUtils.treeCodeSplit(one.getTreeCode());
-                treeCodes.remove(0);
-                List<WbsTreeContract> chains = this.treeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getTreeCode,treeCodes).eq(WbsTreeContract::getContractId,one.getContractId()));
-                Long parentId=one.getParentId();
-                Collections.reverse(chains);
-                for(WbsTreeContract t:chains){
-                    /*由于treeCode的刷新时效性,还需要筛选*/
-                    if(t.getId().equals(parentId)){
-                        list.add(t);
-                        parentId=t.getParentId();
+                /**/
+                if(treeCodes.size()>1) {
+                    treeCodes.remove(0);
+                    List<WbsTreeContract> chains = this.treeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getTreeCode, treeCodes).eq(WbsTreeContract::getContractId, one.getContractId()));
+                    Long parentId = one.getParentId();
+                    Collections.reverse(chains);
+                    for (WbsTreeContract t : chains) {
+                        /*由于treeCode的刷新时效性,还需要筛选*/
+                        if (t.getId().equals(parentId)) {
+                            list.add(t);
+                            parentId = t.getParentId();
+                        }
                     }
+                    Collections.reverse(list);
                 }
-                Collections.reverse(list);
                 list.add(one);
             }else {
                 list.add(one);