Explorar o código

Merge remote-tracking branch 'origin/master'

liuyc hai 1 ano
pai
achega
adb585ca83
Modificáronse 49 ficheiros con 922 adicións e 197 borrados
  1. 2 2
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 5 3
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java
  4. 36 30
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClientFallBack.java
  5. 9 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java
  6. 5 4
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeter.java
  7. 0 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ContractInventoryForm.java
  8. 5 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApply.java
  9. 21 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeFormVO2.java
  10. 7 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeNodeVO.java
  11. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractFromVO.java
  12. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormMeterVO.java
  13. 4 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java
  14. 50 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/NodeSortVO.java
  15. 0 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  16. 0 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java
  17. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml
  18. 14 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  19. 29 43
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  20. 1 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/EVisaApplication.java
  21. 28 23
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  22. 4 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  23. 8 3
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java
  24. 2 2
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  25. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  26. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  27. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  28. 15 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java
  29. 8 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java
  30. 28 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java
  31. 115 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  32. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterMapper.java
  33. 0 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterMapper.xml
  34. 8 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractInventoryFormMapper.xml
  35. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.java
  36. 19 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.xml
  37. 9 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.java
  38. 46 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml
  39. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormService.java
  40. 5 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenInventoryService.java
  41. 0 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenMeterService.java
  42. 4 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java
  43. 4 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/MeterTreeContractService.java
  44. 260 19
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  45. 1 10
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenMeterServiceImpl.java
  46. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractInventoryFormServiceImpl.java
  47. 28 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java
  48. 36 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java
  49. 74 13
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 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 = 8;//Runtime.getRuntime().availableProcessors();
+    public static final int cpuNum =10 ;//Runtime.getRuntime().availableProcessors();
 
     /**
      * 线程池配置
@@ -26,7 +26,7 @@ public class AsyncConfigurer {
     public ThreadPoolExecutor getAsyncExecutor() {
         return new ThreadPoolMonitor(cpuNum
                 , 20
-                , 60
+                , 30
                 , TimeUnit.SECONDS
                 , new LinkedBlockingQueue<>(2000)
                 , new ThreadPoolExecutor.DiscardOldestPolicy(), "manager-thread-pool");

+ 5 - 3
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -112,12 +112,14 @@ public class CommonUtil {
      */
     public static InputStream getOSSInputStream(String urlStr) throws Exception {
         //获取OSS文件流
-//        urlStr = replaceOssUrl(urlStr);
         URL imageUrl = new URL(urlStr);
+        HttpURLConnection conn = null;
         try {
-            HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
+            conn = (HttpURLConnection) imageUrl.openConnection();
             conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
-            return conn.getInputStream();
+            InputStream inputStream = conn.getInputStream();
+
+            return inputStream;
         } catch (Exception e) {
             return null;
         }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java

@@ -76,6 +76,9 @@ public class InformationQueryVO extends InformationQuery {
     @ApiModelProperty("任务人")
     private List<WaitingUser> waitingUserList;
 
+    @ApiModelProperty(value = "电签失败原因")
+    private String eVisaFailedInfo;
+
     public void setWaitingUserList(String waitingUserName, Integer status) {
         if (this.waitingUserList == null) {
             this.waitingUserList = new ArrayList<>();

+ 36 - 30
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClientFallBack.java

@@ -6,41 +6,47 @@ import org.springblade.evisa.vo.CertBeanVO;
 import org.springblade.evisa.vo.EVisaMakeSealVO;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 import org.springblade.evisa.vo.TaskArchiveDTO;
+import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
 
 @Component
-public class EVisaClientFallBack implements EVisaClient {
-
+public class EVisaClientFallBack implements FallbackFactory<EVisaClient> {
     private static final Logger logger = LoggerFactory.getLogger(EVisaClientFallBack.class);
 
     @Override
-    public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
-        return null;
-    }
-
-    @Override
-    public String eVisa(EVisaTaskApprovalVO task) {
-        return null;
-    }
-
-    @Override
-    public String eVisaCustom(TaskArchiveDTO eVisaObj) {
-        logger.info("-----------------远程feign调用电签自定义签章服务EVisaCustom方法失败-----------------");
-        return "500";
-    }
-
-    @Override
-    public String createSeal(EVisaMakeSealVO vo) {
-        return null;
-    }
-
-    @Override
-    public String certification(String pdfUrl, String fileName, String contractId) {
-        return null;
-    }
-
-    @Override
-    public CertBeanVO onlineCheckSeal(String pdfUrl) {
-        return null;
+    public EVisaClient create(Throwable throwable) {
+        return new EVisaClient() {
+            @Override
+            public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
+                return null;
+            }
+
+            @Override
+            public String eVisa(EVisaTaskApprovalVO task) {
+                System.out.println("throwable.getMessage() = " + throwable.getMessage());
+                logger.info("throwable.getMessage() = " +throwable.getMessage());
+                return null;
+            }
+
+            @Override
+            public String eVisaCustom(TaskArchiveDTO eVisaObj) {
+                return null;
+            }
+
+            @Override
+            public String createSeal(EVisaMakeSealVO vo) {
+                return null;
+            }
+
+            @Override
+            public String certification(String pdfUrl, String fileName, String contractId) {
+                return null;
+            }
+
+            @Override
+            public CertBeanVO onlineCheckSeal(String pdfUrl) {
+                return null;
+            }
+        };
     }
 }

+ 9 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java

@@ -112,5 +112,14 @@ public class ChangeTokenInventory extends BaseEntity {
     @ApiModelProperty(value = "变更后金额")
     private BigDecimal changeAfterMoney;
 
+    /**
+     * 是否汇总清单,0分解清单1汇总清单
+     */
+    @ApiModelProperty(value = "是否汇总清单,0分解清单1汇总清单")
+    private Integer isCollectForm;
+
+    @ApiModelProperty(value = "需要修改的中间计量申请ids")
+    private String applyIds;
+
 
 }

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

@@ -65,12 +65,13 @@ public class ChangeTokenMeter extends BaseEntity {
 
     @ApiModelProperty(value = "节点路径")
     private String nodeUrl;
-    /**
-     * 合同图号
-     */
-    @ApiModelProperty(value = "合同图号")
+
+    @ApiModelProperty(value = "变更后合同图号")
     private String contractPicture;
 
+    @ApiModelProperty(value = "变更前-变更合同图号")
+    private String beforeContractPicture;
+
     @ApiModelProperty(value = "变更后金额")
     private BigDecimal changeMoney;
 

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

@@ -198,6 +198,4 @@ public class ContractInventoryForm extends BaseEntity {
     @ExcelIgnore
     private Integer buildChangeTotal;
 
-
-
 }

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

@@ -106,10 +106,13 @@ public class MiddleMeterApply extends BaseEntity {
     @ApiModelProperty(value = "变更令编号")
     private String changeTokenNumber;
     /**
-     * 图片地址
+     * 草图文件
      */
-    @ApiModelProperty(value = "图片地址")
+    @ApiModelProperty(value = "草图文件地址")
     private String pictureUrl;
+
+    @ApiModelProperty(value = "草图文件名称")
+    private String pictureName;
     /**
      * 计算式
      */

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

@@ -14,12 +14,24 @@ import java.math.BigDecimal;
 @Data
 public class ChangeFormVO2 {
 
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "变更令id")
+    private Long changeTokenId;
+
     @ApiModelProperty(value = "合同计量单元id(部位)")
     private Long contractMeterId;
 
     @ApiModelProperty(value = "清单id")
     private Long id;
 
+    @ApiModelProperty(value = "中间表id")
+    private Long middleId;
+
     @ApiModelProperty(value = "清单编号")
     private String formNumber;
 
@@ -46,4 +58,13 @@ public class ChangeFormVO2 {
 
     @ApiModelProperty(value = "变更后金额(变更后)")
     private BigDecimal changeMoney;
+
+    @ApiModelProperty(value = "最新变更后数量")
+    private BigDecimal newestChangeTotal;
+
+    @ApiModelProperty(value = "最新变更后金额")
+    private BigDecimal newestChangeMoney;
+
+    @ApiModelProperty(value = "需要修改的中间计量申请ids")
+    private String applyIds;
 }

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

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
@@ -27,6 +28,12 @@ public class ChangeNodeVO {
     @ApiModelProperty(value = "合同图号")
     private String contractPicture;
 
+    @ApiModelProperty(value = "变更前-变更合同图号")
+    private String beforeContractPicture;
+
+    @ApiModelProperty(value = "变更前-施工图金额")
+    private BigDecimal beforeBuildMoney;
+
     @ApiModelProperty(value = "变更前-变更后金额")
     private BigDecimal beforeChangeMoney;
 

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

@@ -27,6 +27,9 @@ public class ContractFromVO {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
+    @ApiModelProperty(value = "清单id")
+    private Long contractFormId;
+
     /**
      * 清单编号
      */

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

@@ -16,10 +16,13 @@
  */
 package org.springblade.meter.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.meter.entity.InventoryFormMeter;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * 工程清单与合同计量单元	中间表视图实体类
  *
@@ -31,4 +34,7 @@ import lombok.EqualsAndHashCode;
 public class InventoryFormMeterVO extends InventoryFormMeter {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "当前部位当前清单当前计量总和")
+	private BigDecimal allMeterMoney;
+
 }

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

@@ -46,4 +46,8 @@ public class MeterInventoryVO {
     @ApiModelProperty(value = "累计计量数量")
     private BigDecimal allMeterTotal;
 
+    @ApiModelProperty(value = "其他计量期计量量")
+    private BigDecimal otherMeterTotal;
+
+
 }

+ 50 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/NodeSortVO.java

@@ -0,0 +1,50 @@
+package org.springblade.meter.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param   计量节点按最底层排序VO
+ * @Author wangwl
+ * @Date 2023/12/26 15:38
+ **/
+@Data
+public class NodeSortVO implements INode<NodeSortVO> {
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 父节点ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<NodeSortVO> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @Override
+    public List<NodeSortVO> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+}

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

@@ -13,7 +13,6 @@ import org.springblade.archive.vo.ArchiveTaskPageVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.Task;
 import org.springblade.business.entity.TaskParallel;
-import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;

+ 0 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java

@@ -41,7 +41,6 @@ import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.vo.DictBizVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.entity.UserOpinion;
 import org.springblade.business.vo.UserOpinionVO;

+ 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(4) LIMIT 40
+        SELECT DISTINCT JSON_EXTRACT(a.json_data, '$.formDataId') ,a.* from u_task_batch a GROUP BY JSON_EXTRACT(a.json_data, '$.formDataId') LIMIT 140
     </select>
 
 </mapper>

+ 14 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -23,6 +23,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.entity.ContractInfo;
@@ -545,7 +546,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
 
                 Set<String> processInstanceIds = query.stream().map(Task::getProcessInstanceId).map(id -> "'" + id + "'").collect(Collectors.toSet());
                 if (processInstanceIds.size() > 0) {
-                    List<TaskParallel> taskParallels = jdbcTemplate.query("select task_user, task_user_name, e_visa_status, status, process_instance_id, initiative from u_task_parallel where is_deleted = 0 and process_instance_id in(" + StringUtils.join(processInstanceIds, ",") + ")", new BeanPropertyRowMapper<>(TaskParallel.class));
+                    List<TaskParallel> taskParallels = jdbcTemplate.query("select task_user, task_user_name, e_visa_status, status, process_instance_id, initiative,e_visa_content from u_task_parallel where is_deleted = 0 and process_instance_id in(" + StringUtils.join(processInstanceIds, ",") + ")", new BeanPropertyRowMapper<>(TaskParallel.class));
                     taskParallelMaps = taskParallels.stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
                 }
             }
@@ -817,6 +818,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
      * 统合方法
      */
     private void integrationMethod(InformationQueryVO vo, List<TaskParallel> linkList) {
+
         for (TaskParallel link : linkList) {
             vo.setWaitingUserList
                     (link.getTaskUserName(),
@@ -824,6 +826,17 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                                     (new Integer(2).equals(link.getStatus()) ? 2 :
                                             (new Integer(3).equals(link.getStatus()) && new Integer(1).equals(link.getInitiative())) ? 3
                                                     : 1));
+            String eVisaFailedInfo = "";
+            if (link.getStatus() == 2 && ObjectUtil.isNotEmpty(link.getEVisaStatus()) && link.getEVisaStatus() == 2) {
+                if (link.getEVisaContent().contains("请等待") && ObjectUtil.isEmpty(eVisaFailedInfo)) {
+                    eVisaFailedInfo = link.getEVisaContent();
+                }
+            } else if (ObjectUtil.isNotEmpty(link.getEVisaStatus()) && link.getEVisaStatus() == 99) {
+                if (ObjectUtil.isEmpty(eVisaFailedInfo)) {
+                    eVisaFailedInfo = link.getEVisaContent();
+                }
+            }
+            vo.setEVisaFailedInfo(eVisaFailedInfo);
         }
     }
 

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

@@ -20,6 +20,7 @@ import org.springblade.business.vo.*;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.FileUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.cloud.feign.EnableBladeFeign;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
@@ -51,6 +52,7 @@ import org.springblade.system.user.cache.UserCache;
 import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -79,6 +81,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 @AllArgsConstructor
+@EnableFeignClients
 public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implements ITaskService {
 
     private static final Logger logger = LoggerFactory.getLogger(TaskServiceImpl.class);
@@ -388,7 +391,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      */
     @Override
     public Map<String, String> getTaskCount(String projectId, String contractId, String userId) {
-        Map<String, String> map = new HashMap<>();
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
             List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
                     .select(Task::getProcessInstanceId)
@@ -423,7 +425,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
             long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
             long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
-
+            Map<String, String> map = new HashMap<>();
             map.put("allCount", String.valueOf(taskAllCount + messageWarnings.size()));//任务管理
             map.put("taskCount", String.valueOf(taskAllCount));//任务查看
             map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
@@ -433,15 +435,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             map.put("messageCount_4", String.valueOf(messageCount4));//工单反馈
             map.put("messageCount_5", String.valueOf(messageCount5));//系统消息
             map.put("userId", userId);
-        }
-        return map;
-        /*else {
+            return map;
+        } else {
             Map<String, String> map = new HashMap<>();
             List<BusinessUserOpinionVO> businessUserOpinionVOS = userOpinionService.getBaseMapper().queryManageUserOpinionList(userId).stream().filter(f -> f.getIsCurrent().equals(false)).collect(Collectors.toList());
             map.put("myMessageCount", String.valueOf(businessUserOpinionVOS.size()));//后管消息区-我的消息-未处理
             map.put("userId", userId);
             return map;
-        }*/
+        }
     }
 
     /**
@@ -454,7 +455,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      */
     @Override
     public Map<String, String> getTaskCountArchive(String projectId, String contractId, String userId) {
-        Map<String, String> map = new HashMap<>();
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
             List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
                     .select(Task::getProcessInstanceId)
@@ -489,7 +489,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
             long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
             long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
-
+            Map<String, String> map = new HashMap<>();
             map.put("allCount", String.valueOf(taskAllCount + messageWarnings.size()));//任务管理
             map.put("taskCount", String.valueOf(taskAllCount));//任务查看
             map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
@@ -499,8 +499,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             map.put("messageCount_4", String.valueOf(messageCount4));//工单反馈
             map.put("messageCount_5", String.valueOf(messageCount5));//系统消息
             map.put("userId", userId);
+            return map;
+        } else {
+            Map<String, String> map = new HashMap<>();
+            List<BusinessUserOpinionVO> businessUserOpinionVOS = userOpinionService.getBaseMapper().queryManageUserOpinionList(userId).stream().filter(f -> f.getIsCurrent().equals(false)).collect(Collectors.toList());
+            map.put("myMessageCount", String.valueOf(businessUserOpinionVOS.size()));//后管消息区-我的消息-未处理
+            map.put("userId", userId);
+            return map;
         }
-        return map;
     }
 
     /**
@@ -573,12 +579,12 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     }
 
 
-    // @Scheduled(cron = "0 */1 * * * ?")
+    @Scheduled(cron = "0 */1 * * * ?")
     public void SignInfo() {
         //执行代码
         logger.debug("扫描开始");
         List<TaskBatch> maps = taskBatchService.queryDataInfo();
-        if (maps != null && maps.size() >= 1) {
+        if (maps != null && maps.size() >= 1 && executor.getQueue().size()<=200) {
             for (TaskBatch dataInfo : maps) {
                 String jsonData = dataInfo.getJsonData();
                 TaskApprovalVO taskApprovalVO = JSON.parseObject(jsonData, TaskApprovalVO.class);
@@ -586,36 +592,18 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                 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;
-                    }
-                    // taskBatchService.update(Wrappers.<TaskBatch>update().set("is_deleted", 2).eq("id", taskBatchId));
-                    RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 70, TimeUnit.SECONDS);
+                System.out.println("---------"+aBoolean);
+                if (!aBoolean) {
+                    RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1");
                     CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                         try {
-
                             /*===============执行批量任务===============*/
                             this.checkIsExsitTaskBatch(taskApprovalVO, taskBatchId, userId, nickName);
-
                         } catch (FileNotFoundException e) {
                             e.printStackTrace();
                         }
                     }, executor);
-
                 }
             }
         }
@@ -639,7 +627,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         /*===============试验自检任务相关===============*/
         this.trialSelfTaskRelated(taskApprovalVO, pdfUrlEVisa, batchId);
 
-        RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
     }
 
     // 电签主流程业务
@@ -659,29 +646,30 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             return "无当前分支信息";
         }
         //获取主流程
