Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master' into master

yangyj 1 rok pred
rodič
commit
63f1321e16
39 zmenil súbory, kde vykonal 873 pridanie a 210 odobranie
  1. 3 2
      blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/AliOssBuilder.java
  2. 14 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/InventoryFormApplyTaskDTO.java
  3. 2 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MeterApprovalDTO.java
  4. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/TaskDataUploadFileDTO.java
  5. 1 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/TaskPageDTO.java
  6. 117 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenFormTask.java
  7. 105 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventoryTask.java
  8. 67 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeterTask.java
  9. 13 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenFormTaskVO.java
  10. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java
  11. 38 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MiddleMeterApplyVO2.java
  12. 9 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/TaskDataDetailVO.java
  13. 4 4
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  14. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MeterTreeController.java
  15. 4 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java
  16. 229 183
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  17. 4 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/AttachmentFormMapper.java
  18. 7 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/AttachmentFormMapper.xml
  19. 2 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java
  20. 6 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  21. 9 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormTaskMapper.java
  22. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormTaskMapper.xml
  23. 9 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryTaskMapper.java
  24. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryTaskMapper.xml
  25. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterTaskMapper.java
  26. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterTaskMapper.xml
  27. 9 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.java
  28. 45 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml
  29. 5 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IAttachmentFormService.java
  30. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenFormServiceTask.java
  31. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenInventoryServiceTask.java
  32. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenMeterServiceTask.java
  33. 5 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java
  34. 7 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/AttachmentFormServiceImpl.java
  35. 22 5
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  36. 12 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceTaskImpl.java
  37. 12 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenInventoryServiceTaskImpl.java
  38. 12 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenMeterServiceTaskImpl.java
  39. 47 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 3 - 2
blade-ops/blade-resource/src/main/java/org/springblade/resource/builder/oss/AliOssBuilder.java

