Bläddra i källkod

Merge branch 'master' of http://121.41.40.202:3000/zhuwei/bladex

huangtf 1 år sedan
förälder
incheckning
2a94337d2e
100 ändrade filer med 1935 tillägg och 1549 borttagningar
  1. 1 1
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 1 1
      blade-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
  3. 2 2
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  4. 4 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java
  5. 6 0
      blade-service-api/blade-manager-api/pom.xml
  6. 2 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java
  7. 0 6
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  8. 40 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/BaseInfo.java
  9. 8 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ContractInfoVO.java
  10. 10 12
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/EvaSummary.java
  11. 2 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB01.java
  12. 7 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB02.java
  13. 0 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InspectTreeVO.java
  14. 17 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ItemUnit02.java
  15. 28 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/ChangeTokenAddFormDTO.java
  16. 11 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/ChangeTokenFormDTO.java
  17. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MeterPeriodDTO.java
  18. 2 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MeterTreeContractDTO.java
  19. 11 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MiddleMeterApplyDTO.java
  20. 8 4
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenForm.java
  21. 40 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java
  22. 13 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeter.java
  23. 2 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ContractInventoryForm.java
  24. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ContractMaterial.java
  25. 11 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InterimPayCertificate.java
  26. 42 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormApply.java
  27. 5 3
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormMeter.java
  28. 17 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MaterialMeterForm.java
  29. 5 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MaterialStartStatement.java
  30. 5 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterContractInfo.java
  31. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterMidPayItemContract.java
  32. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterMidPayItemProject.java
  33. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterMidPayItemSystem.java
  34. 7 4
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeContract.java
  35. 5 5
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeProject.java
  36. 3 3
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeSystem.java
  37. 4 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeTemplateInfo.java
  38. 12 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApply.java
  39. 8 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/StartPayMeterForm.java
  40. 2 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/StatementFileForm.java
  41. 21 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/feign/MeterContractInfoClient.java
  42. 41 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO.java
  43. 49 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO2.java
  44. 54 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeNodeVO.java
  45. 16 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenFormVO.java
  46. 28 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenPageVO.java
  47. 84 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractFromVO.java
  48. 42 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractInventoryFormVO2.java
  49. 4 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractMeterPeriodVO.java
  50. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InterimPayCertificateVO.java
  51. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormDetailVO.java
  52. 4 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MaterialMeterFormVO.java
  53. 64 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryDetailVO.java
  54. 49 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java
  55. 7 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterMidPayItemContractVO.java
  56. 7 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterMidPayItemProjectVO.java
  57. 7 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterMidPayItemSystemVO.java
  58. 5 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterTreeContractTreeVO.java
  59. 4 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterTreeContractVO.java
  60. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterTreeSystemTreeVO.java
  61. 16 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MiddleMeterApplyVO.java
  62. 40 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ResolveInventoryVO.java
  63. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/StartPayMeterFormVO.java
  64. 55 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ZeroChangeVO.java
  65. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  66. 50 24
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  67. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml
  68. 2 6
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  69. 3 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  70. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FunctionMain.java
  71. 40 79
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  72. 2 2
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  73. 20 23
      blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/MinusNode.java
  74. 36 7
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  75. 180 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  76. 12 2
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java
  77. 45 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  78. 6 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  79. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  80. 0 74
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  81. 0 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  82. 5 337
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/FormulaExecutor.java
  83. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  84. 25 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java
  85. 10 12
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  86. 3 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  87. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java
  88. 8 32
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaService.java
  89. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsParamService.java
  90. 0 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  91. 25 19
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  92. 8 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  93. 36 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java
  94. 238 169
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  95. 43 27
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  96. 19 526
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  97. 0 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  98. 13 15
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  99. 14 45
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java
  100. 111 36
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java

+ 1 - 1
blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java

@@ -110,7 +110,7 @@ public interface LauncherConstant {
     /**
      * elk dev 地址
      */
-    String ELK_DEV_ADDR = "127.0.0.1:9000";
+    String ELK_DEV_ADDR = "192.168.0.119:9000";
 
     /**
      * elk prod 地址

+ 1 - 1
blade-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java

@@ -43,7 +43,7 @@ public class LauncherServiceImpl implements LauncherService {
         PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "false");
 
         // 开启elk日志
-        // PropsUtil.setProperty(props, "blade.log.elk.destination", LauncherConstant.elkAddr(profile));
+        //PropsUtil.setProperty(props, "blade.log.elk.destination", LauncherConstant.elkAddr(profile));
 
         // seata注册地址
         // PropsUtil.setProperty(props, "seata.service.grouplist.default", LauncherConstant.seataAddr(profile));

+ 2 - 2
blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java

@@ -15,7 +15,7 @@ public class AsyncConfigurer {
     /**
      * cpu 核心数量
      */
-    public static final int cpuNum = 3;//Runtime.getRuntime().availableProcessors();
+    public static final int cpuNum = 8;//Runtime.getRuntime().availableProcessors();
 
     /**
      * 线程池配置
@@ -25,7 +25,7 @@ public class AsyncConfigurer {
     @Bean("taskExecutor1")
     public ThreadPoolExecutor getAsyncExecutor() {
         return new ThreadPoolMonitor(cpuNum
-                , 6
+                , 20
                 , 60
                 , TimeUnit.SECONDS
                 , new LinkedBlockingQueue<>(2000)

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java

@@ -141,4 +141,8 @@ public class Task extends BaseEntity {
     @ApiModelProperty("试验自检记录id")
     private Long trialSelfInspectionRecordId;
 
+    @ApiModelProperty("档案任务创建时间戳(解决顺序问题)")
+    private Long taskCreateTimestamp;
+
+
 }

+ 6 - 0
blade-service-api/blade-manager-api/pom.xml

@@ -23,6 +23,12 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-meter-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <packaging>jar</packaging>
 

+ 2 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java

@@ -186,9 +186,9 @@ public class ProjectInfo extends BaseEntity {
     private Long referenceWbsTemplateIdMeter;
 
     /**
-     * wbs私有树引用wbs模板类型-征拆
+     * wbs私有树引用wbs模板类型-计量
      */
-    @ApiModelProperty(value = "wbs私有树引用wbs模板类型-征拆")
+    @ApiModelProperty(value = "wbs私有树引用wbs模板类型-计量")
     private String referenceWbsTemplateTypeMeter;
 
 }

+ 0 - 6
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -1,6 +1,5 @@
 package org.springblade.manager.feign;
 
-import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
@@ -12,7 +11,6 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
-import java.util.Map;
 
 import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
 
@@ -183,8 +181,4 @@ public interface WbsTreeContractClient {
     @GetMapping(API_PREFIX + "/searchNodeAllTableInfo")
     List<AppWbsTreeContractVO> searchNodeAllTableInfo(@RequestParam String primaryKeyId, @RequestParam String type, @RequestParam String contractId, @RequestParam String projectId, @RequestParam Long userId);
 
-    /*删除合同段本地缓存*/
-    @GetMapping(API_PREFIX + "/deleteContractLocalCache")
-    void deleteContractLocalCache(@RequestParam String contractId);
-
 }

+ 40 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/BaseInfo.java

@@ -0,0 +1,40 @@
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.manager.entity.ContractInfo;
+
+import java.math.BigDecimal;
+
+/**
+ * @author yangyj
+ * @Date 2023/12/14 15:55
+ * @description 基础信息
+ */
+@Data
+public class BaseInfo {
+    /**项目名称*/
+    private String projectName;
+    /**合同段名称*/
+    private String contractName;
+    /**
+     * 合同段编号
+     */
+    private String contractNumber;
+    /**
+     * 业主单位名称
+     */
+    private String contractorUnitName;
+    /**
+     * 施工单位名称
+     */
+    private String constructionUnitName;
+    /**
+     * 监理单位名称
+     */
+    private String supervisionUnitName;
+    /**合同段金额*/
+    private BigDecimal contractAmount;
+
+
+}

+ 8 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ContractInfoVO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import org.springblade.manager.entity.ContractInfo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.meter.entity.MeterContractInfo;
 
 import java.util.List;
 
@@ -33,4 +34,11 @@ public class ContractInfoVO extends ContractInfo {
     @ApiModelProperty("是否是默认项目")
     private Integer isDefault;
 
+    /**
+     * 计量合同段-关联详情信息
+     */
+    @ApiModelProperty("计量合同段-关联详情信息")
+    private MeterContractInfo meterContractInfo;
+
+
 }

+ 10 - 12
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/EvaSummary.java