-        Task masterTask = this.getOne(Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0).eq(Task::getProcessInstanceId, currentLink.getProcessInstanceId()));
+        Task masterTask = getOne(Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0).eq(Task::getProcessInstanceId, currentLink.getProcessInstanceId()));
 
         if ("OK".equals(taskApprovalVO.getFlag())) {
             //同意,执行签章
             //todo ============================ 执行电签区域 ============================
             //电签状态
-            String eVisaStatus = this.eVisaClient.eVisa(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class));
-            System.out.println("+++++" + eVisaStatus);
+            System.out.println("++buess-开始+++" + taskApprovalVO.getFormDataId());
+            String eVisaStatus = eVisaClient.eVisa(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class));
+            System.out.println("+++evsin-返回++"+ taskApprovalVO.getFormDataId()+"--"+ eVisaStatus);
             //todo ============================ 执行电签区域 ============================
 
             //电签状态分为success/notPfxOrFile/error,当状态为error时就需要重新提交请求
             if (eVisaStatus == null || StringUtils.isEmpty(eVisaStatus)) {
-                this.taskBatchService.update(Wrappers.<TaskBatch>lambdaUpdate()
+                taskBatchService.update(Wrappers.<TaskBatch>lambdaUpdate()
                         .set(TaskBatch::getIsDeleted, 4)
                         .eq(TaskBatch::getId, taskApprovalVO.getId())
                 );
-
+                RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
             } else if ("success".equals(eVisaStatus) || eVisaStatus.contains("success")) {
                 //审批通过会返回签章成功的文件,需要设置替换
                 //完成/审批当前分支流程
                 //    this.newFlowClient.completeApprovalTask(taskId, parallelProcessInstanceId, comment).getData();
                 //修改分支状态,改为已完成
-                this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
+                taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
                         .set(TaskParallel::getStatus, 2)
                         .set(TaskParallel::getEVisaStatus, 1)
                         .set(TaskParallel::getEVisaContent, "电签成功")
@@ -816,9 +804,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             this.abolishMessage(masterTask, currentLink, comment, taskApprovalVO.getNickName());
         }
 
-        /*//return前先删除合同段树redis缓存
-        informationQueryService.delAsyncWbsTree(masterTask.getContractId());*/
-
         return "";
     }
 
@@ -931,13 +916,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(pdfUrlEVisa, taskApprovalVO);
             //executor删除掉对应批次
             this.taskBatchService.deletedById(batchId);
+            RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
         }
 
         if (!"OK".equals(taskApprovalVO.getFlag())) {
             //已废除
             this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatusFC(taskApprovalVO);
             //executor删除掉对应批次
-            this.taskBatchService.deletedById(batchId);
+            RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
         }
     }
 

+ 1 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/EVisaApplication.java

