浏览代码

183 2-7计量公式

chenr 8 月之前
父节点
当前提交
e40a7d3168

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/FormulaClient.java

@@ -34,7 +34,7 @@ public interface FormulaClient {
 
     //计量公式执行体
     @PostMapping(API_PREFIX + "execute3")
-    List<ReportResult> formulaExecute3(@RequestParam Long contractId, @RequestParam Long periodId,@RequestParam Integer type);
+    List<ReportResult> formulaExecute3(@RequestParam Long contractId, @RequestParam Long periodId,@RequestParam Integer type,@RequestParam Long perIodId1,@RequestParam Long projectId);
 
     //万盛计量专用
     @PostMapping(API_PREFIX + "execute4")

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -895,9 +895,9 @@ public class FormulaController {
     }
 
     @GetMapping("/test")
-    public R<Object> meter(Long contractId,Long reportId ,Integer type){
+    public R<Object> meter(Long contractId,Long reportId ,Integer type,Long periodId,Long projectId){
         /*合同段id,报表Id,报表类型中间计量0,材料1,开工2*/
-        return R.data(this.service.execute3(contractId,reportId,type));
+        return R.data(this.service.execute3(contractId,reportId,type,periodId,projectId));
     }
 
 

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java

@@ -68,8 +68,8 @@ public class FormulaClientImpl implements FormulaClient {
     }
 
     @Override
-    public List<ReportResult> formulaExecute3(Long contractId, Long periodId, Integer type) {
-       return service.execute3(contractId,periodId,type);
+    public List<ReportResult> formulaExecute3(Long contractId, Long periodId, Integer type,Long perIodId1,Long projectId) {
+       return service.execute3(contractId,periodId,type,perIodId1,projectId);
     }
 
     @Override

+ 69 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -7,7 +7,10 @@ import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
 import org.springblade.common.utils.BaseUtils;
+import org.springblade.manager.dto.FormEndPayDTO;
+import org.springblade.manager.utils.PeriodContractUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.Func;
@@ -17,12 +20,16 @@ import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.dto.TreeNode;
+import org.springblade.manager.entity.FormEndPay;
 import org.springblade.manager.formula.ElementWriter;
 import org.springblade.manager.formula.NodeTable;
+import org.springblade.manager.service.impl.FormEndPayServiceImpl;
+import org.springblade.manager.utils.FormEndPayUtil;
 import org.springblade.manager.vo.*;
+import org.springblade.meter.entity.ContractMeterPeriod;
 import org.springblade.meter.entity.InterimPayCertificateItem;
 import org.springframework.beans.BeanUtils;
-
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -32,7 +39,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.*;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -41,6 +47,7 @@ import java.util.stream.IntStream;
  * @Date 2023/12/19 17:40
  * @description 计量相关报表计算
  */
+@Slf4j
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class ExecutorMeter extends FormulaExecutor {
@@ -1591,6 +1598,7 @@ public class ExecutorMeter extends FormulaExecutor {
     @Data
     @EqualsAndHashCode(callSuper = true)
     public  class SubIPaySum extends   BaseSpecial<SubprojectInterimPaymentSummary> implements Special{
+        private FormEndPayServiceImpl formEndPayService;
         /*分项工程中期支付汇总表*/
         @Override
         public boolean ready() {
@@ -1682,15 +1690,40 @@ public class ExecutorMeter extends FormulaExecutor {
 
        /*分项工程中期支付汇总表*/
         @Override
+        @Transactional
         public void parse() {
-             builderFormDatas(SubprojectInterimPaymentSummary.class);
+            FormEndPayDTO dto = PeriodContractUtil.get();
+            //本期期数ID
+            Long periodId=dto.getPeriodId();
+            //合同段ID
+            Long contractId=dto.getContractId();
+            //项目ID
+            Long projectId=dto.getProjectId();
+            PeriodContractUtil.clear();
+            //上期期数ID
+            Long prePeriodId = null;
+            List<ContractMeterPeriod> list =FormEndPayUtil.selectList(contractId);
+            if(list.size()>0){
+                OptionalInt index=IntStream.range(0, list.size())
+                    .filter(i -> list.get(i).getId().equals(periodId))
+                    .findFirst();
+                //i大于0 说明需要有上期
+                if(index.isPresent()){
+                    int j = index.getAsInt();
+                    if(j>0){
+                        prePeriodId=list.get(j-1).getId();
+                    }
+                }
+            }
+            Long finalPrePeriodId = prePeriodId;
+            builderFormDatas(SubprojectInterimPaymentSummary.class);
             LinkedHashMap<String,Summary> endSummary = toSummary(paymentsPeriodEnd);
             LinkedHashMap<String,Summary> preSummary = toSummary(previous);
             LinkedHashMap<String,Summary> curSummary = toSummary(current);
             List<SubprojectInterimPaymentSummary> totalList = new ArrayList<>();
            /* List<String> numbers=  paymentsPeriodEnd.stream().map(Payment::getNumber).distinct().collect(Collectors.toList());*/
             LinkedHashMap<String,InventoryForm> numbersGroup=  tec.meterInfo.getInventoryForms().stream().filter(e->!tec.meterInfo.getChapter().contains(e)&&StringUtils.isNotEquals(0,e.getParentId())).collect(Collectors.toMap(InventoryForm::getFormNumber,e->e,(v1,v2)->v1,LinkedHashMap::new));
-            numbersGroup.forEach((number,itf)->{
+            numbersGroup.forEach((number, itf)->{
                 SubprojectInterimPaymentSummary sis = new SubprojectInterimPaymentSummary();
                 /*上期汇总*/
                 Summary pre =preSummary.get(number);
@@ -1705,7 +1738,7 @@ public class ExecutorMeter extends FormulaExecutor {
                 sis.setContractMoney(itf.getContractMoney());
                 sis.setChangeMoney(itf.getChangeMoney());
                 sis.setPrice(itf.getBidPrice());
-                if(sis.getFormNumber().equals("405-4")){
+                if(sis.getFormNumber().equals("202-3-3")){
                     System.out.println("111");
                 }
                 /*只要存在累计就显示*/
@@ -1744,15 +1777,45 @@ public class ExecutorMeter extends FormulaExecutor {
                         sis.setPreviousPeriodPay(pre.getMoney().toPlainString());
                         sis.setPreviousPeriodCompleted(pre.getCompleted().toPlainString());
                     }
+                    if(finalPrePeriodId !=null){
+                        FormEndPay preFormEndPay = FormEndPayUtil.selectFoemEndPay(finalPrePeriodId,contractId,sis.getFormNumber());
+                        if(ObjectUtil.isNotEmpty(preFormEndPay)){
+                            if (preFormEndPay.getCurrentPeriodEndPay() != null) {
+                                sis.setPreviousPeriodPay(preFormEndPay.getCurrentPeriodEndPay().toPlainString());
+                            }
+                        }
+                    }
                     sis.setCompleted(end.getCompleted().toPlainString());
                     //本期汇总的到本期末完成  //原来=(本期末汇总的本期支付金额) 现在=(上期末汇总的到本期末金额+本期汇总的金额)
                     BigDecimal add;
                     if(sis.getCurrentPeriodPay()!=null&&sis.getPreviousPeriodPay()!=null){
                         add= new BigDecimal(sis.getCurrentPeriodPay()).add(new BigDecimal(sis.getPreviousPeriodPay()));
-                    }else {
+                    }else if(sis.getCurrentPeriodPay() != null){
+                        add=new BigDecimal(sis.getCurrentPeriodPay());
+                    }else if(sis.getPreviousPeriodPay() != null){
+                        add=new BigDecimal(sis.getPreviousPeriodPay());
+                    } else {
                         add=end.getMoney();
                     }
                     sis.setCurrentPeriodEndPay(add.toPlainString());
+                    FormEndPay formEndPay =FormEndPayUtil.selectFoemEndPay(periodId,contractId, sis.getFormNumber());
+                    if(ObjectUtil.isNotEmpty(formEndPay)){
+                        if(!add.equals(formEndPay.getCurrentPeriodEndPay())){
+                            formEndPay.setCurrentPeriodEndPay(add);
+                            FormEndPayUtil.updateFormEndPay(formEndPay);
+                        }
+                    }else {
+                        if(!BigDecimal.ZERO.equals(add)){
+                            formEndPay=new FormEndPay();
+                            formEndPay.setId(SnowFlakeUtil.getId());
+                            formEndPay.setProjectId(projectId);
+                            formEndPay.setPeriodId(periodId);
+                            formEndPay.setContractId(contractId);
+                            formEndPay.setFormNumber(sis.getFormNumber());
+                            formEndPay.setCurrentPeriodEndPay(add);
+                            FormEndPayUtil.insertFormEndPay(formEndPay);
+                        }
+                    }
                     BigDecimal percent= BaseUtils.str2BigDecimal(ratioFc.apply(sis.getCurrentPeriodEndPay(), sis.getChangeMoney()));
                     if(BigDecimal.ZERO.compareTo(percent)<0) {
                         /*百分比大于零才显示*/

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaService.java

@@ -91,7 +91,7 @@ public interface IFormulaService extends BaseService<Formula> {
     /**获取当前节点的参数wbsNodeId:WBS级id ,wtpPkeyId:项目级PkeyId*/
     List<WbsParam> getNodeWps(Long wbsNodeId,Long wtpPkeyId);
     /**计量公式执行 0中间,1材料,2开工*/
-    List<ReportResult> execute3(Long contractId, Long periodId, Integer type);
+    List<ReportResult> execute3(Long contractId, Long periodId, Integer type,Long perIodId1,Long projectId);
 
    /**获取当前节点的所有元素执行公式,可以按表和元素名筛选*/
     R<Object>formulasForNode(Long pkeyId,String tableName,String elementName);

+ 4 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -26,6 +26,7 @@ import org.jsoup.select.Elements;
 import org.springblade.common.constant.MeasurementStorage;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.manager.utils.PeriodContractUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -2175,7 +2176,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public List<ReportResult> execute4(Long reportId,Long contractId, Long periodId, Integer type,Long projectId) throws FileNotFoundException, IllegalAccessException {
-
         Long redisId = SnowFlakeUtil.getId();
         //判断计算的是哪一期。
         String sql="Select * from s_contract_meter_period where contract_id="+contractId+" and is_deleted=0"+" order by start_date";
@@ -4707,7 +4707,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     /*合同段id,报表Id,报表类型中间计量0,材料1,开工2*/
-    public  List<ReportResult> execute3(Long contractId,Long reportId ,Integer type) {
+    public  List<ReportResult> execute3(Long contractId,Long reportId ,Integer type,Long perIodId1,Long projectId) {
+        FormEndPayDTO dto=new FormEndPayDTO(perIodId1,contractId,projectId);
+        PeriodContractUtil.set(dto);
         ExecutionTime executionTime = new ExecutionTime();
         ContractInfo contractInfo = this.contractInfoService.getById(contractId);
         MeterType meterType = MeterType.getByIndex(type,contractInfo.getContractType());

+ 49 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FormEndPayUtil.java

@@ -0,0 +1,49 @@
+package org.springblade.manager.utils;
+
+import org.springblade.manager.entity.FormEndPay;
+import org.springblade.meter.entity.ContractMeterPeriod;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class FormEndPayUtil {
+    private static JdbcTemplate jdbcTemplate;
+    @Autowired
+    public  void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
+        FormEndPayUtil.jdbcTemplate = jdbcTemplate;
+    }
+    public static FormEndPay selectFoemEndPay(Long periodId,Long contractId,String formNumber){
+        String sql="Select * from s_meter_form_end_pay where period_id="+periodId+" and contract_id="+contractId+" and form_number="+"'"+formNumber+"'";
+        List<FormEndPay> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(FormEndPay.class));
+        if(query.isEmpty()){
+            return null;
+        }else {
+            return query.get(0);
+        }
+    }
+
+    public static List<ContractMeterPeriod> selectList(Long contractId){
+        String sql="Select * from s_contract_meter_period where contract_id="+contractId+" and is_deleted=0"+" order by start_date";
+        return jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(ContractMeterPeriod.class));
+    }
+    public static void updateFormEndPay(FormEndPay formEndPay) {
+        String sql="update s_meter_form_end_pay set current_period_end_pay="+formEndPay.getCurrentPeriodEndPay()+" where id="+formEndPay.getId();
+        jdbcTemplate.update(sql);
+    }
+
+    public static void insertFormEndPay(FormEndPay formEndPay) {
+        String sql = "INSERT INTO s_meter_form_end_pay (id, project_id,period_id, contract_id, form_number, current_period_end_pay) VALUES (?, ?, ?, ?, ?, ?)";
+        jdbcTemplate.update(sql,
+            formEndPay.getId(),
+            formEndPay.getProjectId(),
+            formEndPay.getPeriodId(),
+            formEndPay.getContractId(),
+            formEndPay.getFormNumber(),
+            formEndPay.getCurrentPeriodEndPay()
+        );
+    }
+}

+ 26 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PeriodContractUtil.java

@@ -0,0 +1,26 @@
+package org.springblade.manager.utils;
+
+import org.springblade.manager.dto.FormEndPayDTO;
+
+import java.util.HashMap;
+
+/**
+ * 本地线程存期数ID和合同段ID
+ */
+public class PeriodContractUtil {
+
+    private static final ThreadLocal<FormEndPayDTO> periodContractThreadLocal = new ThreadLocal<>();
+
+    public static void set(FormEndPayDTO dto){
+        periodContractThreadLocal.set(dto);
+    }
+
+    public static FormEndPayDTO get(){
+        return  periodContractThreadLocal.get();
+    }
+
+    public static void clear(){
+        periodContractThreadLocal.remove();
+    }
+
+}

+ 2 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -3697,8 +3697,8 @@ public class TaskController extends BladeController {
             jdbcTemplate.execute(sqlUpdate);
             return R.data(rawPdfUrL);
         }else{
-             reportResults = formulaClient.formulaExecute3(report.getContractId(), report.getId(), report.getType());
-             executionTime.info("公式执行");
+            reportResults = formulaClient.formulaExecute3(report.getContractId(), report.getId(), report.getType(),report.getPeriodId(),report.getProjectId());
+            executionTime.info("公式执行");
         }
         String fileUrl = null;
         if (Func.isNotEmpty(reportResults)) {