@@ -24,7 +24,8 @@ public abstract class EvaSummary<T> {
     protected  final List<FormData> fds = new ArrayList<>();
     protected  final List<T> datas = new ArrayList<>();
     protected  Map<String, BiFunction<List<T>,Integer,List<Object>>> fm = new HashMap<>();
-    protected  final List<String> sqlList = new ArrayList<>();
+    protected   String sql;
+    protected  final List<Object[]> params = new ArrayList<>();
 
     public abstract Integer getPageNum();
 
@@ -45,8 +46,10 @@ public abstract class EvaSummary<T> {
         return f;
     }
 
-    public  boolean flush( List<WbsTreeContract> wtcList,List<T> datas){
+    public  boolean flush( List<WbsTreeContract> wtcList){
         if(wtcList.size()>0) {
+            WbsTreeContract w = wtcList.get(0);
+            this.sql="update "+w.getInitTableName()+" set "+this.fds.stream().map(e->e.getKey()+"=?").collect(Collectors.joining(","))+" where p_key_id =?";
             Map<Integer, List<T>> pages = IntStream.range(0, datas.size()).boxed()
                     .collect(Collectors.groupingBy(
                             i -> i / rowSize,
@@ -60,22 +63,17 @@ public abstract class EvaSummary<T> {
                     break;
                 }
                 List<T> v = entry.getValue();
-                WbsTreeContract w = wtcList.get(k);
-                StringBuilder  sb =new StringBuilder();
-                this.fds.forEach(fd -> {
-                    sb.append(putEd(k,v,fd,w)).append(StringPool.COMMA);
-                });
-                String template="update "+w.getInitTableName()+" set "+sb.deleteCharAt(sb.length()-1)+" where id ="+w.getPKeyId();
-                sqlList.add(template);
+                List<Object> l=this.fds.stream().map(fd->putEd(k,v,fd)).collect(Collectors.toList());
+                l.add(wtcList.get(k).getPKeyId());
+                params.add(l.toArray());
             }
-
             return true;
         }
         return false;
     }
 
     /**把数据放到对应元素*/
-    private String putEd(int pn, List<T> items, FormData fd, WbsTreeContract w){
+    private String putEd(int pn, List<T> items, FormData fd){
         BiFunction<List<T>,Integer,List<Object>> fc = this.fm.get(fd.getCode());
         if(fc!=null) {
             List<Object> data = fc.apply(items,pn);
@@ -85,7 +83,7 @@ public abstract class EvaSummary<T> {
                 list.add(new ElementData(pn, 0, data.get(i), c.getX(), c.getY()));
             }
             fd.getValues().addAll(list);
-            return fd.getKey()+StringPool.EQUALS+StringPool.SINGLE_QUOTE+recovery(list)+StringPool.SINGLE_QUOTE;
+            return recovery(list);
         }
         return StringPool.EMPTY;
     }

+ 2 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB01.java

@@ -26,10 +26,10 @@ public class FB01 extends EvaSummary<Item01>{
     }
     public FB01(List<FormData> processFds) {
         for(FormData fd:processFds){
-            if(fd.getEName().contains("分项工程编号")){
+            if(fd.getEName().contains("分项工程编号")||fd.getEName().contains("分部工程编号")){
                 this.number=fd;
                 this.fm.put(fd.getCode(),(List<Item01> l,Integer pn)->l.stream().map(Item01::getNumber).collect(Collectors.toList()));
-            }else if(fd.getEName().contains("分项工程名称")){
+            }else if(fd.getEName().contains("分项工程名称")||fd.getEName().contains("分部工程名称")){
                 this.name=fd;
                 this.fm.put(fd.getCode(),(List<Item01> l,Integer pn)->l.stream().map(Item01::getName).collect(Collectors.toList()));
             }else if(fd.getEName().contains("质量等级")){

+ 7 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB02.java

@@ -5,6 +5,9 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.FormulaDataBlock;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -74,8 +77,10 @@ public class FB02 extends EvaSummary<Item02>{
                 int pass = ib.stream().mapToInt(ItemBlock::getSubPass).sum();
                 if (total > 0) {
                     double rate = (double) pass / (double) total;
-                    if (rate >= 0 && rate <= 100) {
-                        xm.setPassRate(rate);
+                    if (rate >= 0.9 && rate <= 100) {
+                        xm.setPassRate(new BigDecimal(rate*100).setScale(1, RoundingMode.HALF_UP).doubleValue());
+                    }else{
+                        xm.setPassRate(100D);
                     }
                 }
                 this.getDatas().add(xm);

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

@@ -57,7 +57,6 @@ public class InspectTreeVO implements INode<InspectTreeVO> {
     @ApiModelProperty(value = "节点名称")
     private String nodeName;
 
-
     @ApiModelProperty(value = "分属专家")
     private String nodeInfo;
 

+ 17 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ItemUnit02.java

@@ -0,0 +1,17 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+/**
+ * @author yangyj
+ * @Date 2023/12/7 14:22
+ * @description 单位工程质量检验评定表2
+ */
+@Data
+public class ItemUnit02 {
+    private String name;
+    private String score;
+    private Integer weight=1;
+    private String level;
+    private String remark;
+}

+ 28 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/ChangeTokenAddFormDTO.java

@@ -0,0 +1,28 @@
+package org.springblade.meter.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/12/7 16:35
+ **/
+@Data
+public class ChangeTokenAddFormDTO {
+
+    @ApiModelProperty(value = "合同id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "显示类型")
+    private Integer showType;
+
+    @ApiModelProperty(value = "节点id")
+    private Long nodeId;
+
+    @ApiModelProperty(value = "搜索值")
+    private String searchValue;
+
+    @ApiModelProperty(value = "已经存在的变更申请清单id,逗号拼接")
+    private String ids;
+}

+ 11 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/ChangeTokenFormDTO.java

@@ -16,9 +16,15 @@
  */
 package org.springblade.meter.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.meter.entity.AttachmentForm;
 import org.springblade.meter.entity.ChangeTokenForm;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.meter.vo.ChangeFormVO2;
+import org.springblade.meter.vo.ChangeNodeVO;
+
+import java.util.List;
 
 /**
  * 变更令表数据传输对象实体类
@@ -31,4 +37,9 @@ import lombok.EqualsAndHashCode;
 public class ChangeTokenFormDTO extends ChangeTokenForm {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "部位集合")
+	private List<ChangeNodeVO> nodeList;
+
+	@ApiModelProperty(value = "附件集合")
+	private List<AttachmentForm> fileList;
 }

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MeterPeriodDTO.java

@@ -32,6 +32,9 @@ import java.util.List;
 @Data
 public class MeterPeriodDTO {
 
+	@ApiModelProperty(value = "项目id")
+	private Long projectId;
+
 	@ApiModelProperty(value = "合同段id")
 	private Long contractId;
 

+ 2 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MeterTreeContractDTO.java

@@ -3,6 +3,7 @@ package org.springblade.meter.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.meter.entity.MeterTreeContract;
+import org.springblade.meter.vo.ContractFromVO;
 
 import java.util.List;
 
@@ -13,6 +14,6 @@ import java.util.List;
 public class MeterTreeContractDTO extends MeterTreeContract {
 
     @ApiModelProperty(value = "分解清单列表详情")
-    private List<Object> decompositionList; //TODO 此处Obj替换为分解清单Bean对象
+    private List<ContractFromVO> decompositionList; //TODO 此处Obj替换为分解清单Bean对象
 
 }

+ 11 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MiddleMeterApplyDTO.java

@@ -16,9 +16,14 @@
  */
 package org.springblade.meter.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.meter.entity.AttachmentForm;
 import org.springblade.meter.entity.MiddleMeterApply;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.meter.vo.MeterInventoryVO;
+
+import java.util.List;
 
 /**
  * 中间计量申请表数据传输对象实体类
@@ -31,4 +36,10 @@ import lombok.EqualsAndHashCode;
 public class MiddleMeterApplyDTO extends MiddleMeterApply {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "计量清单列表")
+	private List<MeterInventoryVO> formList;
+
+	@ApiModelProperty(value = "附件集合")
+	private List<AttachmentForm> fileList;
+
 }

+ 8 - 4
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenForm.java

@@ -83,7 +83,7 @@ public class ChangeTokenForm extends BaseEntity {
     /**
      * 变更申请金额
      */
-    @ApiModelProperty(value = "项目id")
+    @ApiModelProperty(value = "变更申请金额")
     private BigDecimal changeMoney;
     /**
      * 设计完成时间
@@ -118,13 +118,17 @@ public class ChangeTokenForm extends BaseEntity {
     /**
      * 审批状态
      */
-    @ApiModelProperty(value = "审批状态")
+    @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
     private Integer approveStatus;
     /**
      * 下达状态
      */
-    @ApiModelProperty(value = "下达状态")
-    private String commandStatus;
+    @ApiModelProperty(value = "下达状态0未下达1已下达")
+    private Integer commandStatus;
+
+    @ApiModelProperty(value = "下达日期")
+    private LocalDate commandDate;
+
 
 
 }

+ 40 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java

@@ -16,9 +16,12 @@
  */
 package org.springblade.meter.entity;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
@@ -53,16 +56,36 @@ public class ChangeTokenInventory extends BaseEntity {
      */
     @ApiModelProperty(value = "变更令id")
     private Long changeTokenId;
+    /**
+     * 合同计量单元id
+     */
+    @ApiModelProperty(value = "合同计量单元id(部位)")
+    private Long contractMeterId;
     /**
      * 合同工程清单id
      */
     @ApiModelProperty(value = "合同工程清单id")
     private Long contractFormId;
+    /**
+     * 清单编号
+     */
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+    /**
+     * 清单名称
+     */
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+    /**
+     * 当前单价
+     */
+    @ApiModelProperty(value = "当前单价")
+    private BigDecimal currentPrice;
     /**
      * 变更前数量
      */
     @ApiModelProperty(value = "变更前数量")
-    private Integer changeBefore;
+    private Integer changeBeforeTotal;
     /**
      * 变更数量
      */
@@ -72,7 +95,22 @@ public class ChangeTokenInventory extends BaseEntity {
      * 变更后数量
      */
     @ApiModelProperty(value = "变更后数量")
-    private Integer changeAfter;
+    private Integer changeAfterTotal;
+    /**
+     * 变更前金额
+     */
+    @ApiModelProperty(value = "变更前金额")
+    private BigDecimal changeBeforeMoney;
+    /**
+     * 变更金额
+     */
+    @ApiModelProperty(value = "变更金额")
+    private BigDecimal changeMoney;
+    /**
+     * 变更后金额
+     */
+    @ApiModelProperty(value = "变更后金额")
+    private BigDecimal changeAfterMoney;
 
 
 }

+ 13 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeter.java

@@ -19,6 +19,7 @@ package org.springblade.meter.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
@@ -58,11 +59,23 @@ public class ChangeTokenMeter extends BaseEntity {
      */
     @ApiModelProperty(value = "合同计量单元id")
     private Long contractMeterId;
+
+    @ApiModelProperty(value = "工程名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "节点路径")
+    private String nodeUrl;
     /**
      * 合同图号
      */
     @ApiModelProperty(value = "合同图号")
     private String contractPicture;
 
+    @ApiModelProperty(value = "变更后金额")
+    private BigDecimal changeMoney;
+
+    @ApiModelProperty(value = "是否增补")
+    private Integer isSupplement;
+
 
 }

+ 2 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ContractInventoryForm.java

@@ -118,13 +118,13 @@ public class ContractInventoryForm extends BaseEntity {
      */
     @ApiModelProperty(value = "合同数量")
     @ExcelProperty("数量")
-    private Integer contractTotal;
+    private BigDecimal contractTotal;
     /**
      * 变更后数量
      */
     @ApiModelProperty(value = "变更后数量")
     @ExcelIgnore
-    private Integer changeTotal;
+    private BigDecimal changeTotal;
     /**
      * 合同金额
      */

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ContractMaterial.java

@@ -78,7 +78,7 @@ public class ContractMaterial extends BaseEntity {
      * 数量
      */
     @ApiModelProperty(value = "数量")
-    private Integer amount;
+    private BigDecimal amount;
 
 
 }

+ 11 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InterimPayCertificate.java

@@ -55,6 +55,11 @@ public class InterimPayCertificate extends BaseEntity {
      */
     @ApiModelProperty(value = "合同计量期id")
     private Long contractPeriodId;
+    /**
+     * 计量期
+     */
+    @ApiModelProperty(value = "合同计量期-期号")
+    private String periodNumber;
     /**
      * 材料计量期id逗号分隔
      */
@@ -95,6 +100,12 @@ public class InterimPayCertificate extends BaseEntity {
      */
     @ApiModelProperty(value = "支付金额")
     private BigDecimal payMoney;
+    /**
+     * 是否锁定
+     */
+    @ApiModelProperty(value = "是否锁定:0未锁定,1锁定")
+    private Integer isLock;
+
 
 
 }

+ 42 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormApply.java

@@ -16,9 +16,13 @@
  */
 package org.springblade.meter.entity;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
 
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
@@ -58,11 +62,48 @@ public class InventoryFormApply extends BaseEntity {
      */
     @ApiModelProperty(value = "中间计量申请id")
     private Long middleMeterId;
+
+    @ApiModelProperty(value = "合同计量单元id")
+    private Long contractMeterId;
+    /**
+     * 计量单编号
+     */
+    @ApiModelProperty(value = "计量单编号")
+    private String meterNumber;
+
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+
+    @ApiModelProperty(value = "当前单价")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "施工图数量")
+    private BigDecimal buildPictureTotal;
+    /**
+     * 变更后施工图数量
+     */
+    @ApiModelProperty(value = "变更后施工图数量")
+    private BigDecimal changeBuildPictureTotal;
     /**
      * 本期计量数量
      */
     @ApiModelProperty(value = "本期计量数量")
-    private Integer currentMeterTotal;
+    private BigDecimal currentMeterTotal;
+    /**
+     * 本期计量金额
+     */
+    @ApiModelProperty(value = "本期计量金额")
+    private BigDecimal currentMeterMoney;
+    /**
+     * 合同计量期id
+     */
+    @ApiModelProperty(value = "合同计量期id")
+    private Long contractPeriodId;
 
+    @ApiModelProperty(value = "业务日期")
+    private LocalDate businessDate;
 
 }

+ 5 - 3
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/InventoryFormMeter.java

@@ -17,9 +17,6 @@
 package org.springblade.meter.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-
-import java.io.Serializable;
-
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
@@ -63,6 +60,11 @@ public class InventoryFormMeter extends BaseEntity {
      */
     @ApiModelProperty(value = "施工图数量")
     private Integer buildPictureTotal;
+    /**
+     * 变更后施工图数量
+     */
+    @ApiModelProperty(value = "变更后施工图数量")
+    private Integer changeBuildPictureTotal;
 
 
 }

+ 17 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MaterialMeterForm.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
@@ -64,6 +65,15 @@ public class MaterialMeterForm extends BaseEntity {
      */
     @ApiModelProperty(value = "合同材料id")
     private Long contractMaterialId;
+    @ApiModelProperty(value = "合同材料名称")
+    private String contractMaterialName;
+    @ApiModelProperty(value = "期号")
+    private String periodNumber;
+    /**
+     * 期名称
+     */
+    @ApiModelProperty(value = "期名称")
+    private String periodName;
     /**
      * 单价
      */
@@ -73,12 +83,17 @@ public class MaterialMeterForm extends BaseEntity {
      * 计量数量
      */
     @ApiModelProperty(value = "计量数量")
-    private Integer meterAmount;
+    private BigDecimal meterAmount;
     /**
      * 计量金额
      */
     @ApiModelProperty(value = "计量金额")
     private BigDecimal meterMoney;
+    /**
+     * 业务日期
+     */
+    @ApiModelProperty(value = "业务日期")
+    private LocalDate businessDate;
     /**
      * 备料堆放地点
      */
@@ -117,7 +132,7 @@ public class MaterialMeterForm extends BaseEntity {
     /**
      * 审批状态
      */
-    @ApiModelProperty(value = "审批状态")
+    @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
     private Integer approveStatus;
     /**
      * 排序

+ 5 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MaterialStartStatement.java

@@ -54,6 +54,11 @@ public class MaterialStartStatement extends BaseEntity {
      */
     @ApiModelProperty(value = "计量期id,s_meter_period")
     private Long meterPeriodId;
+    /**
+     * 计量期编号
+     */
+    @ApiModelProperty(value = "计量期编号")
+    private String periodNumber;
     /**
      * 1材料2开工
      */

+ 5 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterContractInfo.java

@@ -1,16 +1,19 @@
 package org.springblade.meter.entity;
 
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.core.mp.base.BaseEntity;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
- * 计量合同段信息详情
+ * 计量合同段关联信息详情
  */
 @Data
-public class MeterContractInfo implements Serializable {
+@TableName(value = "s_meter_contract_info")
+public class MeterContractInfo extends BaseEntity {
 
     @ApiModelProperty(value = "合同段id")
     private Long contractId;

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterMidPayItemContract.java

@@ -6,7 +6,7 @@ import lombok.Data;
 import org.springblade.core.mp.base.BaseEntity;
 
 /**
- * 合同段中期支付项信息
+ * 合同段中期支付项信息
  */
 @Data
 @TableName(value = "s_meter_mid_pay_item_contract")

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterMidPayItemProject.java

@@ -6,7 +6,7 @@ import lombok.Data;
 import org.springblade.core.mp.base.BaseEntity;
 
 /**
- * 项目中期支付项信息
+ * 项目中期支付项信息
  */
 @Data
 @TableName(value = "s_meter_mid_pay_item_project")

+ 1 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterMidPayItemSystem.java

@@ -6,7 +6,7 @@ import lombok.Data;
 import org.springblade.core.mp.base.BaseEntity;
 
 /**
- * 系统中期支付项信息
+ * 系统中期支付项信息
  */
 @Data
 @TableName(value = "s_meter_mid_pay_item_system")

+ 7 - 4
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeContract.java

@@ -8,7 +8,7 @@ import org.springblade.core.mp.base.BaseEntity;
 import java.math.BigDecimal;
 
 /**
- * 合同段计量单元树详情表
+ * 合同段计量单元树
  */
 @Data
 @TableName(value = "s_meter_tree_contract")
@@ -32,10 +32,10 @@ public class MeterTreeContract extends BaseEntity {
     @ApiModelProperty(value = "节点类型")
     private Integer nodeType;
 
-    @ApiModelProperty(value = "工程类型")
-    private Integer engineeringType;
+    @ApiModelProperty(value = "工程类型名称")
+    private String engineeringTypeName;
 
-    @ApiModelProperty(value = "数据源类型 1=原始引用、2=新增、3=导入、4=复制")
+    @ApiModelProperty(value = "数据源类型 1=项目原始引用、2=合同段手动新增、3=项目新增引用(项目是新增的)")
     private Integer dataSourceType;
 
     @ApiModelProperty(value = "源节点id(项目树节点id)")
@@ -68,6 +68,9 @@ public class MeterTreeContract extends BaseEntity {
     @ApiModelProperty(value = "结束桩号")
     private String endStake;
 
+    @ApiModelProperty(value = "桩号类型")
+    private Integer stakeType;
+
     @ApiModelProperty(value = "施工图金额")
     private BigDecimal buildPictureMoney;
 

+ 5 - 5
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeProject.java

@@ -6,7 +6,7 @@ import lombok.Data;
 import org.springblade.core.mp.base.BaseEntity;
 
 /**
- * 项目级计量单元树详情表
+ * 项目级计量单元树
  */
 @Data
 @TableName(value = "s_meter_tree_project")
@@ -27,13 +27,13 @@ public class MeterTreeProject extends BaseEntity {
     @ApiModelProperty(value = "节点类型")
     private Integer nodeType;
 
-    @ApiModelProperty(value = "工程类型")
-    private Integer engineeringType;
+    @ApiModelProperty(value = "工程类型名称")
+    private String engineeringTypeName;
 
-    @ApiModelProperty(value = "数据源类型 1=原始引用、2=新增、3=导入、4=复制")
+    @ApiModelProperty(value = "数据源类型 1=系统原始引用、2=项目手动新增")
     private Integer dataSourceType;
 
-    @ApiModelProperty(value = "源节点id(项目树节点id)")
+    @ApiModelProperty(value = "源节点id(系统树节点id)")
     private Long sourceNodeId;
 
     @ApiModelProperty(value = "编辑状态 0=非编辑,1=是编辑")

+ 3 - 3
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeSystem.java

@@ -6,7 +6,7 @@ import lombok.Data;
 import org.springblade.core.mp.base.BaseEntity;
 
 /**
- * 系统级计量单元树详情表
+ * 系统级计量单元树
  */
 @Data
 @TableName(value = "s_meter_tree_system")
@@ -24,8 +24,8 @@ public class MeterTreeSystem extends BaseEntity {
     @ApiModelProperty(value = "节点类型")
     private Integer nodeType;
 
-    @ApiModelProperty(value = "工程类型")
-    private Integer engineeringType;
+    @ApiModelProperty(value = "工程类型名称")
+    private String engineeringTypeName;
 
     @ApiModelProperty(value = "父级id")
     private Long parentId;

+ 4 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MeterTreeTemplateInfo.java

@@ -5,6 +5,10 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.core.mp.base.BaseEntity;
 
+
+/**
+ * 计量单元模板
+ */
 @Data
 @TableName(value = "s_meter_tree_template_info")
 public class MeterTreeTemplateInfo extends BaseEntity {

+ 12 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApply.java

@@ -60,6 +60,11 @@ public class MiddleMeterApply extends BaseEntity {
      */
     @ApiModelProperty(value = "合同计量期id")
     private Long contractPeriodId;
+    /**
+     * 合同计量期期号
+     */
+    @ApiModelProperty(value = "合同计量期期号")
+    private String periodNumber;
     /**
      * 计量单编号
      */
@@ -98,8 +103,8 @@ public class MiddleMeterApply extends BaseEntity {
     /**
      * 变更令id
      */
-    @ApiModelProperty(value = "变更令id")
-    private Long changeTokenId;
+    @ApiModelProperty(value = "变更令编号")
+    private String changeTokenNumber;
     /**
      * 图片地址
      */
@@ -110,6 +115,11 @@ public class MiddleMeterApply extends BaseEntity {
      */
     @ApiModelProperty(value = "计算式")
     private String calculateFormula;
+    /**
+     * 审批状态
+     */
+    @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
+    private Integer approveStatus;
 
 
 }

+ 8 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/StartPayMeterForm.java

@@ -55,6 +55,14 @@ public class StartPayMeterForm extends BaseEntity {
      */
     @ApiModelProperty(value = "计量期id,s_meter_period")
     private Long meterPeriodId;
+
+    @ApiModelProperty(value = "期号")
+    private String periodNumber;
+    /**
+     * 期名称
+     */
+    @ApiModelProperty(value = "期名称")
+    private String periodName;
     /**
      * 业务日期
      */

+ 2 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/StatementFileForm.java

@@ -51,8 +51,8 @@ public class StatementFileForm extends BaseEntity {
     /**
      * 报表id
      */
-    @ApiModelProperty(value = "报表id")
-    private Long statementId;
+    @ApiModelProperty(value = "计量期id")
+    private Long meterPeriodId;
     /**
      * 报表类型:1中期支付2材料3看开工
      */

+ 21 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/feign/MeterContractInfoClient.java

@@ -0,0 +1,21 @@
+package org.springblade.meter.feign;
+
+import org.springblade.meter.entity.MeterContractInfo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX + "meter")
+public interface MeterContractInfoClient {
+
+    /**
+     * 计量合同段详情信息关联保存或修改
+     *
+     * @param meterContractInfo
+     */
+    @PostMapping("/api/meter/contract/saveOrUpdate")
+    void saveOrUpdate(@RequestBody MeterContractInfo meterContractInfo);
+
+}

+ 41 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO.java

@@ -0,0 +1,41 @@
+package org.springblade.meter.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param   变更清单列表 -变更令使用
+ * @Author wangwl
+ * @Date 2023/12/7 15:52
+ **/
+@Data
+public class ChangeFormVO {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+
+    @ApiModelProperty(value = "当前单价")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "合同数量")
+    private Integer contractTotal;
+
+    @ApiModelProperty(value = "合同变更后数量")
+    private Integer changeTotal;
+
+    @ApiModelProperty(value = "施工图变更后数量")
+    private Integer buildChangeTotal;
+
+    @ApiModelProperty(value = "分解剩余量")
+    private Integer resolveResidueTotal;
+}

+ 49 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO2.java

@@ -0,0 +1,49 @@
+package org.springblade.meter.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param   变更申请清单列表 -变更令使用
+ * @Author wangwl
+ * @Date 2023/12/7 15:52
+ **/
+@Data
+public class ChangeFormVO2 {
+
+    @ApiModelProperty(value = "合同计量单元id(部位)")
+    private Long contractMeterId;
+
+    @ApiModelProperty(value = "清单id")
+    private Long id;
+
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+
+    @ApiModelProperty(value = "当前单价")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "合同数量(变更前)")
+    private Integer contractTotal;
+
+    @ApiModelProperty(value = "数量变更增减")
+    private Integer currentChangeTotal;
+
+    @ApiModelProperty(value = "合同变更后数量(变更后)")
+    private Integer changeTotal;
+
+    @ApiModelProperty(value = "合同金额(变更前)")
+    private BigDecimal contractMoney;
+
+    @ApiModelProperty(value = "金额变更增减")
+    private BigDecimal currentChangeMoney;
+
+    @ApiModelProperty(value = "变更后金额(变更后)")
+    private BigDecimal changeMoney;
+}

+ 54 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeNodeVO.java

@@ -0,0 +1,54 @@
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Param   变更部位视图类-变更令用
+ * @Author wangwl
+ * @Date 2023/12/11 10:12
+ **/
+@Data
+public class ChangeNodeVO {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "工程名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "节点路径")
+    private String nodeUrl;
+
+    @ApiModelProperty(value = "合同图号")
+    private String contractPicture;
+
+    @ApiModelProperty(value = "变更后金额")
+    private BigDecimal changeMoney;
+
+    @ApiModelProperty(value = "是否增补")
+    private Integer isSupplement;
+
+    @ApiModelProperty(value = "是否增补名称")
+    private String isSupplementName;
+
+    @ApiModelProperty(value = "清单集合")
+    private List<ChangeFormVO2> formList;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ChangeNodeVO that = (ChangeNodeVO) o;
+        return id.equals(that.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+}

+ 16 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenFormVO.java

@@ -16,10 +16,14 @@
  */
 package org.springblade.meter.vo;
 
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.meter.entity.AttachmentForm;
 import org.springblade.meter.entity.ChangeTokenForm;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * 变更令表视图实体类
  *
@@ -31,4 +35,16 @@ import lombok.EqualsAndHashCode;
 public class ChangeTokenFormVO extends ChangeTokenForm {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "变更类型名称")
+	private String changeTypeName;
+
+	@ApiModelProperty(value = "变更归类名称")
+	private String changeClassifyName;
+
+	@ApiModelProperty(value = "部位集合")
+	private List<ChangeNodeVO> nodeList;
+
+	@ApiModelProperty(value = "附件集合")
+	private List<AttachmentForm> fileList;
+
 }

+ 28 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenPageVO.java

@@ -0,0 +1,28 @@
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.meter.entity.ChangeTokenForm;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/12/11 18:09
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ChangeTokenPageVO extends ChangeTokenForm {
+    private static final long serialVersionUID = 2L;
+
+    @ApiModelProperty(value = "变更类型名称")
+    private String changeTypeName;
+
+    @ApiModelProperty(value = "审批状态名称")
+    private String approveStatusName;
+
+    @ApiModelProperty(value = "引用状态,0未引用,1引用")
+    private Integer citeStatus;
+
+
+}

+ 84 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractFromVO.java

@@ -0,0 +1,84 @@
+package org.springblade.meter.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author zhuw
+ * @Date 2023/11/29 15:25
+ **/
+@Data
+public class ContractFromVO {
+
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 清单编号
+     */
+    @ApiModelProperty(value = "清单编号")
+    @ExcelProperty("清单编号")
+    private String formNumber;
+    /**
+     * 清单名称
+     */
+    @ApiModelProperty(value = "清单名称")
+    @ExcelProperty("清单名称")
+    private String formName;
+
+    /**
+     * 当前单价
+     */
+    @ApiModelProperty(value = "当前单价")
+    @ExcelIgnore
+    private BigDecimal currentPrice;
+
+    /**
+     * 合同数量
+     */
+    @ApiModelProperty(value = "合同数量")
+    @ExcelProperty("数量")
+    private Integer contractTotal;
+
+    /**
+     * 变更后数量
+     */
+    @ApiModelProperty(value = "变更后数量")
+    @ExcelIgnore
+    private Integer changeTotal;
+
+    /**
+     * 已分解量
+     */
+    @ApiModelProperty(value = "已分解量")
+    @ExcelIgnore
+    private Integer poseNum;
+
+    /**
+     * 剩余分解量
+     */
+    @ApiModelProperty(value = "剩余分解量")
+    @ExcelIgnore
+    private Integer residueNum;
+
+    /**
+     * 是否增补
+     */
+    @ApiModelProperty(value = "是否增补")
+    @ExcelIgnore
+    private Integer isSupplement;
+}

+ 42 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractInventoryFormVO2.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.meter.entity.ContractInventoryForm;
+
+/**
+ * 合同工程清单VO  懒加载树返回单层节点
+ *
+ * @author BladeX
+ * @since 2023-11-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ContractInventoryFormVO2 extends ContractInventoryForm {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "ture有子节点,false没有子节点")
+	private Boolean hasChild;
+
+	@ApiModelProperty(value = "节点名称")
+	private String nodeName;
+
+
+}

+ 4 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractMeterPeriodVO.java

@@ -32,7 +32,10 @@ import lombok.EqualsAndHashCode;
 public class ContractMeterPeriodVO extends ContractMeterPeriod {
 	private static final long serialVersionUID = 1L;
 
-	@ApiModelProperty(value = "引用状态,0未引用,1引用")
+	@ApiModelProperty(value = "存在数据状态,0不存在,1已存在。如果存在数据则不能删除可以修改")
+	private Integer dataStatus;
+
+	@ApiModelProperty(value = "引用状态,0未引用,1引用。如果被引用就不能删除不能修改")
 	private Integer citeStatus;
 
 }

+ 6 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InterimPayCertificateVO.java

@@ -16,10 +16,13 @@
  */
 package org.springblade.meter.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.meter.entity.InterimPayCertificate;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * 中期支付证书视图实体类
  *
@@ -31,4 +34,7 @@ import lombok.EqualsAndHashCode;
 public class InterimPayCertificateVO extends InterimPayCertificate {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "支付项集合")
+	List<Object> payList;
+
 }

+ 6 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormDetailVO.java

@@ -41,4 +41,10 @@ public class InventoryFormDetailVO extends ContractInventoryForm {
 	@ApiModelProperty(value = "下级节点集合")
 	private List<ContractInventoryFormVO> list;
 
+	@ApiModelProperty(value = "引用状态,0未引用,1引用")
+	private Integer citeStatus;
+
+	@ApiModelProperty(value = "是否专项暂定金")
+	private String isSpecialFund;
+
 }

+ 4 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MaterialMeterFormVO.java

@@ -22,6 +22,7 @@ import org.springblade.meter.entity.MaterialMeterForm;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.time.LocalDate;
 import java.util.List;
 
 /**
@@ -38,6 +39,9 @@ public class MaterialMeterFormVO extends MaterialMeterForm {
 	@ApiModelProperty(value = "审批状态名称")
 	private String approveStatusName;
 
+	@ApiModelProperty(value = "计量期名称")
+	private String meterPeriodName;
+
 	@ApiModelProperty(value = "材料是否符合要求名称")
 	private String materialConformName;
 

+ 64 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryDetailVO.java

@@ -0,0 +1,64 @@
+package org.springblade.meter.vo;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param   计量清单明细视图类,用于中间计量申请
+ * @Author wangwl
+ * @Date 2023/12/5 17:18
+ **/
+@Data
+public class MeterInventoryDetailVO {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "清单id")
+    private Long contractFormId;
+
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+
+    @ApiModelProperty(value = "变更后数量")
+    private BigDecimal changeTotal;
+
+    @ApiModelProperty(value = "审批状态名称")
+    private String approveStatusName;
+
+    @ApiModelProperty(value = "计量期名称")
+    private String meterPeriodName;
+
+    @ApiModelProperty(value = "工程划分")
+    private String engineerDivide;
+
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "本期计量数量")
+    private BigDecimal currentMeterTotal;
+
+    @ApiModelProperty(value = "本期计量金额")
+    private BigDecimal currentMeterMoney;
+
+    @ApiModelProperty(value = "完成金额")
+    private BigDecimal allMeterMoney;
+
+    @ApiModelProperty(value = "累计计量数量")
+    private BigDecimal allMeterTotal;
+
+    @ApiModelProperty(value = "明细")
+    private List<MeterInventoryDetailVO> detail;
+
+    @ApiModelProperty(value = "计量单编号")
+    private String meterNumber;
+
+
+}

+ 49 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java

@@ -0,0 +1,49 @@
+package org.springblade.meter.vo;
+
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param   计量清单视图类,用于中间计量申请
+ * @Author wangwl
+ * @Date 2023/12/5 17:18
+ **/
+@Data
+public class MeterInventoryVO {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "分解数量")
+    private BigDecimal resolveTotal;
+
+    @ApiModelProperty(value = "变更后数量")
+    private BigDecimal changeTotal;
+
+    @ApiModelProperty(value = "本期计量数量")
+    private BigDecimal currentMeterTotal;
+
+    @ApiModelProperty(value = "含变更数量")
+    private BigDecimal containChangeTotal;
+
+    @ApiModelProperty(value = "本期计量金额")
+    private BigDecimal currentMeterMoney;
+
+    @ApiModelProperty(value = "累计计量数量")
+    private BigDecimal allMeterTotal;
+
+}

+ 7 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterMidPayItemContractVO.java

@@ -13,6 +13,12 @@ import java.util.List;
 public class MeterMidPayItemContractVO extends MeterMidPayItemContract {
 
     @ApiModelProperty(value = "汇总项列表信息")
-    private List<MeterMidPayItemContract> summaryItemList;
+    private List<MeterMidPayItemContractVO> summaryItemList;
+
+    @ApiModelProperty(value = "支付项类型名称")
+    private String payTypeName;
+
+    @ApiModelProperty(value = "支付适用类型名称")
+    private String payApplicableTypeName;
 
 }

+ 7 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterMidPayItemProjectVO.java

@@ -13,6 +13,12 @@ import java.util.List;
 public class MeterMidPayItemProjectVO extends MeterMidPayItemProject {
 
     @ApiModelProperty(value = "汇总项列表信息")
-    private List<MeterMidPayItemProject> summaryItemList;
+    private List<MeterMidPayItemProjectVO> summaryItemList;
+
+    @ApiModelProperty(value = "支付项类型名称")
+    private String payTypeName;
+
+    @ApiModelProperty(value = "支付适用类型名称")
+    private String payApplicableTypeName;
 
 }

+ 7 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterMidPayItemSystemVO.java

@@ -13,6 +13,12 @@ import java.util.List;
 public class MeterMidPayItemSystemVO extends MeterMidPayItemSystem {
 
     @ApiModelProperty(value = "汇总项列表信息")
-    private List<MeterMidPayItemSystem> summaryItemList;
+    private List<MeterMidPayItemSystemVO> summaryItemList;
+
+    @ApiModelProperty(value = "支付项类型名称")
+    private String payTypeName;
+
+    @ApiModelProperty(value = "支付适用类型名称")
+    private String payApplicableTypeName;
 
 }

+ 5 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterTreeContractTreeVO.java

@@ -1,5 +1,6 @@
 package org.springblade.meter.vo;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.meter.entity.MeterTreeContract;
@@ -10,4 +11,8 @@ public class MeterTreeContractTreeVO extends MeterTreeContract {
     @ApiModelProperty(value = "是否没有子级 true=最下级(没有子级) false=有子级")
     private boolean notExsitChild;
 
+    @ApiModelProperty(value = "是否存在清单数据 1=有 0=没有")
+    @JsonProperty(value = "isDecompositionData")
+    private Integer isDecompositionData;
+
 }

+ 4 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterTreeContractVO.java

@@ -13,6 +13,9 @@ import java.util.List;
 public class MeterTreeContractVO extends MeterTreeContract {
 
     @ApiModelProperty(value = "分解清单列表详情")
-    private List<Object> decompositionList; //TODO 此处Obj替换为分解清单Bean对象
+    private List<ContractFromVO> decompositionList;
+
+    @ApiModelProperty(value = "桩号类型名称")
+    private String stakeTypeName;
 
 }

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterTreeSystemTreeVO.java

@@ -10,4 +10,7 @@ public class MeterTreeSystemTreeVO extends MeterTreeSystem {
     @ApiModelProperty(value = "是否没有子级 true=最下级(没有子级) false=有子级")
     private boolean notExsitChild;
 
+    @ApiModelProperty(value = "节点类型名称")
+    private String nodeTypeName;
+
 }

+ 16 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MiddleMeterApplyVO.java

@@ -16,10 +16,14 @@
  */
 package org.springblade.meter.vo;
 
+import io.swagger.annotations.ApiModelProperty;
+import org.springblade.meter.entity.AttachmentForm;
 import org.springblade.meter.entity.MiddleMeterApply;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * 中间计量申请表视图实体类
  *
@@ -31,4 +35,16 @@ import lombok.EqualsAndHashCode;
 public class MiddleMeterApplyVO extends MiddleMeterApply {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "审批状态名称")
+	private String approveStatusName;
+
+	@ApiModelProperty(value = "计量期号")
+	private String periodNumber;
+
+	@ApiModelProperty(value = "计量清单列表")
+	private List<MeterInventoryVO> formList;
+
+	@ApiModelProperty(value = "附件集合")
+	private List<AttachmentForm> fileList;
+
 }

+ 40 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ResolveInventoryVO.java

@@ -0,0 +1,40 @@
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param   分解清单视图类,用于中间计量申请
+ * @Author wangwl
+ * @Date 2023/12/5 18:22
+ **/
+@Data
+public class ResolveInventoryVO {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+
+    @ApiModelProperty(value = "现在单价")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "合同数量")
+    private BigDecimal contractTotal;
+
+    @ApiModelProperty(value = "合同变更数量")
+    private BigDecimal ChangeTotal;
+
+    @ApiModelProperty(value = "施工图变更后数量")
+    private BigDecimal buildChangeTotal;
+
+    @ApiModelProperty(value = "分解剩余量")
+    private BigDecimal resolveResidueTotal;
+
+}

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/StartPayMeterFormVO.java

@@ -35,6 +35,9 @@ import java.util.List;
 public class StartPayMeterFormVO extends StartPayMeterForm {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "期号")
+	private String periodNumber;
+
 	@ApiModelProperty(value = "审批状态名称")
 	private String approveStatusName;
 

+ 55 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ZeroChangeVO.java

@@ -0,0 +1,55 @@
+package org.springblade.meter.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param   零号变更视图类
+ * @Author wangwl
+ * @Date 2023/12/7 14:21
+ **/
+@Data
+public class ZeroChangeVO {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+
+    @ApiModelProperty(value = "当前单价")
+    private BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "合同数量")
+    private Integer contractTotal;
+
+    @ApiModelProperty(value = "合同金额")
+    private BigDecimal contractMoney;
+
+    @ApiModelProperty(value = "生成变更时划分数量")
+    private Integer buildChangeTotal;
+
+    @ApiModelProperty(value = "现划分数量")
+    private Integer currentChangeTotal;
+
+    @ApiModelProperty(value = "修正量")
+    private Integer updateTotal;
+
+    @ApiModelProperty(value = "修正金额")
+    private BigDecimal updateMoney;
+
+    @ApiModelProperty(value = "核实量")
+    private Integer verifyTotal;
+
+    @ApiModelProperty(value = "核实金额")
+    private BigDecimal verifyMoney;
+
+
+}

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java

@@ -269,7 +269,7 @@ public class ArchiveFileTaskController extends BladeController {
         int totalCount = totalCountOptional.orElse(0);
 
         //分页
-        sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+        sqlString.append(" ORDER BY COALESCE(task_create_timestamp, create_time) ASC LIMIT ? OFFSET ?;"); //按照创建时间戳task_create_timestamp排序,如果task_create_timestamp为空,则按照create_time进行排序。
         params.add(size);
         params.add((current - 1) * size);
 

+ 50 - 24
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -457,9 +457,16 @@ public class TaskController extends BladeController {
 
         //创建上报任务
         Map<Long, String> nameMap = jdbcTemplate.query("select id,name from blade_user where is_deleted = 0", new BeanPropertyRowMapper<>(User.class)).stream().collect(Collectors.toMap(User::getId, User::getName, (key1, key2) -> key1));
-        List<ArchiveFile> archiveFiles = jdbcTemplate.query("select * from u_archive_file where id in (" + archiveTaskBatchReportDTO.getDataIds() + ")", new BeanPropertyRowMapper<>(ArchiveFile.class));
-        if (archiveFiles.size() > 0) {
-            for (ArchiveFile archive : archiveFiles) {
+
+        String[] dataArr = archiveTaskBatchReportDTO.getDataIds().split(",");
+        if (dataArr.length > 0) {
+            for (String id : dataArr) {
+                ArchiveFile archive = jdbcTemplate.query("SELECT * FROM u_archive_file WHERE id = " + id, new BeanPropertyRowMapper<>(ArchiveFile.class)).stream().findAny().orElse(null);
+
+                if (archive == null) {
+                    continue;
+                }
+
                 if (Arrays.asList(1, 2).contains(archive.getStatus())) {
                     throw new ServiceException("只有【未上报 或 已废除】状态的业务数据才能上报!");
                 }
@@ -467,6 +474,12 @@ public class TaskController extends BladeController {
                     throw new ServiceException("只有【未认证】状态的业务数据才能上报!");
                 }
 
+                /*新增的时候去重判断,status=1或2,有且只有一条*/
+                Task taskInfo = jdbcTemplate.query("select status from u_task where task_create_timestamp is not null and status in (1,2) and form_data_id = '" + id + "'", new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+                if (ObjectUtil.isNotEmpty(taskInfo)) {
+                    throw new ServiceException("文件【" + archive.getFileName() + "】已经上报,请重新选择左侧节点树文件数据进行上报");
+                }
+
                 //创建task审批任务
                 Long processInstanceId = SnowFlakeUtil.getId();
                 Task task = new Task();
@@ -501,6 +514,9 @@ public class TaskController extends BladeController {
                 task.setIsDeleted(0);
                 task.setTrialSelfInspectionRecordId(null);
 
+                /*记录当前时间戳*/
+                task.setTaskCreateTimestamp(System.currentTimeMillis());
+
                 taskService.save(task);
 
                 //创建任务相关信息
@@ -527,6 +543,13 @@ public class TaskController extends BladeController {
 
                 //修改档案业务数据任务状态为待审批
                 jdbcTemplate.execute("update u_archive_file set status = 1 where id = " + archive.getId());
+
+                //睡眠1毫秒,确保每个任务的创建时间不一样(时间如果相同,会导致任务查看待办列表的任务顺序不好判断)
+                try {
+                    Thread.sleep(1);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
             }
 
             //WebSocket推送
@@ -546,6 +569,7 @@ public class TaskController extends BladeController {
                     }
                 }
             }
+
             return R.success("上报成功");
         }
         return R.fail("操作失败");
@@ -564,10 +588,11 @@ public class TaskController extends BladeController {
                 //判断现在的数据是否是待审批数据,只有上报状态、未认证状态的数据才能撤销
                 ArchiveFile archiveFile = jdbcTemplate.queryForObject("select * from u_archive_file where id = " + archiveId, new BeanPropertyRowMapper<>(ArchiveFile.class));
                 if (archiveFile != null) {
-                    //修改档案文件收集业务数据状态=已废除
-                    jdbcTemplate.execute("update u_archive_file set status = 3,is_certification = 0,e_visa_file = null where id = " + archiveId);
-                    Task task = jdbcTemplate.query("select id,status,process_instance_id from u_task where form_data_id = " + archiveId, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+                    /*此处任务会查询出多条,因为存在多次废除任务,那么form_data_id指向同一个id,所以在新增的时候去重判断,status=1或2,有且只有一条*/
+                    Task task = jdbcTemplate.query("select id,status,process_instance_id from u_task where task_create_timestamp is not null and status in (1,2) and form_data_id = '" + archiveId + "'", new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
                     if (task != null && task.getStatus().equals(1)) {
+                        //修改档案文件收集业务数据状态=已废除
+                        jdbcTemplate.execute("update u_archive_file set status = 3,is_certification = 0,e_visa_file = null where id = " + archiveId);
                         //待审批审批任务=已废除
                         jdbcTemplate.execute("update u_task set status = 3 where id = " + task.getId());
                         //审批任务详情=已废除
@@ -593,6 +618,7 @@ public class TaskController extends BladeController {
                 }
             }
             return R.success("操作成功");
+
         } else if (repealDTO.getType().equals(2)) { //任务审批废除
             String[] taskIds = repealDTO.getIds().split(",");
             for (String taskId : taskIds) {
@@ -657,19 +683,19 @@ public class TaskController extends BladeController {
                     Task task = jdbcTemplate.queryForObject("select id,contract_id,project_id,process_instance_id,form_data_id,type,archive_ids from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
                     if (task != null) {
                         //判断任务类型是否是验收任务,档案验收任务单独处理修改状态直接返回
-                        if (task.getType() == 2){
+                        if (task.getType() == 2) {
                             //是验收任务直接获取所有的副任务
                             List<TaskParallel> parallelList = taskParallelService.list(new LambdaQueryWrapper<TaskParallel>().eq(TaskParallel::getProcessInstanceId, task.getId()));
                             //修改当前用户的副任务状态,保存
                             for (TaskParallel taskParallel : parallelList) {
-                                if (taskParallel.getTaskUser().equals(AuthUtil.getUserId()+"")){
+                                if (taskParallel.getTaskUser().equals(AuthUtil.getUserId() + "")) {
                                     taskParallel.setStatus(2);
                                     taskParallel.setEVisaStatus(1);
                                     taskParallelService.updateById(taskParallel);
                                     break;
                                 }
                             }
-                            parallelList.removeIf(l->l.getStatus() == 2);
+                            parallelList.removeIf(l -> l.getStatus() == 2);
                             //判断是否所有副任务都是完成状态
                             if (parallelList.size() == 0) {
                                 //都是完成状态,则修改主任务的状态
@@ -683,9 +709,9 @@ public class TaskController extends BladeController {
                                     String phone = expertInfo.getPhone();
                                     String name = expertInfo.getName();
                                     dto.setTenantId(AuthUtil.getTenantId());
-                                    dto.setAccount("expert"+phone);
+                                    dto.setAccount("expert" + phone);
                                     StringSPUtils stringSPUtils = new StringSPUtils();
-                                    dto.setPassword(stringSPUtils.getStringSP(name).toLowerCase(Locale.ROOT)+phone);
+                                    dto.setPassword(stringSPUtils.getStringSP(name).toLowerCase(Locale.ROOT) + phone);
                                     dto.setUserType("3");
                                     dto.setRealName(name);
                                     dto.setPhone(phone);
@@ -697,30 +723,30 @@ public class TaskController extends BladeController {
                                     //专家合同段设置为指挥部
                                     projectDTO.setContractId(task.getContractId());
                                     //判断是否为组长
-                                    if (expertInfo.getIsLeader() == 0){
+                                    if (expertInfo.getIsLeader() == 0) {
                                         projectDTO.setRoleId("1656191770880864257");
-                                    }else {
+                                    } else {
                                         projectDTO.setRoleId("1656191696348082177");
                                     }
                                     list.add(projectDTO);
                                     dto.setProjectAndUserList(list);
                                     //单个保存专家信息
                                     R<Boolean> booleanR = userClient.saveUserDTO(dto);
-                                    if (booleanR.getData() == null ||  booleanR.isSuccess() != true){
+                                    if (booleanR.getData() == null || booleanR.isSuccess() != true) {
                                         throw new ServiceException(booleanR.getMsg());
                                     }
                                 }
                                 //修改档案类型
                                 String archiveIds = task.getArchiveIds();
-                                if (StringUtils.isNotBlank(archiveIds)){
+                                if (StringUtils.isNotBlank(archiveIds)) {
                                     List<Long> longs = Func.toLongList(archiveIds);
                                     R<Boolean> booleanR = archiveClient.batchUpdateIsApply(1, longs);
-                                    if (booleanR.getData() == null || booleanR.isSuccess() != true){
+                                    if (booleanR.getData() == null || booleanR.isSuccess() != true) {
                                         throw new ServiceException("修改档案类型失败");
                                     }
                                 }
                             }
-                           return R.data(true);
+                            return R.data(true);
                         }
                         org.springblade.evisa.vo.TaskArchiveDTO eVisaObj = new org.springblade.evisa.vo.TaskArchiveDTO();
                         BeanUtils.copyProperties(taskArchiveDTO, eVisaObj);
@@ -779,7 +805,7 @@ public class TaskController extends BladeController {
         } else {
             List<String> taskIds = taskArchiveOuterLayerDTO.getTaskArchiveDtoList().stream().map(TaskArchiveDTO::getTaskId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
             //判断任务类型是否是验收任务,档案验收任务单独处理修改状态直接返回
-            if (taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0) == null || taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0).getTaskId() == null){
+            if (taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0) == null || taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0).getTaskId() == null) {
                 throw new ServiceException("参数错误,请传入任务id");
             }
             Task task = jdbcTemplate.queryForObject("select id,type from u_task where id = " + taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0).getTaskId(), new BeanPropertyRowMapper<>(Task.class));
@@ -787,9 +813,9 @@ public class TaskController extends BladeController {
                 //判断任务类型是否是验收任务,档案验收任务单独处理修改状态直接返回
                 if (task.getType() == 2) {
                     //修改主任务表
-                    jdbcTemplate.execute("UPDATE u_task set status = 3 WHERE id in (" +StringUtils.join(taskIds, ",")+")");
+                    jdbcTemplate.execute("UPDATE u_task set status = 3 WHERE id in (" + StringUtils.join(taskIds, ",") + ")");
                     //修改副任务表
-                    jdbcTemplate.execute("UPDATE u_task_parallel set status = 3 WHERE process_instance_id in (\'"+ StringUtils.join(taskIds, "','")+"\')");
+                    jdbcTemplate.execute("UPDATE u_task_parallel set status = 3 WHERE process_instance_id in (\'" + StringUtils.join(taskIds, "','") + "\')");
                     return R.data(true);
                 }
             }
@@ -1575,15 +1601,15 @@ public class TaskController extends BladeController {
                 sqlString.append(" AND (SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id and task_user_name LIKE ? AND is_deleted=0) = 1");
                 params.add("%" + dto.getEVisaUserName() + "%");
             }
-                sqlString.append(" AND (SELECT COUNT(1) FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99" +
-                        " AND u_task_parallel.status != 3 and is_deleted=0) > 0");
+            sqlString.append(" AND (SELECT COUNT(1) FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99" +
+                    " AND u_task_parallel.status != 3 and is_deleted=0) > 0");
         } else {
             if (StringUtils.isNotBlank(dto.getEVisaUserName())) {
                 sqlString.append(" AND (SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id and task_user_name LIKE ? AND is_deleted=0) = 1");
                 params.add("%" + dto.getEVisaUserName() + "%");
             }
-                sqlString.append(" AND (SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id and is_deleted=0) =" +
-                        "(SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 1 AND u_task_parallel.status = 2 and is_deleted=0)");
+            sqlString.append(" AND (SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id and is_deleted=0) =" +
+                    "(SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 1 AND u_task_parallel.status = 2 and is_deleted=0)");
 
         }
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml

@@ -26,7 +26,7 @@
     </delete>
 
     <select id="queryDataInfo" resultMap="taskBatchResultMap">
-        SELECT * from u_task_batch where is_deleted not in(2,4) LIMIT 100
+        SELECT * from u_task_batch where is_deleted not in(4) LIMIT 40
     </select>
 
 </mapper>

+ 2 - 6
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -953,9 +953,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                         RedisTemplate.delete(keysParentCount);
                     }
 
-                    //删除合同段本地缓存
-                    //wbsTreeContractClient.deleteContractLocalCache(String.valueOf(sgId));
-                    /*剥离到user服务中*/
+                    //删除本地缓存
                     userClient.deleteContractLocalCache(String.valueOf(sgId));
                 }
             }
@@ -980,9 +978,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                 RedisTemplate.delete(keysParentCount);
             }
 
-            //删除合同段本地缓存
-            //wbsTreeContractClient.deleteContractLocalCache(contractId);
-            /*剥离到user服务中*/
+            //删除本地缓存
             userClient.deleteContractLocalCache(contractId);
         }
     }

+ 3 - 3
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -576,7 +576,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     }
 
 
-    @Scheduled(cron = "0 */1 * * * ?")
+   // @Scheduled(cron = "0 */1 * * * ?")
     public void SignInfo() {
         //执行代码
         logger.debug("扫描开始");
@@ -606,8 +606,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     if (wtask >= 200) {
                         break;
                     }
-                    taskBatchService.update(Wrappers.<TaskBatch>update().set("is_deleted", 2).eq("id", taskBatchId));
-                    RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 66, TimeUnit.SECONDS);
+                   // taskBatchService.update(Wrappers.<TaskBatch>update().set("is_deleted", 2).eq("id", taskBatchId));
+                    RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 70, TimeUnit.SECONDS);
                     CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                         try {
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/utils/FunctionMain.java

@@ -91,7 +91,7 @@ public class FunctionMain {
 
     public static void getToken() {
         HttpClient httpClient = HttpClientBuilder.create().build();
-        HttpPost httpPost = new HttpPost("http://localhost/blade-auth/oauth/token");
+        HttpPost httpPost = new HttpPost("http://localhost:8090/blade-auth/oauth/token");
         httpPost.setHeader("Authorization", "Basic c2FiZXI6c2FiZXJfc2VjcmV0");
         httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
         httpPost.setHeader("Tenant-Id", "000000");

+ 40 - 79
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java

@@ -21,6 +21,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.*;
 
@@ -48,84 +49,44 @@ public class EVisaController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
+
     // 电签主类
-//    @Scheduled(cron = "0 */1 * * * ?")
-//    public void SignInfo() {
-//        //执行代码
-//        log.info("扫描开始");
-//        String sql = "SELECT * from u_task_batch where is_deleted not in(2,4) LIMIT 100";
-//        List<TaskBatch> maps = jdbcTemplate.queryForList(sql,TaskBatch.class);
-//        if (maps != null && maps.size() >= 1) {
-//            for (TaskBatch dataInfo : maps) {
-//                String jsonData = dataInfo.getJsonData();
-//                TaskApprovalVO taskApprovalVO = JSON.parseObject(jsonData, TaskApprovalVO.class);
-//                String taskBatchId = dataInfo.getId().toString();
-//                Long userId = dataInfo.getCreateUser();
-//                String nickName = dataInfo.getNickName();
-//
-//                Boolean istrue = true;
-//                try {
-//                    Thread.sleep(500);
-//                } catch (InterruptedException e) {
-//                    throw new RuntimeException(e);
-//                }
-//
-//                Boolean aBoolean = RedisTemplate.hasKey("sign-" + taskApprovalVO.getFormDataId());
-//                System.out.println(taskApprovalVO.getFormDataId()+"---"+aBoolean);
-//                if (aBoolean) {
-//                    istrue = false;
-//                }
-//                if (istrue) {
-//                    int wtask = executor.getQueue().size();
-//                    if (wtask >= 200) {
-//                        break;
-//                    }
-//                    jdbcTemplate.execute("update u_task_batch set is_deleted=2 where id="+taskBatchId+"");
-//                    RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 66, TimeUnit.SECONDS);
-//                    CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
-//                        try {
-//                            this.checkIsExsitTaskBatch(taskApprovalVO, taskBatchId, userId, nickName);
-//                        } catch (FileNotFoundException e) {
-//                            e.printStackTrace();
-//                        }
-//                    }, executor);
-//                }
-//            }
-//        }
-//    }
-//
-//    private void checkIsExsitTaskBatch(TaskApprovalVO taskApprovalVO, String batchId, Long userId, String nickName) throws FileNotFoundException {
-//        log.info("【任务审核】当前批次开始电签。批次ID:" + batchId);
-//        taskApprovalVO.setId(batchId);
-//        taskApprovalVO.setUserId(userId);
-//        taskApprovalVO.setNickName(nickName);
-//        String pdfUrlEVisa = this.completeApprovalTask(taskApprovalVO);
-//
-//        System.out.println("电签操作成功buss-----" + pdfUrlEVisa + "---batchId=" + batchId);
-//        //TODO ============== 电签成功,修改试验状态,关联工程部位信息pdf(只有电签成功,才修改) liuYc 2023-03-16 ==============
-//        if ("OK".equals(taskApprovalVO.getFlag()) && StringUtils.isNotEmpty(pdfUrlEVisa)) {
-//            //已审批
-//            this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(pdfUrlEVisa, taskApprovalVO);
-//            //executor删除掉对应批次
-//            this.taskBatchService.deletedById(batchId);
-//        }
-//
-//        if (!"OK".equals(taskApprovalVO.getFlag())) {
-//            //已废除
-//            this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatusFC(taskApprovalVO);
-//            //executor删除掉对应批次
-//            this.taskBatchService.deletedById(batchId);
-//        }
-//        RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
-//    }
-//
-//    private String completeApprovalTask(TaskApprovalVO taskApprovalVO) {
-//        if ("OK".equals(taskApprovalVO.getFlag())) { // 电签流程
-//
-//        }else { //任务废除
-//
-//        }
-//
-//        return "";
-//    }
+    @Scheduled(cron = "0 */1 * * * ?")
+    public void SignInfo() {
+        //执行代码
+        log.info("扫描开始");
+        String sql = "SELECT * from u_task_batch where is_deleted =0 LIMIT 100";
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+        if (maps != null && maps.size() >= 1) {
+            for (Map<String, Object> dataInfo : maps) {
+                String jsonData = dataInfo.get("json_data")+"";
+                TaskApprovalVO taskApprovalVO = JSON.parseObject(jsonData, TaskApprovalVO.class);
+                String taskBatchId = dataInfo.get("id").toString();
+                Long userId = Long.valueOf(dataInfo.get("create_user")+"");
+                String nickName = dataInfo.get("nick_name")+"";
+                String formDataId = taskApprovalVO.getFormDataId();
+
+                CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
+                        try {
+                           this.checkIsExsitTaskBatch(taskApprovalVO, taskBatchId, userId, nickName);
+                        } catch (FileNotFoundException e) {
+                            e.printStackTrace();
+                        }
+                }, executor);
+            }
+        }
+    }
+
+    private void checkIsExsitTaskBatch(TaskApprovalVO taskApprovalVO, String batchId, Long userId, String nickName) throws FileNotFoundException {
+        synchronized (taskApprovalVO.getFormDataId()) {
+            try {
+                System.out.println(taskApprovalVO.getFormDataId());
+                Thread.sleep(8000);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        System.out.println();
+    }
+
 }

+ 2 - 2
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -542,7 +542,7 @@ public class EVisaServiceImpl implements EVisaService {
      */
     public String eVisaCustom(org.springblade.evisa.vo.TaskArchiveDTO taskArchiveDTO) {
         //type=1表示任务审批自定义签章,type=2表示认证电签签章(不涉及审批任务)
-        if (taskArchiveDTO.getSealStrategy().size() > 0 && taskArchiveDTO.getType() == 1) {
+        if (taskArchiveDTO.getSealStrategy()!=null && taskArchiveDTO.getSealStrategy().size() > 0 && taskArchiveDTO.getType() == 1) {
             //获取档案任务
             Task task = jdbcTemplate.queryForObject("select form_data_id from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
             if (task != null) {
@@ -611,7 +611,7 @@ public class EVisaServiceImpl implements EVisaService {
                 }
             }
             return "";
-        } else if (taskArchiveDTO.getSealStrategy().size() > 0 && taskArchiveDTO.getType() == 2) {
+        } else if (taskArchiveDTO.getSealStrategy()!=null && taskArchiveDTO.getSealStrategy().size() > 0 && taskArchiveDTO.getType() == 2) {
             //此时的taskArchiveDTO.taskId=档案数据业务id(档案认证不涉及审批流任务)
             //获取档案任务的文件信息(这里根据id再查询一次,入参的时候不想重新构造入参的dto了)
             ArchiveFile archiveFile = jdbcTemplate.queryForObject("select pdf_file_url,e_visa_file from u_archive_file where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(ArchiveFile.class));

+ 20 - 23
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/MinusNode.java

@@ -7,8 +7,7 @@ import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.StringUtils;
 
 import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 public class MinusNode extends OperatorResultNode {
     public MinusNode() {
@@ -21,7 +20,7 @@ public class MinusNode extends OperatorResultNode {
         Object rightValue = rightOperand.calculate(variables);
         String leftStr=StringUtils.handleNull(leftValue);
         String rightStr=StringUtils.handleNull(rightValue);
-        if (leftStr.matches(DXD_REG) && rightStr.matches(DXD_REG)) {
+        if (leftStr.matches(DXD_REG) && rightStr.matches(DXD_REG)||rightStr.matches(DES_REG)) {
             return CustomFunction.dXd(rightValue, leftValue);
         }else if(leftStr.contains(COLON)&&rightStr.contains(COLON)){
             return fraction(leftStr)-fraction(rightStr);
@@ -52,29 +51,27 @@ public class MinusNode extends OperatorResultNode {
     }
 
 
-/*    public static void main(String[] args) {
+
+/*
+    public static void main(String[] args) {
         Map<String,Object> map = new HashMap<>();
         map.put("A","1:2.36");
         map.put("B","1:4");
-        System.out.println(Expression.parse("A-B").calculate(map).toString());
-    }*/
+        map.put("C","536");
+        map.put("C2","503");
+        map.put("D","540/500");
+        map.put("E","662");
+        map.put("F","540");
+        map.put("G","569");
+        map.put("H","502");
+        map.put("Z","660/540/570/500");
+         new ArrayList<>(Arrays.asList(
+                "A-B","D-C","C-D","C2-D","E-Z","F-Z","G-Z","H-Z"
+        )).stream().map(s->Expression.parse(s).calculate(map).toString()).forEach(System.out::println);
+
+    }
+*/
+
 
-//	public Object calculateOld(Map<String, Object> variables) {
-//		Object leftValue = leftOperand.calculate(variables);
-//		if(leftValue instanceof String && StringUtils.isNumber(leftValue)) {
-//			leftValue = new BigDecimal(leftValue.toString());
-//		}
-//		if (!(leftValue instanceof Number)) {
-//			return null;
-//		}
-//		Object rightValue = rightOperand.calculate(variables);
-//		if(rightValue instanceof String && StringUtils.isNumber(rightValue)) {
-//			rightValue = new BigDecimal(rightValue.toString());
-//		}
-//		if (!(rightValue instanceof Number)) {
-//			return null;
-//		}
-//		return SubtractUtil.calculate((Number) leftValue, (Number) rightValue);
-//	}
 
 }

+ 36 - 7
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -492,9 +492,14 @@ public class CustomFunction {
     public static  Object convert(Object range,boolean isAsc){
         if (Func.isNotEmpty(range)) {
             if(range instanceof List){
-                range= ((List<Object>) range).get(0);
-            }
-            if( Func.isNotEmpty(range)) {
+               List<Object> ranges= (List<Object>) range;
+                if( Func.isNotEmpty(ranges)) {
+                   return ranges.stream().filter(Func::isNotEmpty).map(e->{
+                        String[] s = Func.toStr(e).replaceAll("[\\[\\]\\s]+", "").split(",");
+                        return dateCp(s[0], s[1], isAsc);
+                    }).collect(Collectors.toList());
+                }
+            } else{
                 String[] s = Func.toStr(range).replaceAll("[\\[\\]\\s]+", "").split(",");
                 return dateCp(s[0], s[1], isAsc);
             }
@@ -1262,14 +1267,33 @@ public class CustomFunction {
     }*/
 
 
-    public static Object designFormat(Object design) {
-        if (StringUtils.isNotEmpty(design)) {
-            return Arrays.stream(design.toString().split("[^\\d.]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
+
+    public static Object designFormat(Object design){
+        if(StringUtils.isNotEmpty(design)){
+            if(design instanceof List){
+                List<Object> list = (List<Object>) design;
+                StringBuffer str = new StringBuffer();
+                for(Object o : list){
+                    if(o == null){
+                        continue;
+                    }
+                    if(o.toString().contains("*")){
+                        str.append(o).append("/");
+                    }else{
+                        String collect = Arrays.stream(o.toString().split("[^\\d.-]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
+                        if(StringUtils.isNotEmpty(collect)){
+                            str.append(collect).append("/");
+                        }
+                    }
+                }
+                return str;
+            }else{
+                return  Arrays.stream(design.toString().split("[^\\d.\\-*]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
+            }
         }
         return "";
     }
 
-
     public static double offRangeSum(Object o){
         if(o.equals(Double.MAX_VALUE)){
             return Double.MAX_VALUE;
@@ -1361,6 +1385,7 @@ public class CustomFunction {
         return dev;
     }
 
+
     public static List<Object> b445random(Object hz, Object design, Object dev, Object failed, Object xN) {
         List<Object> measureOut = new ArrayList<>();
         String hzStr = StringUtils.handleNull(hz);
@@ -1419,6 +1444,10 @@ public class CustomFunction {
         return measureOut;
     }
 
+    public static void main(String[] args) {
+        List<Object> list = Arrays.asList("-9*5","2*3");
+        checkpoints(list,"",0,"±5",1);
+    }
 
     /**
      * @return java.lang.Object

+ 180 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -1,8 +1,12 @@
 package com.mixsmart.utils;
 
 
-import cn.hutool.json.JSONObject;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.log.StaticLog;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.jfireel.expression.Expression;
 import org.apache.commons.lang.math.NumberUtils;
 import org.apache.http.*;
@@ -37,6 +41,7 @@ import org.jsoup.nodes.Document;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.tool.utils.*;
+import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.Coords;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
@@ -635,6 +640,19 @@ public class FormulaUtils {
         return t;
     }
 
+    public static List<String> duration2date(String duration){
+        try {
+            if (duration != null && Pattern.matches(RANGE_DATE_REG, duration)) {
+                return Arrays.stream(duration.replaceAll("^\\[|]$", "").split(",")).map(String::trim).map(s -> new DateTime(s).toString(DatePattern.NORM_DATE_PATTERN)).collect(Collectors.toList());
+            }
+            return Collections.singletonList(new DateTime(duration).toString(DatePattern.NORM_DATE_PATTERN));
+        }catch (Exception e){
+            return Collections.singletonList(new DateTime().toString(DatePattern.NORM_DATE_PATTERN));
+        }
+    }
+
+
+
     public static FormData createFormDataFast(String name,String code,String values,String coords){
         if(StringUtils.isNotEmpty(code,name)){
             if(StringUtils.isNotEmpty(coords)) {
@@ -887,6 +905,167 @@ public static Map<String,List<Long>> relatedPages(List<FormData> curFormDatas ,L
         return target;
     }
 
+    public  static  String recovery(List<ElementData> dataList) {
+        if (Func.isNotEmpty(dataList)) {
+            return dataList.stream().filter(e -> !e.isEmpty()).map(e -> e.stringValue() + "_^_" + e.getY() + "_" + e.getX()).collect(Collectors.joining("☆"));
+        }
+        return "";
+    }
+
+
+    public static List<TableInfo> getTableInfoList(JSONArray dataArray) {
+        if (dataArray != null && !dataArray.isEmpty()) {
+            List<TableInfo> result = new ArrayList<>();
+            for (int m = 0; m < dataArray.size(); m++) {
+                TableInfo tableInfo = new TableInfo();
+                com.alibaba.fastjson.JSONObject dataInfo2 = dataArray.getJSONObject(m);
+                //
+                tableInfo.setContractId(dataInfo2.getString("contractId"));
+                tableInfo.setPkeyId(dataInfo2.getString("pkeyId"));
+                tableInfo.setProjectId(dataInfo2.getString("projectId"));
+                //huangjn 填报的类型,施工或监理
+                tableInfo.setClassify(dataInfo2.getString("classify"));
+
+                //设置首件信息
+                setFirstData(dataInfo2, tableInfo);
+                //设置日志信息
+                setTheLogData(dataInfo2, tableInfo);
+
+                dataInfo2.fluentRemove("contractId")
+                        .fluentRemove("pkeyId")
+                        .fluentRemove("p_key_id")
+                        .fluentRemove("projectId")
+                        .fluentRemove("classify")
+                        .fluentRemove("pickerKey")
+                        .fluentRemove("id")
+                        .fluentRemove("isFirst")
+                        .fluentRemove("firstNodeId")
+                        .fluentRemove("isTheLog")
+                        .fluentRemove("theLogId")
+                        .fluentRemove("linkTabIds")
+                        .fluentRemove("recordTime")
+                        .fluentRemove("businessId")
+                        .fluentRemove("sourceUrl")
+                        .fluentRemove("pdfUrl")
+                        .fluentRemove("firstFileName")
+                        .fluentRemove("");
+                // 计算数据
+                LinkedHashMap<String, List<String>> dataMap = dataInfo2.keySet().stream().filter(e -> e.contains("__")).collect(Collectors.groupingBy(e -> e.split("__")[0], LinkedHashMap<String, List<String>>::new, Collectors.toList()));
+                LinkedHashMap<String, String> dataMap2 = new LinkedHashMap<>();
+                // 字段组合
+                for (String k : dataMap.keySet()) {
+                    if (dataMap.get(k).size() > 1 && !dataMap.get(k).contains("000Z")) {
+                        String[] ziduan = dataMap.get(k).toArray(new String[]{});
+                        String temp = "";
+                        for (int i = 0; i < ziduan.length - 1; i++) {
+                            for (int j = 0; j < ziduan.length - i - 1; j++) {
+                                Integer tr = Integer.parseInt((ziduan[j].split("__")[1]).split("_")[0]);
+                                Integer td = Integer.parseInt(ziduan[j].split("__")[1].split("_")[1]);
+
+                                Integer tr_1 = Integer.parseInt(ziduan[j + 1].split("__")[1].split("_")[0]);
+                                Integer td_1 = Integer.parseInt(ziduan[j + 1].split("__")[1].split("_")[1]);
+
+                                if (tr > tr_1 && td.equals(td_1)) { //纵向排序
+                                    temp = ziduan[j];
+                                    ziduan[j] = ziduan[j + 1];
+                                    ziduan[j + 1] = temp;
+                                }
+                            }
+                        }
+
+                        String lastStr = dataInfo2.getString(ziduan[0]) + "_^_" + ziduan[0].split("__")[1];
+                        for (int i = 1; i < ziduan.length; i++) {
+                            String keyData = dataInfo2.getString(ziduan[i]);
+                            if (org.apache.commons.lang.StringUtils.isNotEmpty(keyData) && !keyData.equals("")) {
+                                lastStr += "☆" + dataInfo2.getString(ziduan[i]) + "_^_" + ziduan[i].split("__")[1];
+                            }
+
+                        }
+                        dataMap2.put(k, lastStr);
+                    } else {
+                        String dataVal = dataInfo2.getString(dataMap.get(k).get(0));
+                        if (org.apache.commons.lang.StringUtils.isNotEmpty(dataVal)) {
+                            if (dataVal.contains("Ljava")) {
+                                Object o = dataInfo2.get(dataMap.get(k).get(0));
+                                dataVal = JSON.toJSONString(o).replace("\"", "");
+                            }
+                            dataMap2.put(k, dataVal + "_^_" + dataMap.get(k).get(0).split("__")[1]);
+                        }
+                    }
+                }
+                dataInfo2.put("p_key_id", tableInfo.getPkeyId());
+                dataInfo2.put("classify",tableInfo.getClassify());
+                dataInfo2.put("contractId",tableInfo.getContractId());
+                dataInfo2.put("projectId",tableInfo.getProjectId());
+                tableInfo.setDataMap(dataMap2);
+                result.add(tableInfo);
+            }
+            return result;
+        }
+        return null;
+    }
+    public static void setFirstData(com.alibaba.fastjson.JSONObject dataInfo2, TableInfo tableInfo) {
+        //huangjn 判断是否是首件
+        if (dataInfo2.containsKey("isFirst")) {
+            tableInfo.setIsFirst(dataInfo2.getString("isFirst"));
+        }
+        //huangjn 判断是否是首件
+
+        //首件资料绑定的节点
+        if (dataInfo2.containsKey("firstNodeId")) {
+            tableInfo.setFirstNodeId(dataInfo2.getString("firstNodeId"));
+        }
+        //首件ID(编辑时有值,新增时为空)
+        if (dataInfo2.containsKey("firstId")) {
+            tableInfo.setFirstId(dataInfo2.getString("firstId"));
+        }
+        //源文件
+        if (dataInfo2.containsKey("sourceUrl")) {
+            tableInfo.setSourceUrl(dataInfo2.getString("sourceUrl"));
+        }
+        //pdfUrl
+        if (dataInfo2.containsKey("pdfUrl")) {
+            tableInfo.setPdfUrl(dataInfo2.getString("pdfUrl"));
+        }
+        //文件名称
+        if (dataInfo2.containsKey("firstFileName")) {
+            tableInfo.setFirstFileName(dataInfo2.getString("firstFileName"));
+        }
+        //关联的信息
+        if (dataInfo2.containsKey("linkProcessList")) {
+            tableInfo.setLinkProcessList(dataInfo2.getJSONArray("linkProcessList"));
+        }
+    }
+    public static void setTheLogData(JSONObject dataInfo2, TableInfo tableInfo) {
+        //huangjn 判断是否是日志
+        if (dataInfo2.containsKey("isTheLog")) {
+            tableInfo.setIsTheLog(dataInfo2.getString("isTheLog"));
+        }
+        //huangjn 判断是否是日志
+
+        //huangjn 日志ID
+        if (dataInfo2.containsKey("theLogId")) {
+            tableInfo.setTheLogId(dataInfo2.getString("theLogId"));
+        }
+        //huangjn 日志ID
+
+        //huangjn 日志勾选的工序
+        if (dataInfo2.containsKey("linkTabIds")) {
+            tableInfo.setLinkTabIds(dataInfo2.getJSONArray("linkTabIds"));
+        }
+        //huangjn 日志勾选的工序
+
+        //huangjn 日志所选时间
+        if (dataInfo2.containsKey("recordTime")) {
+            tableInfo.setRecordTime(dataInfo2.getString("recordTime"));
+        }
+        //huangjn 日志所选时间
+        //huangjn 每份填报数据的id,目前日志专用
+        if (dataInfo2.containsKey("id")) {
+            tableInfo.setBusinessId(dataInfo2.getString("id"));
+        }
+        //huangjn 每份填报数据的id,目前日志专用
+    }
 
 
 }

+ 12 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java

@@ -1317,11 +1317,21 @@ public class StringUtils {
         return max;
     }
 
+/*    public static void main(String[] args) {
+        System.out.println(getScaleZero(152000,"±10.0"));
+        System.out.println(getScaleZero(152000,"-10.0,10"));
+        System.out.println(getScaleZero(152000,"-10.0,10.0"));
+        System.out.println(getScaleZero(Double.MAX_VALUE,"-10.0,10"));
+        System.out.println(getScaleZero(152000,"-10,10"));
+    }*/
+
     public static List<Object> scaleParam(Object ... number){
-        return Arrays.stream(number).filter(StringUtils::isNotEmpty).flatMap(e-> CustomFunction.obj2ListNe(e).stream()).distinct().filter(StringUtils::isNumber).map(e->{
+        return Arrays.stream(number).filter(StringUtils::isNotEmpty).flatMap(e-> CustomFunction.obj2ListNe(e).stream()).distinct().map(s->s.toString().replaceAll("±","")).filter(StringUtils::isNumber).map(e->{
             /*0.3999999999999986 检测到超长小数位先转double处理,再还原回String*/
             String tg=e.toString();
-            if(tg.length()-tg.indexOf(StringPool.DOT)>6||tg.contains("e")){
+            int dot=tg.indexOf(StringPool.DOT);
+            boolean unlimited=dot>0&&(tg.length()-dot>6);
+            if(unlimited||tg.contains("e")){
                 return BigDecimal.valueOf(Double.parseDouble(tg)).setScale(2, RoundingMode.HALF_UP).toString();
             }else {
                 return e.toString();

+ 45 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -26,6 +26,7 @@ import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.service.SaveUserInfoByProjectService;
 import org.springblade.manager.vo.*;
+import org.springblade.meter.entity.MeterContractInfo;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.vo.UserContractInfoVO;
@@ -65,7 +66,16 @@ public class ContractInfoController extends BladeController {
     @ApiOperation(value = "详情", notes = "传入contractInfo")
     public R<ContractInfoVO> detail(ContractInfo contractInfo) {
         ContractInfo detail = contractInfoService.getOne(Condition.getQueryWrapper(contractInfo));
-        return R.data(ContractInfoWrapper.build().entityVO(detail));
+        if (detail != null) {
+            ContractInfoVO vo = new ContractInfoVO();
+            BeanUtil.copyProperties(detail, vo);
+            MeterContractInfo meterContractInfo = jdbcTemplate.query("SELECT * FROM s_meter_contract_info WHERE contract_id = " + contractInfo.getId(), new BeanPropertyRowMapper<>(MeterContractInfo.class)).stream().findAny().orElse(null);
+            if (meterContractInfo != null) {
+                vo.setMeterContractInfo(meterContractInfo);
+            }
+            return R.data(vo);
+        }
+        return R.data(null);
     }
 
     /**
@@ -85,13 +95,25 @@ public class ContractInfoController extends BladeController {
     @GetMapping("/get-contractInfo")
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "根据项目id查询当前所有合同", notes = "传入pid")
-    public R<List<ContractInfo>> findContractInfoByPid(String pid) {
+    public R<List<ContractInfoVO>> findContractInfoByPid(String pid) {
         List<ContractInfo> contractInfoVOS = contractInfoService.selectContractInfoPageByPid(pid);
-        return R.data(contractInfoVOS);
+        List<ContractInfoVO> resultAll = new ArrayList<>();
+        for (ContractInfo contractInfo : contractInfoVOS) {
+            ContractInfoVO vo = new ContractInfoVO();
+            BeanUtil.copyProperties(contractInfo, vo);
+            if (contractInfo.getContractType().equals(4)) {
+                MeterContractInfo meterContractInfo = jdbcTemplate.query("SELECT * FROM s_meter_contract_info WHERE contract_id = " + contractInfo.getId(), new BeanPropertyRowMapper<>(MeterContractInfo.class)).stream().findAny().orElse(null);
+                if (meterContractInfo != null) {
+                    vo.setMeterContractInfo(meterContractInfo);
+                }
+            }
+            resultAll.add(vo);
+        }
+        return R.data(resultAll);
     }
 
     /**
-     * 分页 合同段信息表
+     * 分页 合同段信息
      */
     @GetMapping("/list")
     @ApiOperationSupport(order = 2)
@@ -102,7 +124,7 @@ public class ContractInfoController extends BladeController {
     }
 
     /**
-     * 自定义分页 合同段信息
+     * 自定义分页 合同段信息
      */
     @GetMapping("/page")
     @ApiOperationSupport(order = 3)
@@ -114,7 +136,7 @@ public class ContractInfoController extends BladeController {
 
 
     /**
-     * 新增 合同段信息
+     * 新增 合同段信息
      */
     @PostMapping("/save")
     @ApiOperationSupport(order = 4)
@@ -124,7 +146,7 @@ public class ContractInfoController extends BladeController {
     }
 
     /**
-     * 修改 合同段信息
+     * 修改 合同段信息
      */
     @PostMapping("/update")
     @ApiOperationSupport(order = 5)
@@ -145,7 +167,7 @@ public class ContractInfoController extends BladeController {
 
 
     /**
-     * 新增或修改 合同段信息
+     * 新增或修改 合同段信息
      */
     @PostMapping("/submit")
     @ApiOperationSupport(order = 6)
@@ -159,13 +181,13 @@ public class ContractInfoController extends BladeController {
 
 
     /**
-     * 删除 合同段信息
+     * 删除 合同段信息
      */
     @PostMapping("/remove")
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        //白马合同段不允许删除,syncProjectUserInfo合同段同步白马人员接口使用中
+        /*白马合同段不允许删除,syncProjectUserInfo合同段同步白马人员接口使用中*/
         List<String> baiMaList = Arrays.asList("1612335077269143554", "1613022750656921601", "1613823243083792385", "1687370014959017986", "1687370619295309826");
         if (baiMaList.contains(ids)) {
             return R.fail("该项目合同段不允许删除,请联系管理员");
@@ -179,6 +201,19 @@ public class ContractInfoController extends BladeController {
         if (saveUserInfoByProjectMapper.selectSGJL(ids) > 0) {
             return R.fail("当前监理合同段存在关联的施工合同信息,删除失败");
         }
+
+        /*逻辑删除计量相关信息*/
+        ContractInfo info = contractInfoService.getById(ids);
+        if (info != null && info.getContractType().equals(4)) {
+            /*逻辑删除关联信息*/
+            jdbcTemplate.execute("UPDATE s_meter_contract_info SET is_deleted = 1 WHERE contract_id = " + ids);
+            /*逻辑删除合同段计量单元信息*/
+            jdbcTemplate.execute("UPDATE s_meter_tree_contract SET is_deleted = 1 WHERE contract_id = " + ids);
+            /*逻辑删除合同段中期支付项信息*/
+            jdbcTemplate.execute("UPDATE s_meter_mid_pay_item_contract SET is_deleted = 1 WHERE contract_id = " + ids);
+        }
+
+        /*逻辑删除合同段信息*/
         return R.status(contractInfoService.deleteLogic(Func.toLongList(ids)));
     }
 

+ 6 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -148,7 +148,7 @@ public class ExcelTabController extends BladeController {
 
     private final IContractInfoService contractInfoService;
 
-    private final IWbsParamService wbsParamService;
+    /*private final IWbsParamService wbsParamService;*/
 
     private final TaskClient taskClient;
 
@@ -318,9 +318,11 @@ public class ExcelTabController extends BladeController {
         ExcelInfoUtils.excelInfo(file.getInputStream(), exceUrl, thmlUrl, "1");
         // 上传excel文件
         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(), exceUrl);
-        // 解析原始excel
 
-        //  BladeFile bladeFileR = newIOSSClient.uploadFileByInputStream(file);
+        if(bladeFile==null || ObjectUtil.isEmpty(bladeFile)){
+            return R.fail("oss上传失败,请校验oss配置是否正确");
+        }
+        // 解析原始excel
         detail.setExtension(file.getOriginalFilename());
         detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
@@ -1972,7 +1974,7 @@ public class ExcelTabController extends BladeController {
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
         if (maps == null || maps.size() == 0) {
             WbsTreeContract contract = wbsTreeContractService.getOne(new LambdaQueryWrapper<WbsTreeContract>().eq(WbsTreeContract::getPKeyId, nodeId));
-            String fileName = this.wbsParamService.createFileTitle(contract);
+            String fileName = this.excelTabService.createFileTitle(contract);
             InformationQuery query = new InformationQuery();
             query.setId(SnowFlakeUtil.getId());
             query.setWbsId(Long.parseLong(nodeId));

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

@@ -34,6 +34,7 @@ import org.springblade.manager.formula.impl.CompositeDataAccess;
 import org.springblade.manager.formula.impl.StartupTimeListener;
 import org.springblade.manager.service.*;
 import org.springblade.manager.service.impl.FormulaServiceImpl;
+import org.springblade.manager.vo.CurrentNode;
 import org.springblade.manager.wrapper.FormulaWrapper;
 import org.springframework.beans.BeanUtils;
 import org.springframework.dao.EmptyResultDataAccessException;
@@ -49,6 +50,7 @@ import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiFunction;
 import java.util.stream.Collectors;
 
 /**
@@ -932,6 +934,7 @@ public class FormulaController {
 
     @GetMapping("/evaluate")
     public R<Object> evaluate(@NotNull(message="tablePkeyId 不能为空") Long tablePkeyId){
+         BiFunction<String,String,List<Map<String, Object>>> bif= this.service.getTableNamePkIdsMaps();
          return this.service.evaluate(tablePkeyId);
     }
 

+ 0 - 74
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -1,7 +1,5 @@
 package org.springblade.manager.controller;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.spire.xls.*;
@@ -187,78 +185,6 @@ public class WbsTreeContractController extends BladeController {
         return R.status(iWbsTreeContractService.syncTabData(pKeyId));
     }
 
-    /**
-     * 客户端懒加载获取合同段树(统计颜色、填报数量)
-     *
-     * @author liuyc
-     * @date 2023年7月17日10:28:49
-     */
-    @Deprecated /*(已剥离到user服务)*/
-    /*@GetMapping("/lazyQueryContractWbsTree")
-    @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "客户端懒加载获取合同段树(统计颜色、填报数量)")
-    @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "primaryKeyId"),
-            @ApiImplicitParam(name = "parentId", value = "父节点id,为空则查询第一级节点"),
-            @ApiImplicitParam(name = "contractId", value = "合同段id"),
-            @ApiImplicitParam(name = "contractIdRelation", value = "合同段关联id(监理、业主合同关联施工合同id)"),
-            @ApiImplicitParam(name = "classifyType", value = "合同段区分,施工合同段=1,监理合同段=2"),
-            @ApiImplicitParam(name = "tableOwner", value = "所属方节点权限,施工=1,监理=2,区分节点的数量、颜色")
-    })*/
-    public R<List<WbsTreeContractLazyVO>> lazyQueryContractWbsTree(@RequestParam String primaryKeyId, @RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation, @RequestParam String classifyType, @RequestParam String tableOwner) {
-        //这里是对应的监理合同段下,加载树时primaryKeyId=parentId;与前端对接时没沟通好入参,就不单独处理了,直接重新映射赋值一下
-        if (StringUtils.isNotEmpty(primaryKeyId)) {
-            parentId = primaryKeyId;
-        }
-
-        //结果集
-        List<WbsTreeContractLazyVO> vos;
-
-        //构造Redis缓存Key
-        String dataInfoId = "";
-        if (("1").equals(classifyType)) {
-            dataInfoId = contractId + "_" + parentId + "_" + classifyType + "_" + tableOwner;
-        } else if (("2").equals(classifyType)) {
-            //监理合同段下,classifyType=1,直接查询对应的施工树缓存
-            dataInfoId = contractIdRelation + "_" + parentId + "_" + "1" + "_" + tableOwner;
-        }
-
-        //获取Redis缓存信息
-        Object data = null;
-        if (ObjectUtil.isNotEmpty(dataInfoId)) {
-            if (("2").equals(classifyType) && ObjectUtil.isNotEmpty(contractIdRelation)) {
-                //监理根据contractIdRelation关联合同段id来判断获取缓存
-                data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + dataInfoId);
-            } else if (("1").equals(classifyType)) {
-                //施工直接获取缓存
-                data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + dataInfoId);
-            }
-        }
-
-        if (data != null) {
-            //返回缓存
-            vos = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
-
-        } else {
-            //响应结果集
-            vos = iWbsTreeContractService.lazyQueryContractWbsTree(parentId, contractId, contractIdRelation, tableOwner);
-
-            //存储缓存
-            if (vos != null && ObjectUtil.isNotEmpty(dataInfoId)) {
-                //监理根据contractIdRelation关联合同段id来判断存储缓存
-                if (("2").equals(classifyType) && ObjectUtil.isNotEmpty(contractIdRelation)) {
-                    JSONArray array = JSONArray.parseArray(JSON.toJSONString(vos));
-                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + dataInfoId, JSON.toJSON(array).toString());
-                } else if (("1").equals(classifyType)) {
-                    //施工直接存储缓存
-                    JSONArray array = JSONArray.parseArray(JSON.toJSONString(vos));
-                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + dataInfoId, JSON.toJSON(array).toString());
-                }
-            }
-        }
-        return R.data(vos);
-    }
-
     /**
      * 影像资料-懒加载获取影像资料合同段树(存储部位文件数量)
      *

+ 0 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -425,10 +425,5 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
         return list;
     }
 
-    /*删除合同段本地缓存*/
-    @Override
-    public void deleteContractLocalCache(String contractId) {
-        wbsTreeContractServiceImpl.deleteContractLocalCache(contractId);
-    }
 
 }

+ 5 - 337
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/FormulaExecutor.java

@@ -1,27 +1,9 @@
 package org.springblade.manager.formula;
 
-import cn.hutool.log.StaticLog;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.mixsmart.utils.CustomFunction;
-import com.mixsmart.utils.FormulaUtils;
-import com.mixsmart.utils.StringUtils;
 import lombok.Data;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.StringPool;
-import org.springblade.manager.dto.*;
-import org.springblade.manager.entity.Formula;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.formula.impl.TableElementConverter;
-import org.springblade.manager.service.*;
-import org.springblade.manager.service.impl.FormulaServiceImpl;
-import org.springblade.manager.vo.AppWbsTreeContractVO;
-import org.springblade.manager.vo.CurrentNode;
-
-import java.util.*;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
+
 
 /**
  * @author yangyj
@@ -29,9 +11,8 @@ import java.util.stream.Stream;
  * @description 公式执行器
  */
 @Data
-public class FormulaExecutor {
-    private final FormulaServiceImpl service;
-    private final TableElementConverter tec;
+public abstract  class   FormulaExecutor implements FormulaHandleChain{
+    public  TableElementConverter tec;
     public final static String WP="WP";
     public final static String CHAIN="trees";
     public final static String FC="FC.";
@@ -43,322 +24,9 @@ public class FormulaExecutor {
     public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=])";
     public static final Pattern P = Pattern.compile(ELE_CODE_REG);
     public final static String CTI="ContractInfo";
-
-    public FormulaExecutor(FormulaServiceImpl service, TableElementConverter tec) {
-        this.service = service;
+    public FormulaExecutor(TableElementConverter tec) {
         this.tec = tec;
     }
-
-
-    public void execute(){
-        List<FormulaHandleChain> chainList = new LinkedList<>();
-           chainList.add(new Init());
-           chainList.add(new Sort());
-           chainList.add(new Pre());
-           chainList.add(new Special());
-           chainList.add(new Calculate());
-           chainList.add(new Format());
-           chainList.forEach(FormulaHandleChain::handle);
-    }
-
-    public class Init implements  FormulaHandleChain{
-        @Override
-        public void handle() {
-            /*基础数据*/
-            baseData();
-            if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
-                /*依赖加载*/
-                checkingMissingList();
-                /*公式参数*/
-                //option();
-                /*评定表*/
-                //assessmentForm();
-            }
-        }
-
-        /**补充缺失的元素依赖*/
-        public void checkingMissingList(){
-            List<String> missingList = new ArrayList<>();
-            if(tec.isNew){
-                tec.formDataList.forEach(fd->{
-                    if (fd.executable()) {
-                        service.relyParse(fd.getFormula());
-                        Formula f = fd.getFormula();
-                        List<String> relyList = f.getRelyList();
-                        if (Func.isNotEmpty(relyList)) {
-                            relyList.forEach(r -> {
-                                if (!tec.formDataMap.containsKey(r)) {
-                                    missingList.add(r);
-                                }
-                            });
-                        }
-                    }
-                });
-                missingFill2(missingList);
-            }else {
-                tec.formDataList.forEach(fd -> {
-                    if (fd.executable()) {
-                        service.relyParse(fd.getFormula());
-                        Formula f = fd.getFormula();
-                        List<String> relyList = f.getRelyList();
-                        if (Func.isNotEmpty(relyList)) {
-                            relyList.forEach(r -> {
-                                if (tec.formDataMap.values().stream().map(FormData::getCode).noneMatch(k -> StringUtils.isEquals(k, r))) {
-                                    missingList.add(r);
-                                }
-                            });
-                        }
-                    }
-                });
-                missingFill(missingList);
-            }
-            if(Func.isNotEmpty(missingList)){
-                StringBuilder sb = new StringBuilder();
-                missingList.stream().collect(Collectors.groupingBy(s->s.split(StringPool.COLON)[0])).forEach((k, v)->{
-                    sb.append(k).append("(").append(v.stream().map(c->c.split(StringPool.COLON)[1]).collect(Collectors.joining(","))).append(")");
-                });
-                tec.getLog().put(FormulaLog.CROSS,sb.toString());
-            }
-        }
-        public void missingFill(List<String> missingList){
-            try {
-                /*数据池里面没有任何元素匹配和当前依赖匹配*/
-                if (Func.isNotEmpty(missingList)) {
-                    StaticLog.info("需要挂载的元素{}", String.join(";", missingList));
-                    Map<String, Object> elementInfoMap = service.getElementInfoByCodes(String.join(",", missingList));
-                    /*1从当前节点其它表格中查找匹配的元素*/
-                    List<String> removeList = new ArrayList<>();
-                    if (Func.isNotEmpty(missingList)) {
-                        /*2从当前节点的兄弟节点中查找匹配的元素*/
-                        CurrentNode currentNode = tec.getCurrentNode();
-                        /*List<Map<String,Object>> tableNamePkIdsMaps= this.jdbcTemplate.queryForList("select c.init_table_name tableName,c.p_key_id pkId,c.html_url url from (select b.id from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.contract_id=b.contract_id and b.ancestors like CONCAT(a.ancestors,'%')) where a.p_key_id="+currentNode.getPkId()+" and b.is_deleted=0 and b.node_type=6 ORDER BY b.sort) k join m_wbs_tree_contract c on c.parent_id = k.id where  c.contract_id="+tec.getContractId()+" and c.is_deleted=0 ");*/
-                        WbsTreeContract parent = service.wbsTreeContractService().getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, currentNode.getParentPkeyId()));
-                        if (parent == null) {
-                            return;
-                        }
-                        List<Map<String, Object>> tableNamePkIdsMaps = tec.jdbcTemplate.queryForList(
-                                "select c.init_table_name tableName,c.p_key_id pkId,c.html_url url from" +
-                                        " (select id from m_wbs_tree_contract where contract_id=" + currentNode.getContractId() + " and is_deleted=0 and node_type=6 and tree_code like '" + parent.getTreeCode() + "%' ORDER BY sort) k" +
-                                        " join m_wbs_tree_contract c on c.parent_id = k.id " +
-                                        "where  c.contract_id=" + currentNode.getContractId() + " and c.is_deleted=0 "
-                        );
-                        if (Func.isNotEmpty(tableNamePkIdsMaps)) {
-                            // removeList.clear();
-                            missingList.forEach(miss -> {
-                                @SuppressWarnings("unckecked")
-                                Map<String, Object> elementInfo = (Map<String, Object>) elementInfoMap.get(miss);
-                                String tn = miss.substring(0, miss.indexOf(StringPool.COLON));
-                                String key = miss.substring(miss.indexOf(StringPool.COLON) + 1);
-                                String targetIds = tableNamePkIdsMaps.stream().filter(m -> StringUtils.isEquals(m.get("tableName"), tn)).map(m -> m.get("pkId")).map(StringUtils::handleNull).collect(Collectors.joining(","));
-                                if (Func.isNotEmpty(targetIds)) {
-                                    if (!tec.getCoordinateMap().containsKey(tn)) {
-                                        tableNamePkIdsMaps.stream().filter(m -> StringUtils.isEquals(m.get("tableName"), tn)).findAny().ifPresent(m -> {
-                                            tec.getCoordinateMap().put(tn, FormulaUtils.getElementCell(StringUtils.handleNull(m.get("url"))));
-                                        });
-                                    }
-                                    List<Map<String, Object>> tableDatas = tec.jdbcTemplate.queryForList("select * from " + tn + " where p_key_id in (" + targetIds + ")");
-                                    String tmp = elementInfo == null ? "" : StringUtils.handleNull(elementInfo.get("ename"));
-                                    fill(tableDatas, removeList, tn, key, tmp);
-                                }
-                            });
-                        }
-                    }
-                    if (Func.isNotEmpty(removeList)) {
-                        /*移除已经找到的元素数据*/
-                        missingList.removeIf(removeList::contains);
-                    }
-                }
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-        }
-        public void fill(List<Map<String,Object>> tableDatas,List<String> removeList,String tn,String key,String name){
-            if(Func.isNotEmpty(tableDatas)){
-                Map<String,Object> map = new HashMap<>();
-                tableDatas.forEach(m->{
-                    for(Map.Entry<String,Object> entry:m.entrySet()){
-                        if(entry.getValue()!=null){
-                            map.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1 + ";;" + v2);
-                        }
-                    }
-                });
-                tec.tableDataMaps.put(tn,map);
-                String values= StringUtils.handleNull(map.get(key));
-                String r= tn+StringPool.COLON+key;
-                FormData tmp=createFormDataFast(name,r,values);
-                if(tmp!=null){
-                    tec.formDataMap.put(r,tmp);
-                }
-            }
-        }
-        public FormData createFormDataFast(String name,String code,String values){
-            if(StringUtils.isNotEmpty(code,name)){
-                String[] arr=code.split(":");
-                String coords = tec.getCoordinateMap().get(arr[0]).get(arr[1]);
-                if(StringUtils.isNotEmpty(coords)) {
-                    /*定位信息存在才合法*/
-                    List<Coords> coordsList = Stream.of(coords).flatMap(s -> Arrays.stream(s.split(";"))).map(s -> {
-                        String[] xy = s.split("_");
-                        return new Coords(xy[1], xy[0]);
-                    }).collect(Collectors.toList());
-                    List<ElementData> eds = new ArrayList<>();
-                    if (StringUtils.isNotEmpty(values)) {
-                        String[] pages = values.split(";;");
-                        for (int index = 0; index < pages.length; index++) {
-                            String pg = pages[index];
-                            if (Func.isNotBlank(pg)) {
-                                String[] val = pg.split("☆");
-                                Map<String, Object> tmpMap = new LinkedHashMap<>();
-                                for (String s : val) {
-                                    String[] t = s.split("_\\^_");
-                                    String[] c = t[1].split("_");
-                                    tmpMap.put(StringUtils.join(code, 0, index, Func.toInt(c[1]), Func.toInt(c[0]), StringPool.AT), t[0]);
-                                }
-                                for (Coords c : coordsList) {
-                                    Object data = null;
-                                    String key = StringUtils.join(code, 0, index, c.getX(), c.getY(), StringPool.AT);
-                                    if (tmpMap.containsKey(key)) {
-                                        data = tmpMap.get(key);
-                                    }
-                                    eds.add(new ElementData(index, 0, data, c.getX(), c.getY()));
-                                }
-                            }
-                        }
-
-                    } else {
-                        eds = coordsList.stream().map(c -> new ElementData(0, 0, null, c.getX(), c.getY())).collect(Collectors.toList());
-                    }
-                    FormData one = new FormData(code, eds, null, coords);
-                    one.setEName(name);
-                    /*备份原始数据,用于更新比较*/
-                    one.init();
-                    return one;
-                }
-                tec.getLog().put(FormulaLog.POSITION,code+"("+name+")");
-            }
-            return null;
-        }
-        public void missingFill2(List<String> missingList){
-            /*数据池里面没有任何元素匹配和当前依赖匹配*/
-            if(Func.isNotEmpty(missingList)){
-                StaticLog.info("需要挂载的元素{}", String.join(";", missingList));
-                Map<String,FormData> fdsMap = service.createFormDataByCode(String.join(",",missingList));
-                /*1从当前节点其它表格中查找匹配的元素*/
-                List<String> removeList=new ArrayList<>();
-                /*2从当前节点的兄弟节点中查找匹配的元素*/
-                CurrentNode currentNode = tec.getCurrentNode();
-                String sql= "select c.init_table_name tableName,c.p_key_id pkeyId,c.html_url url from (select b.id from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.contract_id=b.contract_id and b.ancestors like CONCAT(a.ancestors,'%')) where a.p_key_id="+currentNode.getPkId()+" and b.is_deleted=0 and b.node_type=6 ORDER BY b.sort) k join m_wbs_tree_contract c on c.parent_id = k.id where  c.contract_id="+tec.getContractId()+" and c.is_deleted=0 ";
-                List<TableFormMapper> tableNamePkIdsList = service.getSqlList(sql,TableFormMapper.class);
-                if(Func.isNotEmpty(tableNamePkIdsList)) {
-                    List<Long> pkeyIds=tec.getTableAll().stream().map(NodeTable::getPKeyId).collect(Collectors.toList());
-                    Map<String,List<Long>>tableNamePkIdsMaps=tableNamePkIdsList.stream().filter(m->!pkeyIds.contains(m.getPkeyId())).collect(Collectors.groupingBy(TableFormMapper::getTableName,Collectors.mapping(TableFormMapper::getPkeyId,Collectors.toList())));
-                    Map<String,String> tableNameUrlMaps=tableNamePkIdsList.stream().collect(Collectors.toMap(TableFormMapper::getTableName,TableFormMapper::getUrl,(p,n)->p));
-                    List<FormData> fds=new ArrayList<>(fdsMap.values());
-                    Map<String,List<FormData>> group = fds.stream().collect(Collectors.groupingBy(FormData::getTableName,Collectors.toList()));
-                    group.forEach((k,v)->{
-                        String ids =tableNamePkIdsMaps.get(k).stream().map(Objects::toString).collect(Collectors.joining(","));
-                        String sqlTableDataInfo="select id,p_key_id pageId,tab_key tabKey ,key_val value from table_data_info where  p_key_id in("+ids+")";
-                        List<CellDataVo> list= service.getSqlList(sqlTableDataInfo,CellDataVo.class);
-                        if(list!=null){
-                            Set<String> set= v.stream().map(FormData::getTableName).collect(Collectors.toSet());
-                            Map<String, List<CellDataVo>>  targetGroup=list.stream().filter(e->set.contains(e.getKey())).collect(Collectors.groupingBy(CellDataVo::getKey,Collectors.toList()));
-                            for(FormData fd:v){
-                                fd.setCellDataVoList(targetGroup.get(fd.getKey()));
-                                if(fd.getCellDataVoList()!=null) {
-                                    List<Long> pageIds = tableNamePkIdsMaps.get(fd.getTableName());
-                                    String coords =tec.getCoordinateMap().computeIfAbsent(fd.getTableName(), x -> FormulaUtils.getElementCell(tableNameUrlMaps.get(x))).get(fd.getKey());
-                                    if(Func.isNotBlank(coords)){
-                                        fd.flushCoords(coords);
-                                    }else{
-                                        tec.getLog().put(FormulaLog.POSITION,fd.getCode()+"("+fd.getEName()+")");
-                                        continue;
-                                    }
-                                    List<Coords> coordsList = fd.getCoordsList();
-                                    List<ElementData> eds = fd.getValues();
-                                    Map<String, Object> map = fd.getCellDataVoList().stream().collect(Collectors.toMap(e -> StringUtils.join(pageIds.indexOf(e.getPageId()), e.getX(), e.getY(), StringPool.AT), CellDataVo::getValue));
-                                    for (int i = 0; i < pageIds.size(); i++) {
-                                        for (Coords c : coordsList) {
-                                            String key = StringUtils.join(i, c.getX(), c.getY(), StringPool.AT);
-                                            eds.add(new ElementData(i, 0, map.get(key), c.getX(), c.getY()));
-                                        }
-                                    }
-                                    /*数据初始化加载*/
-                                    fd.setInitReady(true);
-                                    /*备份原始数据,用于更新比较*/
-                                    fd.init();
-                                }
-                            }
-                        }
-                    });
-                }
-                if(Func.isNotEmpty(removeList)){
-                    /*移除已经找到的元素数据*/
-                    missingList.removeIf(removeList::contains);
-                }
-            }
-        }
-        public void keyWord(Map<String,Object> constantMap){
-            CustomFunction.KEYWORD_SET.forEach(e->{
-                constantMap.put(e,e);
-            });
-        }
-        public void baseData(){
-            /*List<FormData> list =this.tec.getFds();*/
-            CurrentNode one=tec.getCurrentNode();
-            /*tec.formDataList=list;*/
-            /*预设关键字*/
-            keyWord(tec.constantMap);
-            /*wbs节点链*/
-            if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
-                List<WbsTreeContract> nodes = service.wpService().tracing(one.getPkId());
-                tec.constantMap.put(CHAIN,nodes.stream().map(e-> StringUtils.isNotEmpty(e.getFullName())?e.getFullName():e.getNodeName()).collect(Collectors.toList()));
-                /*节点参数*/
-                tec.constantMap.put(WP,service.getWpMap(one));
-                /*监表质量附件,过滤掉隐藏表格*/
-                tec.constantMap.put("tableNames",tec.getTableAll().stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)&&StringUtils.isNotEquals(e.getTableType(),4)).map(NodeTable::getNodeName).collect(Collectors.toList()));
-            }
-        }
-    }
-
-    public class Sort implements  FormulaHandleChain{
-        @Override
-        public void handle() {
-            tec.getFormDataList().sort(Comparator.comparingInt(FormData::getStep));
-        }
-    }
-
-    public class Pre implements  FormulaHandleChain{
-        @Override
-        public void handle() {
-            for(FormData fd:tec.getFormDataList()){
-                System.out.println(fd.getEName());
-            }
-        }
-    }
-    public class Special implements  FormulaHandleChain{
-        @Override
-        public void handle() {
-            for(FormData fd:tec.getFormDataList()){
-                System.out.println(fd.getEName());
-            }
-        }
+    public FormulaExecutor() {
     }
-    public class Calculate implements  FormulaHandleChain{
-        @Override
-        public void handle() {
-             for(FormData fd:tec.getFormDataList()){
-                 System.out.println(fd.getEName());
-             }
-        }
-    }
-    public class Format implements  FormulaHandleChain{
-        @Override
-        public void handle() {
-            for(FormData fd:tec.getFormDataList()){
-                System.out.println(fd.getEName());
-            }
-        }
-    }
-
-
 }

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

@@ -185,7 +185,7 @@ public interface ITurnPointCalculator {
          for (Map.Entry<String, String> kv : configMap.entrySet()) {
              String key = kv.getKey();
              String field = kv.getValue();
-             String value = StringUtils.handleNull(dm.get(field));
+             String value = StringUtils.handleNull(dm.get(field)).trim().replaceAll(" ","");
              switch (key) {
                  case CD:
                      tp.setName(value);

+ 25 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java

@@ -0,0 +1,25 @@
+package org.springblade.manager.formula.impl;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.manager.formula.FormulaExecutor;
+import org.springblade.manager.vo.BaseInfo;
+
+import java.util.function.Function;
+
+/**
+ * @author yangyj
+ * @Date 2023/12/11 15:33
+ * @description TODO
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ExecutorInit extends FormulaExecutor {
+    private  Function<Long, BaseInfo> BaseInfoFc;
+    public void handle() {
+        /*加载合同数据*/
+        BaseInfo baseInfo = this.BaseInfoFc.apply(tec.getContractId());
+        /*加载计量期信息*/
+        /*加载合同材料、材料清单*/
+    }
+}

+ 10 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -50,7 +50,6 @@ public class TableElementConverter implements ITableElementConverter {
     List<KeyMapper> keyMappers;
     List<Formula> formulas;
     Map<Long, Formula> formulaMap = new HashMap<>();
-   /* List<FormData> fds = new ArrayList<>();*/
     /**
      * 所有已经初始化数据的元素集
      */
@@ -102,6 +101,8 @@ public class TableElementConverter implements ITableElementConverter {
 
     /**是否使用新流程,默认关闭*/
     public  boolean isNew=false;
+    /**是否强制执行,刷数据的时候会用到*/
+    public boolean  force=false;
 
     public JdbcTemplate  jdbcTemplate;
 
@@ -161,12 +162,14 @@ public class TableElementConverter implements ITableElementConverter {
 
 
     public Boolean isPresent() {
-        return BaseUtils.isNotNull(this.keyMappers, this.formulas, this.nodeId);
-    }
-    public Boolean isPresent2() {
-        return BaseUtils.isNotNull(this.formDataList, this.nodeId);
+        if(isNew){
+            return BaseUtils.isNotNull(this.formDataList, this.nodeId);
+        }else{
+            return BaseUtils.isNotNull(this.keyMappers, this.formulas, this.nodeId);
+        }
     }
 
+
     @Override
     public void before() {
         if (Func.isNotEmpty(this.keyMappers) && Func.isNotEmpty(this.formulas)) {
@@ -330,7 +333,7 @@ public class TableElementConverter implements ITableElementConverter {
                             List<ElementData> p = pages.get(i);
                             TableInfo info = tables.get(i);
                             info.setToBeUpdated(true);
-                            info.getDataMap().put(fd.getKey(), recovery(p));
+                            info.getDataMap().put(fd.getKey(), FormulaUtils.recovery(p));
                         }
                     } catch (Exception e) {
                         StaticLog.error("元素{}回写报错", fd.getCode());
@@ -394,12 +397,7 @@ public class TableElementConverter implements ITableElementConverter {
         }
     }
 
-    public String recovery(List<ElementData> dataList) {
-        if (Func.isNotEmpty(dataList)) {
-            return dataList.stream().filter(e -> !e.isEmpty()).map(e -> e.stringValue() + "_^_" + e.getY() + "_" + e.getX()).collect(Collectors.joining("☆"));
-        }
-        return "";
-    }
+
 
 
 }

+ 3 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -22,10 +22,7 @@ import org.jsoup.nodes.Document;
 import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.bean.TableInfo;
-import org.springblade.manager.entity.ExcelEditCallback;
-import org.springblade.manager.entity.ExcelTab;
-import org.springblade.manager.entity.TableFile;
-import org.springblade.manager.entity.WbsFormElement;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.vo.ExceTabTreVO;
 import org.springblade.manager.vo.ExcelTabVO;
@@ -184,4 +181,6 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
 
     R saveBussData(JSONArray dataArray) throws Exception;
 
+
+    String createFileTitle(WbsTreeContract wbsTreeContract);
 }

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDao.java

@@ -0,0 +1,10 @@
+package org.springblade.manager.service;
+
+import org.springblade.manager.vo.BaseInfo;
+
+import java.util.function.Function;
+
+public interface IFormulaDao {
+    /**获取项目合同基础信息*/
+    Function<Long, BaseInfo> getBaseInfo();
+}

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

@@ -25,61 +25,37 @@ public interface IFormulaService extends BaseService<Formula> {
     /**
      * 变量准备
      */
-    IFormulaService init();
+    IFormulaService init(TableElementConverter tec);
 
     /**
      * 依赖排序
      */
-    IFormulaService sort();
+    IFormulaService sort(TableElementConverter tec);
 
     /**
      * 公式预处理
      */
-    IFormulaService pre();
+    IFormulaService pre(TableElementConverter tec);
 
     /**
      * 特殊公式处理
      */
-    IFormulaService special();
+    IFormulaService special(TableElementConverter tec);
 
     /**
      * 公式运算
      */
-    IFormulaService calculate();
+    IFormulaService calculate(TableElementConverter tec);
 
     /**
      * 格式化
      */
-    void format();
+    void format(TableElementConverter tec);
     /**
      * 变量准备
      */
-    IFormulaService init2();
+    IFormulaService init2(TableElementConverter tec);
 
-    /**
-     * 依赖排序
-     */
-    /*IFormulaService sort2();*/
-
-    /**
-     * 公式预处理
-     */
-    /*IFormulaService pre2();*/
-
-    /**
-     * 特殊公式处理
-     */
-    /*IFormulaService special2();*/
-
-    /**
-     * 公式运算
-     */
-    /*IFormulaService calculate2();*/
-
-    /**
-     * 格式化
-     */
-    /*void format2();*/
 
     List<Formula> getFormulaList(List<KeyMapper> keyMapperList);
     /**
@@ -113,7 +89,7 @@ public interface IFormulaService extends BaseService<Formula> {
     /**获取当前节点的参数wbsNodeId:WBS级id ,wtpPkeyId:项目级PkeyId*/
     List<WbsParam> getNodeWps(Long wbsNodeId,Long wtpPkeyId);
 
-    IWbsParamService wpService();
+
 
 
 }

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

@@ -43,7 +43,7 @@ public interface IWbsParamService extends BaseService<WbsParam> {
     /**指定key的formulaId映射*/
     Long formulaId(String k);
     /**指定key的formulaId映射*/
-    Map<String, Formula> formulaKeyMap(List<String> ks);
+    /*Map<String, Formula> formulaKeyMap(List<String> ks);*/
     /**根据合同段集合刷新*/
      void treeCodeUpdate(Set<Long> contractIds);
     /**全部项目刷新*/

+ 0 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -14,7 +14,6 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.List;
-import java.util.Map;
 
 public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
@@ -62,8 +61,6 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     void syncCurrentFormToAllContract(WbsTreePrivate wbsTreePrivate);
 
-    List<WbsTreeContractLazyVO> lazyQueryContractWbsTree(String id, String contractId, String contractIdRelation, String tableOwner);
-
     List<WbsTreeContractLazyVO> imageLazyQueryContractWbsTree(String parentId, String contractId, String contractIdRelation, String classId);
 
     boolean syncContractTabSort(String projectId);

+ 25 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -1,6 +1,5 @@
 package org.springblade.manager.service.impl;
 
-import cn.hutool.core.lang.hash.Hash;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -10,9 +9,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.common.collect.Lists;
 import lombok.AllArgsConstructor;
-import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
@@ -29,6 +26,8 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.vo.*;
+import org.springblade.meter.entity.MeterContractInfo;
+import org.springblade.meter.feign.MeterContractInfoClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.vo.UserContractInfoVO;
@@ -60,6 +59,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     private final IUserClient iUserClient;
     private final InformationQueryClient informationQueryClient;
     private final ArchiveTreeContractMapper archiveTreeContractMapper;
+    private final MeterContractInfoClient meterContractInfoClient;
     @Autowired
     StringRedisTemplate redisTemplate;
 
@@ -797,19 +797,23 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
             boolean row = this.saveOrUpdate(contractInfo);
 
-            //监理、总监办新增
+            /*监理、总监办新增*/
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
                 if (contractInfo.getIdList().size() > 0) {
                     List<WbsTreeContractVO3> infos = contractInfo.getIdList();
                     for (WbsTreeContractVO3 info : infos) {
-                        //新增关系记录
+                        /*新增关系记录*/
                         baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), info.getContractId());
                     }
                 }
 
-                //中西试验室
+                /*总承包合同段(计量合同段)*/
             } else if (contractInfo.getContractType().equals(4)) {
-                //TODO
+                if (ObjectUtil.isNotEmpty(contractInfo.getMeterContractInfo())) {
+                    MeterContractInfo meterContractInfo = contractInfo.getMeterContractInfo();
+                    meterContractInfo.setContractId(contractInfo.getId());
+                    meterContractInfoClient.saveOrUpdate(meterContractInfo);
+                }
             }
 
             return this.submitContractRelevantInfo(row, contractInfo);
@@ -832,30 +836,28 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
             }
             boolean row = this.saveOrUpdate(contractInfo);
 
-            //监理、总监办编辑
+            /*监理、总监办编辑*/
             if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
-                //获取当前项目所有施工合同段ids
+                /*获取当前项目所有施工合同段ids*/
                 List<Long> contractInfosSGAll = baseMapper.selectList(Wrappers.<ContractInfo>lambdaQuery()
                         .eq(ContractInfo::getPId, contractInfo.getPId())
                         .eq(ContractInfo::getContractType, 1).eq(ContractInfo::getStatus, 1))
                         .stream().map(ContractInfo::getId).collect(Collectors.toList());
 
-                //更新当下项目所有施工合同段Redis树缓存
+                contractInfosSGAll.add(contractInfo.getId());
+                /*更新当下项目合同段Redis树缓存*/
                 for (Long id : contractInfosSGAll) {
                     informationQueryClient.delAsyncWbsTree(id + "");
                 }
 
-                //更新当前监理合同段Redis树缓存
-                informationQueryClient.delAsyncWbsTree(contractInfo.getId() + "");
-
-                //删除记录信息
+                /*删除记录信息*/
                 List<String> updateId_SG = contractInfo.getIdList().stream().map(WbsTreeContractVO3::getContractId).collect(Collectors.toList());
                 baseMapper.deleteContractRelationJLYZ(contractInfo.getId());
                 for (String id : updateId_SG) {
                     baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), id);
                 }
 
-                //当前关联的施工合同段ids
+                /*当前关联的施工合同段ids*/
                 String sql = "select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractInfo.getId();
                 List<String> record_SG = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class)).stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
 
@@ -863,12 +865,12 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                 List<Long> delIds = contractInfosSGAll.stream().filter(f -> !record_SG.contains(f.toString())).collect(Collectors.toList());
 
                 if (saveIds.size() > 0) {
-                    //同步
+                    /*同步*/
                     this.syncUserInfoToContract(contractInfo, saveIds);
                 }
 
                 if (delIds.size() > 0) {
-                    //删除
+                    /*删除*/
                     List<SaveUserInfoByProjectDTO> list = saveUserInfoByProjectService.getBaseMapper().selectList(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery()
                             .eq(SaveUserInfoByProjectDTO::getProjectId, contractInfo.getPId())
                             .eq(SaveUserInfoByProjectDTO::getIsRecordJlId, contractInfo.getId())
@@ -881,9 +883,13 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                     }
                 }
 
-                //中西试验室编辑
+                /*总承包合同段(计量合同段)*/
             } else if (contractInfo.getContractType().equals(4)) {
-
+                if (ObjectUtil.isNotEmpty(contractInfo.getMeterContractInfo())) {
+                    MeterContractInfo meterContractInfo = contractInfo.getMeterContractInfo();
+                    meterContractInfo.setContractId(contractInfo.getId());
+                    meterContractInfoClient.saveOrUpdate(meterContractInfo);
+                }
             }
 
             return this.submitContractRelevantInfo(row, contractInfo);

+ 8 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -450,7 +450,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     tec.setExecuteType(type);
                     tec.setContractId(contractId);
                     tec.setProjectId(projectId);
-                    if (tec.isPresent2()) {
+                    if (tec.isPresent()) {
                         tec.before2();
                         this.formulaService.execute2(tec);
                         tec.after2();
@@ -1675,13 +1675,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
                             String myData = DataInfo.get(val) + "";
                             if ((myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) || (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0)) {
-
                                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
                                 sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
                                 SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
-
                                 if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
-
                                     myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
                                     String[] dataVal = myData.split(",");
                                     Date Start_dataStr = new Date();
@@ -1842,7 +1839,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
 
-        FileUtils.excel2pdf(excelPath, pdfPath);
+      //  FileUtils.excel2pdf(excelPath, pdfPath);
+        FileUtils.excelToPdf(excelPath, pdfPath);
 
         BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
 
@@ -2997,6 +2995,11 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         return R.data("操作成功");
     }
 
+    @Override
+    public String createFileTitle(WbsTreeContract wbsTreeContract) {
+        return this.wbsParamService.createFileTitle(wbsTreeContract);
+    }
+
     // 保存单表
     public void SaveOneTabInfo(JSONObject tableInfo) throws Exception {
         System.out.println("---------=" + new Date().toLocaleString());

+ 36 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java

@@ -0,0 +1,36 @@
+package org.springblade.manager.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ProjectInfo;
+import org.springblade.manager.service.IContractInfoService;
+import org.springblade.manager.service.IFormulaDao;
+import org.springblade.manager.service.IProjectInfoService;
+import org.springblade.manager.vo.BaseInfo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.function.Function;
+
+/**
+ * @author yangyj
+ * @Date 2023/12/14 16:33
+ * @description TODO
+ */
+@Service
+@RequiredArgsConstructor
+public class FormulaDaoImpl implements IFormulaDao {
+    private final IContractInfoService contractInfoService;
+    private final IProjectInfoService projectInfoService;
+    @Override
+    public Function<Long, BaseInfo> getBaseInfo() {
+        return contractId->{
+            ContractInfo info=  this.contractInfoService.getById(contractId);
+            ProjectInfo projectInfo= projectInfoService.getById(info.getPId());
+            BaseInfo baseInfo= new BaseInfo();
+            BeanUtils.copyProperties(info,baseInfo);
+            baseInfo.setProjectName(projectInfo.getProjectName());
+            return baseInfo;
+        };
+    }
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 238 - 169
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java


+ 43 - 27
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java

@@ -16,10 +16,8 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.TreeNode;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsParamMapper;
-import org.springblade.manager.service.IElementFormulaMappingService;
-import org.springblade.manager.service.IFormulaService;
-import org.springblade.manager.service.IWbsParamService;
-import org.springblade.manager.service.IWbsTreeContractService;
+import org.springblade.manager.mapper.WbsTreePrivateMapper;
+import org.springblade.manager.service.*;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
@@ -38,8 +36,8 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsParam> implements IWbsParamService {
     private final IWbsTreeContractService treeContractService;
+    private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final IElementFormulaMappingService elementFormulaMappingService;
-    private final IFormulaService formulaService;
     private final JdbcTemplate jdbcTemplate;
 
     private static final String NOT_SET = "还未配置提名规则";
@@ -56,12 +54,12 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         if(wtc!=null&&wtc.getPKeyId()!=null){
             List<WbsTreeContract> nodes = tracing(wtc.getPKeyId());
             if (Func.isNotEmpty(nodes)) {
-                WbsTreePrivate wtp = this.formulaService.wtpId(wtc.getPKeyId());
+                WbsTreePrivate wtp = this.wtpId(wtc.getPKeyId());
                 if(wtp!=null){
                     /*优先取私有*/
                     WbsParam wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, wtp.getPKeyId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1"));
                     if (wp == null) {
-                        WbsTreePrivate publicWtp = this.formulaService.getOriginWtp(wtp.getPKeyId());
+                        WbsTreePrivate publicWtp = this.getOriginWtp(wtp.getPKeyId());
                         wp = this.getOne(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, publicWtp.getId()).eq(WbsParam::getK, FILE_TITLE).last(" limit 1 "));
                     }
                     if (Func.isNotEmpty(wp)) {
@@ -74,6 +72,41 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         return NOT_SET;
     }
 
+    public WbsTreePrivate getOriginWtp(Long pkeyId) {
+
+        /*WbsTreePrivate wtp = this.wbsTreePrivateMapper.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId,pkeyId));*/
+        WbsTreePrivate wtp = this.wbsTreePrivateMapper.getByPKeyId(pkeyId);
+        int i=10;
+        WbsTreePrivate publicWtp = wtp;
+        while (i>0) {
+           /* WbsTreePrivate tmp=  this.wbsTreePrivateMapper.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, publicWtp.getWbsId()));*/
+            WbsTreePrivate tmp=  this.wbsTreePrivateMapper.getByPKeyId(Long.parseLong(publicWtp.getWbsId()));
+            if (tmp == null) {
+                break;
+            }
+            publicWtp = tmp;
+            i--;
+        }
+        /*私有引用项目的wbsId其实是被复制的项目的根节点p_key_id,只有溯源才能找到真正的wbsId*/
+        wtp.setWbsId(publicWtp.getWbsId());
+        return wtp;
+    }
+
+    public WbsTreePrivate wtpId(Long pkeyId){
+        WbsTreeContract wtc = this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
+        int loop=0;
+        while (wtc.getOldId()!=null&&loop<10){
+            loop++;
+            WbsTreeContract tmp = this.treeContractService.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()).last(" limit 1 "));
+            }else{
+                wtc=tmp;
+            }
+        }
+        return this.wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()).last(" limit 1 "));
+    }
+
     @Override
     public String createFileTitle(Long pkeyId) {
         WbsTreeContract wtc =this.treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
@@ -166,9 +199,9 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
                 if(removeMapingIds.size()>0){
                     batchDel(this.elementFormulaMappingService,removeMapingIds);
                 }
-                if(removeFormulaIds.size()>0){
+/*                if(removeFormulaIds.size()>0){
                     batchDel(this.formulaService,removeFormulaIds);
-                }
+                }*/
                 stopWatch.stop();
                 Long totalTime = stopWatch.getTotalTimeMillis();
                 StaticLog.info("公式执行用时:{},删除情况:{}", totalTime,result);
@@ -267,24 +300,7 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
         return null;
     }
 
-    @Override
-    public Map<String, Formula> formulaKeyMap(List<String> ks) {
-        Map<String,Formula> result = new HashMap<>();
-        Map<String,Long> fkMap= formulaIdKeyMap(ks);
-        if(fkMap.size()>0) {
-           List<Formula> list =  this.formulaService.listByIds(fkMap.values());
-           if(list.size()<fkMap.size()){
-               /*this.formulaService.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getIsDeleted,0).eq(Formula::getIsDeleted,1).in(Formula::getId,fkMap.values()));*/
-               this.jdbcTemplate.execute("update m_formula set is_deleted = 0 where is_deleted = 1 and id in ("+fkMap.values().stream().map(Object::toString).collect(Collectors.joining(","))+")");
-               list =  this.formulaService.listByIds(fkMap.values());
-           }
-           Map<Long,Formula> idMap=list.stream().collect(Collectors.toMap(BaseEntity::getId, f->f));
-           fkMap.forEach((k,v)->{
-               result.put(k,idMap.get(v));
-           });
-        }
-        return result;
-    }
+
 
     public void builder(Long id,List<String>sqlList){
         List<Map<String,Object>> treeNodeList= this.jdbcTemplate.queryForList("select node_name name,p_key_id value, id, parent_id parentId,sort  from m_wbs_tree_contract where contract_id="+id+" and is_deleted=0 and type=1 order by sort,create_time");

+ 19 - 526
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -26,7 +26,9 @@ import org.springblade.common.utils.FileUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.NodeVO;
@@ -62,18 +64,20 @@ import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
+
 
 @Service
 @AllArgsConstructor
 public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractMapper, WbsTreeContract> implements IWbsTreeContractService {
 
-    /*static {
-        *//*parallelStream并行流粒度*//*
+    /*保留 image/lazyQueryContractWbsTree 接口在使用*/
+    static {
+        /*parallelStream并行流粒度*/
         System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "4");
-    }*/
+    }
 
     private static final Logger logger = LoggerFactory.getLogger(WbsTreeContractServiceImpl.class);
+    private final BladeRedis bladeRedis;
     private final ConstructionLedgerFeignClient constructionLedgerFeign;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
     private final ContractInfoMapper contractInfoMapper;
@@ -118,6 +122,14 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
     @Override
     public boolean submitWbsTreeInContract(WbsTreeContractDTO pawDTO) {
+        /*加锁*/
+        String redisValue = bladeRedis.get("submit-wbs-contract:" + pawDTO.getContractId());
+        if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
+            throw new ServiceException("请勿重复提交,请60秒后再尝试");
+        }
+        bladeRedis.set("submit-wbs-contract:" + pawDTO.getContractId(), "1");
+        bladeRedis.expire("submit-wbs-contract:" + pawDTO.getContractId(), 60);
+
         String wbsTreeIds = pawDTO.getWbsTreeIds();
         String[] ids = wbsTreeIds.split(",");
         //项目对应到合同段的入参节点ids
@@ -145,7 +157,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         List<String> saveIds = idList1.stream().filter(f -> !finalNowContractNodeIds.contains(f)).collect(Collectors.toList());
         List<String> delIds = finalNowContractNodeIds.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
 
-        //TODO ---------节点未变只同步元素表---------
+        // ================= 节点未变只同步元素表 =================
         if (saveIds.size() == 0 && delIds.size() == 0) {
             //当前项目所有原始表(从公有树到项目私有树同步后的,或是私有到私有的)
             List<WbsTreePrivate> nowProjectTabs = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
@@ -273,7 +285,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             }
 
         } else {
-            //TODO ---------删除---------
+            // ================= 删除 =================
             if (delIds.size() > 0) {
                 List<ContractRelationJlyz> contractRelationJLYZList = baseMapper.selectContractRelationInfoByidSG2(pawDTO.getContractId());
                 if (contractRelationJLYZList.size() > 0) {
@@ -300,7 +312,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId(), pawDTO.getContractId());
             }
 
-            //TODO ---------新增---------
+            // ================= 新增 =================
             if (saveIds.size() > 0) {
                 ArrayList<ConstructionLedger> constructionLedgerList = new ArrayList<>();
                 List<WbsTreePrivate> wbsTreePrivatesList = wbsTreePrivateMapper.selectNodeAndTable2(pawDTO.getWbsId(), pawDTO.getProjectId());
@@ -727,462 +739,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         baseMapper.syncCurrentFormToAllContract(wbsTreePrivate);
     }
 
-    @Override
-    public List<WbsTreeContractLazyVO> lazyQueryContractWbsTree(String id, String contractId, String contractIdRelation, String tableOwner) {
-        if (StringUtils.isEmpty(tableOwner)) {
-            throw new ServiceException("tableOwner is not null");
-        }
-        if (ObjectUtil.isNotEmpty(contractId)) {
-            ContractInfo contractInfo = contractInfoMapper.selectOne(Wrappers.<ContractInfo>lambdaQuery().select(ContractInfo::getContractName, ContractInfo::getContractType).eq(ContractInfo::getId, contractId));
-            if (contractInfo != null) {
-                /*施工合同段*/
-                if (new Integer(1).equals(contractInfo.getContractType())) {
-                    //获取当前层懒加载节点
-                    String sql = "select p_key_id,contract_id,(SELECT id FROM u_contract_tree_drawings where process_id = p_key_id and is_deleted = 0 limit 1) AS drawingsId,id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,partition_code,old_id,contract_id_relation,is_concealed_works_node,CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1 and b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + contractId + " ORDER BY a.sort,title,a.create_time";
-                    List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
-                    if (lazyNodes.size() > 0) {
-
-                        /*根节点直接返回*/
-                        if (lazyNodes.stream().anyMatch(f -> f.getParentId().equals(0L))) {
-                            for (WbsTreeContractLazyVO lazyNode : lazyNodes) {
-                                lazyNode.setSubmitCounts(0);
-                                lazyNode.setColorStatus(2);
-                                lazyNode.setType(lazyNode.getNodeType());
-                                lazyNode.setNotExsitChild(!lazyNode.getHasChildren().equals(1));
-                                lazyNode.setPrimaryKeyId(lazyNode.getPKeyId());
-                                lazyNode.setTitle(contractInfo.getContractName());
-                            }
-                            return lazyNodes;
-                        }
-
-                        //获取本地缓存节点信息
-                        List<WbsTreeContractLazyVO> nodesAll = this.getNodeAll(contractId);
-                        List<WbsTreeContractLazyVO> distinctNodesAll = nodesAll.stream()
-                                .collect(Collectors.collectingAndThen(
-                                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
-                                        ArrayList::new
-                                ));
-
-                        //所有最底层节点
-                        List<WbsTreeContractLazyVO> distinctLowestNodesAll = distinctNodesAll.stream().filter(f -> f.getHasChildren().equals(0)).collect(Collectors.collectingAndThen(
-                                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
-                                ArrayList::new
-                        ));
-
-                        //获取本地缓存资料信息
-                        List<WbsTreeContractLazyQueryInfoVO> queryInfoList = this.getQueryInfoList(contractId, tableOwner);
-
-                        Map<Long, Integer> queryInfoMaps = queryInfoList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
-                                .collect(Collectors.toMap(WbsTreeContractLazyQueryInfoVO::getWbsId, WbsTreeContractLazyQueryInfoVO::getStatus, (existingValue, newValue) -> existingValue));
-                        List<Long> pKeyIdList = new ArrayList<>(queryInfoMaps.keySet());
-
-                        /*处理数量*/
-                        //填报过的所有最底层节点
-                        List<WbsTreeContractLazyVO> lowestNodesTB = distinctLowestNodesAll.parallelStream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
-                        List<Long> lowestNodeParentIdsTB = lowestNodesTB.parallelStream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toList());
-                        //获取本地缓存节点数量统计
-                        List<WbsTreeContractLazyVO> resultParentNodesTB = this.getCachedParentCountNodes(contractId, lowestNodeParentIdsTB, nodesAll, tableOwner);
-
-                        /*List<WbsTreeContractLazyVO> resultParentNodesTB = new ArrayList<>();
-                        long startTime1 = System.currentTimeMillis();
-                        this.recursiveGetParentNodes(resultParentNodesTB, lowestNodeParentIdsTB, nodesAll);
-                        long endTime1 = System.currentTimeMillis();
-                        long executionTime1 = endTime1 - startTime1;
-                        logger.info("合同段 " + contractId + " wbs节点树 数量计算 耗时:" + executionTime1 + " ms");*/
-
-                        //最底层节点颜色构造后Map
-                        Map<Long, WbsTreeContractLazyVO> lowestNodesMap = lowestNodesTB.stream()
-                                .peek(vo -> {
-                                    Integer colorStatus = queryInfoMaps.get(vo.getPKeyId());
-                                    if (colorStatus != null) {
-                                        //任务状态0=未上报=颜色2蓝色、任务状态1=待审批=颜色3橙色、任务状态2=已审批=颜色4绿色、
-                                        ///*任务状态3=已废除=颜色1黑色*/(2023年10月16日13:59:00 已废除改为=颜色2蓝色)
-                                        vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 2)));
-                                    } else {
-                                        //未填报的=颜色1黑色
-                                        vo.setColorStatus(1);
-                                    }
-                                }).collect(Collectors.toMap(WbsTreeContractLazyVO::getPKeyId, Function.identity()));
-
-                        /*处理颜色*/
-                        long startTime = System.currentTimeMillis();
-                        //先将WbsTreeContractLazyVO转为NodeVO
-                        List<NodeVO> nodeVOList = distinctNodesAll.stream().map(this::convertToNodeVO).collect(Collectors.toList());
-                        //转为Map<Long, NodeVO>
-                        Map<Long, NodeVO> nodeVOMap = nodeVOList.stream().collect(Collectors.toMap(NodeVO::getId, vo -> vo, (existing, replacement) -> existing));
-                        //把distinctNodesAll把所有节点转为树形结构,再转为List<NodeVO>对象
-                        List<NodeVO> treeNodeVOList = this.buildNodeTreeByStream(distinctNodesAll, lowestNodesMap);
-                        //处理节点颜色
-                        NodeVO.calculateStatusToDFS(treeNodeVOList, nodeVOMap);
-                        //把树形结构转为普通List集合
-                        List<NodeVO> nodeVOS = this.flattenTree(treeNodeVOList);
-                        //获取所有节点颜色Map
-                        Map<Long, Integer> nodeColorStatusMap = nodeVOS.stream().collect(Collectors.toMap(NodeVO::getPKeyId, NodeVO::getStatus, (existing, replacement) -> existing));
-                        long endTime = System.currentTimeMillis();
-                        long executionTime = endTime - startTime;
-                        logger.info("合同段 " + contractId + " 处理颜色 执行时间:" + executionTime + " ms");
-
-                        /*处理最终结果集*/
-                        if (lazyNodes.size() > 0) {
-                            //处理填报数量
-                            Map<Long, Integer> countMap = new HashMap<>();
-                            for (WbsTreeContractLazyVO node : resultParentNodesTB) {
-                                Long key = node.getPKeyId();
-                                if (countMap.containsKey(key)) {
-                                    countMap.put(key, countMap.get(key) + 1);
-                                } else {
-                                    countMap.put(key, 1);
-                                }
-                            }
-
-                            //返回最终结果集
-                            for (WbsTreeContractLazyVO lazyNodeVO : lazyNodes) {
-                                lazyNodeVO.setType(lazyNodeVO.getNodeType()); //前端显示需要一样的,所以修改成一样的
-                                lazyNodeVO.setNotExsitChild(!lazyNodeVO.getHasChildren().equals(1));
-                                lazyNodeVO.setPrimaryKeyId(lazyNodeVO.getPKeyId());
-                                if (lazyNodeVO.getParentId() == 0L) {
-                                    if (ObjectUtil.isNotEmpty(contractInfo.getContractName())) {
-                                        lazyNodeVO.setTitle(contractInfo.getContractName());
-                                    }
-                                }
-
-                                //设置数量
-                                lazyNodeVO.setSubmitCounts(ObjectUtil.isNotEmpty(countMap.get(lazyNodeVO.getPKeyId())) ? countMap.get(lazyNodeVO.getPKeyId()) : (ObjectUtil.isNotEmpty(queryInfoMaps.get(lazyNodeVO.getPKeyId())) ? 1 : 0));
-
-                                //设置颜色
-                                if (lazyNodeVO.getSubmitCounts().equals(0)) {
-                                    lazyNodeVO.setColorStatus(1);
-                                    continue;
-                                }
-
-                                Integer parentColorStatus = nodeColorStatusMap.get(lazyNodeVO.getPKeyId());
-                                if (parentColorStatus != null) {
-                                    lazyNodeVO.setColorStatus(parentColorStatus);
-                                } else {
-                                    WbsTreeContractLazyVO lowestNode = lowestNodesMap.get(lazyNodeVO.getPKeyId());
-                                    if (lowestNode != null) {
-                                        lazyNodeVO.setColorStatus(lowestNode.getColorStatus());
-                                    }
-                                }
-                            }
-                        }
-                        return lazyNodes;
-                    }
-
-                    /*监理、业主合同段*/
-                } else if (new Integer("2").equals(contractInfo.getContractType()) || new Integer("3").equals(contractInfo.getContractType())) {
-                    List<WbsTreeContractLazyVO> lazyNodesAll = new ArrayList<>();
-                    List<String> contractIds = new ArrayList<>();
-                    if (ObjectUtil.isNotEmpty(contractIdRelation) && ObjectUtil.isNotEmpty(id)) {
-                        //非根节点时选择加载施工合同段的树
-                        contractIds.add(contractIdRelation);
-                    } else {
-                        //根节点时默认加载所有施工合同段的树
-                        contractIds = this.contractClient.getProcessContractByJLContractId(contractId);
-                    }
-                    if (ObjectUtil.isEmpty(contractIds) || contractIds.size() <= 0) {
-                        return null;
-                    }
-                    for (String sgContractId : contractIds) {
-                        ContractInfo sgContractInfo = jdbcTemplate.query("select contract_name from m_contract_info where id = " + sgContractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
-                        if (sgContractInfo != null) {
-                            List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query("select p_key_id,contract_id,(SELECT id FROM u_contract_tree_drawings where process_id = p_key_id and is_deleted = 0 limit 1) AS drawingsId,id,parent_id,node_type,type,wbs_type,major_data_type,partition_code,old_id,contract_id_relation,is_concealed_works_node,CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title,(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND  b.type = 1 and b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 ) AS hasChildren from m_wbs_tree_contract a where a.node_type != 111 and a.type = 1 and a.status = 1 and a.is_deleted = 0 and parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " and contract_id = " + sgContractId + " ORDER BY a.sort,title,a.create_time", new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
-                            if (lazyNodes.size() > 0) {
-
-                                if (lazyNodes.stream().anyMatch(f -> f.getParentId().equals(0L))) {
-                                    for (WbsTreeContractLazyVO lazyNode : lazyNodes) {
-                                        lazyNode.setSubmitCounts(0);
-                                        lazyNode.setColorStatus(2);
-                                        lazyNode.setType(lazyNode.getNodeType());
-                                        lazyNode.setNotExsitChild(!lazyNode.getHasChildren().equals(1));
-                                        lazyNode.setPrimaryKeyId(lazyNode.getPKeyId());
-                                        lazyNode.setContractIdRelation(sgContractId);
-                                        lazyNode.setTitle(sgContractInfo.getContractName());
-                                    }
-                                    return lazyNodes;
-                                }
-
-                                List<WbsTreeContractLazyVO> nodesAll = this.getNodeAll(sgContractId);
-                                List<WbsTreeContractLazyVO> distinctNodesAll = nodesAll.stream()
-                                        .collect(Collectors.collectingAndThen(
-                                                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
-                                                ArrayList::new
-                                        ));
-                                List<WbsTreeContractLazyVO> distinctLowestNodesAll = distinctNodesAll.stream().filter(f -> f.getHasChildren().equals(0)).collect(Collectors.collectingAndThen(
-                                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WbsTreeContractLazyVO::getPKeyId))),
-                                        ArrayList::new
-                                ));
-
-                                List<WbsTreeContractLazyQueryInfoVO> queryInfoList = this.getQueryInfoList(sgContractId, tableOwner);
-
-                                Map<Long, Integer> queryInfoMaps = queryInfoList.stream().filter(f -> ObjectUtil.isNotEmpty(f.getWbsId()))
-                                        .collect(Collectors.toMap(WbsTreeContractLazyQueryInfoVO::getWbsId, WbsTreeContractLazyQueryInfoVO::getStatus, (existingValue, newValue) -> existingValue));
-                                List<Long> pKeyIdList = new ArrayList<>(queryInfoMaps.keySet());
-
-                                List<WbsTreeContractLazyVO> lowestNodesTB = distinctLowestNodesAll.parallelStream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
-                                List<Long> lowestNodeParentIdsTB = lowestNodesTB.parallelStream().map(WbsTreeContractLazyVO::getParentId).collect(Collectors.toList());
-
-                                List<WbsTreeContractLazyVO> resultParentNodesTB = this.getCachedParentCountNodes(sgContractId, lowestNodeParentIdsTB, nodesAll, tableOwner);
-
-                                Map<Long, WbsTreeContractLazyVO> lowestNodesMap = lowestNodesTB.stream()
-                                        .peek(vo -> {
-                                            Integer colorStatus = queryInfoMaps.get(vo.getPKeyId());
-                                            if (colorStatus != null) {
-                                                vo.setColorStatus(colorStatus == 0 ? 2 : (colorStatus == 1 ? 3 : (colorStatus == 2 ? 4 : 2)));
-                                            } else {
-                                                vo.setColorStatus(1);
-                                            }
-                                        }).collect(Collectors.toMap(WbsTreeContractLazyVO::getPKeyId, Function.identity()));
-
-                                List<NodeVO> nodeVOList = distinctNodesAll.stream().map(this::convertToNodeVO).collect(Collectors.toList());
-                                Map<Long, NodeVO> nodeVOMap = nodeVOList.stream().collect(Collectors.toMap(NodeVO::getId, vo -> vo, (existing, replacement) -> existing));
-                                List<NodeVO> treeNodeVOList = this.buildNodeTreeByStream(distinctNodesAll, lowestNodesMap);
-                                NodeVO.calculateStatusToDFS(treeNodeVOList, nodeVOMap);
-                                List<NodeVO> nodeVOS = this.flattenTree(treeNodeVOList);
-                                Map<Long, Integer> nodeColorStatusMap = nodeVOS.stream().collect(Collectors.toMap(NodeVO::getPKeyId, NodeVO::getStatus, (existing, replacement) -> existing));
-
-                                if (lazyNodes.size() > 0) {
-                                    Map<Long, Integer> countMap = new HashMap<>();
-                                    for (WbsTreeContractLazyVO node : resultParentNodesTB) {
-                                        Long key = node.getPKeyId();
-                                        if (countMap.containsKey(key)) {
-                                            countMap.put(key, countMap.get(key) + 1);
-                                        } else {
-                                            countMap.put(key, 1);
-                                        }
-                                    }
-
-                                    for (WbsTreeContractLazyVO lazyNodeVO : lazyNodes) {
-                                        lazyNodeVO.setType(lazyNodeVO.getNodeType());
-                                        lazyNodeVO.setNotExsitChild(!lazyNodeVO.getHasChildren().equals(1));
-                                        lazyNodeVO.setPrimaryKeyId(lazyNodeVO.getPKeyId());
-                                        lazyNodeVO.setContractIdRelation(sgContractId);
-                                        if (lazyNodeVO.getParentId() == 0L) {
-                                            if (ObjectUtil.isNotEmpty(sgContractInfo.getContractName())) {
-                                                lazyNodeVO.setTitle(sgContractInfo.getContractName());
-                                            }
-                                        }
-
-                                        lazyNodeVO.setSubmitCounts(ObjectUtil.isNotEmpty(countMap.get(lazyNodeVO.getPKeyId())) ? countMap.get(lazyNodeVO.getPKeyId()) : (ObjectUtil.isNotEmpty(queryInfoMaps.get(lazyNodeVO.getPKeyId())) ? 1 : 0));
-                                        if (lazyNodeVO.getSubmitCounts().equals(0)) {
-                                            lazyNodeVO.setColorStatus(1);
-                                            continue;
-                                        }
-
-                                        Integer parentColorStatus = nodeColorStatusMap.get(lazyNodeVO.getPKeyId());
-                                        if (parentColorStatus != null) {
-                                            lazyNodeVO.setColorStatus(parentColorStatus);
-                                        } else {
-                                            WbsTreeContractLazyVO lowestNode = lowestNodesMap.get(lazyNodeVO.getPKeyId());
-                                            if (lowestNode != null) {
-                                                lazyNodeVO.setColorStatus(lowestNode.getColorStatus());
-                                            }
-                                        }
-                                    }
-                                }
-                                lazyNodesAll.addAll(lazyNodes);
-                            }
-                        }
-                    }
-                    return lazyNodesAll;
-                }
-            }
-        }
-        return null;
-    }
-
-
-    /**
-     * 获取当前合同段所有节点缓存
-     *
-     * @param contractId
-     * @return
-     */
-    public List<WbsTreeContractLazyVO> getNodeAll(String contractId) {
-        //获取本地缓存
-        List<WbsTreeContractLazyVO> nodesAll = localCacheNodes.get(contractId);
-
-        if (nodesAll == null || nodesAll.isEmpty()) {
-            //从Redis获取数据
-            Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + contractId);
-            if (data != null) {
-                nodesAll = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
-                //更新本地缓存
-                localCacheNodes.put(contractId, nodesAll);
-            } else {
-                //返回数据库数据
-                long startTime = System.currentTimeMillis();
-
-                /*分页查询,每次5000条*/
-                int pageSize = 5000;
-                int pageNumber = 1;
-                int offset;
-
-                nodesAll = new ArrayList<>();
-                List<WbsTreeContractLazyVO> nodesAllPage;
-                do {
-                    offset = (pageNumber - 1) * pageSize;
-                    nodesAllPage = jdbcTemplate.query(
-                            "SELECT p_key_id, id, parent_id FROM m_wbs_tree_contract " +
-                                    "WHERE type = 1 " +
-                                    "AND status = 1 " +
-                                    "AND is_deleted = 0 " +
-                                    "AND contract_id = ? " +
-                                    "LIMIT ? OFFSET ?",
-                            new Object[]{contractId, pageSize, offset},
-                            new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class)
-                    );
-                    nodesAll.addAll(nodesAllPage);
-                    pageNumber++;
-                } while (nodesAllPage.size() == pageSize);
-
-                long endTime = System.currentTimeMillis();
-                long executionTime = endTime - startTime;
-                logger.info("合同段 " + contractId + " 查询所有wbs节点树 执行时间:" + executionTime + " ms");
-
-                if (nodesAll.size() > 0) {
-                    //判断是否有子级,赋值
-                    Map<Long, List<WbsTreeContractLazyVO>> groupedByParentId = nodesAll.stream().collect(Collectors.groupingBy(WbsTreeContractLazyVO::getParentId));
-                    for (WbsTreeContractLazyVO vo : nodesAll) {
-                        if (vo.getParentId() == 0) {
-                            vo.setHasChildren(1);
-                        }
-                        List<WbsTreeContractLazyVO> childNodes = groupedByParentId.getOrDefault(vo.getId(), null);
-                        if (childNodes != null && childNodes.size() > 0) {
-                            vo.setHasChildren(1);
-                        } else {
-                            vo.setHasChildren(0);
-                        }
-                    }
-
-                    //存储到Redis中
-                    JSONArray array = JSONArray.parseArray(JSON.toJSONString(nodesAll));
-                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + contractId, JSON.toJSON(array).toString());
-
-                    //更新本地缓存
-                    localCacheNodes.put(contractId, nodesAll);
-                }
-            }
-        }
-        return nodesAll;
-    }
-
-    /**
-     * 获取节点数量统计缓存
-     *
-     * @param contractId
-     * @param lowestNodeParentIdsTB
-     * @param nodesAll
-     * @return
-     */
-    public List<WbsTreeContractLazyVO> getCachedParentCountNodes(String contractId, List<Long> lowestNodeParentIdsTB, List<WbsTreeContractLazyVO> nodesAll, String tableOwner) {
-        //从本地缓存获取数据
-        String cacheKey = contractId + "_" + tableOwner;
-        List<WbsTreeContractLazyVO> resultParentNodesTB = localCacheParentCountNodes.get(cacheKey);
-
-        if (resultParentNodesTB == null || resultParentNodesTB.isEmpty()) {
-
-            //从Redis获取数据
-            Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byParentCountNodes:" + cacheKey);
-            if (data != null) {
-                resultParentNodesTB = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);
-                //更新本地缓存
-                localCacheParentCountNodes.put(cacheKey, resultParentNodesTB);
-
-            } else {
-                /*重新计算,进行递归获取父节点计数统计*/
-                resultParentNodesTB = new ArrayList<>();
-                long startTime = System.currentTimeMillis();
-
-                this.recursiveGetParentNodes(resultParentNodesTB, lowestNodeParentIdsTB, nodesAll);
-
-                long endTime = System.currentTimeMillis();
-                long executionTime = endTime - startTime;
-                logger.info("合同段 " + contractId + " wbs节点树 数量计算 耗时:" + executionTime + " ms");
-
-                if (resultParentNodesTB.size() > 0) {
-                    //存储到Redis中
-                    JSONArray array = JSONArray.parseArray(JSON.toJSONString(resultParentNodesTB));
-                    redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byParentCountNodes:" + cacheKey, JSON.toJSON(array).toString());
-
-                    //更新本地缓存
-                    localCacheParentCountNodes.put(cacheKey, resultParentNodesTB);
-                }
-            }
-        }
-
-        return resultParentNodesTB;
-    }
-
-
-    /**
-     * 获取当前合同段所有填报资料缓存信息
-     *
-     * @param contractId
-     * @param tableOwner
-     * @return
-     */
-    public List<WbsTreeContractLazyQueryInfoVO> getQueryInfoList(String contractId, String tableOwner) {
-        //从本地缓存获取
-        String cacheKey = contractId + "_" + tableOwner;
-        List<WbsTreeContractLazyQueryInfoVO> cachedQueryInfoList = localCacheQueryInfos.get(cacheKey);
-
-        if (cachedQueryInfoList != null && !cachedQueryInfoList.isEmpty()) {
-            return cachedQueryInfoList;
-        }
-
-        //从Redis获取数据
-        Object dataInformationQuery = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:byInformationQuery:" + cacheKey);
-
-        List<WbsTreeContractLazyQueryInfoVO> queryInfoList = new ArrayList<>();
-        if (dataInformationQuery != null) {
-            queryInfoList = JSON.parseArray(dataInformationQuery.toString(), WbsTreeContractLazyQueryInfoVO.class);
-            //更新本地缓存
-            localCacheQueryInfos.put(cacheKey, queryInfoList);
-
-        } else {
-            //返回数据库数据
-            long startTime = System.currentTimeMillis();
-
-            /*分页查询,每次5000条*/
-            int pageSize = 5000;
-            int pageNumber = 1;
-            int offset;
-
-            List<WbsTreeContractLazyQueryInfoVO> queryInfoListPage;
-
-            do {
-                offset = (pageNumber - 1) * pageSize;
-                queryInfoListPage = jdbcTemplate.query(
-                        "SELECT wbs_id, status FROM u_information_query " +
-                                "WHERE type = 1 " +
-                                "AND contract_id = ? " +
-                                "AND classify = ? " +
-                                "LIMIT ? OFFSET ?",
-                        new Object[]{contractId, tableOwner, pageSize, offset},
-                        new BeanPropertyRowMapper<>(WbsTreeContractLazyQueryInfoVO.class));
-                queryInfoList.addAll(queryInfoListPage);
-                pageNumber++;
-            } while (queryInfoListPage.size() == pageSize);
-
-            long endTime = System.currentTimeMillis();
-            long executionTime = endTime - startTime;
-            logger.info("合同段 " + contractId + " 查询所有资料信息 执行时间:" + executionTime + " ms");
-
-            if (queryInfoList.size() > 0) {
-                JSONArray array = JSONArray.parseArray(JSON.toJSONString(queryInfoList));
-
-                //存储到Redis中
-                redisTemplate.opsForValue().set("blade-manager::contract:wbstree:byInformationQuery:" + cacheKey, JSON.toJSON(array).toString());
-
-                //更新本地缓存
-                localCacheQueryInfos.put(cacheKey, queryInfoList);
-            }
-        }
-
-        return queryInfoList;
-    }
-
     @Override
     public List<WbsTreeContractLazyVO> imageLazyQueryContractWbsTree(String id, String contractId, String
             contractIdRelation, String classId) {
@@ -1237,7 +793,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 ));
                         List<Long> pKeyIdList = new ArrayList<>(queryFileMaps.keySet());
 
-                        //填报过的所有最底层节点,处理数量
                         List<WbsTreeContractLazyVO> lowestNodesTB = distinctLowestNodesAll.stream().filter(f -> pKeyIdList.contains(f.getPKeyId())).collect(Collectors.toList());
                         List<WbsTreeContractLazyVO> lowestNodesTBNew = BeanUtil.copyProperties(lowestNodesTB, WbsTreeContractLazyVO.class);
                         for (WbsTreeContractLazyVO vo : lowestNodesTB) {
@@ -1561,42 +1116,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
      * @param lowestNodeParentIds 最底层节点ParentIds
      * @param nodesAll            所有节点
      */
-    /*public void recursiveGetParentNodes(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
-        if (lowestNodeParentIds.isEmpty()) {
-            return;
-        }
-
-        //父级Id与出现的次数Map
-        Map<Long, Long> parentIdGroup = lowestNodeParentIds.parallelStream()
-                .collect(Collectors.groupingByConcurrent(Function.identity(), Collectors.counting()));
-
-        //批量查询单次节点
-        List<WbsTreeContractLazyVO> parentNodes = parentIdGroup.entrySet().parallelStream()
-                .filter(entry -> entry.getValue() == 1L)
-                .flatMap(entry -> nodesAll.stream()
-                        .filter(f -> entry.getKey().equals(f.getId())))
-                .collect(Collectors.toList());
-
-        //批量查询多次节点
-        List<WbsTreeContractLazyVO> multipleParentNodes = parentIdGroup.entrySet().parallelStream()
-                .filter(entry -> entry.getValue() > 1L)
-                .flatMap(entry -> nodesAll.stream()
-                        .filter(f -> entry.getKey().equals(f.getId()))
-                        .limit(1)
-                        .flatMap(node -> Collections.nCopies(entry.getValue().intValue(), node).stream()))
-                .collect(Collectors.toList());
-
-        //结果集
-        List<Long> collect = Stream.concat(parentNodes.stream(), multipleParentNodes.stream())
-                .map(WbsTreeContractLazyVO::getParentId)
-                .collect(Collectors.toList());
-
-        if (!collect.isEmpty()) {
-            result.addAll(parentNodes);
-            result.addAll(multipleParentNodes);
-            this.recursiveGetParentNodes(result, collect, nodesAll);
-        }
-    }*/
     public void recursiveGetParentNodes(List<WbsTreeContractLazyVO> result, List<Long> lowestNodeParentIds, List<WbsTreeContractLazyVO> nodesAll) {
         if (lowestNodeParentIds.isEmpty()) {
             return;
@@ -2768,30 +2287,4 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return list;
     }
 
-    /*删除合同段本地缓存*/
-    public void deleteContractLocalCache(String contractId) {
-        /*删除节点缓存*/
-        localCacheNodes.remove(contractId);
-
-        /*删除资料缓存*/
-        Iterator<Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>>> iterator_1 = localCacheQueryInfos.entrySet().iterator();
-        while (iterator_1.hasNext()) {
-            Map.Entry<String, List<WbsTreeContractLazyQueryInfoVO>> entry = iterator_1.next();
-            String cacheKey = entry.getKey();
-            if (cacheKey.startsWith(contractId + "_")) {
-                iterator_1.remove();
-            }
-        }
-
-        /*删除节点计算统计缓存*/
-        Iterator<Map.Entry<String, List<WbsTreeContractLazyVO>>> iterator_2 = localCacheParentCountNodes.entrySet().iterator();
-        while (iterator_2.hasNext()) {
-            Map.Entry<String, List<WbsTreeContractLazyVO>> entry = iterator_2.next();
-            String cacheKey = entry.getKey();
-            if (cacheKey.startsWith(contractId + "_")) {
-                iterator_2.remove();
-            }
-        }
-    }
-
 }

+ 0 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -27,7 +27,6 @@ import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.FormulaBean;
-import org.springblade.manager.dto.ParamElements;
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;
@@ -41,8 +40,6 @@ import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.SqlParameterValue;
-import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;

+ 13 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -855,6 +855,14 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
     @Override
     public R<Object> submitWbsTreeInProject(WbsTreeContractDTO pawDTO) {
+        /*加锁*/
+        String redisValue = bladeRedis.get("submit-wbs-project:" + pawDTO.getProjectId());
+        if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
+            return R.fail(400, "请勿重复提交,请60秒后再尝试");
+        }
+        bladeRedis.set("submit-wbs-project:" + pawDTO.getProjectId(), "1");
+        bladeRedis.expire("submit-wbs-project:" + pawDTO.getProjectId(), 60);
+
         try {
             if (StringUtils.isEmpty(pawDTO.getWbsId())) {
                 return R.fail(400, "未获取到wbsId,请选择一个正确的wbs模板!");
@@ -881,7 +889,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             List<String> saveIds = idList1.stream().filter(f -> !idList2.contains(f)).collect(Collectors.toList());
             List<String> delIds = idList2.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
 
-            //TODO -------同步新增独立表单--------
+            // ================= 同步新增独立表单 =================
             if (saveIds.size() == 0 && delIds.size() == 0) {
                 if (pawDTO.getReferenceType().equals("private")) {
                     //新增独立表单
@@ -889,7 +897,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                 }
 
             } else {
-                //TODO ------------删除------------
+                // ================= 删除 =================
                 if (delIds.size() > 0) {
                     if (pawDTO.getReferenceType().equals("public")) {
                         List<Long> ids1 = delIds.stream().map(Long::parseLong).collect(Collectors.toList());
@@ -967,15 +975,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
                 }
 
-                //TODO ------------新增------------
+                // ================= 新增 =================
                 if (saveIds.size() > 0) {
-                    if (saveIds.size() >= 1000) {
-                        String redisValue = bladeRedis.get("submit-wbs-project:" + pawDTO.getProjectId());
-                        if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
-                            return R.fail(400, "请勿重复提交,请60秒后再尝试");
-                        }
-                    }
-
                     //构造入参集合
                     List<WbsTreePrivate> insertData1 = new ArrayList<>();
                     List<WbsTreePrivate> insertData2 = new ArrayList<>();
@@ -1085,6 +1086,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         if (pawDTO.getWbsType() == 5) { //征拆
                             projectInfoMapper.updateTemplateInfoLar(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                         }
+
                     } else if (pawDTO.getReferenceType().equals("private")) {
                         List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
                         for (List<WbsTreePrivate> addList : partition1) {
@@ -1104,17 +1106,13 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         if (pawDTO.getWbsType() == 2) {
                             projectInfoMapper.updateTemplateInfoTrial(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
-                        if (pawDTO.getWbsType() == 3) { //计量
+                        if (pawDTO.getWbsType() == 3) {
                             projectInfoMapper.updateTemplateInfoMeter(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
                         if (pawDTO.getWbsType() == 5) {
                             projectInfoMapper.updateTemplateInfoLar(pawDTO.getProjectId(), pawDTO.getWbsId(), "private");
                         }
                     }
-                    if (saveIds.size() >= 1000) {
-                        bladeRedis.set("submit-wbs-project:" + pawDTO.getProjectId(), "1");
-                        bladeRedis.expire("submit-wbs-project:" + pawDTO.getProjectId(), 60);
-                    }
                 }
             }
             return R.success("操作成功");

+ 14 - 45
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/test.java

@@ -1,55 +1,24 @@
 package org.springblade.manager.utils;
 
-
-
-
-
-import com.spire.xls.CellRange;
-import com.spire.xls.Workbook;
-import com.spire.xls.Worksheet;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
-import org.springblade.core.tool.utils.IoUtil;
-import org.springblade.core.tool.utils.ResourceUtil;
+import cn.hutool.http.useragent.UserAgentUtil;
+import cn.hutool.jwt.JWT;
+import cn.hutool.jwt.JWTUtil;
+import io.jsonwebtoken.Claims;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.Charsets;
+import org.springblade.core.tool.utils.StringPool;
 
 import java.io.*;
+import java.util.Base64;
 
 public class test {
+    public static void main11(String[] args) throws IOException {
+     String token ="bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiJwZW5nY3QiLCJyZWFsX25hbWUiOiJQQ1QiLCJhdmF0YXIiOiJodHRwczovL2JsYWRleC1jaG9uZ3FpbmctaW5mby5vc3MtY24taGFuZ3pob3UuYWxpeXVuY3MuY29tLy91cGxvYWQvMjAyMjA2MTYvOGVkMzdhMTU2ZjJiMTc3ZDY5MTgxYzg3Njg5MjczOWYuanBnIiwiYXV0aG9yaXRpZXMiOlsiYWRtaW5pc3RyYXRvciJdLCJjbGllbnRfaWQiOiJjbGllbnQiLCJyb2xlX25hbWUiOiJhZG1pbmlzdHJhdG9yIiwibGljZW5zZSI6InBvd2VyZWQgYnkgYmxhZGV4IiwicG9zdF9pZCI6IjE1MzcyNjAzOTA3NzI1OTI2NDEiLCJ1c2VyX2lkIjoiMTUzNjk4NTA5NDU3MTgyMzEwNSIsInJvbGVfaWQiOiIxMTIzNTk4ODE2NzM4Njc1MjAxIiwicGhvbmUiOiIxODU4MDE0NzU1MCIsInNjb3BlIjpbImFsbCJdLCJuaWNrX25hbWUiOiJQQ1QiLCJvYXV0aF9pZCI6IiIsImRldGFpbCI6eyJ0eXBlIjoid2ViIn0sImV4cCI6MTcwMTMzNTM1OCwiZGVwdF9pZCI6IjE1MzY5ODMwNTYzNjIzODEzMTMiLCJqdGkiOiIzOGE2MDA4Yi01MzQ2LTQ5YjktOGU0OC1hOTNmYjNlNjYyMGYiLCJhY2NvdW50IjoicGVuZ2N0In0._IvCSHGZY8P74XcPWnRw7D46zWORsPCRKkB0HQgxjU0";
 
-    public static void main1(String[] args) throws IOException {
-     //   String excel="/Users/hongchuangyanfa/Downloads/JL1036隧道锚喷支护施工记录表.xlsx";
-        String excel="/Users/hongchuangyanfa/Downloads/养护表格/ZJY6.11.2植筋检验表.xlsx";
-        String poiPath="/Users/hongchuangyanfa/Desktop/pdf/poi.pdf";
-        String pdfPath22="/Users/hongchuangyanfa/Desktop/pdf/poi222.pdf";
-        String pdfPathhtml="/Users/hongchuangyanfa/Desktop/pdf/poi222.html";
-        Workbook workbook2 = new Workbook();
-        workbook2.loadFromFile(excel);
-        //设置转换后的PDF页面高宽适应工作表的内容大小
-        workbook2.getConverterSetting().setSheetFitToPage(true);
-        Worksheet sheet = workbook2.getWorksheets().get(0);
-
-        sheet.saveToHtml(pdfPathhtml);
-
-        File file1 = ResourceUtil.getFile(pdfPathhtml);
-        String htmlString = IoUtil.readToString(new FileInputStream(file1));
-        Document doc = Jsoup.parse(htmlString);
-        Element table = doc.select("table").first();
-        Elements trs = table.select("tr");
-        Elements cols = table.select("Col");
-
-        sheet.deleteRow(trs.size(),sheet.getRows().length - trs.size());
-        sheet.deleteColumn(cols.size(),sheet.getColumns().length - cols.size());
-
-        System.out.println(trs.size());
-        System.out.println(cols.size());
-
-        System.out.println(sheet.getRows().length);
-        System.out.println(sheet.getColumns().length);
-
-
-        ////16384*/
+        byte[] decoded = Base64.getDecoder().decode(token);
+        String token2 = new String(decoded, Charsets.UTF_8_NAME);
+        int index = token2.indexOf(StringPool.COLON);
+        System.out.println("ccd");
     }
 
 }

+ 111 - 36
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java

@@ -16,9 +16,7 @@
  */
 package org.springblade.meter.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
@@ -27,6 +25,9 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.meter.dto.ChangeTokenAddFormDTO;
+import org.springblade.meter.dto.ChangeTokenFormDTO;
+import org.springblade.meter.vo.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -34,6 +35,8 @@ import org.springblade.meter.entity.ChangeTokenForm;
 import org.springblade.meter.service.IChangeTokenFormService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.List;
+
 /**
  * 变更令表 控制器
  *
@@ -43,74 +46,146 @@ import org.springblade.core.boot.ctrl.BladeController;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/changeTokenForm")
-@Api(value = "变更令表", tags = "变更令表接口")
+@Api(value = "变更管理", tags = "变更管理接口")
 public class ChangeTokenFormController extends BladeController {
 
 	private final IChangeTokenFormService changeTokenFormService;
 
 	/**
-	 * 详情
+	 * 一键生成零号变更
 	 */
-	@GetMapping("/detail")
+	@GetMapping("/buildZeroChange")
 	@ApiOperationSupport(order = 1)
-	@ApiOperation(value = "详情", notes = "传入changeTokenForm")
-	public R<ChangeTokenForm> detail(ChangeTokenForm changeTokenForm) {
-		ChangeTokenForm detail = changeTokenFormService.getOne(Condition.getQueryWrapper(changeTokenForm));
-		return R.data(detail);
+	@ApiOperation(value = "一键生成零号变更", notes = "传入合同段id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "contractId", value = "合同id", required = true)
+	})
+	public R buildZeroChange(Long contractId) {
+		changeTokenFormService.buildZeroChange(contractId);
+		return R.success("生成成功");
 	}
 
 	/**
-	 * 分页 变更令表
+	 * 获取零号变更
 	 */
-	@GetMapping("/list")
+	@GetMapping("/getZeroChange")
 	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页", notes = "传入changeTokenForm")
-	public R<IPage<ChangeTokenForm>> list(ChangeTokenForm changeTokenForm, Query query) {
-		IPage<ChangeTokenForm> pages = changeTokenFormService.page(Condition.getPage(query), Condition.getQueryWrapper(changeTokenForm));
-		return R.data(pages);
+	@ApiOperation(value = "获取节点下的零号变更", notes = "传入合同段id,节点id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true)
+	})
+	public R<List<ZeroChangeVO>> getZeroChange(Long contractId, Long nodeId) {
+		List<ZeroChangeVO> vos = changeTokenFormService.getZeroChange(contractId,nodeId);
+		return R.data(vos);
 	}
 
-
+	/**
+	 * 新增-获取变更申请部位
+	 */
+	@GetMapping("/getChangeNode")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "新增-获取变更申请部位", notes = "传入合同id和选中的节点id,返回变更申请部位集合")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+			@ApiImplicitParam(name = "ids", value = "选中的节点id,逗号拼接", required = true),
+			@ApiImplicitParam(name = "changeIds", value = "已经存在的节点id,逗号拼接", required = true)
+	})
+	public R<List<ChangeNodeVO>> getChangeNode(Long contractId,String ids,String changeIds) {
+		List<ChangeNodeVO> vos = changeTokenFormService.getChangeNode(contractId,ids,changeIds);
+		return R.data(vos);
+	}
 
 	/**
-	 * 新增 变更令表
+	 * 新增-添加清单
 	 */
-	@PostMapping("/save")
+	@GetMapping("/addForm")
 	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增", notes = "传入changeTokenForm")
-	public R save(@Valid @RequestBody ChangeTokenForm changeTokenForm) {
-		return R.status(changeTokenFormService.save(changeTokenForm));
+	@ApiOperation(value = "新增添加清单", notes = "传入合同id,显示类型1显示所有2显示已分解,节点id,搜索值,返回清单集合")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+			@ApiImplicitParam(name = "showType", value = "显示类型1显示所有2显示已分解", required = true),
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+			@ApiImplicitParam(name = "searchValue", value = "搜索值", required = true),
+			@ApiImplicitParam(name = "ids", value = "已经存在的变更申请清单id,逗号拼接", required = true)
+	})
+	public R<List<ChangeFormVO>> addForm(ChangeTokenAddFormDTO dto) {
+		List<ChangeFormVO> vos = changeTokenFormService.addForm(dto);
+		return R.data(vos);
 	}
 
 	/**
-	 * 修改 变更令表
+	 * 新增-确认选择清单
 	 */
-	@PostMapping("/update")
+	@GetMapping("/selectForm")
 	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入changeTokenForm")
-	public R update(@Valid @RequestBody ChangeTokenForm changeTokenForm) {
-		return R.status(changeTokenFormService.updateById(changeTokenForm));
+	@ApiOperation(value = "新增确认选择清单", notes = "传入选中的清单id,返回变更申请清单集合")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
+			@ApiImplicitParam(name = "ids", value = "选中的清单id,逗号拼接", required = true)
+	})
+	public R<List<ChangeFormVO2>> selectForm(Long contractId,Long nodeId,String ids) {
+		List<ChangeFormVO2> vos = changeTokenFormService.selectForm(contractId,nodeId,ids);
+		return R.data(vos);
 	}
 
 	/**
-	 * 新增或修改 变更令表
+	 * 新增 变更令
 	 */
-	@PostMapping("/submit")
+	@PostMapping("/add")
 	@ApiOperationSupport(order = 6)
-	@ApiOperation(value = "新增或修改", notes = "传入changeTokenForm")
-	public R submit(@Valid @RequestBody ChangeTokenForm changeTokenForm) {
-		return R.status(changeTokenFormService.saveOrUpdate(changeTokenForm));
+	@ApiOperation(value = "新增变更令", notes = "传入changeTokenFormDTO,包含基础信息,部位集合,清单集合,附件集合")
+	public R add(@Valid @RequestBody ChangeTokenFormDTO dto) {
+		changeTokenFormService.add(dto);
+		return R.success("新增成功");
+	}
+
+	/**
+	 * 修改 变更令表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "修改", notes = "传入changeTokenFormDTO,包含基础信息,部位集合,清单集合,附件集合")
+	public R update(@Valid @RequestBody ChangeTokenFormDTO dto) {
+		changeTokenFormService.update2(dto);
+		return R.success("修改成功");
+	}
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "详情", notes = "传入变更令id")
+	public R<ChangeTokenFormVO> detail(Long id) {
+		ChangeTokenFormVO detail = changeTokenFormService.detail(id);
+		return R.data(detail);
 	}
 
+	/**
+	 * 分页 变更令表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "分页", notes = "传入合同id和分页信息")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
+	})
+	public R<IPage<ChangeTokenPageVO>> page(Long contractId, Query query) {
+		IPage<ChangeTokenPageVO> pages = changeTokenFormService.page2(contractId,query);
+		return R.data(pages);
+	}
 	
 	/**
 	 * 删除 变更令表
 	 */
-	@PostMapping("/remove")
-	@ApiOperationSupport(order = 7)
+	@PostMapping("/delete")
+	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "逻辑删除", notes = "传入ids")
-	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(changeTokenFormService.deleteLogic(Func.toLongList(ids)));
+	public R delete(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		changeTokenFormService.delete(ids);
+		return R.success("删除成功");
 	}
 
 	

Vissa filer visades inte eftersom för många filer har ändrats