@@ -13,6 +13,7 @@ import org.springframework.cloud.client.SpringCloudApplication;
 public class EVisaApplication {
 
     public static void main(String[] args) {
+
         BladeApplication.run(EVisaConstant.APPLICATION_WEATHER_NAME, EVisaApplication.class, args);
     }
 

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

@@ -20,13 +20,13 @@ import java.io.BufferedReader;
 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.*;
 import java.util.concurrent.*;
 
 import java.lang.management.ManagementFactory;
 import java.lang.management.OperatingSystemMXBean;
+import java.util.concurrent.locks.ReentrantLock;
+
 /**
  * 清表基础数据表 控制器
  *
@@ -49,10 +49,10 @@ public class EVisaController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-
     // 电签主类
-    @Scheduled(cron = "0 */1 * * * ?")
+  //  @Scheduled(cron = "0 */1 * * * ?")
     public void SignInfo() {
+
         //执行代码
         log.info("扫描开始");
         String sql = "SELECT * from u_task_batch where is_deleted =0 LIMIT 100";
@@ -64,29 +64,34 @@ public class EVisaController {
                 String taskBatchId = dataInfo.get("id").toString();
                 Long userId = Long.valueOf(dataInfo.get("create_user")+"");
                 String nickName = dataInfo.get("nick_name")+"";
-                String formDataId = taskApprovalVO.getFormDataId();
+                Boolean aBoolean = RedisTemplate.hasKey("sign-" + taskApprovalVO.getFormDataId());
+                System.out.println(aBoolean);
+
+                RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 600, TimeUnit.SECONDS);
 
-                CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
-                        try {
-                           this.checkIsExsitTaskBatch(taskApprovalVO, taskBatchId, userId, nickName);
-                        } catch (FileNotFoundException e) {
-                            e.printStackTrace();
+               /* String formDataId = taskApprovalVO.getFormDataId().substring(0,5);
+                synchronized (formDataId){
+                    executor.execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            checkIsExsitTaskBatch(taskApprovalVO,formDataId,userId,nickName);
                         }
-                }, 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();
+    public void checkIsExsitTaskBatch(TaskApprovalVO taskApprovalVO, String batchId, Long userId, String nickName){
+           synchronized (batchId){
+               try {
+                   System.out.println("开始执行-------");
+                   Thread.sleep(8000);
+                   System.out.println(batchId);
+                   System.out.println("结束执行-------");
+               } catch (InterruptedException e) {
+                   throw new RuntimeException(e);
+               }
+           }
     }
-
 }

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

@@ -511,6 +511,7 @@ public class EVisaServiceImpl implements EVisaService {
                             MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
                             //重新上传
                             BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
+
                             if (bladeFile != null) {
                                 resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
                             } else {
@@ -532,6 +533,7 @@ public class EVisaServiceImpl implements EVisaService {
         //释放锁
         //  DistributedRedisLock.release(task.getUserId().toString());
 
+        System.out.println("bladeFile---eVisa"+task.getFormDataId()+"--"+resultMessage);
         return resultMessage;
     }
 
@@ -825,7 +827,9 @@ public class EVisaServiceImpl implements EVisaService {
 
             compoundSealPdfListDetachedRequest.setBody(requestBody);
             //****************************** 请求服务端进行签章 *********************************************
+            System.out.println("-----------------------"+new Date().toString()+"开始"+transactionNo +"----------------------------");
             ResponseDto responseDto = paperlessClient.execute(compoundSealPdfListDetachedRequest);
+            System.out.println("-----------------------"+new Date().toString()+"结束"+transactionNo +"----------------------------");
 
             //******************************解析响应结果 *********************************************
             CompoundSealPdfListDetachedResponse compoundSealPdfListDetachedResponse = (CompoundSealPdfListDetachedResponse) responseDto;

+ 8 - 3
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java

@@ -11,6 +11,7 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.utils.Func;
 
 import java.io.InputStream;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -65,7 +66,8 @@ public class PDFUtils {
         PdfDocument pdf = new PdfDocument();
         List<String> eVisaConfigList = new ArrayList<>();
         try {
-            InputStream ossInputStream = CommonUtil.getOSSInputStream(pdfUrl);
+            InputStream ossInputStream = CommonUtil.getOSSInputStream(pdfUrl);;
+          //  InputStream ossInputStream = new URL(pdfUrl).openStream();
             //加载PDF文档
             pdf.loadFromStream(ossInputStream);
 
@@ -81,12 +83,15 @@ public class PDFUtils {
                     }
                 }
             }
+
+
+            List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());
             ossInputStream.close();
+            return unique;
         }catch (Exception e){
             e.printStackTrace();
         }
-        List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());
-        return unique;
+        return null;
     }
 
     public static void main123(String[] args) {

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

@@ -2706,11 +2706,11 @@ public class CustomFunction {
             if (StringUtils.isEmpty(scale)) {
                 scale = 0;
             }
-            String delimiter = handleNull(matcherFindGroup("[^0-9./E\\-]", design.toString(), 0, false));
+            String delimiter = handleNull(matcherFindGroup("[^0-9./E]", design.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter)) {
                 delimiter = CONCAT;
             }
-            String delimiter2 = handleNull(matcherFindGroup("[^0-9.E\\-]", data.toString(), 0, false));
+            String delimiter2 = handleNull(matcherFindGroup("[^0-9.E]", data.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter2)) {
                 delimiter2 = CONCAT;
             }

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

@@ -314,7 +314,7 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "nodeId", value = "节点id", required = true)
     })
     public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) {
-        String file_path = FileUtils.getSysLocalFileUrl();
+        String file_path = "/Users/hongchuangyanfa/Desktop/";//FileUtils.getSysLocalFileUrl();
         ExcelTab detail = excelTabService.getById(nodeId);
 
         String filecode = SnowFlakeUtil.getId() + "";

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -393,12 +393,12 @@
             matc1.node_name as name,
             (SELECT COUNT(*)
              FROM u_archives_auto uaa1
-             WHERE  uaa1.is_destroy =0 and uaa1.is_deleted =0 and (uaa1.node_id in
+             WHERE  uaa1.is_destroy =0 and uaa1.is_deleted =0 and uaa1.is_archive = 1 and (uaa1.node_id in
                  (select id from m_archive_tree_contract matc2 WHERE matc2.project_id = #{projectId} and matc2.ancestors like CONCAT('%',matc1.id,'%')) or uaa1.node_id = matc1.id)
             ) as 'auto',
             (SELECT COUNT(*)
              FROM u_archives_auto uaa1
-             WHERE  uaa1.is_destroy =1 and uaa1.is_deleted =1 and (uaa1.node_id in
+             WHERE  uaa1.is_destroy =1 and uaa1.is_deleted =1 and uaa1.is_archive = 1 and (uaa1.node_id in
                 (select id from m_archive_tree_contract matc2 WHERE matc2.project_id = #{projectId} and matc2.ancestors like CONCAT('%',matc1.id,'%')) or uaa1.node_id = matc1.id)
             ) as 'deleted',
             if((SELECT COUNT(*) from m_archive_tree_contract matc WHERE parent_id = matc1.id)=0,false,true) as hasChildren

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -2460,6 +2460,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return R.fail("无数据");
     }
 
+
     String[] tabArr=new String[]{"计量报表","动员预付款报表","材料预付款报表"};
     @Override
     public void execute3(Long contractId,Long periodId ,Integer type) {

+ 15 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/ChangeTokenFormController.java

@@ -192,7 +192,7 @@ public class ChangeTokenFormController extends BladeController {
 	 * 下达变更 变更令表
 	 */
 	@GetMapping("/executeChange")
-	@ApiOperationSupport(order = 9)
+	@ApiOperationSupport(order = 11)
 	@ApiOperation(value = "下达变更", notes = "传入当前变更令id")
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "id", value = "当前变更令id", required = true),
@@ -202,5 +202,19 @@ public class ChangeTokenFormController extends BladeController {
 		return R.success("下达成功");
 	}
 
+	/**
+	 * 撤销变更 变更令表
+	 */
+	@GetMapping("/annulChange")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "撤销变更", notes = "传入当前变更令id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "id", value = "当前变更令id", required = true),
+	})
+	public R annulChange(Long id) {
+		changeTokenFormService.annulChange(id);
+		return R.success("撤销成功");
+	}
+
 	
 }

+ 8 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java

@@ -154,10 +154,11 @@ public class MiddleMeterApplyController extends BladeController {
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
 			@ApiImplicitParam(name = "contractUnitId", value = "节点id", required = true),
-			@ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true)
+			@ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true),
+			@ApiImplicitParam(name = "type", value = "类型1按部位排序2按时间排序", required = true)
 	})
-	public R<IPage<MiddleMeterApplyVO>> list(MiddleMeterApply middleMeterApply, Query query) {
-		IPage<MiddleMeterApplyVO> pages = middleMeterApplyService.page2(middleMeterApply,query);
+	public R<IPage<MiddleMeterApplyVO>> list(MiddleMeterApply middleMeterApply, Query query,Integer type) {
+		IPage<MiddleMeterApplyVO> pages = middleMeterApplyService.page2(middleMeterApply,query,type);
 		return R.data(pages);
 	}
 
@@ -214,6 +215,10 @@ public class MiddleMeterApplyController extends BladeController {
 		return R.data(middleMeterApplyService.getCurrentMeterMoney(middleMeterApply));
 	}
 
+	@GetMapping("/test")
+	public R<String> test() {
+		return R.data(middleMeterApplyService.test());
+	}
 
 	
 }

+ 28 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java

@@ -18,9 +18,8 @@ package org.springblade.meter.mapper;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
-import org.springblade.meter.entity.ChangeTokenForm;
+import org.springblade.meter.entity.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.springblade.meter.entity.ContractInventoryForm;
 import org.springblade.meter.vo.*;
 
 import java.util.List;
@@ -50,10 +49,36 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
 
     ChangeTokenFormVO detail(@Param("id") Long id);
 
+    //获取变更令下节点
     List<ChangeNodeVO> getNodeList(@Param("contractId") Long contractId,@Param("id") Long id);
-
+    //获取变更令下节点,附带最新施工图金额和变更后金额
+    List<ChangeNodeVO> getNodeList2(@Param("id") Long id,@Param("contractId") Long contractId);
+    //获取变更令下节点,回退时使用,附带修改前的施工图号
+    List<ChangeNodeVO> getNodeList3(@Param("id") Long id,@Param("contractId") Long contractId);
+    //获取变更令下清单
     List<ChangeFormVO2> getFormList(@Param("contractId") Long contractId,@Param("id") Long id);
+    //获取变更令下清单,附带最新变更后数量和变更后金额
+    List<ChangeFormVO2> getFormList2(@Param("id") Long id,@Param("contractId") Long contractId);
+    //获取变更令下清单,回退时使用,附带修改前的变更后数量与变更后金额
+    List<ChangeFormVO2> getFormList3(@Param("id") Long id,@Param("contractId") Long contractId);
 
     IPage<ChangeTokenPageVO> page2(IPage<ChangeTokenPageVO> page,@Param("contractId") Long contractId);
 