@@ -52,10 +52,11 @@ public class AliOssBuilder {
         // 设置失败请求重试次数,默认为3次。
         conf.setMaxErrorRetry(5);
         OssProperties ossProperties = new OssProperties();
-        ossProperties.setEndpoint(oss.getEndpoint());
+
+        //ossProperties.setEndpoint(oss.getEndpoint());
 
         //本地测试1
-        //ossProperties.setEndpoint("https://oss-cn-hangzhou.aliyuncs.com/");
+        ossProperties.setEndpoint("https://oss-cn-hangzhou.aliyuncs.com/");
 
         ossProperties.setAccessKey(oss.getAccessKey());
         ossProperties.setSecretKey(oss.getSecretKey());

+ 14 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/InventoryFormApplyTaskDTO.java

@@ -0,0 +1,14 @@
+package org.springblade.meter.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.meter.entity.InventoryFormApplyTask;
+
+
+@Data
+public class InventoryFormApplyTaskDTO extends InventoryFormApplyTask {
+
+    @ApiModelProperty(value = "任务修改时使用清单id")
+    private Long taskDetailId;
+
+}

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

@@ -14,8 +14,8 @@ public class MeterApprovalDTO implements Serializable {
     @ApiModelProperty(value = "合同段id")
     private Long contractId;
 
-    @ApiModelProperty(value = "期数id")
-    private Long periodId;
+    @ApiModelProperty(value = "期数id(如果是变更令,那么入参传勾选的id字符串英文逗号拼接)")
+    private String periodId;
 
     @ApiModelProperty(value = "任务名称")
     private String taskName;

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

@@ -16,6 +16,9 @@ public class TaskDataUploadFileDTO implements Serializable {
     @ApiModelProperty(value = "中间列表数据的Id")
     private Long dataId;
 
+    @ApiModelProperty(value = "任务id")
+    private Long taskId;
+
     @ApiModelProperty(value = "项目id")
     private Long projectId;
 

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

@@ -17,7 +17,7 @@ public class TaskPageDTO implements Serializable {
     @ApiModelProperty(value = "选择菜单类型,1=待办,2=已办,3=我发起的")
     private Integer selectedType;
 
-    @ApiModelProperty(value = "任务类型")
+    @ApiModelProperty(value = "任务类型 1=中间计量,2=材料计量,3=开工预付款,4=变更令,5=工程结算,6=收方单")
     private Integer typeValue;
 
     @ApiModelProperty(value = "任务状态")

+ 117 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenFormTask.java

@@ -0,0 +1,117 @@
+package org.springblade.meter.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("s_change_token_form_task")
+@EqualsAndHashCode(callSuper = true)
+public class ChangeTokenFormTask extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务id
+     */
+    @ApiModelProperty(value = "任务id")
+    private Long taskId;
+
+    /**
+     * 项目id
+     */
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+    /**
+     * 合同段id
+     */
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+    /**
+     * 变更令编号
+     */
+    @ApiModelProperty(value = "变更令编号")
+    private String changeNumber;
+    /**
+     * 变更令名称
+     */
+    @ApiModelProperty(value = "变更令名称")
+    private String changeName;
+    /**
+     * 变更发起单位
+     */
+    @ApiModelProperty(value = "变更发起单位")
+    private String changeUnit;
+    /**
+     * 变更类型
+     */
+    @ApiModelProperty(value = "变更类型")
+    private Integer changeType;
+    /**
+     * 业务日期
+     */
+    @ApiModelProperty(value = "业务日期")
+    private LocalDate businessDate;
+    /**
+     * 延长工期
+     */
+    @ApiModelProperty(value = "延长工期")
+    private Integer lengthenDays;
+    /**
+     * 变更申请金额
+     */
+    @ApiModelProperty(value = "变更申请金额")
+    private BigDecimal changeMoney;
+    /**
+     * 设计完成时间
+     */
+    @ApiModelProperty(value = "设计完成时间")
+    private LocalDate designDate;
+    /**
+     * 实际变更桩号
+     */
+    @ApiModelProperty(value = "实际变更桩号")
+    private String realityChangeNumber;
+    /**
+     * 变更批复文号
+     */
+    @ApiModelProperty(value = "变更批复文号")
+    private String changeApprovalNumber;
+    /**
+     * 变更归类
+     */
+    @ApiModelProperty(value = "变更归类")
+    private Integer changeClassify;
+    /**
+     * 变更批复日期
+     */
+    @ApiModelProperty(value = "变更批复日期")
+    private LocalDate changeApprovalDate;
+    /**
+     * 变更原因
+     */
+    @ApiModelProperty(value = "变更原因")
+    private String changeCause;
+    /**
+     * 审批状态
+     */
+    @ApiModelProperty(value = "审批状态,0未上报,1待审批,2已审批,3已废除")
+    private Integer approveStatus;
+    /**
+     * 下达状态
+     */
+    @ApiModelProperty(value = "下达状态0未下达1已下达")
+    private Integer commandStatus;
+
+    @ApiModelProperty(value = "下达日期")
+    private LocalDateTime commandDate;
+
+
+
+}

+ 105 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventoryTask.java

@@ -0,0 +1,105 @@
+package org.springblade.meter.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("s_change_token_inventory_task")
+@EqualsAndHashCode(callSuper = true)
+public class ChangeTokenInventoryTask extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务id
+     */
+    @ApiModelProperty(value = "任务id")
+    private Long taskId;
+
+    /**
+     * 项目id
+     */
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+    /**
+     * 合同段id
+     */
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+    /**
+     * 变更令id
+     */
+    @ApiModelProperty(value = "变更令id")
+    private Long changeTokenId;
+    /**
+     * 合同计量单元id
+     */
+    @ApiModelProperty(value = "合同计量单元id(部位)")
+    private Long contractMeterId;
+    /**
+     * 合同工程清单id
+     */
+    @ApiModelProperty(value = "合同工程清单id")
+    private Long contractFormId;
+    /**
+     * 清单编号
+     */
+    @ApiModelProperty(value = "清单编号")
+    private String formNumber;
+    /**
+     * 清单名称
+     */
+    @ApiModelProperty(value = "清单名称")
+    private String formName;
+    /**
+     * 当前单价
+     */
+    @ApiModelProperty(value = "当前单价")
+    private BigDecimal currentPrice;
+    /**
+     * 变更前数量
+     */
+    @ApiModelProperty(value = "变更前数量")
+    private BigDecimal changeBeforeTotal;
+    /**
+     * 变更数量
+     */
+    @ApiModelProperty(value = "变更数量")
+    private BigDecimal changeTotal;
+    /**
+     * 变更后数量
+     */
+    @ApiModelProperty(value = "变更后数量")
+    private BigDecimal changeAfterTotal;
+    /**
+     * 变更前金额
+     */
+    @ApiModelProperty(value = "变更前金额")
+    private BigDecimal changeBeforeMoney;
+    /**
+     * 变更金额
+     */
+    @ApiModelProperty(value = "变更金额")
+    private BigDecimal changeMoney;
+    /**
+     * 变更后金额
+     */
+    @ApiModelProperty(value = "变更后金额")
+    private BigDecimal changeAfterMoney;
+
+    /**
+     * 是否汇总清单,0分解清单1汇总清单
+     */
+    @ApiModelProperty(value = "是否汇总清单,0分解清单1汇总清单")
+    private Integer isCollectForm;
+
+    @ApiModelProperty(value = "需要修改的中间计量申请ids")
+    private String applyIds;
+
+
+}

+ 67 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenMeterTask.java

@@ -0,0 +1,67 @@
+package org.springblade.meter.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+
+
+@Data
+@TableName("s_change_token_meter_task")
+@EqualsAndHashCode(callSuper = true)
+public class ChangeTokenMeterTask extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务id
+     */
+    @ApiModelProperty(value = "任务id")
+    private Long taskId;
+    /**
+     * 项目id
+     */
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+    /**
+     * 合同段id
+     */
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+    /**
+     * 变更令id
+     */
+    @ApiModelProperty(value = "变更令id")
+    private Long changeTokenId;
+    /**
+     * 合同计量单元id
+     */
+    @ApiModelProperty(value = "合同计量单元id")
+    private Long contractMeterId;
+
+    @ApiModelProperty(value = "工程名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "节点路径")
+    private String nodeUrl;
+
+    @ApiModelProperty(value = "变更后合同图号")
+    private String contractPicture;
+
+    @ApiModelProperty(value = "变更前-变更合同图号")
+    private String beforeContractPicture;
+
+    @ApiModelProperty(value = "变更后金额")
+    private BigDecimal changeMoney;
+
+    @ApiModelProperty(value = "变更前-变更后金额")
+    private BigDecimal beforeChangeMoney;
+
+    @ApiModelProperty(value = "是否增补")
+    private Integer isSupplement;
+
+
+}

+ 13 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ChangeTokenFormTaskVO.java

@@ -0,0 +1,13 @@
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.meter.entity.ChangeTokenFormTask;
+
+@Data
+public class ChangeTokenFormTaskVO extends ChangeTokenFormTask {
+
+    @ApiModelProperty(value = "是否已批注,1=是,0=否")
+    private Integer isComment;
+
+}

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

@@ -19,6 +19,9 @@ public class MeterInventoryVO {
     @ApiModelProperty(value = "id")
     private Long id;
 
+    @ApiModelProperty(value = "任务修改时使用id")
+    private Long taskDetailId;
+
     @ApiModelProperty(value = "清单编号")
     private String formNumber;
 

+ 38 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MiddleMeterApplyVO2.java

@@ -0,0 +1,38 @@
+package org.springblade.meter.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.meter.entity.AttachmentForm;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Param   用于下达变更
+ * @Author wangwl
+ * @Date 2024/1/2 14:44
+ **/
+@Data
+public class MiddleMeterApplyVO2 {
+    @ApiModelProperty(value = "中间计量申请id")
+    private Long id;
+
+    @ApiModelProperty(value = "中间计量申请下的清单id,逗号分隔")
+    private String formIds;
+
+    @ApiModelProperty(value = "合同段id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "合同计量单元id")
+    private Long contractUnitId;
+
+    @ApiModelProperty(value = "业务日期")
+    private LocalDate businessDate;
+
+    @ApiModelProperty(value = "变更令编号")
+    private String changeTokenNumber;
+
+    @ApiModelProperty(value = "变更令id,逗号拼接")
+    private String changeTokenIds;
+
+}

+ 9 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/TaskDataDetailVO.java

@@ -3,6 +3,8 @@ package org.springblade.meter.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.meter.entity.AttachmentFormTask;
+import org.springblade.meter.entity.ChangeTokenInventoryTask;
+import org.springblade.meter.entity.ChangeTokenMeterTask;
 
 import java.io.Serializable;
 import java.util.List;
@@ -13,9 +15,15 @@ public class TaskDataDetailVO implements Serializable {
     @ApiModelProperty(value = "基础信息")
     private Object basicsInfo;
 
-    @ApiModelProperty(value = "关联业务列表数据")
+    @ApiModelProperty(value = "中间计量-关联清单列表数据")
     private List<MeterInventoryVO> associatedDataInfoList;
 
+    @ApiModelProperty(value = "变更令-关联部位数据")
+    private List<ChangeTokenMeterTask> changeTokenMeterTaskList;
+
+    @ApiModelProperty(value = "变更令-关联部位清单数据")
+    private List<ChangeTokenInventoryTask> changeTokenInventoryTaskList;
+
     @ApiModelProperty(value = "附件文件信息")
     private List<AttachmentFormTask> attachmentFormTask;
 

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

@@ -556,7 +556,7 @@ public class TaskController extends BladeController {
                 if (archiveFile != null) {
                     /*此处任务会查询出多条,因为存在多次废除任务,那么form_data_id指向同一个id,所以在新增的时候去重判断,status=1或2,有且只有一条*/
                     Task task = jdbcTemplate.query("select id,status,process_instance_id from u_task where task_create_timestamp is not null and status in (1,2) and form_data_id = '" + archiveId + "'", new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
-                    if (task != null && task.getStatus().equals(1)) {
+                    if (task != null) {
                         //修改档案文件收集业务数据状态=已废除
                         jdbcTemplate.execute("update u_archive_file set status = 3,is_certification = 0,e_visa_file = null where id = " + archiveId);
                         //待审批审批任务=已废除
@@ -581,7 +581,7 @@ public class TaskController extends BladeController {
             String[] taskIds = repealDTO.getIds().split(",");
             for (String taskId : taskIds) {
                 Task task = jdbcTemplate.query("select id,status,process_instance_id,form_data_id from u_task where id = " + taskId, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
-                if (task != null && task.getStatus().equals(1)) {
+                if (task != null) {
                     //待审批审批任务=已废除
                     jdbcTemplate.execute("update u_task set status = 3 where id = " + task.getId());
                     //审批任务详情=已废除
@@ -663,7 +663,7 @@ public class TaskController extends BladeController {
                                     dto.setAccount("expert" + phone);
                                     //如果当前账户已经存在,则代表账号已经注册,直接跳过当前
                                     R<User> r = userClient.userByAccount(AuthUtil.getTenantId(), dto.getAccount());
-                                    if (r.getData() != null){
+                                    if (r.getData() != null) {
                                         continue;
                                     }
                                     StringSPUtils stringSPUtils = new StringSPUtils();
@@ -1173,7 +1173,7 @@ public class TaskController extends BladeController {
         int size = dto.getSize();
         //封装入参SQL
         List<Object> params = new ArrayList<>();
-        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type != 4"); //approval_type != 4 非档案的任务就是1填报资料,2工程文件,3日志资料
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type not in(4,5)");
         if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
             sqlString.append(" AND type = ?");
             params.add(dto.getTypeValue());

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

@@ -663,7 +663,7 @@ public class MeterTreeController extends BladeController {
     @ApiOperationSupport(order = 25)
     @ApiOperation(value = "合同段树节点详情", notes = "传入id")
     public R<MeterTreeContractVO> contractDetail(@RequestParam String id) {
-        MeterTreeContract basicInfo = meterTreeContractService.getById(id);
+        MeterTreeContract basicInfo = jdbcTemplate.query("select * from s_meter_tree_contract where is_deleted = 0 and id = " + id, new BeanPropertyRowMapper<>(MeterTreeContract.class)).stream().findAny().orElse(null);
         if (basicInfo != null) {
             MeterTreeContractVO vo = new MeterTreeContractVO();
             BeanUtil.copyProperties(basicInfo, vo);

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

@@ -63,10 +63,11 @@ public class MiddleMeterApplyController extends BladeController {
 			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
 			@ApiImplicitParam(name = "nodeId", value = "节点id", required = true),
 			@ApiImplicitParam(name = "ids", value = "已经存在的清单id,逗号分隔", required = true),
-			@ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true)
+			@ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true),
+			@ApiImplicitParam(name = "id", value = "中间计量申请的id", required = true)
 	})
-	public R<List<ResolveInventoryVO>> addFormList(Long contractId ,Long contractPeriodId, Long nodeId ,String ids) {
-		List<ResolveInventoryVO> vos = middleMeterApplyService.addFormList(contractId,contractPeriodId,nodeId,ids);
+	public R<List<ResolveInventoryVO>> addFormList(Long id,Long contractId ,Long contractPeriodId, Long nodeId ,String ids) {
+		List<ResolveInventoryVO> vos = middleMeterApplyService.addFormList(id,contractId,contractPeriodId,nodeId,ids);
 		return R.data(vos);
 	}
 

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

@@ -11,7 +11,6 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
-import org.springblade.business.entity.FixedFlowLink;
 import org.springblade.business.entity.Task;
 import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.feign.TaskClient;
@@ -26,6 +25,7 @@ import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.feign.ArchiveFileTaskClient;
 import org.springblade.manager.entity.ContractInfo;
@@ -59,7 +59,6 @@ public class TaskController extends BladeController {
 
     private final JdbcTemplate jdbcTemplate;
     private final BladeRedis bladeRedis;
-    private final ArchiveFileTaskClient archiveFileTaskClient;
     private final TaskClient taskClient;
     private final ContractMeterPeriodServiceImpl contractMeterPeriodService;
     private final MeterPeriodServiceImpl periodService;
@@ -73,12 +72,18 @@ public class TaskController extends BladeController {
     private final StartPayMeterFormServiceTaskImpl startPayMeterFormServiceTask;
     private final AttachmentFormServiceImpl attachmentFormService;
     private final AttachmentFormServiceTaskImpl attachmentFormServiceTask;
-
     private final MiddleMeterApplyMapper middleMeterApplyMapper;
 
+    private final ChangeTokenFormServiceImpl changeTokenFormService;
+    private final ChangeTokenFormServiceTaskImpl changeTokenFormServiceTask;
+    private final ChangeTokenMeterServiceImpl changeTokenMeterService;
+    private final ChangeTokenMeterServiceTaskImpl changeTokenMeterServiceTask;
+    private final ChangeTokenInventoryServiceImpl changeTokenInventoryService;
+    private final ChangeTokenInventoryServiceTaskImpl changeTokenInventoryServiceTask;
+
     @GetMapping("/name")
     @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "获取任务名称", notes = "传入合同段contractId、期数id、type=1(中间计量申请)、=2(材料计量单)、3=(开工预付款计量单)、=4(变更令)")
+    @ApiOperation(value = "获取任务名称", notes = "传入合同段contractId、期数id(变更令传勾选的id字符串英文逗号拼接)、type=1(中间计量申请)、=2(材料计量单)、3=(开工预付款计量单)、=4(变更令)")
     public R<Object> name(@RequestParam String contractId, @RequestParam String id, @RequestParam String type) {
         String name = null;
         if (ObjectUtil.isNotEmpty(contractId) && ObjectUtil.isNotEmpty(id)) {
@@ -101,7 +106,14 @@ public class TaskController extends BladeController {
                     name = "【" + contractInfo.getContractName() + "】" + date + " 开工预付款计量单【" + meterPeriod.getPeriodNumber() + "】";
                 }
             } else if (("4").equals(type)) {
-                //TODO 变更令
+                List<Long> longs = Func.toLongList(id);
+                if (contractInfo != null && longs.size() > 0) {
+                    List<ChangeTokenForm> changeTokenForms = changeTokenFormService.getBaseMapper().selectBatchIds(longs);
+                    if (changeTokenForms.size() > 0) {
+                        List<String> collect = changeTokenForms.stream().map(ChangeTokenForm::getChangeNumber).collect(Collectors.toList());
+                        name = "【" + contractInfo.getContractName() + "】" + date + " 变更令【" + StringUtils.join(collect, "、") + "】";
+                    }
+                }
             }
         }
         return R.data(200, name, "操作成功");
@@ -127,14 +139,14 @@ public class TaskController extends BladeController {
         }
 
         /*加锁*/
-        String redisValue = bladeRedis.get("meter:report:periodId-" + approvalDTO.getPeriodId());
+        String redisValue = bladeRedis.get("meter:report:contractId-" + approvalDTO.getContractId());
         if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
-            return R.fail(400, "当前期数已提交任务审批,请勿重复提交,60秒后再尝试");
+            return R.fail(400, "请勿重复提交,10秒后再尝试");
         }
-        bladeRedis.set("meter:report:periodId-" + approvalDTO.getPeriodId(), "1");
-        bladeRedis.expire("meter:report:periodId-" + approvalDTO.getPeriodId(), 60);
+        bladeRedis.set("meter:report:contractId-" + approvalDTO.getContractId(), "1");
+        bladeRedis.expire("meter:report:contractId-" + approvalDTO.getContractId(), 10);
 
-        if (ObjectUtil.isNotEmpty(approvalDTO.getType()) && (approvalDTO.getType().equals(1) || approvalDTO.getType().equals(2) || approvalDTO.getType().equals(3))) {
+        if (ObjectUtil.isNotEmpty(approvalDTO.getType()) && (approvalDTO.getType().equals(1) || approvalDTO.getType().equals(2) || approvalDTO.getType().equals(3) || approvalDTO.getType().equals(4))) {
             if (approvalDTO.getType().equals(1)) {
                 /*==================== 中间计量申请 ====================*/
                 Long taskId = SnowFlakeUtil.getId();
@@ -342,7 +354,62 @@ public class TaskController extends BladeController {
                 }
             } else if (approvalDTO.getType().equals(4)) {
                 /*==================== 变更令 ====================*/
-                //TODO
+                Set<String> aopParamsSet = new HashSet<>();
+                for (String id : approvalDTO.getPeriodId().split(",")) {
+                    Long taskId = SnowFlakeUtil.getId();
+                    /*获取变更令信息*/
+                    ChangeTokenForm changeTokenForm = changeTokenFormService.getById(id);
+                    if (changeTokenForm != null) {
+                        /*判断是否是未上报、或已废除*/
+                        if (!Arrays.asList(0, 3).contains(changeTokenForm.getApproveStatus())) {
+                            throw new ServiceException("当前变更令已上报,操作失败");
+                        }
+                        /*获取变更令下的计量单元部位信息*/
+                        List<ChangeTokenMeter> changeTokenMeters = changeTokenMeterService.getBaseMapper().selectList(Wrappers.<ChangeTokenMeter>lambdaQuery().eq(ChangeTokenMeter::getChangeTokenId, changeTokenForm.getId()));
+                        if (changeTokenMeters.size() > 0) {
+                            /*获取计量单元下的清单信息*/
+                            List<ChangeTokenInventory> changeTokenInventories = changeTokenInventoryService.getBaseMapper().selectList(Wrappers.<ChangeTokenInventory>lambdaQuery()
+                                    .eq(ChangeTokenInventory::getChangeTokenId, changeTokenForm.getId()));
+
+                            /*复制taskVO数据*/
+                            ChangeTokenFormTask changeTokenFormTask = BeanUtil.copyProperties(changeTokenForm, ChangeTokenFormTask.class);
+                            if (changeTokenFormTask != null) {
+                                changeTokenFormTask.setTaskId(taskId);
+                                changeTokenFormServiceTask.save(changeTokenFormTask); //变更令
+
+                                List<ChangeTokenMeterTask> changeTokenMeterTasks = BeanUtil.copyProperties(changeTokenMeters, ChangeTokenMeterTask.class);
+                                for (ChangeTokenMeterTask changeTokenMeterTask : changeTokenMeterTasks) {
+                                    changeTokenMeterTask.setTaskId(taskId);
+                                }
+                                changeTokenMeterServiceTask.saveBatch(changeTokenMeterTasks, 1000); //部位
+
+                                List<ChangeTokenInventoryTask> changeTokenInventoryTasks = BeanUtil.copyProperties(changeTokenInventories, ChangeTokenInventoryTask.class);
+                                for (ChangeTokenInventoryTask changeTokenInventoryTask : changeTokenInventoryTasks) {
+                                    changeTokenInventoryTask.setTaskId(taskId);
+                                }
+                                changeTokenInventoryServiceTask.saveBatch(changeTokenInventoryTasks, 1000); //清单
+
+                                /*构造创建审批任务*/
+                                try {
+                                    this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 4);
+                                } catch (Exception e) {
+                                    throw new ServiceException("创建审批任务异常,操作失败");
+                                }
+
+                                /*修改变更令原始数据的审批状态=待审批*/
+                                changeTokenFormService.update(Wrappers.<ChangeTokenForm>lambdaUpdate()
+                                        .set(ChangeTokenForm::getApproveStatus, 1)
+                                        .eq(ChangeTokenForm::getId, id));
+                                /*复制数据的审批状态=待审批*/
+                                changeTokenFormServiceTask.update(Wrappers.<ChangeTokenFormTask>lambdaUpdate()
+                                        .set(ChangeTokenFormTask::getApproveStatus, 1)
+                                        .eq(ChangeTokenFormTask::getTaskId, taskId)
+                                        .eq(ChangeTokenFormTask::getId, id));
+                            }
+                        }
+                    }
+                }
+                return R.data(200, aopParamsSet, "操作成功");
             }
         }
         return R.fail("操作失败");
@@ -357,33 +424,6 @@ public class TaskController extends BladeController {
      * @param meterTaskType
      */
     private void buildTaskInfo(Long taskId, MeterApprovalDTO approvalDTO, Set<String> aopParamsSet, Integer meterTaskType) {
-        /*预设流程,获取对应任务人id*/
-        String resultString = "";
-        if (ObjectUtil.isNotEmpty(approvalDTO.getFixedFlowId())) {
-            List<FixedFlowLink> fixedFlowLinks = jdbcTemplate.query("select fixed_flow_link_user,fixed_flow_link_sort from u_fixed_flow_link " +
-                    "where fixed_flow_id = " + approvalDTO.getFixedFlowId(), new BeanPropertyRowMapper<>(FixedFlowLink.class));
-            if (fixedFlowLinks.size() > 0) {
-                fixedFlowLinks.sort(Comparator.comparingInt(FixedFlowLink::getFixedFlowLinkSort));
-                StringBuilder sortStr = new StringBuilder();
-                for (FixedFlowLink link : fixedFlowLinks) {
-                    sortStr.append(link.getFixedFlowLinkUser()).append(",");
-                }
-                if (sortStr.length() > 0) {
-                    sortStr.deleteCharAt(sortStr.length() - 1);
-                }
-                resultString = sortStr.toString();
-            }
-        }
-        /*如果是预设流程,重新赋值任务人id*/
-        if (ObjectUtil.isNotEmpty(resultString)) {
-            /*检查预设任务流程的任务人是否存在签字证书信息*/
-            R<Object> objectR = archiveFileTaskClient.checkTaskUserCertificateInfo(resultString);
-            if (objectR.isSuccess()) {
-                approvalDTO.setTaskUserIds(resultString);
-            } else {
-                throw new ServiceException("未获取到预设任务流程的任务人的签字证书信息,操作失败");
-            }
-        }
         if (ObjectUtil.isEmpty(approvalDTO.getTaskUserIds())) {
             throw new ServiceException("未获取到任务人信息,操作失败");
         }
@@ -406,12 +446,12 @@ public class TaskController extends BladeController {
         task.setCreateDept(null);
         task.setTaskContent(ObjectUtil.isNotEmpty(approvalDTO.getTaskDesc()) ? approvalDTO.getTaskDesc() : null);
         task.setTaskUser(null);
-        task.setFormDataId(approvalDTO.getPeriodId().toString()); //数据指向,指向期数id
+        task.setFormDataId(approvalDTO.getPeriodId()); //数据指向,指向期数id(变更令为id英文逗号拼接)
         task.setTaskName(approvalDTO.getTaskName());
         task.setContractId(approvalDTO.getContractId().toString());
         task.setProjectId(approvalDTO.getProjectId().toString());
         task.setBatch(approvalDTO.getBatch());
-        task.setMeterTaskType(meterTaskType); //计量任务类型 1=中间计量申请,2=材料计量单,3=开工预付款计量单
+        task.setMeterTaskType(meterTaskType); //计量任务类型 1=中间计量申请,2=材料计量单,3=开工预付款计量单、4=变更令...
 
         task.setType(1);
         task.setApprovalType(5); //计量
@@ -502,7 +542,7 @@ public class TaskController extends BladeController {
 
     @PostMapping("/repeal")
     @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "任务废除(任务撤销、驳回审批)", notes = "按一期废除,即按整条任务废除(中期计量申请、材料计量单、开工预付款计量单、任务查看-废除任务)")
+    @ApiOperation(value = "任务废除(任务撤销、驳回审批)", notes = "按一期废除,即按整条任务废除(中期计量申请、材料计量单、开工预付款计量单、变更令、任务查看-废除任务)")
     @PushMessage(clientId = ClientIdConstant.METER_CLIENT_ID)
     public R<Object> repeal(@RequestBody TaskRepealDTO taskRepealDTO) {
         if (ObjectUtil.isNotEmpty(taskRepealDTO) && ObjectUtil.isNotEmpty(taskRepealDTO.getTaskId())) {
@@ -515,21 +555,16 @@ public class TaskController extends BladeController {
                 String processInstanceId = task.getProcessInstanceId();
                 List<TaskParallel> taskParallels = jdbcTemplate.query("SELECT * FROM u_task_parallel WHERE process_instance_id = '" + processInstanceId + "' ORDER BY sort", new BeanPropertyRowMapper<>(TaskParallel.class));
                 List<String> taskParallelsUserIds = taskParallels.stream().map(TaskParallel::getTaskUser).collect(Collectors.toList());
-                boolean previousUsersApproved = true;
                 List<String> name = new ArrayList<>();
                 for (TaskParallel parallel : taskParallels) {
-                    //判断是否有人未审批
-                    if (parallel.getStatus() != 2) {
-                        previousUsersApproved = false;
-                        name.add(parallel.getTaskUserName());
+                    if (parallel.getTaskUser().equals(SecureUtil.getUserId().toString())) {
                         break;
                     }
-                    //判断是否是当前用户之前的用户
-                    if (parallel.getTaskUser().equals(AuthUtil.getUserId().toString())) {
-                        break;
+                    if (parallel.getStatus() != 2) {
+                        name.add(parallel.getTaskUserName());
                     }
                 }
-                if (!previousUsersApproved) {
+                if (name.size() > 0) {
                     throw new ServiceException("当前任务还有【" + StringUtils.join(name, "、") + "】未完成审批,请您稍后再试");
                 }
 
@@ -622,7 +657,17 @@ public class TaskController extends BladeController {
                         jdbcTemplate.execute("DELETE FROM s_start_pay_meter_form_task WHERE meter_period_id = '" + periodId + "' AND task_id = " + taskRepealDTO.getTaskId());
 
                     } else if (task.getMeterTaskType().equals(4)) {
-                        //TODO 变更令
+                        for (String dataId : periodId.split(",")) {
+                            /*修改变更令的审批状态=未上报*/
+                            changeTokenFormService.update(Wrappers.<ChangeTokenForm>lambdaUpdate()
+                                    .set(ChangeTokenForm::getApproveStatus, 0)
+                                    .eq(ChangeTokenForm::getId, dataId));
+
+                            /*删除业务复制数据taskVO*/
+                            jdbcTemplate.execute("DELETE FROM s_change_token_form_task WHERE id = '" + dataId + "' AND task_id = " + taskRepealDTO.getTaskId());
+                            jdbcTemplate.execute("DELETE FROM s_change_token_meter_task WHERE change_token_id = '" + dataId + "' AND task_id = " + taskRepealDTO.getTaskId());
+                            jdbcTemplate.execute("DELETE FROM s_change_token_inventory_task WHERE change_token_id = '" + dataId + "' AND task_id = " + taskRepealDTO.getTaskId());
+                        }
                     }
 
                     /*删除文件附件、任务批注信息*/
@@ -679,7 +724,7 @@ public class TaskController extends BladeController {
         }
 
         if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
-            sqlString.append(" AND type = ?");
+            sqlString.append(" AND meter_task_type = ?");
             params.add(dto.getTypeValue());
         }
         if (ObjectUtil.isNotEmpty(dto.getStatusValue())) {
@@ -933,7 +978,20 @@ public class TaskController extends BladeController {
 
                 } else if (task.getMeterTaskType().equals(4)) {
                     /*==================== 变更令 ====================*/
-                    //TODO 变更令
+                    List<Long> longs = Func.toLongList(periodId);
+                    List<ChangeTokenFormTask> changeTokenFormTasks = changeTokenFormServiceTask.getBaseMapper().selectBatchIds(longs);
+                    List<ChangeTokenFormTaskVO> changeTokenFormTaskVOS = BeanUtil.copyProperties(changeTokenFormTasks, ChangeTokenFormTaskVO.class);
+                    for (ChangeTokenFormTaskVO changeTokenFormTaskVO : changeTokenFormTaskVOS) {
+                        String key = SecureUtil.getUserId() + ":" + changeTokenFormTaskVO.getId();
+                        TaskComment orDefault = taskCommentMap.getOrDefault(key, null);
+                        if (orDefault != null) {
+                            changeTokenFormTaskVO.setIsComment(1);
+                        } else {
+                            changeTokenFormTaskVO.setIsComment(0);
+                        }
+                    }
+                    vo.setTaskCenterDataInfo(changeTokenFormTaskVOS);
+
                 }
             }
         }
@@ -954,8 +1012,8 @@ public class TaskController extends BladeController {
                 MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(dataId);
                 vo.setBasicsInfo(middleMeterApplyTask);
 
-                /*清单信息(查询原始表数据,因为包含表中数据的计算统计,复制表中的数据不全)*/
-                List<MeterInventoryVO> formToTask = middleMeterApplyMapper.getForm(Long.parseLong(dataId), middleMeterApplyTask.getContractId(), middleMeterApplyTask.getContractUnitId());
+                /*清单信息*/
+                List<MeterInventoryVO> formToTask = middleMeterApplyMapper.getFormCopy(Long.parseLong(dataId), middleMeterApplyTask.getContractId(), middleMeterApplyTask.getContractUnitId());
                 vo.setAssociatedDataInfoList(formToTask);
 
             } else if (task.getMeterTaskType().equals(2)) {
@@ -965,8 +1023,20 @@ public class TaskController extends BladeController {
             } else if (task.getMeterTaskType().equals(3)) {
                 StartPayMeterFormTask startPayMeterFormTask = startPayMeterFormServiceTask.getById(dataId);
                 vo.setBasicsInfo(startPayMeterFormTask);
+
             } else if (task.getMeterTaskType().equals(4)) {
-                //TODO 变更令
+                ChangeTokenFormTask changeTokenFormTask = changeTokenFormServiceTask.getById(dataId);
+                if (changeTokenFormTask != null) {
+                    vo.setBasicsInfo(changeTokenFormTask);
+
+                    List<ChangeTokenMeterTask> changeTokenMeterTasks = changeTokenMeterServiceTask.getBaseMapper().selectList(Wrappers.<ChangeTokenMeterTask>lambdaQuery()
+                            .eq(ChangeTokenMeterTask::getChangeTokenId, changeTokenFormTask.getId()));
+                    vo.setChangeTokenMeterTaskList(changeTokenMeterTasks);
+
+                    List<ChangeTokenInventoryTask> changeTokenInventoryTasks = changeTokenInventoryServiceTask.getBaseMapper().selectList(Wrappers.<ChangeTokenInventoryTask>lambdaQuery()
+                            .eq(ChangeTokenInventoryTask::getChangeTokenId, changeTokenFormTask.getId()));
+                    vo.setChangeTokenInventoryTaskList(changeTokenInventoryTasks);
+                }
             }
 
             /*附件文件信息*/
@@ -980,17 +1050,17 @@ public class TaskController extends BladeController {
 
     @GetMapping("/data/remove")
     @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "任务关联的数据删除(清单、变更令删除)", notes = "传入任务id,数据dataId")
-    public R<Object> dataRemove(@RequestParam String id, @RequestParam String dataId) {
-        if (ObjectUtil.isEmpty(id) || ObjectUtil.isEmpty(dataId)) {
-            throw new ServiceException("任务、数据id不能为空");
+    @ApiOperation(value = "任务关联的数据删除(清单、变更令删除)", notes = "传入任务id,数据taskDetailId")
+    public R<Object> dataRemove(@RequestParam String id, @RequestParam String taskDetailId) {
+        if (ObjectUtil.isEmpty(id) || ObjectUtil.isEmpty(taskDetailId)) {
+            throw new ServiceException("任务、数据taskDetailId不能为空");
         }
 
         Task task = jdbcTemplate.query("SELECT meter_task_type,form_data_id FROM u_task WHERE id = " + id, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             if (task.getMeterTaskType().equals(1)) {
                 /*清单*/
-                InventoryFormApplyTask inventoryFormApplyTask = inventoryFormApplyServiceTask.getById(dataId);
+                InventoryFormApplyTask inventoryFormApplyTask = inventoryFormApplyServiceTask.getById(taskDetailId);
                 if (inventoryFormApplyTask != null) {
                     MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(inventoryFormApplyTask.getMiddleMeterId());
                     if (middleMeterApplyTask != null && inventoryFormApplyServiceTask.removeById(inventoryFormApplyTask.getId())) {
@@ -999,6 +1069,7 @@ public class TaskController extends BladeController {
                         BigDecimal result = currentMeterMoney.multiply(currentMeterTotal);
 
                         BigDecimal meterMoney = middleMeterApplyTask.getMeterMoney();
+
                         BigDecimal updatedMeterMoney = meterMoney.subtract(result); //相减
 
                         String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ? WHERE id = ?";
@@ -1020,58 +1091,41 @@ public class TaskController extends BladeController {
 
     @PostMapping("/data/inventoryFormApplyTask/update")
     @ApiOperationSupport(order = 8)
-    @ApiOperation(value = "清单数据修改", notes = "传入InventoryFormApplyTask")
-    public R<Object> dataInventoryFormApplyTaskUpdate(@RequestBody InventoryFormApplyTask obj) {
+    @ApiOperation(value = "清单数据修改", notes = "传入InventoryFormApplyTaskDTO")
+    public R<Object> dataInventoryFormApplyTaskUpdate(@RequestBody InventoryFormApplyTaskDTO dto) {
+        InventoryFormApplyTask obj = BeanUtil.copyProperties(dto, InventoryFormApplyTask.class);
+        if (ObjectUtil.isEmpty(obj)) {
+            throw new ServiceException("操作异常");
+        }
+        obj.setId(dto.getTaskDetailId());
         InventoryFormApplyTask inventoryFormApplyTask = inventoryFormApplyServiceTask.getById(obj.getId());
+        if (ObjectUtil.isEmpty(inventoryFormApplyTask)) {
+            throw new ServiceException("未获取到清单数据");
+        }
 
-        /*更新前数量*/
-        BigDecimal old = inventoryFormApplyTask.getCurrentMeterTotal();
-        /*更新后数量*/
-        BigDecimal update = obj.getCurrentMeterTotal();
-
-        /*如果更新前<更新后,相加*/
-        if (old.compareTo(update) < 0) {
-            BigDecimal total = update.subtract(old); //差值
-            BigDecimal currentMeterMoney = inventoryFormApplyTask.getCurrentMeterMoney();
-            BigDecimal result = currentMeterMoney.multiply(total);
-
-            if (inventoryFormApplyServiceTask.updateById(obj)) {
-
-                MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(inventoryFormApplyTask.getMiddleMeterId());
-                if (middleMeterApplyTask != null) {
-                    BigDecimal meterMoney = middleMeterApplyTask.getMeterMoney();
-                    BigDecimal updatedMeterMoney = meterMoney.add(result); //相加
+        if (inventoryFormApplyServiceTask.updateById(obj)) {
+            MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(inventoryFormApplyTask.getMiddleMeterId());
+            if (middleMeterApplyTask != null) {
 
-                    String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ? WHERE id = ?";
-                    Object[] params = {updatedMeterMoney, inventoryFormApplyTask.getMiddleMeterId()};
-                    jdbcTemplate.update(updateSql, params);
+                /*清单信息*/
+                List<MeterInventoryVO> formToTask = middleMeterApplyMapper.getFormCopy(middleMeterApplyTask.getId(), middleMeterApplyTask.getContractId(), middleMeterApplyTask.getContractUnitId());
 
-                    return R.data(200, updatedMeterMoney, "操作成功");
+                BigDecimal totalSum = BigDecimal.ZERO;
+                for (MeterInventoryVO meterInventoryVO : formToTask) {
+                    BigDecimal currentMeterTotal = meterInventoryVO.getCurrentMeterTotal();
+                    BigDecimal currentMeterMoney = meterInventoryVO.getCurrentMeterMoney();
+                    BigDecimal product = currentMeterTotal.multiply(currentMeterMoney);
+                    totalSum = totalSum.add(product);
                 }
-            }
 
-            /*如果更新前>更新后,相减*/
-        } else if (old.compareTo(update) > 0) {
-            BigDecimal total = old.subtract(update); //差值
-            BigDecimal currentMeterMoney = inventoryFormApplyTask.getCurrentMeterMoney();
-            BigDecimal result = currentMeterMoney.multiply(total);
+                String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ? WHERE id = ?";
+                Object[] params = {totalSum, inventoryFormApplyTask.getMiddleMeterId()};
+                jdbcTemplate.update(updateSql, params);
 
-            if (inventoryFormApplyServiceTask.updateById(obj)) {
-
-                MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(inventoryFormApplyTask.getMiddleMeterId());
-                if (middleMeterApplyTask != null) {
-                    BigDecimal meterMoney = middleMeterApplyTask.getMeterMoney();
-                    BigDecimal updatedMeterMoney = meterMoney.subtract(result); //相减
-
-                    String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ? WHERE id = ?";
-                    Object[] params = {updatedMeterMoney, inventoryFormApplyTask.getMiddleMeterId()};
-                    jdbcTemplate.update(updateSql, params);
-
-                    return R.data(200, updatedMeterMoney, "操作成功");
-                }
+                return R.data(200, totalSum, "操作成功");
             }
         }
-        return R.fail("操作失败");
+        return R.fail(400, "操作失败");
     }
 
     @PostMapping("/data/inventoryFormApplyTask/save")
@@ -1089,32 +1143,6 @@ public class TaskController extends BladeController {
         List<MeterInventoryVO> formList = middleMeterApplyService.addResolveForm(dto.getContractId(), dto.getNodeId(), dto.getIds());
 
         if (formList.size() != 0) {
-            /*原始表数据(为了/data/detail接口回显,因为详情接口查询的是原始数据)*/
-            List<InventoryFormApply> formApplies = formList.stream().map(l -> {
-                InventoryFormApply formApply = new InventoryFormApply();
-                formApply.setBusinessDate(middleMeterApplyTask.getBusinessDate());
-                formApply.setProjectId(dto.getProjectId());
-                formApply.setContractId(dto.getContractId());
-                formApply.setContractFormId(l.getId());
-                formApply.setMiddleMeterId(dto.getDataId());
-                formApply.setContractPeriodId(dto.getContractPeriodId());
-                formApply.setMeterNumber(middleMeterApplyTask.getMeterNumber());
-                formApply.setContractMeterId(dto.getNodeId());
-                formApply.setFormNumber(l.getFormNumber());
-                formApply.setFormName(l.getFormName());
-                formApply.setCurrentPrice(l.getCurrentPrice());
-                formApply.setBuildPictureTotal(l.getResolveTotal());
-                formApply.setChangeBuildPictureTotal(l.getChangeTotal());
-                if (l.getCurrentMeterTotal() != null && l.getCurrentPrice() != null) {
-                    formApply.setCurrentMeterTotal(l.getCurrentMeterTotal());
-                    formApply.setCurrentMeterMoney(l.getCurrentPrice().multiply(l.getCurrentMeterTotal()));
-                } else {
-                    throw new ServiceException("计量金额和计量数量不能为空");
-                }
-                return formApply;
-            }).collect(Collectors.toList());
-            inventoryFormApplyService.saveBatch(formApplies);
-
             /*复制表taskVO数据*/
             BigDecimal currentMeterMoneyTotal = BigDecimal.ZERO;
             List<InventoryFormApplyTask> formAppliesTask = formList.stream().map(l -> {
@@ -1188,6 +1216,7 @@ public class TaskController extends BladeController {
                 file.setProjectId(dto.getProjectId());
                 file.setContractId(dto.getContractId());
                 file.setMasterId(dto.getDataId());
+                file.setTaskId(dto.getTaskId());
             }
             attachmentFormServiceTask.saveOrUpdateBatch(fileList);
             return R.success("操作成功");
@@ -1276,7 +1305,7 @@ public class TaskController extends BladeController {
             /*当前审批轮次*/
             String sql_2 = "SELECT * FROM u_task_parallel WHERE process_instance_id = ? ORDER BY sort";
             List<TaskParallel> taskParallels = jdbcTemplate.query(sql_2, new Object[]{task.getProcessInstanceId()}, new BeanPropertyRowMapper<>(TaskParallel.class));
-            boolean isCurrentUserLastApprove = checkTheTaskPersonSort(task, taskParallels);
+            boolean isCurrentUserLastApprove = checkTheTaskPersonSort(taskParallels);
 
             /*单条业务数据状态*/
             updateCopyDataStatus(task, dto);
@@ -1304,27 +1333,29 @@ public class TaskController extends BladeController {
         return R.fail("操作失败");
     }
 
-    private boolean checkTheTaskPersonSort(Task task, List<TaskParallel> taskParallels) {
+    private boolean checkTheTaskPersonSort(List<TaskParallel> taskParallels) {
+        //未完成审批人信息
         List<String> name = new ArrayList<>();
-        boolean previousUsersApproved = true;
-        boolean isCurrentUserLastApprover = true;
+        //是否为最后一个审批人
+        boolean isCurrentUserLastApprover = false;
+
         for (TaskParallel parallel : taskParallels) {
-            //判断是否有人未审批
-            if (parallel.getStatus() != 2) {
-                previousUsersApproved = false;
-                name.add(parallel.getTaskUserName());
-                break;
-            }
-            //判断是否是当前用户之前的用户
             if (parallel.getTaskUser().equals(SecureUtil.getUserId().toString())) {
-                isCurrentUserLastApprover = false; //当前用户不是最后一个审批人
                 break;
             }
+            if (parallel.getStatus() != 2) {
+                name.add(parallel.getTaskUserName());
+            }
         }
-        if (!previousUsersApproved) {
+        if (name.size() > 0) {
             throw new ServiceException("当前任务还有【" + StringUtils.join(name, "、") + "】未完成审批,请您稍后再试");
         }
 
+        TaskParallel taskParallel = taskParallels.get(taskParallels.size() - 1);
+        if (taskParallel.getTaskUser().equals(SecureUtil.getUserId().toString())) {
+            isCurrentUserLastApprover = true;
+        }
+
         return isCurrentUserLastApprover;
     }
 
@@ -1337,11 +1368,13 @@ public class TaskController extends BladeController {
                     .isNull(MiddleMeterApplyTask::getStatus) //表示用户未选择,那么默认同意
             );
             List<Long> ids = middleMeterApplyTasks.stream().map(MiddleMeterApplyTask::getId).collect(Collectors.toList());
-            UpdateWrapper<MiddleMeterApplyTask> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.in("id", ids);
-            MiddleMeterApplyTask updateEntity = new MiddleMeterApplyTask();
-            updateEntity.setStatus(1);
-            middleMeterApplyServiceTask.update(updateEntity, updateWrapper);
+            if (ids.size() > 0) {
+                UpdateWrapper<MiddleMeterApplyTask> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", ids);
+                MiddleMeterApplyTask updateEntity = new MiddleMeterApplyTask();
+                updateEntity.setStatus(1);
+                middleMeterApplyServiceTask.update(updateEntity, updateWrapper);
+            }
 
         } else if (task.getMeterTaskType().equals(2)) {
             List<MaterialMeterFormTask> materialMeterFormTasks = materialMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<MaterialMeterFormTask>lambdaQuery()
@@ -1350,12 +1383,13 @@ public class TaskController extends BladeController {
                     .isNull(MaterialMeterFormTask::getStatus) //表示用户未选择,那么默认同意
             );
             List<Long> ids = materialMeterFormTasks.stream().map(MaterialMeterFormTask::getId).collect(Collectors.toList());
-            UpdateWrapper<MaterialMeterFormTask> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.in("id", ids);
-            MaterialMeterFormTask updateEntity = new MaterialMeterFormTask();
-            updateEntity.setStatus(1);
-            materialMeterFormServiceTask.update(updateEntity, updateWrapper);
-
+            if (ids.size() > 0) {
+                UpdateWrapper<MaterialMeterFormTask> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", ids);
+                MaterialMeterFormTask updateEntity = new MaterialMeterFormTask();
+                updateEntity.setStatus(1);
+                materialMeterFormServiceTask.update(updateEntity, updateWrapper);
+            }
         } else if (task.getMeterTaskType().equals(3)) {
             List<StartPayMeterFormTask> startPayMeterFormTasks = startPayMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<StartPayMeterFormTask>lambdaQuery()
                     .eq(StartPayMeterFormTask::getMeterPeriodId, formDataId)
@@ -1363,12 +1397,13 @@ public class TaskController extends BladeController {
                     .isNull(StartPayMeterFormTask::getStatus) //表示用户未选择,那么默认同意
             );
             List<Long> ids = startPayMeterFormTasks.stream().map(StartPayMeterFormTask::getId).collect(Collectors.toList());
-            UpdateWrapper<StartPayMeterFormTask> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.in("id", ids);
-            StartPayMeterFormTask updateEntity = new StartPayMeterFormTask();
-            updateEntity.setStatus(1);
-            startPayMeterFormServiceTask.update(updateEntity, updateWrapper);
-
+            if (ids.size() > 0) {
+                UpdateWrapper<StartPayMeterFormTask> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", ids);
+                StartPayMeterFormTask updateEntity = new StartPayMeterFormTask();
+                updateEntity.setStatus(1);
+                startPayMeterFormServiceTask.update(updateEntity, updateWrapper);
+            }
         } else if (task.getMeterTaskType().equals(4)) {
             //TODO 变更令
         }
@@ -1382,22 +1417,26 @@ public class TaskController extends BladeController {
                     .eq(MiddleMeterApplyTask::getTaskId, dto.getTaskId())
             );
             List<Long> middleMeterApplyTasksIds = middleMeterApplyTasks.stream().map(MiddleMeterApplyTask::getId).collect(Collectors.toList());
-            UpdateWrapper<MiddleMeterApplyTask> updateWrapper_1 = new UpdateWrapper<>();
-            updateWrapper_1.in("id", middleMeterApplyTasksIds);
-            MiddleMeterApplyTask updateEntity_1 = new MiddleMeterApplyTask();
-            updateEntity_1.setApproveStatus(2);
-            middleMeterApplyServiceTask.update(updateEntity_1, updateWrapper_1);
+            if (middleMeterApplyTasksIds.size() > 0) {
+                UpdateWrapper<MiddleMeterApplyTask> updateWrapper_1 = new UpdateWrapper<>();
+                updateWrapper_1.in("id", middleMeterApplyTasksIds);
+                MiddleMeterApplyTask updateEntity_1 = new MiddleMeterApplyTask();
+                updateEntity_1.setApproveStatus(2);
+                middleMeterApplyServiceTask.update(updateEntity_1, updateWrapper_1);
+            }
 
             List<InventoryFormApplyTask> inventoryFormAppliesTasks = inventoryFormApplyServiceTask.getBaseMapper().selectList(Wrappers.<InventoryFormApplyTask>lambdaQuery()
                     .eq(InventoryFormApplyTask::getContractPeriodId, formDataId)
                     .eq(InventoryFormApplyTask::getTaskId, dto.getTaskId())
             );
             List<Long> inventoryFormAppliesTasksIds = inventoryFormAppliesTasks.stream().map(InventoryFormApplyTask::getId).collect(Collectors.toList());
-            UpdateWrapper<InventoryFormApplyTask> updateWrapper_2 = new UpdateWrapper<>();
-            updateWrapper_2.in("id", inventoryFormAppliesTasksIds);
-            InventoryFormApplyTask updateEntity_2 = new InventoryFormApplyTask();
-            updateEntity_2.setApproveStatus(2);
-            inventoryFormApplyServiceTask.update(updateEntity_2, updateWrapper_2);
+            if (inventoryFormAppliesTasksIds.size() > 0) {
+                UpdateWrapper<InventoryFormApplyTask> updateWrapper_2 = new UpdateWrapper<>();
+                updateWrapper_2.in("id", inventoryFormAppliesTasksIds);
+                InventoryFormApplyTask updateEntity_2 = new InventoryFormApplyTask();
+                updateEntity_2.setApproveStatus(2);
+                inventoryFormApplyServiceTask.update(updateEntity_2, updateWrapper_2);
+            }
 
         } else if (task.getMeterTaskType().equals(2)) {
             List<MaterialMeterFormTask> materialMeterFormTasks = materialMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<MaterialMeterFormTask>lambdaQuery()
@@ -1405,24 +1444,26 @@ public class TaskController extends BladeController {
                     .eq(MaterialMeterFormTask::getTaskId, dto.getTaskId())
             );
             List<Long> ids = materialMeterFormTasks.stream().map(MaterialMeterFormTask::getId).collect(Collectors.toList());
-            UpdateWrapper<MaterialMeterFormTask> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.in("id", ids);
-            MaterialMeterFormTask updateEntity = new MaterialMeterFormTask();
-            updateEntity.setApproveStatus(2);
-            materialMeterFormServiceTask.update(updateEntity, updateWrapper);
-
+            if (ids.size() > 0) {
+                UpdateWrapper<MaterialMeterFormTask> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", ids);
+                MaterialMeterFormTask updateEntity = new MaterialMeterFormTask();
+                updateEntity.setApproveStatus(2);
+                materialMeterFormServiceTask.update(updateEntity, updateWrapper);
+            }
         } else if (task.getMeterTaskType().equals(3)) {
             List<StartPayMeterFormTask> startPayMeterFormTasks = startPayMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<StartPayMeterFormTask>lambdaQuery()
                     .eq(StartPayMeterFormTask::getMeterPeriodId, formDataId)
                     .eq(StartPayMeterFormTask::getTaskId, dto.getTaskId())
             );
             List<Long> ids = startPayMeterFormTasks.stream().map(StartPayMeterFormTask::getId).collect(Collectors.toList());
-            UpdateWrapper<StartPayMeterFormTask> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.in("id", ids);
-            StartPayMeterFormTask updateEntity = new StartPayMeterFormTask();
-            updateEntity.setApproveStatus(2);
-            startPayMeterFormServiceTask.update(updateEntity, updateWrapper);
-
+            if (ids.size() > 0) {
+                UpdateWrapper<StartPayMeterFormTask> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", ids);
+                StartPayMeterFormTask updateEntity = new StartPayMeterFormTask();
+                updateEntity.setApproveStatus(2);
+                startPayMeterFormServiceTask.update(updateEntity, updateWrapper);
+            }
         } else if (task.getMeterTaskType().equals(4)) {
             //TODO 变更令
         }
@@ -1437,7 +1478,12 @@ public class TaskController extends BladeController {
     private void updateTaskParallelStatus(Task task) {
         TaskParallel taskParallelOne = jdbcTemplate.query("SELECT * FROM u_task_parallel WHERE process_instance_id = '" + task.getProcessInstanceId() + "' AND task_user = " + SecureUtil.getUserId(), new BeanPropertyRowMapper<>(TaskParallel.class)).stream().findAny().orElse(null);
         if (taskParallelOne != null && taskParallelOne.getStatus().equals(1)) {
-            jdbcTemplate.execute("UPDATE u_task_parallel SET status = 2 WHERE id = " + taskParallelOne.getId());
+            String sql = "UPDATE u_task_parallel SET status = ? ,update_time = ? WHERE id = ?";
+            Object[] param = {
+                    2,
+                    new java.sql.Timestamp(System.currentTimeMillis()),
+                    taskParallelOne.getId()};
+            jdbcTemplate.update(sql, param);
         }
     }
 

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

@@ -20,6 +20,8 @@ import org.apache.ibatis.annotations.Param;
 import org.springblade.meter.entity.AttachmentForm;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.Set;
+
 /**
  * 附件表 Mapper 接口
  *
@@ -30,4 +32,6 @@ public interface AttachmentFormMapper extends BaseMapper<AttachmentForm> {
 
 
     void deleteByMasterId(@Param("masterId") Long masterId);
+
+    void deleteByMasterIds(@Param("ids") Set<Long> ids);
 }

+ 7 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/AttachmentFormMapper.xml

@@ -23,6 +23,13 @@
         DELETE FROM s_attachment_form
         where master_id = #{masterId}
     </delete>
+    <delete id="deleteByMasterIds">
+        DELETE FROM s_attachment_form
+        where file_type = 2 and master_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
 
 
 </mapper>

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

@@ -81,4 +81,6 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
     List<ChangeFormVO2> getAllCollectForm(@Param("tokenId") Long id);
 
     void deleteCollectForm(@Param("tokenId")Long id);
+
+    List<MiddleMeterApply> getChangeMiddleTotal(@Param("contractId") Long contractId,@Param("tokenId") Long id);
 }

+ 6 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml

@@ -269,6 +269,12 @@
         from s_change_token_inventory cti
         where is_deleted = 0 and is_collect_form = 1 and change_token_id = #{tokenId}
     </select>
+    <select id="getChangeMiddleTotal" resultType="org.springblade.meter.entity.MiddleMeterApply">
+        select *
+        from s_middle_meter_apply
+        where is_deleted = 0 and contract_id = #{contractId} and
+            FIND_IN_SET(#{tokenId}, change_token_ids)
+    </select>
 
 
 </mapper>

+ 9 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormTaskMapper.java

@@ -0,0 +1,9 @@
+package org.springblade.meter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.meter.entity.*;
+
+
+public interface ChangeTokenFormTaskMapper extends BaseMapper<ChangeTokenFormTask> {
+
+}

+ 5 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormTaskMapper.xml

@@ -0,0 +1,5 @@
+<?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.ChangeTokenFormTaskMapper">
+
+</mapper>

+ 9 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryTaskMapper.java

@@ -0,0 +1,9 @@
+package org.springblade.meter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.meter.entity.ChangeTokenInventoryTask;
+
+
+public interface ChangeTokenInventoryTaskMapper extends BaseMapper<ChangeTokenInventoryTask> {
+
+}

+ 5 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryTaskMapper.xml

@@ -0,0 +1,5 @@
+<?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.ChangeTokenInventoryTaskMapper">
+
+</mapper>

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

@@ -0,0 +1,8 @@
+package org.springblade.meter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.meter.entity.ChangeTokenMeterTask;
+
+public interface ChangeTokenMeterTaskMapper extends BaseMapper<ChangeTokenMeterTask> {
+
+}

+ 5 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenMeterTaskMapper.xml

@@ -0,0 +1,5 @@
+<?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.ChangeTokenMeterTaskMapper">
+
+</mapper>

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

@@ -56,13 +56,15 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
 
     List<MeterInventoryVO> getForm(@Param("id") Long id,@Param("contractId") Long contractId,@Param("nodeId") Long nodeId);
 
+    List<MeterInventoryVO> getFormCopy(@Param("id") Long id,@Param("contractId") Long contractId,@Param("nodeId") Long nodeId);
+
     ChangeTokenForm getTokenById(@Param("id") Long id);
 
     String getContractInfo(@Param("contractId") Long contractId);
 
     Integer getNodeChild(@Param("contractId") Long contractId,@Param("nodeId") Long contractUnitId);
 
-    List<Long> getNodeOtherFormId(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId,@Param("nodeId") Long nodeId);
+    List<Long> getNodeOtherFormId(@Param("middleId") Long id,@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId,@Param("nodeId") Long nodeId);
 
     BigDecimal getCurrentMeterMoney(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
 
@@ -73,4 +75,10 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
     List<NodeSortVO> getAllNode(@Param("contractId") Long contractId);
 
     Set<ChangeTokenForm> getNodeToken(@Param("contractId") Long contractId,@Param("ids") List<Long> ids,@Param("nodeId") Long nodeId,@Param("bDate") String businessDate);
+
+    Set<Long> getMiddleIds(@Param("ids") List<Long> ids);
+
+    List<MiddleMeterApplyVO2> getAllAPPlyAndForm(@Param("ids") Set<Long> middleIds);
+
+    void batchUpdateMiddle(@Param("list") List<MiddleMeterApplyVO2> vo2s);
 }

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

@@ -27,6 +27,16 @@
         <result column="picture_url" property="pictureUrl"/>
         <result column="calculate_formula" property="calculateFormula"/>
     </resultMap>
+    <update id="batchUpdateMiddle">
+        <foreach item="item" collection="list" separator=";">
+            UPDATE s_middle_meter_apply
+            <set>
+                change_token_number = #{item.changeTokenNumber},
+                change_token_ids = #{item.changeTokenIds},
+            </set>
+            where id = #{item.id}
+        </foreach>
+    </update>
     <select id="getFormList" resultType="org.springblade.meter.vo.ResolveInventoryVO">
         select id,form_number,form_name,current_price,contract_total,change_total,
                change_total as buildChangeTotal,
@@ -108,7 +118,7 @@
         from s_middle_meter_apply where id = #{id}
     </select>
     <select id="getForm" resultType="org.springblade.meter.vo.MeterInventoryVO">
-        select ifa.contract_form_id as id,ifa.form_number,ifa.form_name,ifa.current_price,ifa.build_picture_total as resolveTotal,
+        select ifa.id as taskDetailId,ifa.contract_form_id as id,ifa.form_number,ifa.form_name,ifa.current_price,ifa.build_picture_total as resolveTotal,
                ifa.change_build_picture_total as changeTotal,
                ifa.current_meter_total as currentMeterTotal,0 as containChangeTotal,
                ifa.current_meter_money as currentMeterMoney,
@@ -120,6 +130,21 @@
         where ifa.contract_id = #{contractId} and ifa.is_deleted = 0
         AND ifa.middle_meter_id = #{id}
     </select>
+
+    <select id="getFormCopy" resultType="org.springblade.meter.vo.MeterInventoryVO">
+        select ifa.id as taskDetailId,ifa.contract_form_id as id,ifa.form_number,ifa.form_name,ifa.current_price,ifa.build_picture_total as resolveTotal,
+               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_task ifa
+        where ifa.contract_id = #{contractId} and ifa.is_deleted = 0
+          AND ifa.middle_meter_id = #{id}
+    </select>
+
     <select id="getTokenById" resultType="org.springblade.meter.entity.ChangeTokenForm">
         select *
         from s_change_token_form where id = #{id}
@@ -133,6 +158,9 @@
     <select id="getNodeOtherFormId" resultType="java.lang.Long">
         select contract_form_id from s_inventory_form_apply
         where contract_id = #{contractId} and is_deleted = 0 and contract_period_id = #{contractPeriodId} and contract_meter_id = #{nodeId}
+        <if test="middleId != null and middleId != ''">
+            and middle_meter_id != #{middleId}
+        </if>
     </select>
     <select id="getCurrentMeterMoney" resultType="java.math.BigDecimal">
         select ifnull(sum(meter_money),0)
@@ -173,6 +201,22 @@
             limit 1)
         </foreach>
     </select>
+    <select id="getMiddleIds" resultType="java.lang.Long">
+        select middle_meter_id from s_inventory_form_apply
+        where id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
+    <select id="getAllAPPlyAndForm" resultType="org.springblade.meter.vo.MiddleMeterApplyVO2">
+        select mma.id,mma.contract_id,mma.contract_unit_id,mma.business_date,
+               (select GROUP_CONCAT(ifa.contract_form_id) from s_inventory_form_apply ifa where mma.id = ifa.middle_meter_id and ifa.is_deleted = 0) as formIds
+        from s_middle_meter_apply mma
+        where mma.id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 
 
 </mapper>

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

@@ -19,6 +19,8 @@ package org.springblade.meter.service;
 import org.springblade.meter.entity.AttachmentForm;
 import org.springblade.core.mp.base.BaseService;
 
+import java.util.Set;
+
 /**
  * 附件表 服务类
  *
@@ -27,6 +29,8 @@ import org.springblade.core.mp.base.BaseService;
  */
 public interface IAttachmentFormService extends BaseService<AttachmentForm> {
 
-
+    //删除根据masterId
     void deleteByMasterId(Long masterId);
+    //删除中间计量申请下的变更附件
+    void deleteByMasterIds(Set<Long> ids);
 }

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

@@ -0,0 +1,8 @@
+package org.springblade.meter.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.meter.entity.ChangeTokenFormTask;
+
+public interface IChangeTokenFormServiceTask extends BaseService<ChangeTokenFormTask> {
+
+}

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

@@ -0,0 +1,8 @@
+package org.springblade.meter.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.meter.entity.ChangeTokenInventoryTask;
+
+public interface IChangeTokenInventoryServiceTask extends BaseService<ChangeTokenInventoryTask> {
+
+}

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

@@ -0,0 +1,8 @@
+package org.springblade.meter.service;
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.meter.entity.ChangeTokenMeterTask;
+
+public interface IChangeTokenMeterServiceTask extends BaseService<ChangeTokenMeterTask> {
+
+}

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

@@ -26,6 +26,7 @@ import org.springblade.meter.vo.*;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
+import java.util.Set;
 
 /**
  * 中间计量申请表 服务类
@@ -36,7 +37,7 @@ import java.util.List;
 public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply> {
 
 
-    List<ResolveInventoryVO> addFormList(Long contractId,Long contractPeriodId ,Long nodeId , String ids);
+    List<ResolveInventoryVO> addFormList(Long id,Long contractId,Long contractPeriodId ,Long nodeId , String ids);
 
     List<MeterInventoryVO> addResolveForm(Long contractId ,Long nodeId ,String ids);
 
@@ -60,6 +61,9 @@ public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply>
 
     BigDecimal getCurrentMeterMoney(MiddleMeterApply middleMeterApply);
 
+    //异步重新计算受变更影响的中间计量申请附件,ids为中间计量申请和清单表的id,需要重新获取
+    void asyncCalculateMiddleMeter(List<Long> ids);
+
     String test();
 
 }

+ 7 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/AttachmentFormServiceImpl.java

@@ -22,6 +22,8 @@ import org.springblade.meter.service.IAttachmentFormService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.Set;
+
 /**
  * 附件表 服务实现类
  *
@@ -36,4 +38,9 @@ public class AttachmentFormServiceImpl extends BaseServiceImpl<AttachmentFormMap
     public void deleteByMasterId(Long masterId) {
         baseMapper.deleteByMasterId(masterId);
     }
+
+    @Override
+    public void deleteByMasterIds(Set<Long> ids) {
+        baseMapper.deleteByMasterIds(ids);
+    }
 }

+ 22 - 5
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java

@@ -41,10 +41,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -599,6 +596,13 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         List<InventoryFormMeter> list5 = new ArrayList<>();
         //清单与中间计量申请中间表集合,用于批量修改
         List<InventoryFormApply> list6 = new ArrayList<>();
+        //获取清单中所有影响的中间计量
+        String middle = allForm.stream().filter(l -> StringUtils.isNotBlank(l.getApplyIds())).map(l -> l.getApplyIds()).collect(Collectors.joining(","));
+        //用于修改中间计量申请中的变更编号,变更id,变更附件
+        List<Long> list7 = new ArrayList<>();
+        if (StringUtils.isNotBlank(middle)){
+            list7 = Func.toLongList(middle).stream().distinct().collect(Collectors.toList());
+        }
         for (ChangeFormVO2 vo2 : allForm) {
             //判断是否存在分解信息,如果不存在新增
             if (vo2.getNewestChangeTotal() == null){
@@ -665,6 +669,10 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
             .set(ChangeTokenForm::getCommandDate, LocalDateTime.now()));
         //异步重新计算节点金额,和修改施工图号,此方法放到最后,待所有操作成功后再执行
         meterTreeContractService.asyncCalculateNodeMoney(allNode);
+        //异步重新计算受变更影响的中间计量申请附件
+        if (list7.size() > 0) {
+            middleMeterApplyService.asyncCalculateMiddleMeter(list7);
+        }
     }
 
     /**
@@ -689,6 +697,13 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
             throw new ServiceException("清单:"+s+"在当前变更之后又发生过变更,请先撤销上一次变更");
         }
 
+        //双重验证,中间计量申请存在先删除变更清单,又添加回来的操作
+        List<MiddleMeterApply> middles = baseMapper.getChangeMiddleTotal(form.getContractId(),id);
+        if (middles.size() > 0){
+            MiddleMeterApply apply = middles.get(0);
+            throw new ServiceException("当前变更令已经修改中间计量申请-"+apply.getPeriodNumber()+"-"+apply.getEngineerDivide()+"-的数据,不能撤销变更,删除计量清单之后允许撤销");
+        }
+
         //判断是否修改过中间计量申请,修改过则不能撤销
         //获取当前变更令所有修改的中间计量申请的id
         String ids = baseMapper.getUpdateMiddleForm(id);
@@ -698,10 +713,11 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
             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+"的数据,不能撤销变更,删除计量之后允许撤销");
+                throw new ServiceException("当前变更令已经修改中间计量申请的清单:"+s+"的数据,不能撤销变更,删除计量清单之后允许撤销");
             }
         }
 
+
         //通过汇总项修改合同清单
         List<ChangeFormVO2> vo3 = baseMapper.getAllCollectForm(id);
         if (vo3.size() == 0){
@@ -745,5 +761,6 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
                 .eq(ChangeTokenForm::getId,id)
                 .set(ChangeTokenForm::getCommandStatus,0));
+
     }
 }

+ 12 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceTaskImpl.java

@@ -0,0 +1,12 @@
+package org.springblade.meter.service.impl;
+
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.meter.entity.*;
+import org.springblade.meter.mapper.ChangeTokenFormTaskMapper;
+import org.springblade.meter.service.*;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ChangeTokenFormServiceTaskImpl extends BaseServiceImpl<ChangeTokenFormTaskMapper, ChangeTokenFormTask> implements IChangeTokenFormServiceTask {
+
+}

+ 12 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenInventoryServiceTaskImpl.java

@@ -0,0 +1,12 @@
+package org.springblade.meter.service.impl;
+
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.meter.entity.ChangeTokenInventoryTask;
+import org.springblade.meter.mapper.ChangeTokenInventoryTaskMapper;
+import org.springblade.meter.service.IChangeTokenInventoryServiceTask;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ChangeTokenInventoryServiceTaskImpl extends BaseServiceImpl<ChangeTokenInventoryTaskMapper, ChangeTokenInventoryTask> implements IChangeTokenInventoryServiceTask {
+
+}

+ 12 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenMeterServiceTaskImpl.java

@@ -0,0 +1,12 @@
+package org.springblade.meter.service.impl;
+
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.meter.entity.ChangeTokenMeterTask;
+import org.springblade.meter.mapper.ChangeTokenMeterTaskMapper;
+import org.springblade.meter.service.IChangeTokenMeterServiceTask;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ChangeTokenMeterServiceTaskImpl extends BaseServiceImpl<ChangeTokenMeterTaskMapper, ChangeTokenMeterTask> implements IChangeTokenMeterServiceTask {
+
+}

+ 47 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -33,6 +33,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.meter.utils.ForestNodeMerger;
 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;
 
@@ -71,7 +72,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
      * 添加清单
      */
     @Override
-    public List<ResolveInventoryVO> addFormList(Long contractId,Long contractPeriodId,Long nodeId ,String ids) {
+    public List<ResolveInventoryVO> addFormList(Long id,Long contractId,Long contractPeriodId,Long nodeId ,String ids) {
         //获取当前节点下关联的清单,如果没有直接返回
         List<ResolveInventoryVO> vos = new ArrayList<>();
         List<Long> list = formMeterService.getNodeAllForm(nodeId);
@@ -79,7 +80,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             return vos;
         }
         //获取当前计量期,当前节点下其他申请所包含的清单
-        List<Long> formIds = baseMapper.getNodeOtherFormId(contractId,contractPeriodId,nodeId);
+        List<Long> formIds = baseMapper.getNodeOtherFormId(id,contractId,contractPeriodId,nodeId);
         if (formIds.size() != 0){
           list.removeAll(formIds);
         }
@@ -195,8 +196,8 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
      */
     @Override
     public MiddleMeterTokenVO getNodeToken(Long contractId,Long nodeId, String formIds, String businessDate) {
-        if (nodeId == null || StringUtils.isBlank(formIds) || StringUtils.isBlank(businessDate)){
-            throw new ServiceException("请求参数错误,请检查是否有节点id,业务日期,和计量清单");
+        if (contractId == null || nodeId == null || StringUtils.isBlank(businessDate)){
+            throw new ServiceException("请求参数错误,请检查是否有节点id,业务日期");
         }
         MiddleMeterTokenVO vo = new MiddleMeterTokenVO();
         //当前没有清单就没有变更令
@@ -458,6 +459,48 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         return baseMapper.getCurrentMeterMoney(middleMeterApply.getContractId(),middleMeterApply.getContractPeriodId());
     }
 
+    /**
+     * 异步重新计算受变更影响的中间计量申请附件,ids为中间计量申请和清单表的id,需要重新获取
+     * @param ids
+     */
+    @Override
+    @Transactional
+    @Async
+    public void asyncCalculateMiddleMeter(List<Long> ids) {
+        //等待一秒
+        try {
+            Thread.sleep(1000L);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        //根据中间表id获取中间计量申请表id,并且去重
+        Set<Long> middleIds = baseMapper.getMiddleIds(ids);
+        //获取所有的中间计量申请,并且携带所有关联的中间表的清单ids
+        List<MiddleMeterApplyVO2> vo2s = baseMapper.getAllAPPlyAndForm(middleIds);
+        //删除所有id的变更附件
+        attachmentFormService.deleteByMasterIds(middleIds);
+        //调用方法获取最新的变更编号,变更令,附件信息
+        List<AttachmentForm> fs = new ArrayList<>();
+        for (MiddleMeterApplyVO2 vo2 : vo2s) {
+            MiddleMeterTokenVO vo = this.getNodeToken(vo2.getContractId(), vo2.getContractUnitId(), vo2.getFormIds(), vo2.getBusinessDate().toString());
+            vo2.setChangeTokenNumber(vo.getChangeTokenNumber());
+            vo2.setChangeTokenIds(vo.getChangeTokenIds());
+            if (vo.getFiles() != null){
+                List<AttachmentForm> files = vo.getFiles();
+                for (AttachmentForm file : files) {
+                    file.setMasterId(vo2.getId());
+                    fs.add(file);
+                }
+            }
+        }
+        //批量修改变更编号,变更令
+        baseMapper.batchUpdateMiddle(vo2s);
+        //批量新增附件信息
+        if (fs.size() > 0) {
+            attachmentFormService.saveBatch(fs);
+        }
+    }
+
     @Override
     public String test() {
         Long contractId = 1612329251049537537L;