+    void batchUpdateForm(@Param("list") List<ContractInventoryForm> list2);
+
+    void batchUpdateTokenForm(@Param("list") List<ChangeTokenInventory> list3);
+
+    void batchUpdateMeterForm(@Param("list") List<InventoryFormMeter> list4);
+
+    void batchUpdateApplyForm(@Param("list") List<InventoryFormApply> list6);
+
+    List<ChangeFormVO2> getMultipleChange(@Param("tokenId") Long id);
+
+    String getUpdateMiddleForm(@Param("tokenId") Long id);
+
+    InventoryFormMeterVO getNodeFormAndMeterMoney(@Param("id") Long id,@Param("meterId") Long contractMeterId);
+
+    List<ChangeFormVO2> getAllCollectForm(@Param("tokenId") Long id);
+
+    void deleteCollectForm(@Param("tokenId")Long id);
 }

+ 115 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml

@@ -30,6 +30,51 @@
         <result column="approve_status" property="approveStatus"/>
         <result column="command_status" property="commandStatus"/>
     </resultMap>
+    <update id="batchUpdateForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_contract_inventory_form
+            <set>
+                change_total = #{item.changeTotal},
+                change_money = #{item.changeMoney}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
+    <update id="batchUpdateTokenForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_change_token_inventory
+            <set>
+                change_before_total = #{item.changeBeforeTotal},
+                change_after_total = #{item.changeAfterTotal},
+                change_before_money = #{item.changeBeforeMoney},
+                change_after_money = #{item.changeAfterMoney},
+                apply_ids = #{item.applyIds}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
+    <update id="batchUpdateMeterForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_inventory_form_meter
+            <set>
+                change_build_picture_total = #{item.changeBuildPictureTotal},
+                change_build_picture_money = #{item.changeBuildPictureMoney}
+            </set>
+            where contract_form_id = #{item.contractFormId} and contract_meter_id = #{item.contractMeterId}  and is_deleted = 0
+        </foreach>
+    </update>
+    <update id="batchUpdateApplyForm">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_inventory_form_apply
+            <set>
+                change_build_picture_total = #{item.changeBuildPictureTotal}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
+    <delete id="deleteCollectForm">
+        delete from s_change_token_inventory where change_token_id = #{tokenId} and is_collect_form = 1
+    </delete>
     <select id="getAllForm" resultType="org.springblade.meter.entity.ContractInventoryForm">
         select cif.id,
                IFNULL((select sum(build_picture_total) from s_inventory_form_meter ifm
@@ -92,7 +137,8 @@
         GROUP BY contract_form_id
     </select>
     <select id="getChangeNode" resultType="org.springblade.meter.vo.ChangeNodeVO">
-        select id,node_name,change_picture as contractPicture,change_money,change_money as beforeChangeMoney,ifnull(is_supplement,0) as isSupplement,
+        select id,node_name,change_picture as contractPicture,change_picture as beforeContractPicture,change_money,change_money as beforeChangeMoney,
+               ifnull(is_supplement,0) as isSupplement,
                 if(is_supplement = 1,'是','否') as isSupplementName
         from s_meter_tree_contract mtc
         WHERE mtc.contract_id = #{contractId} and mtc.is_deleted = 0
@@ -102,7 +148,8 @@
             FIND_IN_SET(#{id} , mtc.ancestor)
         </foreach>
         union
-        select id,node_name,change_picture as contractPicture,change_money,change_money as beforeChangeMoney,ifnull(is_supplement,0) as isSupplement,
+        select id,node_name,change_picture as contractPicture,change_picture as beforeContractPicture,change_money,change_money as beforeChangeMoney,
+               ifnull(is_supplement,0) as isSupplement,
         if(is_supplement = 1,'是','否') as isSupplementName
         from s_meter_tree_contract mtc
         WHERE mtc.contract_id = #{contractId} and mtc.is_deleted = 0
@@ -134,11 +181,27 @@
     <select id="getNodeList" resultType="org.springblade.meter.vo.ChangeNodeVO">
         select ctm.contract_meter_id as id,ctm.node_name,ctm.node_url,before_change_money,
                if(ctm.is_supplement = 1,'是','否') as isSupplementName,
+               ctm.contract_picture,ctm.change_money,before_contract_picture
+        from s_change_token_meter ctm
+        where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
+          AND ctm.change_token_id = #{id}
+    </select>
+    <select id="getNodeList2" resultType="org.springblade.meter.vo.ChangeNodeVO">
+        select ctm.contract_meter_id as id,ctm.node_name,ctm.node_url,
+               (select build_picture_money from s_meter_tree_contract where id = ctm.contract_meter_id) as beforeBuildMoney,
+               (select change_money from s_meter_tree_contract where id = ctm.contract_meter_id) as beforeChangeMoney,
                ctm.contract_picture,ctm.change_money
         from s_change_token_meter ctm
         where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
           AND ctm.change_token_id = #{id}
     </select>
+    <select id="getNodeList3" resultType="org.springblade.meter.vo.ChangeNodeVO">
+        select ctm.contract_meter_id as id,
+               ctm.before_contract_picture as contractPicture
+        from s_change_token_meter ctm
+        where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
+          AND ctm.change_token_id = #{id}
+    </select>
     <select id="getFormList" resultType="org.springblade.meter.vo.ChangeFormVO2">
         select cti.contract_form_id as id,cti.form_number,cti.form_name,cti.current_price,cti.contract_meter_id,
                cti.change_before_total as contractTotal,cti.change_total as currentChangeTotal,
@@ -146,8 +209,33 @@
                cti.change_money as currentChangeMoney,cti.change_after_money as changeMoney
         from s_change_token_inventory cti
         where cti.contract_id = #{contractId} and cti.is_deleted = 0
-          AND cti.change_token_id = #{id}
+          AND cti.change_token_id = #{id} and is_collect_form = 0
+    </select>
+    <select id="getFormList2" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select cti.contract_form_id as id,cti.form_number,cti.form_name,cti.current_price,cti.contract_meter_id,cti.change_token_id,
+               cti.change_before_total as contractTotal,cti.change_total as currentChangeTotal,
+               cti.change_after_total as changeTotal,cti.change_before_money as contractMoney,
+               cti.change_money as currentChangeMoney,cti.change_after_money as changeMoney,
+               cti.id as middleId,cti.project_id,cti.contract_id,
+               (select change_build_picture_total from s_inventory_form_meter where contract_id = #{contractId} and is_deleted = 0
+                    and contract_form_id = cti.contract_form_id and contract_meter_id = cti.contract_meter_id) as newestChangeTotal,
+               (select change_build_picture_money from s_inventory_form_meter where contract_id = #{contractId} and is_deleted = 0
+                    and contract_form_id = cti.contract_form_id and contract_meter_id = cti.contract_meter_id) as newestChangeMoney,
+               (select GROUP_CONCAT(id) from s_inventory_form_apply WHERE is_deleted = 0 and approve_status = 0 and contract_form_id = cti.contract_form_id
+                  and contract_meter_id = cti.contract_meter_id and business_date > CURDATE()) as applyIds
+        from s_change_token_inventory cti
+        where cti.contract_id = #{contractId} and cti.is_deleted = 0
+          AND cti.change_token_id = #{id} and is_collect_form = 0
     </select>
+    <select id="getFormList3" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select cti.contract_form_id as id,cti.contract_meter_id,
+               cti.change_before_total as changeTotal,
+               cti.change_before_money as changeMoney
+        from s_change_token_inventory cti
+        where cti.contract_id = #{contractId} and cti.is_deleted = 0
+          AND cti.change_token_id = #{id} and is_collect_form = 0
+    </select>
+
     <select id="page2" resultType="org.springblade.meter.vo.ChangeTokenPageVO">
         select *,
                (select dict_value from blade_dict where is_deleted = 0 and code = 'meter_change_type' and dict_key = ctf.change_type) as changeTypeName,
@@ -156,7 +244,30 @@
                0 as citeStatus
         from s_change_token_form ctf
         where contract_id = #{contractId} and is_deleted = 0
-        order by change_approval_date desc
+        order by create_time desc
+    </select>
+    <select id="getMultipleChange" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select form_name
+        from s_change_token_inventory cti
+        where is_deleted = 0 and is_collect_form = 1 and change_token_id = #{tokenId}
+            and change_after_total != (select change_total from s_contract_inventory_form where is_deleted = 0 and id = cti.contract_form_id)
+    </select>
+    <select id="getNodeFormAndMeterMoney" resultType="org.springblade.meter.vo.InventoryFormMeterVO">
+        select change_build_picture_total,
+                (select sum(current_meter_total) from s_inventory_form_apply ifa where ifa.is_deleted = 0
+                        and ifa.contract_form_id = ifm.contract_form_id and ifa.contract_meter_id = ifm.contract_meter_id) as allMeterMoney
+        from s_inventory_form_meter ifm
+        where is_deleted = 0 and contract_form_id = #{id} and contract_meter_id = #{meterId}
+    </select>
+    <select id="getUpdateMiddleForm" resultType="java.lang.String">
+        select GROUP_CONCAT(apply_ids)
+        from s_change_token_inventory
+        WHERE change_token_id = #{tokenId} and is_deleted = 0 and is_collect_form = 0
+    </select>
+    <select id="getAllCollectForm" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select contract_form_id as id,change_before_total as contractTotal,change_before_money as contractMoney
+        from s_change_token_inventory cti
+        where is_deleted = 0 and is_collect_form = 1 and change_token_id = #{tokenId}
     </select>
 
 

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterMapper.java

@@ -34,5 +34,5 @@ public interface ChangeTokenMeterMapper extends BaseMapper<ChangeTokenMeter> {
 
     void deleteByTokenId(@Param("id") Long id);
 
-    List<ChangeNodeVO> getChangTokenAllNode(@Param("tokenId") Long tokenId,@Param("contractId") Long contractId);
+
 }

+ 0 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterMapper.xml

@@ -22,9 +22,6 @@
         DELETE FROM s_change_token_meter
         where change_token_id = #{id}
     </delete>
-    <select id="getChangTokenAllNode" resultType="org.springblade.meter.vo.ChangeNodeVO">
-
-    </select>
 
 
 </mapper>

+ 8 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractInventoryFormMapper.xml

@@ -137,16 +137,21 @@
                        WHERE contract_id = #{contractId} and contract_form_id = cif.id),0)  as poseNum
         from s_contract_inventory_form cif
         WHERE cif.contract_id = #{contractId} and cif.is_deleted = 0 and cif.is_form_node = 1
-            <if test="formNum != null and formNum != '' and type==1">
+            <if test="formNum != null and formNum != ''">
                 and cif.form_number like concat('%',#{formNum},'%')
             </if>
           and cif.id not in (SELECT contract_form_id from s_inventory_form_meter WHERE contract_id = #{contractId} and contract_meter_id = #{meterId} and is_deleted = 0)
     </select>
     <select id="getNodeResolveForm" resultType="org.springblade.meter.vo.ContractFromVO">
-        select ifm.id, cif.form_number,cif.form_name,cif.current_price,cif.contract_total,cif.change_total,cif.is_supplement,
+        select ifm.id, ifm.contract_form_id ,cif.form_number,cif.form_name,cif.current_price,cif.contract_total,cif.change_total,cif.is_supplement,
                ifm.build_picture_total,ifm.change_build_picture_total,ifm.build_picture_money,ifm.change_build_picture_money,
+
                if(ifm.build_picture_total=ifm.change_build_picture_total,if((select count(1) from s_inventory_form_apply
-                   where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id)=0,0,1),1) as citeStatus,
+                   where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id and contract_meter_id = ifm.contract_meter_id)=0,
+                       if((select count(1) from s_change_token_inventory
+                          where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id and contract_meter_id = ifm.contract_meter_id)=0,0,1)
+                   ,1),1) as citeStatus,
+
             IFNULL((SELECT SUM(build_picture_total) from s_inventory_form_meter WHERE contract_id = #{contractId} and contract_form_id = cif.id
                      and is_deleted = 0 and contract_meter_id and contract_meter_id != #{meterId}),0)  as otherPoseNum,
             IFNULL((SELECT SUM(build_picture_total) from s_inventory_form_meter

+ 8 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.java

@@ -3,12 +3,20 @@ package org.springblade.meter.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.springblade.meter.entity.InventoryFormMeter;
 import org.springblade.meter.entity.MeterTreeContract;
 
+import java.util.List;
+import java.util.Set;
+
 public interface MeterTreeContractMapper extends BaseMapper<MeterTreeContract> {
 
     @Select("SELECT MAX(sort) FROM s_meter_tree_contract WHERE parent_id = #{parentId} AND status = 1 AND is_deleted = 0")
     Integer selectMaxSort(@Param("parentId") Long parentId);
 
     MeterTreeContract getAllChildNodeMoney(@Param("contractId") Long contractId,@Param("id") Long id);
+
+    void batchUpdateById(@Param("list") List<MeterTreeContract> list);
+
+    List<InventoryFormMeter> getNodeAllForm(@Param("ids") Set<Long> ids);
 }

+ 19 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MeterTreeContractMapper.xml

@@ -1,11 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.meter.mapper.MeterTreeContractMapper">
+    <update id="batchUpdateById">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_meter_tree_contract
+            <set>
+                change_picture = #{item.contractPicture},
+                change_money = #{item.changeMoney}
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
 
     <select id="getAllChildNodeMoney" resultType="org.springblade.meter.entity.MeterTreeContract">
-        select sum(build_picture_money) as build_picture_money,
-               sum(change_money) as change_money
+        select ifnull(sum(build_picture_money),0) as build_picture_money,
+               ifnull(sum(change_money),0) as change_money
         from s_meter_tree_contract
         where contract_id = #{contractId} and is_deleted = 0 and  FIND_IN_SET(#{id}, ancestor)
     </select>
+    <select id="getNodeAllForm" resultType="org.springblade.meter.entity.InventoryFormMeter">
+        select contract_meter_id,change_build_picture_money
+        from s_inventory_form_meter where is_deleted = 0 and contract_meter_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 9 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.java

@@ -23,10 +23,7 @@ import org.springblade.meter.entity.ChangeTokenMeter;
 import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MiddleMeterApply;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.springblade.meter.vo.MeterInventoryDetailVO;
-import org.springblade.meter.vo.MeterInventoryVO;
-import org.springblade.meter.vo.MiddleMeterApplyVO;
-import org.springblade.meter.vo.ResolveInventoryVO;
+import org.springblade.meter.vo.*;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -49,6 +46,8 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
     List<MeterTreeContract> getNodeDivide(@Param("contractId") Long contractId, @Param("ids") List<Long> ids);
 
     IPage<MiddleMeterApplyVO> page2(IPage<MiddleMeterApplyVO> iPage,@Param("apply") MiddleMeterApply middleMeterApply);
+    //根据部位排序
+    IPage<MiddleMeterApplyVO> page3(IPage<MiddleMeterApplyVO> iPage,@Param("apply") MiddleMeterApply middleMeterApply,@Param("ids") List<Long> ids);
 
     List<MeterInventoryDetailVO> meterPeriodAllForm(@Param("apply") MiddleMeterApply apply);
 
@@ -65,4 +64,10 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
     List<Long> getNodeOtherFormId(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId,@Param("nodeId") Long nodeId);
 
     BigDecimal getCurrentMeterMoney(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
+
+    Integer getAllAPPly(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
+
+    List<NodeSortVO> getLowestNodeBySort(@Param("contractId") Long contractId,@Param("nodeId") Long nodeId);
+
+    List<NodeSortVO> getAllNode(@Param("contractId") Long contractId);
 }

+ 46 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml

@@ -54,7 +54,9 @@
     </select>
     <select id="getNodeToken" resultType="org.springblade.meter.entity.ChangeTokenMeter">
         select * from s_change_token_meter
-        where is_deleted = 0 and contract_meter_id = #{nodeId} limit 1
+        where is_deleted = 0 and contract_meter_id = #{nodeId}
+        order by create_time desc
+        limit 1
     </select>
     <select id="getNodeDivide" resultType="org.springblade.meter.entity.MeterTreeContract">
         select *
@@ -76,6 +78,26 @@
                     WHERE contract_id = #{apply.contractId} and is_deleted = 0
                     and (mtc.id = #{apply.contractUnitId} or FIND_IN_SET(#{apply.contractUnitId}, ancestor))
                   )
+            order by mma.create_time desc
+    </select>
+    <select id="page3" resultType="org.springblade.meter.vo.MiddleMeterApplyVO">
+        SELECT *,
+               CASE when approve_status = 0 then '未上报' when approve_status = 1 then '待审批' when approve_status = 2 then '已审批'
+                    else '已废除' end as approveStatusName,
+               (select period_number from s_contract_meter_period cmp where cmp.id = mma.contract_period_id) as periodNumber
+        FROM s_middle_meter_apply mma
+        WHERE contract_id = #{apply.contractId} and is_deleted = 0 and contract_period_id = #{apply.contractPeriodId}
+          and contract_unit_id in (
+                <foreach collection="ids" item="id"  separator=",">
+                    #{id}
+                </foreach>
+            )
+        order by FIELD(contract_unit_id,
+            <foreach collection="ids" item="id"  separator=",">
+                #{id}
+            </foreach>
+        )
+
     </select>
     <select id="meterPeriodAllForm" resultType="org.springblade.meter.vo.MeterInventoryDetailVO">
         SELECT cif.id,ifa.meter_number,cif.form_number,cif.form_name,cif.current_price,cif.change_total,ifa.current_meter_total,ifa.current_meter_money,ifa.contract_form_id,
@@ -95,6 +117,8 @@
                ifa.change_build_picture_total as changeTotal,
                ifa.current_meter_total as currentMeterTotal,0 as containChangeTotal,
                ifa.current_meter_money as currentMeterMoney,
+               (IFNULL((select sum(current_meter_total) from s_inventory_form_apply where is_deleted = 0
+                      and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id and id != ifa.id),0)) as otherMeterTotal,
                (IFNULL((select sum(current_meter_total) from s_inventory_form_apply where is_deleted = 0
                       and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id),0)) as allMeterTotal
         from s_inventory_form_apply ifa
@@ -120,6 +144,27 @@
         from s_middle_meter_apply
         where contract_id = #{contractId} and is_deleted = 0 and contract_period_id = #{contractPeriodId} and approve_status != 3
     </select>
+    <select id="getAllAPPly" resultType="java.lang.Integer">
+        select count(1)
+        from s_middle_meter_apply
+        where contract_id = #{contractId} and contract_period_id = #{contractPeriodId}
+    </select>
+
+    <select id="getAllNode" resultType="org.springblade.meter.vo.NodeSortVO">
+        SELECT id,parent_id from m_wbs_tree_private  WHERE project_id  = 1578599210897772545 and is_deleted = 0 and type != 10 and wbs_type = 1
+    </select>
+    <select id="getLowestNodeBySort" resultType="org.springblade.meter.vo.NodeSortVO">
+        SELECT id,parent_id
+        FROM s_meter_tree_contract mtc
+        WHERE is_deleted = 0 and contract_id = #{contractId}
+          and id in (SELECT id FROM s_meter_tree_contract mtc2
+                     WHERE mtc2.contract_id = #{contractId} and mtc2.is_deleted = 0
+                       and (mtc2.id = #{nodeId} or FIND_IN_SET(#{nodeId}, mtc2.ancestor))
+        )
+        ORDER BY mtc.sort,mtc.create_time
+
+
+    </select>
 
 
 </mapper>

+ 5 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormService.java

@@ -89,4 +89,9 @@ public interface IChangeTokenFormService extends BaseService<ChangeTokenForm> {
      * 下达变更 变更令表
      */
     void executeChange(Long id);
+
+    /**
+     * 撤销变更 变更令表
+     */
+    void annulChange(Long id);
 }

+ 5 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenInventoryService.java

@@ -18,6 +18,9 @@ package org.springblade.meter.service;
 
 import org.springblade.meter.entity.ChangeTokenInventory;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.meter.vo.ChangeFormVO2;
+
+import java.util.List;
 
 /**
  * 变更令与合同工程清单	中间表 服务类
@@ -28,5 +31,6 @@ import org.springblade.core.mp.base.BaseService;
 public interface IChangeTokenInventoryService extends BaseService<ChangeTokenInventory> {
 
     //删除当前变更令下的清单
-    void deleteByTokenId(Long id);
+    void deleteByTokenId(Long tokenId);
+
 }

+ 0 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenMeterService.java

@@ -33,6 +33,4 @@ public interface IChangeTokenMeterService extends BaseService<ChangeTokenMeter>
     //删除当前变更令下的清单
     void deleteByTokenId(Long tokenId);
 
-    //获取当前变更令下的所有节点
-    List<ChangeNodeVO> getChangTokenAllNode(Long tokenId,Long contractId);
 }

+ 4 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java

@@ -50,7 +50,7 @@ public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply>
 
     void update2(MiddleMeterApplyDTO dto);
 
-    IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query);
+    IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query,Integer type);
 
     void delete(List<Long> ids);
 
@@ -61,4 +61,7 @@ public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply>
     String getMeterNumber(MiddleMeterApply middleMeterApply);
 
     BigDecimal getCurrentMeterMoney(MiddleMeterApply middleMeterApply);
+
+    String test();
+
 }

+ 4 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/MeterTreeContractService.java

@@ -4,6 +4,7 @@ import org.springblade.core.mp.base.BaseService;
 import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
 import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MeterTreeProject;
+import org.springblade.meter.vo.ChangeNodeVO;
 import org.springblade.meter.vo.MeterTreeContractVO;
 
 import java.util.List;
@@ -19,4 +20,7 @@ public interface MeterTreeContractService extends BaseService<MeterTreeContract>
     boolean contractSave(MeterTreeContractSaveBatchDTO dto);
 
     void getAllChildNodeMoney(MeterTreeContractVO vo);
+
+    //异步重新计算节点金额,和修改施工图号
+    void asyncCalculateNodeMoney(List<ChangeNodeVO> vos);
 }

+ 260 - 19
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java

@@ -17,6 +17,7 @@
 package org.springblade.meter.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
@@ -33,10 +34,12 @@ import org.springblade.meter.service.*;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.meter.vo.*;
 import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -69,9 +72,14 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
     private final IChangeTokenInventoryService changeTokenInventoryService;
 
     //合同计量单元与清单中间表
-
     private final IInventoryFormMeterService inventoryFormMeterService;
 
+    //中间计量申请与清单中间表
+    private final IInventoryFormApplyService inventoryFormApplyService;
+
+    //合同计量单元
+    private final MeterTreeContractService meterTreeContractService;
+
 
     /**
      * 一键生成零号变更  统计每个清单节点当前分解量,设置进清单的划分数量
@@ -141,6 +149,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 meter.setContractMeterId(l.getId());
                 meter.setContractPicture(l.getContractPicture());
                 //设置部位基础信息,方便公式生成报表
+                meter.setBeforeContractPicture(l.getBeforeContractPicture());
                 meter.setNodeName(l.getNodeName());
                 meter.setNodeUrl(l.getNodeUrl());
                 meter.setChangeMoney(BigDecimal.ZERO);
@@ -180,12 +189,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 }
                 //如果是负变更,判断当前节点下是否存在当前清单
                 if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
-                    //获取当前节点下当前清单的分解信息
-                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
-                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
-                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
-                    if (meter == null || (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1)){
-                        throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单("+vo2.getFormName()+")的分解信息,不能负变更");
+                    //获取当前节点下当前清单的分解信息,与计量总和
+                    InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
+                    if (meter == null){
+                        throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
+                    }else {
+                        //如果负变更后小于变更后施工图数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
+                        }
+                        //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更后变更后施工图数量小于已计量量,导致超计,不能负变更");
+                        }
                     }
                 }else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
                     throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单("+vo2.getFormName()+")的变更数量为0,请确认后再提交");
@@ -203,6 +219,8 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 inventoryList.add(inventory);
             }
             changeTokenInventoryService.saveBatch(inventoryList);
+        }else {
+            throw new ServiceException("请添加变更清单后再保存");
         }
         form.setChangeMoney(big);
         this.save(form);
@@ -297,6 +315,11 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
     @Override
     @Transactional
     public void update2(ChangeTokenFormDTO dto) {
+        //获取当前变更令,判断上报状态
+        ChangeTokenForm tokenForm = this.getById(dto.getId());
+        if (tokenForm.getApproveStatus() != 0){
+            throw new ServiceException("当前变更令为上报或审批状态,不能修改");
+        }
         //复制出基础数据
         ChangeTokenForm form = new ChangeTokenForm();
         BeanUtils.copyProperties(dto,form);
@@ -321,6 +344,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 meter.setContractMeterId(l.getId());
                 meter.setContractPicture(l.getContractPicture());
                 //设置部位基础信息,方便公式生成报表
+                meter.setBeforeContractPicture(l.getBeforeContractPicture());
                 meter.setNodeName(l.getNodeName());
                 meter.setNodeUrl(l.getNodeUrl());
                 meter.setChangeMoney(BigDecimal.ZERO);
@@ -362,12 +386,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 }
                 //如果是负变更,判断当前节点下是否存在当前清单
                 if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
-                    //获取当前节点下当前清单的分解信息
-                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
-                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
-                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
-                    if (meter == null || (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1)){
+                    //获取当前节点下当前清单的分解信息,与计量总和
+                    InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
+                    if (meter == null){
                         throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
+                    }else {
+                        //如果负变更后小于变更后施工图数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
+                        }
+                        //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更后变更后施工图数量小于已计量量,导致超计,不能负变更");
+                        }
                     }
                 }else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
                     throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]的变更数量为0,请确认后再提交");
@@ -385,6 +416,8 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 inventoryList.add(inventory);
             }
             changeTokenInventoryService.saveBatch(inventoryList);
+        }else {
+            throw new ServiceException("请添加变更清单后再保存");
         }
         form.setChangeMoney(big);
         this.updateById(form);
@@ -476,18 +509,226 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         if (form.getCommandStatus() == 1){
             throw new ServiceException("当前变更任务已经下达,请勿重复下达");
         }
+        if (form.getApproveStatus() != 2){
+            throw new ServiceException("当前变更任务未审批通过,下达失败");
+        }
+        //为防止中途其他变更执行,获取节点和清单的最新数据进行重新计算再变更
         //获取当前变更令的变更节点
-
+        List<ChangeNodeVO> allNode = baseMapper.getNodeList2(id, form.getContractId());
+        if (allNode.size() == 0){
+            throw new ServiceException("当前变更令的变更节点为空,下达失败");
+        }
         //获取当前变更令的所有变更清单
-        //清单放入节点中
-        //修改合同清单
-            // 此条清单的变更后数量和变更后金额
+        List<ChangeFormVO2> allForm = baseMapper.getFormList2(id,form.getContractId());
+        if (allForm.size() == 0){
+            throw new ServiceException("当前变更令的变更清单为空,下达失败");
+        }
+        //修改合同清单,此条清单的变更后数量和变更后金额,
+        // 所有清单按照清单id分组,
+        Map<Long, List<ChangeFormVO2>> map = allForm.stream().collect(Collectors.groupingBy(ChangeFormVO2::getId));
+        //获取所有清单的最新数据进行重新计算再变更
+        List<ContractInventoryForm> formList = contractInventoryFormService.listByIds(map.keySet());
+        Map<Long, ContractInventoryForm> formMap = formList.stream().collect(Collectors.toMap(l->l.getId(),l->l));
 
+        List<ChangeTokenInventory> list1 = new ArrayList<>();
+        List<ContractInventoryForm> list2 = new ArrayList<>();
+        for (Long aLong : map.keySet()) {
+            List<ChangeFormVO2> list = map.get(aLong);
+            BigDecimal total = BigDecimal.ZERO;
+            BigDecimal money = BigDecimal.ZERO;
+            for (ChangeFormVO2 vo2 : list) {
+                total = total.add(vo2.getCurrentChangeTotal());
+                money = money.add(vo2.getCurrentChangeMoney());
+            }
+            //获取清单汇总,并且插入到中间表
+            ContractInventoryForm form2 = formMap.get(aLong);
+            ChangeFormVO2 vo2 = list.get(0);
+            ChangeTokenInventory inventory = new ChangeTokenInventory();
+            inventory.setProjectId(form2.getProjectId());
+            inventory.setContractId(form2.getContractId());
+            inventory.setChangeTokenId(vo2.getChangeTokenId());
+            inventory.setContractFormId(vo2.getId());
+            inventory.setContractMeterId(vo2.getContractMeterId());
+            //设置汇总清单的数量
+            inventory.setChangeBeforeTotal(form2.getChangeTotal());
+            inventory.setChangeTotal(total);
+            inventory.setChangeAfterTotal(inventory.getChangeBeforeTotal().add(inventory.getChangeTotal()));
+            //设置汇总清单的金额
+            inventory.setChangeBeforeMoney(form2.getChangeMoney());
+            inventory.setChangeMoney(money);
+            inventory.setChangeAfterMoney(inventory.getChangeBeforeMoney().add(inventory.getChangeMoney()));
+            //设置清单3个基础信息,因为变更后不能改变
+            inventory.setFormNumber(vo2.getFormNumber());
+            inventory.setFormName(vo2.getFormName());
+            inventory.setCurrentPrice(vo2.getCurrentPrice());
+            inventory.setIsCollectForm(1);
+            list1.add(inventory);
+            // 修改清单数量与金额
+            ContractInventoryForm fo = new ContractInventoryForm();
+            fo.setId(aLong);
+            fo.setChangeTotal(inventory.getChangeAfterTotal());
+            fo.setChangeMoney(inventory.getChangeAfterMoney());
+            list2.add(fo);
+        }
+        //批量新增清单汇总到 变更令与计量单元中间表
+        changeTokenInventoryService.saveBatch(list1);
+        //批量修改合同工程清单,因为mybatis的修改是伪批量,所以手动拼接
+        baseMapper.batchUpdateForm(list2);
         //修改清单与合同计量单元,当前节点下当前清单
-            // 修改施工图数量和施工图变更后数量,施工图金额和施工图变更后金额,并且重新计算节点金额
-        //修改清单与中间计量申请,当前节点下当前清单
-            // 只修改业务日期在今天之后的,并且未上报的,修改分解数量与变更后数量
+        // 修改施工图数量和施工图变更后数量,施工图金额和施工图变更后金额
+        //变更令与清单中间表集合,用于批量修改
+        List<ChangeTokenInventory> list3 = new ArrayList<>();
+        //清单与合同计量单元中间表集合,用于批量修改
+        List<InventoryFormMeter> list4 = new ArrayList<>();
+        //清单与合同计量单元中间表集合,用于批量保存,因为变更不存在的清单,就是新增
+        List<InventoryFormMeter> list5 = new ArrayList<>();
+        //清单与中间计量申请中间表集合,用于批量修改
+        List<InventoryFormApply> list6 = new ArrayList<>();
+        for (ChangeFormVO2 vo2 : allForm) {
+            //判断是否存在分解信息,如果不存在新增
+            if (vo2.getNewestChangeTotal() == null){
+                InventoryFormMeter meter = new InventoryFormMeter();
+                meter.setProjectId(vo2.getProjectId());
+                meter.setContractId(vo2.getContractId());
+                meter.setContractFormId(vo2.getId());
+                meter.setBuildPictureTotal(BigDecimal.ZERO);
+                meter.setBuildPictureMoney(BigDecimal.ZERO);
+                meter.setContractMeterId(vo2.getContractMeterId());
+                meter.setChangeBuildPictureTotal(vo2.getChangeTotal());
+                meter.setChangeBuildPictureMoney(vo2.getChangeMoney());
+                list5.add(meter);
+            }else {
+                //判断施工图数量是否发生变化,发生变化代表新增之后下达之前,变更过,则修改中间表的变更前数量和变更前金额
+                if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal()) || StringUtils.isNotBlank(vo2.getApplyIds())) {
+                    //为allForm设置最终的当前节点当前清单变更后数量,用于修改清单与中间计量申请
+                    vo2.setChangeTotal(vo2.getNewestChangeTotal().add(vo2.getCurrentChangeTotal()));
+                    vo2.setChangeMoney(vo2.getNewestChangeMoney().add(vo2.getCurrentChangeMoney()));
+                    ChangeTokenInventory ct = new ChangeTokenInventory();
+                    ct.setId(vo2.getMiddleId());
+                    ct.setChangeBeforeTotal(vo2.getNewestChangeTotal());
+                    ct.setChangeAfterTotal(vo2.getChangeTotal());
+                    ct.setChangeBeforeMoney(vo2.getNewestChangeMoney());
+                    ct.setChangeAfterMoney(vo2.getChangeMoney());
+                    ct.setApplyIds(vo2.getApplyIds());
+                    list3.add(ct);
+                }
+                InventoryFormMeter meter = new InventoryFormMeter();
+                meter.setContractFormId(vo2.getId());
+                meter.setContractMeterId(vo2.getContractMeterId());
+                meter.setChangeBuildPictureTotal(vo2.getChangeTotal());
+                meter.setChangeBuildPictureMoney(vo2.getChangeMoney());
+                list4.add(meter);
+            }
+            //修改清单与中间计量申请,当前节点下当前清单,只修改业务日期在今天之后的,并且未上报的,修改分解数量与变更后数量
+            String applyIds = vo2.getApplyIds();
+            if (StringUtils.isNotBlank(applyIds)){
+                //存在值,则代表需要修改
+                List<Long> ids = Func.toLongList(applyIds);
+                for (Long along : ids) {
+                    InventoryFormApply apply = new InventoryFormApply();
+                    apply.setId(along);
+                    apply.setChangeBuildPictureTotal(vo2.getChangeTotal());
+                    list6.add(apply);
+                }
+            }
+        }
+        if (list3.size() > 0) {
+            baseMapper.batchUpdateTokenForm(list3);
+        }
+        if (list4.size() > 0) {
+            baseMapper.batchUpdateMeterForm(list4);
+        }
+        if (list5.size() > 0) {
+            inventoryFormMeterService.saveBatch(list5);
+        }
+        if (list6.size() > 0) {
+            baseMapper.batchUpdateApplyForm(list6);
+        }
+        this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
+            .eq(ChangeTokenForm::getId,id)
+            .set(ChangeTokenForm::getCommandStatus,1)
+            .set(ChangeTokenForm::getCommandDate, LocalDate.now()));
+        //异步重新计算节点金额,和修改施工图号,此方法放到最后,待所有操作成功后再执行
+        meterTreeContractService.asyncCalculateNodeMoney(allNode);
+    }
 
+    /**
+     * 撤销变更 变更令表
+     */
+    @Override
+    @Transactional
+    public void annulChange(Long id) {
+        //判断当前状态是否是已下达
+        ChangeTokenForm form = this.getById(id);
+        if (form.getCommandStatus() == 0){
+            throw new ServiceException("当前变更任务不是已下达状态,撤销失败");
+        }
+        if (form.getApproveStatus() != 2){
+            throw new ServiceException("当前变更任务未审批通过,撤销失败");
+        }
+
+        //判断是否有清单执行过二次变更,执行过则不能撤销
+        List<ChangeFormVO2> vo2 = baseMapper.getMultipleChange(id);
+        if (vo2.size() != 0){
+            String s = vo2.stream().map(ChangeFormVO2::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
+            throw new ServiceException("清单:"+s+"在当前变更之后又发生过变更,请先撤销上一次变更");
+        }
 
+        //判断是否修改过中间计量申请,修改过则不能撤销
+        //获取当前变更令所有修改的中间计量申请的id
+        String ids = baseMapper.getUpdateMiddleForm(id);
+        if (StringUtils.isNotBlank(ids)){
+            //存在修改,则判断这些修改是否已经删除
+            List<Long> longs = Func.toLongList(ids);
+            List<InventoryFormApply> list = inventoryFormApplyService.listByIds(longs);
+            if (list.size() != 0){
+                String s = list.stream().map(InventoryFormApply::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
+                throw new ServiceException("当前变更令已经修改中间计量申请的清单:"+s+"的数据,不能撤销变更,删除计量之后允许撤销");
+            }
+        }
+
+        //通过汇总项修改合同清单
+        List<ChangeFormVO2> vo3 = baseMapper.getAllCollectForm(id);
+        if (vo3.size() == 0){
+            throw new ServiceException("当前变更令的变更清单为空,撤销失败");
+        }
+        List<ContractInventoryForm> list2 = new ArrayList<>();
+        for (ChangeFormVO2 vo : vo3) {
+            // 修改清单数量与金额
+            ContractInventoryForm fo = new ContractInventoryForm();
+            fo.setId(vo.getId());
+            fo.setChangeTotal(vo.getContractTotal());
+            fo.setChangeMoney(vo.getContractMoney());
+            list2.add(fo);
+        }
+        //批量修改合同工程清单,因为mybatis的修改是伪批量,所以手动拼接
+        baseMapper.batchUpdateForm(list2);
+        //批量删除汇总项,因为撤销变更后,是可以下达的状态,下达时会重新生成最新的清单数据
+        baseMapper.deleteCollectForm(id);
+
+        //修改清单与合同计量单元中间表
+        //清单与合同计量单元中间表集合,用于批量修改
+        List<InventoryFormMeter> list4 = new ArrayList<>();
+        //获取当前变更令的所有变更清单
+        List<ChangeFormVO2> allForm = baseMapper.getFormList3(id,form.getContractId());
+        for (ChangeFormVO2 v : allForm) {
+            InventoryFormMeter meter = new InventoryFormMeter();
+            meter.setContractFormId(v.getId());
+            meter.setContractMeterId(v.getContractMeterId());
+            meter.setChangeBuildPictureTotal(v.getChangeTotal());
+            meter.setChangeBuildPictureMoney(v.getChangeMoney());
+            list4.add(meter);
+        }
+        baseMapper.batchUpdateMeterForm(list4);
+        //获取当前变更令的变更节点
+        List<ChangeNodeVO> allNode = baseMapper.getNodeList3(id, form.getContractId());
+        if (allNode.size() == 0){
+            throw new ServiceException("当前变更令的变更节点为空,下达失败");
+        }
+        //异步重新计算节点金额,和还原施工图号,此方法放到最后,待所有操作成功后再执行
+        meterTreeContractService.asyncCalculateNodeMoney(allNode);
+        this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
+                .eq(ChangeTokenForm::getId,id)
+                .set(ChangeTokenForm::getCommandStatus,0));
     }
 }

+ 1 - 10
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenMeterServiceImpl.java

@@ -40,14 +40,5 @@ public class ChangeTokenMeterServiceImpl extends BaseServiceImpl<ChangeTokenMete
         baseMapper.deleteByTokenId(id);
     }
 
-    /**
-     *     //获取当前变更令下的所有节点
-     * @param tokenId
-     * @param contractId
-     * @return
-     */
-    @Override
-    public List<ChangeNodeVO> getChangTokenAllNode(Long tokenId, Long contractId) {
-        return baseMapper.getChangTokenAllNode(tokenId,contractId);
-    }
+
 }

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractInventoryFormServiceImpl.java

@@ -586,7 +586,7 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
     }
 
     /**
-     * 判断当前节点是否已经分解或变更过,变更过返回true
+     * 判断当前清单是否已经分解或变更过,变更过返回true
      */
     private Boolean nodeIsChange(ContractInventoryForm form) {
         if (form.getBuildChangeTotal() != null) {

+ 28 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java

@@ -26,11 +26,9 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.WbsTree;
-import org.springblade.meter.entity.ContractInventoryForm;
-import org.springblade.meter.entity.InventoryFormApply;
-import org.springblade.meter.entity.InventoryFormMeter;
-import org.springblade.meter.entity.MeterTreeContract;
+import org.springblade.meter.entity.*;
 import org.springblade.meter.mapper.InventoryFormMeterMapper;
+import org.springblade.meter.service.IChangeTokenInventoryService;
 import org.springblade.meter.service.IInventoryFormApplyService;
 import org.springblade.meter.service.IInventoryFormMeterService;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -55,6 +53,8 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
 
     private final IInventoryFormApplyService inventoryFormApplyService;
 
+    private final IChangeTokenInventoryService tokenInventoryService;
+
     @Override
     public List<Long> getNodeAllForm(Long nodeId) {
         return baseMapper.getNodeAllForm(nodeId);
@@ -95,6 +95,10 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
             if (vo.getBuildPictureTotal() == null){
                 throw new ServiceException("请填写施工图数量");
             }
+            //校验当前节点下当前清单,是否在变更令中变更,或计量中计量
+            if (vo.getCiteStatus() == 0 && formIsChange(meterId,vo.getContractFormId())){
+                throw new ServiceException("清单["+vo.getFormName()+"]已经变更或计量,请刷新页面");
+            }
             //统计
             vo.setBuildPictureMoney(vo.getCurrentPrice().multiply(vo.getBuildPictureTotal()));
             vo.setChangeBuildPictureMoney(vo.getCurrentPrice().multiply(vo.getChangeBuildPictureTotal()));
@@ -132,6 +136,7 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
         //判断当前清单是否被计量
         List<InventoryFormApply> list = inventoryFormApplyService.list(new LambdaQueryWrapper<InventoryFormApply>()
                 .eq(InventoryFormApply::getContractId, meter.getContractId())
+                .eq(InventoryFormApply::getContractMeterId,Long.parseLong(meterId))
                 .eq(InventoryFormApply::getContractFormId, meter.getContractFormId()));
         if (list.size() > 0){
             throw new ServiceException("当前清单已经计量,不能删除");
@@ -140,4 +145,23 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
         this.removeById(formIds);
         return R.success("成功");
     }
+
+    /**
+     * 判断当前节点下当前清单是否已经分解或变更过,变更过返回true
+     */
+    private Boolean formIsChange(Long meterId,Long formId) {
+        long count = inventoryFormApplyService.count(new LambdaQueryWrapper<InventoryFormApply>()
+                .eq(InventoryFormApply::getContractFormId, formId)
+                .eq(InventoryFormApply::getContractMeterId, meterId));
+        if (count > 0) {
+            return true;
+        }
+        long count1 = tokenInventoryService.count(new LambdaQueryWrapper<ChangeTokenInventory>()
+                .eq(ChangeTokenInventory::getContractFormId, formId)
+                .eq(ChangeTokenInventory::getContractMeterId, meterId));
+        if (count1 > 0) {
+            return true;
+        }
+        return false;
+    }
 }

+ 36 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java

@@ -2,6 +2,7 @@ package org.springblade.meter.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -10,16 +11,20 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.meter.dto.MeterTreeContractSaveBatchDTO;
 import org.springblade.meter.dto.MeterTreeContractSaveDTO;
+import org.springblade.meter.entity.InventoryFormMeter;
 import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MeterTreeProject;
 import org.springblade.meter.mapper.MeterTreeContractMapper;
 import org.springblade.meter.mapper.MeterTreeProjectMapper;
 import org.springblade.meter.service.MeterTreeContractService;
+import org.springblade.meter.vo.ChangeNodeVO;
 import org.springblade.meter.vo.MeterTreeContractVO;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -534,6 +539,37 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
         vo.setChangeMoney(m.getChangeMoney());
     }
 
+    /**
+     * 异步重新计算节点金额,和修改施工图号
+     * @param vos
+     */
+    @Override
+//    @Async
+    public void asyncCalculateNodeMoney(List<ChangeNodeVO> vos) {
+        for (ChangeNodeVO vo : vos) {
+            if (StringUtils.isBlank(vo.getContractPicture())){
+                vo.setContractPicture("");
+            }
+        }
+        Map<Long, String> map = vos.stream().collect(Collectors.toMap(l -> l.getId(), l -> l.getContractPicture()));
+        //获取所有要重新计算的节点的最新数据
+        List<MeterTreeContract> list = this.listByIds(map.keySet());
+        //获取节点下所有分解的表单
+        List<InventoryFormMeter> formMeters = baseMapper.getNodeAllForm(map.keySet());
+        Map<Long, BigDecimal> decimalMap = formMeters.stream()
+                .collect(Collectors.groupingBy(l -> l.getContractMeterId(),
+                        Collectors.mapping(InventoryFormMeter::getChangeBuildPictureMoney,
+                                Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+        list.stream().forEach(l->{
+            String picture = map.get(l.getId());
+            l.setContractPicture(StringUtils.isBlank(picture)?"":picture);
+            //统计节点下所有分解的表单的总金额
+            l.setChangeMoney(decimalMap.get(l.getId())==null?BigDecimal.ZERO:decimalMap.get(l.getId()));
+        });
+        //拼接SQL修改合同图号和重新计算的金额
+        baseMapper.batchUpdateById(list);
+    }
+
     /**
      * 获取对应的父级的ancestor字段
      *

+ 74 - 13
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -30,10 +30,8 @@ import org.springblade.meter.entity.*;
 import org.springblade.meter.mapper.MiddleMeterApplyMapper;
 import org.springblade.meter.service.*;
 import org.springblade.core.mp.base.BaseServiceImpl;
-import org.springblade.meter.vo.MeterInventoryDetailVO;
-import org.springblade.meter.vo.MeterInventoryVO;
-import org.springblade.meter.vo.MiddleMeterApplyVO;
-import org.springblade.meter.vo.ResolveInventoryVO;
+import org.springblade.meter.utils.ForestNodeMerger;
+import org.springblade.meter.vo.*;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -107,6 +105,9 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         //获取清单和分解信息
         List<Long> longs = Func.toLongList(ids);
         vos = baseMapper.getResolveFormInfo(contractId,nodeId,longs);
+        for (MeterInventoryVO vo : vos) {
+            vo.setOtherMeterTotal(vo.getAllMeterTotal().subtract(vo.getCurrentMeterTotal()));
+        }
         return vos;
     }
 
@@ -126,6 +127,10 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         if (period.getApproveStatus() != 0){
             throw new ServiceException("新增失败,当前计量期已经上报或审批");
         }
+        //校验业务日期是否填写,变更时修改
+        if (dto.getBusinessDate() == null){
+            throw new ServiceException("新增失败,请填写业务日期");
+        }
         //保存中间计量申请,设置计量金额为0,如果存在计量清单,则统计计量清单总金额
         MiddleMeterApply apply = new MiddleMeterApply();
         Long id = SnowFlakeUtil.getId();
@@ -139,6 +144,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
              //保存清单
             List<InventoryFormApply> formApplies = formList.stream().map(l -> {
                 InventoryFormApply formApply = new InventoryFormApply();
+                formApply.setBusinessDate(dto.getBusinessDate());
                 formApply.setProjectId(dto.getProjectId());
                 formApply.setContractId(dto.getContractId());
                 formApply.setContractFormId(l.getId());
@@ -194,7 +200,10 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         }
         //获取变更令
         ChangeTokenForm tokenForm = baseMapper.getTokenById(nodeToken.getChangeTokenId());
-        return tokenForm.getChangeNumber();
+        if (tokenForm != null && StringUtils.isNotBlank(tokenForm.getChangeNumber())) {
+            return tokenForm.getChangeNumber();
+        }
+        return null;
     }
 
     /**
@@ -247,6 +256,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             //保存清单
             List<InventoryFormApply> formApplies = formList.stream().map(l -> {
                 InventoryFormApply formApply = new InventoryFormApply();
+                formApply.setBusinessDate(dto.getBusinessDate());
                 formApply.setProjectId(dto.getProjectId());
                 formApply.setContractId(dto.getContractId());
                 formApply.setContractFormId(l.getId());
@@ -294,9 +304,28 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
      * 分页 中间计量申请表
      */
     @Override
-    public IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query) {
+    public IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query,Integer type) {
         IPage<MiddleMeterApplyVO> iPage = new Page<>(query.getCurrent(),query.getSize());
-        iPage = baseMapper.page2(iPage,middleMeterApply);
+        if (type == 1){
+            //根据部位分页,先查出部位
+            List<NodeSortVO> vos = baseMapper.getLowestNodeBySort(middleMeterApply.getContractId(),middleMeterApply.getContractUnitId());
+            //转换为树
+            Long l1 = System.currentTimeMillis();
+            List<NodeSortVO> list = ForestNodeMerger.merge(vos);
+            Long l2 = System.currentTimeMillis();
+            System.out.println(l2-l1);
+            //递归循环树,存在子节点就深入,不存在子节点就add后返回上一层
+            List<Long> ids = new ArrayList<>();
+            gatherSortNode(list,ids);
+            if (ids.size() != 0){
+                Long l3 = System.currentTimeMillis();
+                iPage = baseMapper.page3(iPage,middleMeterApply,ids);
+                Long l4 = System.currentTimeMillis();
+                System.out.println(l4-l3);
+            }
+        }else {
+            iPage = baseMapper.page2(iPage, middleMeterApply);
+        }
         return iPage;
     }
 
@@ -307,9 +336,9 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
     @Transactional
     public void delete(List<Long> ids) {
         for (Long id : ids) {
-            //校验当前计量是否已经上报
-            ContractMeterPeriod period = contractMeterPeriodService.getById(id);
-            if (period.getApproveStatus() != 0){
+            //校验当前计量申请是否已经上报
+            MiddleMeterApply apply = this.getById(id);
+            if (apply.getApproveStatus() != 0){
                 throw new ServiceException("删除,当前计量期已经上报或审批");
             }
             //删除中间计量申请信息
@@ -338,6 +367,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             List<MeterInventoryDetailVO> voList = map.get(aLong);
             MeterInventoryDetailVO vo = new MeterInventoryDetailVO();
             MeterInventoryDetailVO vo1 = voList.get(0);
+            vo.setId(vo1.getId());
             vo.setFormNumber(vo1.getFormNumber());
             vo.setFormName(vo1.getFormName());
             vo.setChangeTotal(vo1.getChangeTotal());
@@ -393,9 +423,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         }
         str.append(contractMeterPeriod.getPeriodNumber()+"-");
         //获取流水号:当前合同段存在的当前计量期的申请单总数+1
-        long count = this.count(new LambdaQueryWrapper<MiddleMeterApply>()
-                .eq(MiddleMeterApply::getContractId, apply.getContractId())
-                .eq(MiddleMeterApply::getContractPeriodId,apply.getContractPeriodId()));
+        Integer count = baseMapper.getAllAPPly(apply.getContractId(),apply.getContractPeriodId());
         str.append(count+1);
         return str.toString();
     }
@@ -407,4 +435,37 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
     public BigDecimal getCurrentMeterMoney(MiddleMeterApply middleMeterApply) {
         return baseMapper.getCurrentMeterMoney(middleMeterApply.getContractId(),middleMeterApply.getContractPeriodId());
     }
+
+    @Override
+    public String test() {
+        Long contractId = 1612329251049537537L;
+        //获取当前合同下所以计量单元
+        List<NodeSortVO> vos = baseMapper.getAllNode(contractId);
+        //转换为树
+        Long l1 = System.currentTimeMillis();
+        List<NodeSortVO> list = ForestNodeMerger.merge(vos);
+        Long l2 = System.currentTimeMillis();
+        System.out.println("----------------------");
+        System.out.println(l2-l1);
+        //递归循环树,存在子节点就深入,不存在子节点就add后返回上一层
+        List<Long> ids = new ArrayList<>();
+        Long l3 = System.currentTimeMillis();
+        gatherSortNode(list,ids);
+        Long l4 = System.currentTimeMillis();
+        System.out.println("---------------");
+        System.out.println(l4-l3);
+        return "";
+    }
+
+    //递归方法
+    private void gatherSortNode(List<NodeSortVO> list,List<Long> ids){
+        for (NodeSortVO vo : list) {
+            if (vo.getChildren().size() == 0){
+                ids.add(vo.getId());
+                continue;
+            }else {
+                gatherSortNode(vo.getChildren(), ids);
+            }
+        }
+    }
 }