Переглянути джерело

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

huangtf 1 рік тому
батько
коміт
971edba24f
35 змінених файлів з 665 додано та 154 видалено
  1. 1 1
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 4 4
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertConclusion.java
  3. 14 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java
  4. 3 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ExpertInspection.java
  5. 2 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java
  6. 1 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClient.java
  7. 18 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/UpdateExpertVO.java
  8. 31 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/TaskDataUpdateRecord.java
  9. 83 20
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExpertConclusionController.java
  10. 14 11
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  11. 6 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java
  12. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClientImpl.java
  13. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.java
  14. 6 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.xml
  15. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  16. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  17. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.java
  18. 2 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.xml
  19. 10 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertConclusionService.java
  20. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertScoreService.java
  21. 4 4
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  22. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IExpertInspectionService.java
  23. 77 10
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java
  24. 10 5
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java
  25. 25 16
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  26. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ExpertInspectionServiceImpl.java
  27. 6 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  28. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  29. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  30. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  31. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  32. 26 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  33. 8 6
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MidPayItemController.java
  34. 289 43
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  35. 1 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

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

@@ -73,7 +73,7 @@ public interface LauncherConstant {
     String APPLICATION_XXLJOB_ADMIN_NAME = APPLICATION_NAME_PREFIX + "xxljob-admin";
 
     /**
-     * nacos dev 地址 172.31.222.127   192.168.0.109     127.0.0.1
+     * nacos dev 地址 172.31.222.127   192.168.0.109     127.0.0.1    172.30.224.81(216.210)
      */
     String NACOS_DEV_ADDR = "127.0.0.1:8848";
 

+ 4 - 4
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertConclusion.java

@@ -65,10 +65,10 @@ public class ArchiveExpertConclusion extends BaseEntity {
     @ApiModelProperty("存在问题及建议")
     private String questionSuggest;
 
-    @ApiModelProperty("审批状态,0未上报,1待审批,2已审批,3已废除")
-    private Integer approveStatus;
-
-    @ApiModelProperty("审批状态,0未上报,1待审批,2已审批,3已废除")
+    @ApiModelProperty("生成报告PDF时间")
     private LocalDate approveDate;
 
+    @ApiModelProperty("任务")
+    private Long taskId;
+
 }

+ 14 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchiveExpertScore.java

@@ -42,6 +42,9 @@ public class ArchiveExpertScore extends BaseEntity {
     @ApiModelProperty("项目id")
     private Long projectId;
 
+    @ApiModelProperty("结论id")
+    private Long conclusionId;
+
     @ApiModelProperty("单位类型:1业主2监理3施工")
     private Integer unitType;
 
@@ -72,4 +75,15 @@ public class ArchiveExpertScore extends BaseEntity {
         this.normative = normative;
         this.normativeDeduction = normativeDeduction;
     }
+
+    public ArchiveExpertScore(Long projectId, Long conclusionId, Integer unitType, String scoreItem, Integer integrality, Integer integralityDeduction, Integer normative, Integer normativeDeduction) {
+        this.projectId = projectId;
+        this.conclusionId = conclusionId;
+        this.unitType = unitType;
+        this.scoreItem = scoreItem;
+        this.integrality = integrality;
+        this.integralityDeduction = integralityDeduction;
+        this.normative = normative;
+        this.normativeDeduction = normativeDeduction;
+    }
 }

+ 3 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ExpertInspection.java

@@ -19,6 +19,9 @@ public class ExpertInspection extends BaseEntity {
     @ApiModelProperty("项目id")
     private Long projectId;
 
+    @ApiModelProperty("结论id")
+    private Long conclusionId;
+
     @ApiModelProperty("单位类型:1施工2监理3业主")
     private Integer UnitType;
 

+ 2 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java

@@ -3,6 +3,7 @@ package org.springblade.archive.feign;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.archive.vo.UpdateExpertVO;
 import org.springblade.common.constant.ArchiveConstant;
 import org.springblade.common.constant.EVisaConstant;
 import org.springblade.core.tool.api.R;
@@ -42,5 +43,5 @@ public interface ArchiveAutoClient {
      * 批量修改档案专家,参数为节点集合
      */
     @PostMapping(API_PREFIX + "/batchUpdateExpertId")
-    R<Boolean> batchUpdateExpertId(@RequestParam String userId,@RequestParam List<Long> ids);
+    R<Boolean> batchUpdateExpertId(@RequestBody UpdateExpertVO vo);
 }

+ 1 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClient.java

@@ -14,5 +14,5 @@ public interface ArchiveExpertConclusionClient {
     String API_PREFIX = "/api/archive/archiveExpertConclusion";
 
     @GetMapping(API_PREFIX + "/saveBaseTableInfo")
-    R saveBaseTableInfo(@RequestParam Long projectId, @RequestParam String appUrl);
+    R saveBaseTableInfo(@RequestParam Long projectId, @RequestParam String appUrl,@RequestParam Long taskId);
 }

+ 18 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/UpdateExpertVO.java

@@ -0,0 +1,18 @@
+package org.springblade.archive.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Param   用于批量修改传参
+ * @Author wangwl
+ * @Date 2024/1/10 18:18
+ **/
+@Data
+public class UpdateExpertVO implements Serializable {
+    private static final long serialVersionUID = 996L;
+
+    private String ids;
+    private String userid;
+}

+ 31 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/TaskDataUpdateRecord.java

@@ -0,0 +1,31 @@
+package org.springblade.meter.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName(value = "s_task_data_update_record")
+public class TaskDataUpdateRecord implements Serializable {
+
+    @ApiModelProperty(value = "主键id")
+    private Long id;
+
+    @ApiModelProperty(value = "中间计量数据id(变更令时=任务id)")
+    private Long dataId;
+
+    @ApiModelProperty(value = "中间计量数据下的清单id(变更令时=变更令id)")
+    private Long formId;
+
+    @ApiModelProperty(value = "原始清单数据json")
+    private String rawFormDataJson;
+
+    @ApiModelProperty(value = "原始变更令中间数据json")
+    private String rawChangCenterDataJson;
+
+    @ApiModelProperty(value = "原始变更令右边数据json")
+    private String rawChangRightDataJson;
+
+}

+ 83 - 20
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveExpertConclusionController.java

@@ -11,10 +11,7 @@ import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.archive.service.IArchiveExpertConclusionService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -67,25 +64,13 @@ public class ArchiveExpertConclusionController extends BladeController {
     public R getAppPreview(@RequestParam Long projectId) {
         return R.data(conclusionService.getAppPreview(projectId));
     }
-    /**
-     * 在线验收-查看验收报告
-     */
-    @GetMapping("/getTable")
-    @ApiOperationSupport(order = 5)
-    @ApiOperation(value = "在线验收-查看验收报告", notes = "传入当前项目id,返回当期验收报告URL地址")
-    @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
-    })
-    public R getTable(@RequestParam Long projectId) {
-        return R.data(conclusionService.getTable(projectId));
-    }
 
     /**
      * 编写结论-是否生成打分表
      */
     @GetMapping("/creatScore")
-    @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "验收申请-是否生成打分表", notes = "传入当前项目id,返回1选择0不选择")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "编写结论-是否生成打分表", notes = "传入当前项目id,返回1选择0不选择")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
     })
@@ -97,8 +82,8 @@ public class ArchiveExpertConclusionController extends BladeController {
      * 编写结论-修改是否生成打分表
      */
     @GetMapping("/updateScore")
-    @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "验收申请-修改是否生成打分表", notes = "传入当前项目id,传入1选择0不选择")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "编写结论-修改是否生成打分表", notes = "传入当前项目id,传入1选择0不选择")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
             @ApiImplicitParam(name = "isSelect", value = "1选择0不选择", required = true)
@@ -107,4 +92,82 @@ public class ArchiveExpertConclusionController extends BladeController {
         conclusionService.updateScore(projectId,isSelect);
         return R.data("修改成功");
     }
+
+    /**
+     * 在线验收-获取当前期在线验收id
+     */
+    @GetMapping("/getCurrentId")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "在线验收-获取当前期在线验收id", notes = "传入当前项目id,返回当前期在线验收id")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R getCurrentId(@RequestParam Long projectId) {
+        return R.data(conclusionService.getCurrentId(projectId));
+    }
+
+    /**
+     * 在线验收-下一步编写报告,校验
+     */
+    @GetMapping("/checkTable")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "在线验收-下一步编写报告,校验", notes = "传入当前项目id,返回ture允许跳转")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R checkTable(@RequestParam Long projectId) {
+        return R.data(conclusionService.checkTable(projectId));
+    }
+
+    /**
+     * 在线验收-获取结论
+     */
+    @GetMapping("/getTable")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "在线验收-获取结论", notes = "传入当前项目id,返回结论信息")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R<ArchiveExpertConclusion> getTable(@RequestParam Long projectId) {
+        return R.data(conclusionService.getTable(projectId));
+    }
+
+
+    /**
+     * 编写结论-暂存草稿
+     */
+    @PostMapping("/saveTable")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "在线验收-暂存草稿", notes = "传入结论信息")
+    public R saveTable(@RequestBody ArchiveExpertConclusion conclusion) {
+        conclusionService.updateById(conclusion);
+        return R.data("草稿保存成功");
+    }
+
+    /**
+     * 编写结论-校验提交权限
+     */
+    @GetMapping("/checkSubmit")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "在线验收-确认提交权限", notes = "传入项目id,返回true代表为专家组长,显示提交按钮")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R checkSubmit(@RequestParam Long projectId) {
+        return R.data(conclusionService.checkSubmit(projectId));
+    }
+
+    /**
+     * 编写结论-确认提交
+     */
+    @PostMapping("/submitTable")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "在线验收-确认提交", notes = "传入结论信息")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+    })
+    public R submitTable(@RequestBody ArchiveExpertConclusion conclusion) {
+        conclusionService.submitTable(conclusion);
+        return R.data("提交成功");
+    }
 }

+ 14 - 11
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -808,10 +808,11 @@ public class ArchivesAutoController extends BladeController {
 	@ApiOperation(value = "在线验收-修改抽检状态", notes = "在当前页面停留30秒再调接口:传入档案id,返回查阅完成,可以显示到页面")
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
-			@ApiImplicitParam(name = "archiveId", value = "档案id", required = true)
+			@ApiImplicitParam(name = "archiveId", value = "档案id", required = true),
+			@ApiImplicitParam(name = "conclusionId", value = "当前期id", required = true)
 	})
-	public R updateInspectStatus(@RequestParam Long archiveId,@RequestParam Long projectId) {
-		archivesAutoService.updateInspectStatus(archiveId,projectId);
+	public R updateInspectStatus(@RequestParam Long archiveId,@RequestParam Long projectId,@RequestParam Long conclusionId) {
+		archivesAutoService.updateInspectStatus(archiveId,projectId,conclusionId);
 		return R.data("当前案卷查阅完成");
 	}
 
@@ -823,10 +824,11 @@ public class ArchivesAutoController extends BladeController {
 	@ApiOperation(value = "在线验收-获取档案文件抽检意见", notes = "传入项目id,文件id")
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
-			@ApiImplicitParam(name = "fileId", value = "文件id", required = true)
+			@ApiImplicitParam(name = "fileId", value = "文件id", required = true),
+			@ApiImplicitParam(name = "conclusionId", value = "当前期id", required = true)
 	})
-	public R<ExpertInspectionVO> getArchiveFileOpinion(@RequestParam Long fileId,@RequestParam Long projectId) {
-		ExpertInspectionVO vo = archivesAutoService.getArchiveFileOpinion(fileId, projectId);
+	public R<ExpertInspectionVO> getArchiveFileOpinion(@RequestParam Long fileId,@RequestParam Long projectId,@RequestParam Long conclusionId) {
+		ExpertInspectionVO vo = archivesAutoService.getArchiveFileOpinion(fileId, projectId,conclusionId);
 		return R.data(vo);
 	}
 
@@ -840,7 +842,8 @@ public class ArchivesAutoController extends BladeController {
 			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
 			@ApiImplicitParam(name = "archiveId", value = "档案id", required = true),
 			@ApiImplicitParam(name = "fileId", value = "文件id", required = false),
-			@ApiImplicitParam(name = "opinion", value = "抽检意见", required = false)
+			@ApiImplicitParam(name = "opinion", value = "抽检意见", required = false),
+			@ApiImplicitParam(name = "conclusionId", value = "结论id", required = false)
 	})
 	public R saveInspect(@RequestBody ExpertInspection inspection) {
 		archivesAutoService.saveInspect(inspection);
@@ -858,8 +861,8 @@ public class ArchivesAutoController extends BladeController {
 			@ApiImplicitParam(name = "size", value = "每页的数量", required = true),
 			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
 	})
-	public R<IPage<ExpertInspectionVO>> getUserInspectInfo(Query query,@RequestParam Long projectId) {
-		IPage<ExpertInspectionVO> page = archivesAutoService.getUserInspectInfo(query, projectId);
+	public R<IPage<ExpertInspectionVO>> getUserInspectInfo(Query query,@RequestParam Long projectId,@RequestParam Long conclusionId) {
+		IPage<ExpertInspectionVO> page = archivesAutoService.getUserInspectInfo(query, projectId,conclusionId);
 		return R.data(page);
 	}
 
@@ -874,8 +877,8 @@ public class ArchivesAutoController extends BladeController {
 			@ApiImplicitParam(name = "size", value = "每页的数量", required = true),
 			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
 	})
-	public R<IPage<ExpertInspectionVO>> getUserInspectInfo2(Query query,@RequestParam Long projectId) {
-		IPage<ExpertInspectionVO> page = archivesAutoService.getUserInspectInfo2(query, projectId);
+	public R<IPage<ExpertInspectionVO>> getUserInspectInfo2(Query query,@RequestParam Long projectId,@RequestParam Long conclusionId) {
+		IPage<ExpertInspectionVO> page = archivesAutoService.getUserInspectInfo2(query, projectId,conclusionId);
 		return R.data(page);
 	}
 

+ 6 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java

@@ -8,6 +8,7 @@ import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.archive.vo.UpdateExpertVO;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -50,21 +51,23 @@ public class ArchiveAutoClientImpl implements ArchiveAutoClient {
     }
 
     @Override
-    public R<Boolean> batchUpdateExpertId(String userId, List<Long> ids) {
+    public R<Boolean> batchUpdateExpertId(UpdateExpertVO vo) {
+        List<Long> ids = Func.toLongList(vo.getIds());
         List<ArchivesAuto> list = autoMapper.getNodeAllArchive(ids);
         //循环判断是否已经存在专家,存在则追加
         list.stream().forEach(l->{
             if (StringUtils.isBlank(l.getExpertId())){
                 //为空
-                l.setExpertId(userId);
+                l.setExpertId(vo.getUserid());
             }else {
                 //不为空
                 String expertId = l.getExpertId();
-                l.setExpertId(expertId+","+userId);
+                l.setExpertId(expertId+","+vo.getUserid());
             }
         });
         //保存所有节点
         archivesAutoService.updateBatchById(list);
         return R.data(true);
     }
+
 }

+ 2 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveExpertConclusionClientImpl.java

@@ -16,7 +16,7 @@ public class ArchiveExpertConclusionClientImpl implements ArchiveExpertConclusio
 
 
     @Override
-    public R saveBaseTableInfo(Long projectId, String appUrl) {
-        return conclusionService.saveBaseTableInfo(projectId,appUrl);
+    public R saveBaseTableInfo(Long projectId, String appUrl,Long taskId) {
+        return conclusionService.saveBaseTableInfo(projectId,appUrl,taskId);
     }
 }

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.java

@@ -3,6 +3,7 @@ package org.springblade.archive.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.archive.entity.ArchiveExpertScore;
 import org.springblade.archive.entity.ExpertInspection;
 
@@ -18,4 +19,5 @@ import java.util.List;
 public interface ArchiveExpertScoreMapper extends BaseMapper<ArchiveExpertScore> {
 
 
+    ArchiveExpertConclusion getConclusion(@Param("projectId") Long projectId);
 }

+ 6 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchiveExpertScoreMapper.xml

@@ -3,4 +3,10 @@
 <mapper namespace="org.springblade.archive.mapper.ArchiveExpertScoreMapper">
 
 
+    <select id="getConclusion" resultType="org.springblade.archive.entity.ArchiveExpertConclusion">
+        select * from u_archive_expert_conclusion
+        where project_id = #{projectId} and is_deleted = 0
+        order by create_time desc
+        limit 1
+    </select>
 </mapper>

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -185,7 +185,7 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 
 	Integer getUserReviewedTotal(@Param("projectId") Long projectId,@Param("userId") Long userId);
 
-	IPage<ExpertInspectionVO> getUserInspectInfo(IPage<ExpertInspectionVO> page,@Param("projectId") Long projectId,@Param("userId") Long userId);
+	IPage<ExpertInspectionVO> getUserInspectInfo(IPage<ExpertInspectionVO> page,@Param("projectId") Long projectId,@Param("userId") Long userId,@Param("conclusionId") Long conclusionId);
 
     List<ArchivesAutoVO3> getAllInspectArchive(@Param("projectId")Long projectId);
 

+ 2 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -1065,11 +1065,11 @@
              ) a
     </select>
     <select id="getUserInspectInfo" resultType="org.springblade.archive.vo.ExpertInspectionVO">
-        select aei.id,aei.archive_name ,aei.opinion , aei.archive_id,expert_name,file_id,aei.is_pass,
+        select aei.id,aei.archive_name ,aei.opinion , aei.archive_id,expert_name,file_id,aei.is_pass,aei.conclusion_id,
                (case when unit_type = 1 then '施工' when unit_type = 2 then '监理' else '业主' end) as unitName,
                (select uaf.pdf_file_url from u_archive_file uaf where uaf.id = aei.file_id) as filePdf
         from u_archive_expert_inspection aei
-        WHERE project_id = #{projectId} and is_deleted = 0 and is_pass = 0
+        WHERE project_id = #{projectId} and is_deleted = 0 and is_pass = 0 and conclusion_id = #{conclusionId}
         <if test="userId != null">
             and expert_id = #{userId}
         </if>

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.java

@@ -17,5 +17,5 @@ import java.util.List;
  */
 public interface ExpertInspectionMapper extends BaseMapper<ExpertInspection> {
 
-    List<ExpertInspection> getListByFileId(@Param("fileId") Long fileId,@Param("projectId") Long projectId);
+    List<ExpertInspection> getListByFileId(@Param("fileId") Long fileId,@Param("projectId") Long projectId,@Param("conclusionId") Long conclusionId);
 }

+ 2 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ExpertInspectionMapper.xml

@@ -4,6 +4,7 @@
 
     <select id="getListByFileId" resultType="org.springblade.archive.entity.ExpertInspection">
         select * from u_archive_expert_inspection
-        where project_id = #{projectId} and file_id = #{fileId} and is_deleted = 0 and is_pass = 0
+        where project_id = #{projectId} and file_id = #{fileId} and conclusion_id = #{conclusionId}
+        and is_deleted = 0 and is_pass = 0
     </select>
 </mapper>

+ 10 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveExpertConclusionService.java

@@ -12,7 +12,7 @@ public interface IArchiveExpertConclusionService extends BaseService<ArchiveExpe
 
 
     //验收申请审批通过,创建当前报表基本信息
-    R saveBaseTableInfo(Long projectId,String appUrl);
+    R saveBaseTableInfo(Long projectId,String appUrl,Long taskId);
 
     Boolean getAppStatus(Long projectId);
 
@@ -20,9 +20,17 @@ public interface IArchiveExpertConclusionService extends BaseService<ArchiveExpe
 
     String getAppPreview(Long projectId);
 
-    String getTable(Long projectId);
+    ArchiveExpertConclusion getTable(Long projectId);
 
     Integer creatScore(Long projectId);
 
     void updateScore(Long projectId, Integer isSelect);
+
+    Boolean checkTable(Long projectId);
+
+    void submitTable(ArchiveExpertConclusion conclusion);
+
+    Boolean checkSubmit(Long projectId);
+
+    Long getCurrentId(Long projectId);
 }

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

@@ -10,7 +10,7 @@ import java.util.List;
 public interface IArchiveExpertScoreService extends BaseService<ArchiveExpertScore> {
 
     // 审批成功,保存基础评分信息
-    void saveBaseScoreInfo(Long projectId);
+    void saveBaseScoreInfo(Long projectId,Long conclusionId);
 
     List<ArchiveExpertScore> getItemByUnit(Long projectId, Integer unitType);
 }

+ 4 - 4
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -130,17 +130,17 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	Map<String,String> userInspectStats(Long projectId);
 
-	void updateInspectStatus(Long archiveId,Long projectId);
+	void updateInspectStatus(Long archiveId,Long projectId,Long conclusionId);
 
 	void saveInspect(ExpertInspection inspection);
 
-	IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId);
+	IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId, Long conclusionId);
 
-	IPage<ExpertInspectionVO> getUserInspectInfo2(Query query, Long projectId);
+	IPage<ExpertInspectionVO> getUserInspectInfo2(Query query, Long projectId,Long conclusionId);
 
     ProjectInspectStatVO projectInspectStat(Long projectId);
 
-	ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId);
+	ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId,Long conclusionId);
 
 
     ArchiveConclusion getArchiveConclusion(Long projectId);

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

@@ -11,5 +11,5 @@ import java.util.List;
 public interface IExpertInspectionService extends BaseService<ExpertInspection> {
 
 
-    List<ExpertInspection> getListByFileId(Long fileId, Long projectId);
+    List<ExpertInspection> getListByFileId(Long fileId, Long projectId,Long conclusionId);
 }

+ 77 - 10
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertConclusionServiceImpl.java

@@ -11,8 +11,10 @@ import org.springblade.archive.mapper.ArchiveExpertConclusionMapper;
 import org.springblade.archive.mapper.ArchiveExpertScoreMapper;
 import org.springblade.archive.service.IArchiveExpertConclusionService;
 import org.springblade.archive.service.IArchiveExpertScoreService;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.feign.ProjectClient;
@@ -31,22 +33,32 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
 
     @Override
     @Transactional
-    public R saveBaseTableInfo(Long projectId, String appUrl) {
+    public R saveBaseTableInfo(Long projectId, String appUrl,Long taskId) {
+        //判断当前项目下是否存在抽检中的数据
+        long count = this.count(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .eq(ArchiveExpertConclusion::getStatus, 1));
+        if (count > 0){
+            return R.fail("操作失败,上次验收还未完成");
+        }
         //保存表单基础信息
         ArchiveExpertConclusion conclusion = new ArchiveExpertConclusion();
+        Long id = SnowFlakeUtil.getId();
+        conclusion.setId(id);
         conclusion.setProjectId(projectId);
         conclusion.setAppUrl(appUrl);
         conclusion.setIsBuildScore(0);
         conclusion.setStatus(1);
-        conclusion.setApproveStatus(0);
+        conclusion.setTaskId(taskId);
         ProjectInfo info = projectClient.getById(projectId + "");
         if (info == null){
             return R.fail("获取项目信息失败");
         }
         conclusion.setTableTitle(info.getProjectName()+"项目档案验收报告");
+        conclusion.setGeneralSituation(info.getProjectGist());
         this.save(conclusion);
         //保存评分基础信息
-        scoreService.saveBaseScoreInfo(projectId);
+        scoreService.saveBaseScoreInfo(projectId,id);
         return R.data("保存成功");
     }
 
@@ -105,10 +117,10 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
     }
 
     /**
-     * 在线验收-查看验收报告
+     * 在线验收-获取结论
      */
     @Override
-    public String getTable(Long projectId) {
+    public ArchiveExpertConclusion getTable(Long projectId) {
         //获取最新的最新的一期验收
         ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
                 .eq(ArchiveExpertConclusion::getProjectId, projectId)
@@ -118,10 +130,7 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
         if (one == null){
             throw new ServiceException("暂无验收档案信息,请检查是否申请过验收");
         }
-        if (StringUtils.isBlank(one.getTableUrl())){
-            throw new ServiceException("当前在线验收还未生成报告");
-        }
-        return one.getTableUrl();
+        return one;
     }
 
     /**
@@ -153,10 +162,68 @@ public class ArchiveExpertConclusionServiceImpl extends BaseServiceImpl<ArchiveE
                 .last("limit 1"));
         //如果为空代表没有申请过,返回true
         if (one == null){
-            throw new ServiceException("当前没有申请验收信息,无法修改");
+            throw new ServiceException("当前项目没有申请验收信息,无法修改");
         }
         one.setIsBuildScore(isSelect);
         this.updateById(one);
     }
+
+    /**
+     * 在线验收-下一步编写报告,校验
+     */
+    @Override
+    public Boolean checkTable(Long projectId) {
+        //获取最新的最新的一期验收
+        ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .orderByDesc(ArchiveExpertConclusion::getCreateTime)
+                .last("limit 1"));
+        //如果为空代表没有申请过,返回true
+        if (one == null){
+            throw new ServiceException("当前项目没有申请验收信息,无法编写报告");
+        }
+        return true;
+    }
+
+    /**
+     * 编写结论-确认提交
+     */
+    @Override
+    @Transactional
+    public void submitTable(ArchiveExpertConclusion conclusion) {
+        //保存数据
+        //查询出数据
+        //判断是否追加
+        //调用生成
+
+    }
+
+    @Override
+    public Boolean checkSubmit(Long projectId) {
+        //判断当前用户职位是否为专家组长,专家组长允许提交
+        String userRole = AuthUtil.getUserRole();
+        if ("专家组长".equals(userRole)){
+            return true;
+        }else {
+            return false;
+        }
+    }
+
+    /**
+     * 在线验收-获取当前期在线验收id
+     */
+    @Override
+    public Long getCurrentId(Long projectId) {
+        //获取最新的最新的一期验收
+        ArchiveExpertConclusion one = this.getOne(new LambdaUpdateWrapper<ArchiveExpertConclusion>()
+                .eq(ArchiveExpertConclusion::getProjectId, projectId)
+                .orderByDesc(ArchiveExpertConclusion::getCreateTime)
+                .last("limit 1"));
+        //如果为空代表没有申请过,返回true
+        if (one == null){
+            throw new ServiceException("当前项目没有申请验收信息,请联系管理员");
+        }
+        return one.getId();
+    }
 }
 

+ 10 - 5
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveExpertScoreServiceImpl.java

@@ -2,6 +2,7 @@ package org.springblade.archive.service.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.archive.entity.ArchiveExpertScore;
 import org.springblade.archive.entity.ExpertInspection;
 import org.springblade.archive.mapper.ArchiveExpertScoreMapper;
@@ -19,14 +20,14 @@ public class ArchiveExpertScoreServiceImpl extends BaseServiceImpl<ArchiveExpert
 
 
     @Override
-    public void saveBaseScoreInfo(Long projectId) {
+    public void saveBaseScoreInfo(Long projectId,Long conclusionId) {
         List<ArchiveExpertScore> list = new ArrayList<>();
         //业主
-        list.add(new ArchiveExpertScore(projectId,1,"业主评分项1",10,0,10,0));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,1,"业主评分项1",10,0,10,0));
         //监理
-        list.add(new ArchiveExpertScore(projectId,2,"监理评分项1",10,0,10,0));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,2,"监理评分项1",10,0,10,0));
         //施工
-        list.add(new ArchiveExpertScore(projectId,3,"施工评分项1",10,0,10,0));
+        list.add(new ArchiveExpertScore(projectId,conclusionId,3,"施工评分项1",10,0,10,0));
         this.saveBatch(list);
     }
 
@@ -35,9 +36,13 @@ public class ArchiveExpertScoreServiceImpl extends BaseServiceImpl<ArchiveExpert
      */
     @Override
     public List<ArchiveExpertScore> getItemByUnit(Long projectId, Integer unitType) {
+        //获取当前结论
+        ArchiveExpertConclusion conclusion = baseMapper.getConclusion(projectId);
+        
         List<ArchiveExpertScore> list = this.list(new LambdaQueryWrapper<ArchiveExpertScore>()
                 .eq(ArchiveExpertScore::getProjectId, projectId)
-                .eq(ArchiveExpertScore::getUnitType, unitType));
+                .eq(ArchiveExpertScore::getUnitType, unitType)
+                .eq(ArchiveExpertScore::getConclusionId,conclusion.getId()));
         return list;
     }
 }

+ 25 - 16
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -2935,7 +2935,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			total += (int)Math.ceil(new Double(vo2.getName().length()+4) / 50);
 			//如果出现不相同,则合并之前的
 			document.add(dataTable);
-			if (total >= 35 && i !=  (vo2s.size()-1)) {
+			if (total >= 40 && i !=  (vo2s.size()-1)) {
 				total = 0;
 				document.newPage();
 				tableHeader(projectName,document,size10font,size17font,floats);
@@ -3095,11 +3095,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 */
 	@Override
 	@Transactional
-	public void updateInspectStatus(Long archiveId,Long projectId) {
+	public void updateInspectStatus(Long archiveId,Long projectId,Long conclusionId) {
 		//查看当前档案是否存在有意见的数据,存在则什么都不修改,不存在则修改已抽检,合格
 		long count2 = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
 				.eq(ExpertInspection::getIsPass, 0)
-				.eq(ExpertInspection::getArchiveId, archiveId));
+				.eq(ExpertInspection::getArchiveId, archiveId)
+				.eq(ExpertInspection::getConclusionId,conclusionId));
 		//修改档案抽检状态
 		if (count2 == 0) {
 			this.update(new LambdaUpdateWrapper<ArchivesAuto>()
@@ -3111,7 +3112,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		Long userId = AuthUtil.getUserId();
 		long count = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
 						.eq(ExpertInspection::getExpertId, userId)
-						.eq(ExpertInspection::getArchiveId, archiveId));
+						.eq(ExpertInspection::getArchiveId, archiveId)
+						.eq(ExpertInspection::getConclusionId,conclusionId));
 		if (count == 0){
 			String userName = AuthUtil.getNickName();
 			//获取档案信息,如果状态未未查阅则修改
@@ -3132,6 +3134,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			inspection.setUnitType(unitType);
 			inspection.setArchiveId(archiveId);
 			inspection.setArchiveName(archive.getName());
+			inspection.setConclusionId(conclusionId);
 			inspectionService.save(inspection);
 		}
 
@@ -3179,18 +3182,21 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			ExpertInspection one = inspectionService.getOne(new LambdaQueryWrapper<ExpertInspection>()
 					.eq(ExpertInspection::getExpertId, userId)
 					.eq(ExpertInspection::getArchiveId, archive.getId())
-					.eq(ExpertInspection::getIsPass, 1));
+					.eq(ExpertInspection::getIsPass, 1)
+					.eq(ExpertInspection::getConclusionId, inspection.getConclusionId()));
 			if (one == null) {
 				//先删除当前专家对当前案卷当前文件的意见
 				inspectionService.remove(new LambdaQueryWrapper<ExpertInspection>()
 						.eq(ExpertInspection::getExpertId, userId)
 						.eq(ExpertInspection::getArchiveId, inspection.getArchiveId())
-						.eq(ExpertInspection::getFileId, inspection.getFileId()));
+						.eq(ExpertInspection::getFileId, inspection.getFileId())
+						.eq(ExpertInspection::getConclusionId, inspection.getConclusionId()));
 				//判断当前档案是否存在其他意见,有则直接跳过
 				long count3 = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
 						.eq(ExpertInspection::getExpertId, userId)
 						.eq(ExpertInspection::getArchiveId, archive.getId())
-						.eq(ExpertInspection::getIsPass, 0));
+						.eq(ExpertInspection::getIsPass, 0)
+						.eq(ExpertInspection::getConclusionId, inspection.getConclusionId()));
 				if (count3 == 0) {
 					//没有就直接保存合格
 					inspection.setFileId(null);
@@ -3203,12 +3209,14 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			inspectionService.remove(new LambdaQueryWrapper<ExpertInspection>()
 					.eq(ExpertInspection::getExpertId, userId)
 					.eq(ExpertInspection::getArchiveId, inspection.getArchiveId())
-					.eq(ExpertInspection::getIsPass, 1));
+					.eq(ExpertInspection::getIsPass, 1)
+					.eq(ExpertInspection::getConclusionId, inspection.getConclusionId()));
 			//再去查看意见表是否存在对当前档案当前文件的意见
 			ExpertInspection one = inspectionService.getOne(new LambdaQueryWrapper<ExpertInspection>()
 					.eq(ExpertInspection::getExpertId, userId)
 					.eq(ExpertInspection::getArchiveId, inspection.getArchiveId())
-					.eq(ExpertInspection::getFileId, inspection.getFileId()));
+					.eq(ExpertInspection::getFileId, inspection.getFileId())
+					.eq(ExpertInspection::getConclusionId, inspection.getConclusionId()));
 			//如果不存在数据,然后保存
 			if (one == null) {
 				inspectionService.save(inspection);
@@ -3222,7 +3230,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//查询当前档案的所有不合格专家意见
 		long count = inspectionService.count(new LambdaQueryWrapper<ExpertInspection>()
 				.eq(ExpertInspection::getArchiveId, archive.getId())
-				.eq(ExpertInspection::getIsPass, 0));
+				.eq(ExpertInspection::getIsPass, 0)
+				.eq(ExpertInspection::getConclusionId, inspection.getConclusionId()));
 		if (count > 0){
 			//如果有则修改档案不合格
 			archive.setUpdateStatus(1);
@@ -3237,17 +3246,17 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * 在线验收-抽检记录
 	 */
 	@Override
-	public IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId) {
+	public IPage<ExpertInspectionVO> getUserInspectInfo(Query query, Long projectId, Long conclusionId) {
 		Long userId = AuthUtil.getUserId();
 		IPage<ExpertInspectionVO> page = new Page<>(query.getCurrent(),query.getSize());
-		return baseMapper.getUserInspectInfo(page,projectId,userId);
+		return baseMapper.getUserInspectInfo(page,projectId,userId,conclusionId);
 	}
 
 	/**
 	 * 在线验收-抽检记录-汇总
 	 */
 	@Override
-	public IPage<ExpertInspectionVO> getUserInspectInfo2(Query query, Long projectId) {
+	public IPage<ExpertInspectionVO> getUserInspectInfo2(Query query, Long projectId,Long conclusionId) {
 		Long userId = AuthUtil.getUserId();
 		//判断当前用户职位是否为专家组长,专家组长查看所有
 		String userRole = AuthUtil.getUserRole();
@@ -3255,7 +3264,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			userId = null;
 		}
 		IPage<ExpertInspectionVO> page = new Page<>(query.getCurrent(),query.getSize());
-		return baseMapper.getUserInspectInfo(page,projectId,userId);
+		return baseMapper.getUserInspectInfo(page,projectId,userId,conclusionId);
 	}
 
 	/**
@@ -3360,12 +3369,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * 在线验收-获取档案文件抽检意见
 	 */
 	@Override
-	public ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId) {
+	public ExpertInspectionVO getArchiveFileOpinion(Long fileId, Long projectId,Long conclusionId) {
 		Long userId = AuthUtil.getUserId();
 		String userName = AuthUtil.getNickName();
 		ExpertInspectionVO vo = new ExpertInspectionVO();
 		//获取意见表里当前文件相关意见
-		List<ExpertInspection> list = inspectionService.getListByFileId(fileId,projectId);
+		List<ExpertInspection> list = inspectionService.getListByFileId(fileId,projectId,conclusionId);
 		if (list != null && list.size() > 0){
 			StringBuilder str = new StringBuilder();
 			for (ExpertInspection inspection : list) {

+ 2 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ExpertInspectionServiceImpl.java

@@ -15,8 +15,8 @@ public class ExpertInspectionServiceImpl extends BaseServiceImpl<ExpertInspectio
 
 
     @Override
-    public List<ExpertInspection> getListByFileId(Long fileId, Long projectId) {
-        return baseMapper.getListByFileId(fileId,projectId);
+    public List<ExpertInspection> getListByFileId(Long fileId, Long projectId,Long conclusionId) {
+        return baseMapper.getListByFileId(fileId,projectId,conclusionId);
     }
 }
 

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

@@ -706,9 +706,12 @@ public class TaskController extends BladeController {
                                     }
                                 }
                                 //创建报表基本信息,报表中会自动创建评分基础信息
-                                R r = conclusionClient.saveBaseTableInfo(Long.parseLong(task.getProjectId()), task.getAttachmentPdfUrl());
-                                if (r == null || !"保存成功".equals(r.getData())){
-                                    throw new ServiceException("保存报表基本信息失败");
+                                R r = conclusionClient.saveBaseTableInfo(Long.parseLong(task.getProjectId()), task.getAttachmentPdfUrl(),task.getId());
+                                if (r == null ){
+                                    throw new ServiceException("调用档案服务失败");
+                                }
+                                if (!"保存成功".equals(r.getData())){
+                                    throw new ServiceException(r.getMsg());
                                 }
                             }
                             return R.data(true);

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

@@ -502,8 +502,8 @@ public class ArchiveTreeContractController extends BladeController {
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "projectId", value = "项目id")
     })
-    public R<Boolean> startInspect(@RequestParam Long projectId) {
-        return R.data(archiveTreeContractService.startInspect(projectId));
+    public R<Boolean> startInspect(@RequestParam Long projectId,@RequestParam Integer type) {
+        return R.data(archiveTreeContractService.startInspect(projectId,type));
     }
 
 

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

@@ -19,6 +19,7 @@ package org.springblade.manager.mapper;
 
 import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.manager.entity.ArchiveTreeContract;
@@ -128,4 +129,6 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
     List<ArchiveTreeContract> getSelectNodes(@Param("ids") List<Long> longs);
 
     List<MyInspectTreeVO> MyLazyTree(@Param("parentId") Long parentId,@Param("projectId") Long projectId,@Param("userId") Long userId);
+
+    ArchiveExpertConclusion getNewTable(@Param("projectId") Long projectId);
 }

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

@@ -607,6 +607,12 @@
         and FIND_IN_SET(#{userId},d.expert_id)
         ORDER BY d.sort
     </select>
+    <select id="getNewTable" resultType="org.springblade.archive.entity.ArchiveExpertConclusion">
+        select * from u_archive_expert_conclusion
+        WHERE is_deleted = 0 and project_id = #{projectId}
+        order by create_time DESC
+        limit 1
+    </select>
 
 
     <update id="updateAllSonNodeIdsForArchiveAutoRule">

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

@@ -131,5 +131,5 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
     List<MyInspectTreeVO> lazyTree(Long parentId, Long projectId);
 
-    Boolean startInspect(Long projectId);
+    Boolean startInspect(Long projectId,Integer type);
 }

+ 26 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -22,7 +22,9 @@ import com.mixsmart.utils.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.archive.feign.ArchiveAutoClient;
+import org.springblade.archive.vo.UpdateExpertVO;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.BladeUser;
@@ -1464,7 +1466,10 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		//保存所有节点
 		this.updateBatchById(list);
 		//修改节点下所有档案,并保存
-		R<Boolean> booleanR = archiveAutoClient.batchUpdateExpertId(userId, longs);
+		UpdateExpertVO vo = new UpdateExpertVO();
+		vo.setUserid(userId);
+		vo.setIds(ids);
+		R<Boolean> booleanR = archiveAutoClient.batchUpdateExpertId(vo);
 		if (booleanR.getData() == null || booleanR.getData() != true){
 			throw new ServiceException("为档案绑定专家失败");
 		}
@@ -1503,7 +1508,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	 * 在线验收-开始抽检
 	 */
 	@Override
-	public Boolean startInspect(Long projectId) {
+	public Boolean startInspect(Long projectId,Integer type) {
 		//获取当前项目首节点
 		ArchiveTreeContract one = this.getOne(new LambdaQueryWrapper<ArchiveTreeContract>()
 				.eq(ArchiveTreeContract::getProjectId, projectId)
@@ -1511,19 +1516,30 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		if (one == null){
 			throw new ServiceException("未找到当前项目首节点");
 		}
+
+		//获取项目最新的一条结论,如果不存在则提示
+		ArchiveExpertConclusion conclusion = baseMapper.getNewTable(projectId);
+		if (conclusion == null){
+			throw new ServiceException("当前项目还未申请在线验收");
+		}
+
 		BladeUser user = AuthUtil.getUser();
 		String roleId = user.getRoleId();
 		//判断当前用户是否为专家
-		if (roleId.contains("1656191696348082177") || roleId.contains("1656191770880864257")){
-			//判断是否存在当前专家id
-			if (StringUtil.isNotBlank(one.getExpertId()) && one.getExpertId().contains(user.getUserId()+"")){
-				return false;
-			}else {
-				return true;
-			}
-		}else {
+		if (!"1656191696348082177,1656191770880864257".contains(roleId)){
 			throw new ServiceException("当前用户不是专家,不能抽检");
 		}
+		//判断当前结论的状态是否已经完成
+		if (type ==  1){
+			if (conclusion.getStatus() == 2){
+				throw new ServiceException("当前抽检已经生成结论,请直接点击编辑结论");
+			}
+		}
+		//判断是否存在当前专家id
+		if (StringUtil.isNotBlank(one.getExpertId()) && one.getExpertId().contains(user.getUserId()+"")){
+			return false;
+		}
+		return true;
 
 	}
 

+ 8 - 6
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MidPayItemController.java

@@ -1,7 +1,6 @@
 package org.springblade.meter.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -110,8 +109,7 @@ public class MidPayItemController extends BladeController {
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "系统中期支付项分页", notes = "传入MeterMidPayItemSystem、Query")
     public R<IPage<MeterMidPayItemSystemVO>> systemPage(@RequestBody MeterMidPayItemSystem meterMidPayItemSystem, @RequestBody Query query) {
-        IPage<MeterMidPayItemSystem> pages = payItemSystemService.page(Condition.getPage(query), Condition.getQueryWrapper(meterMidPayItemSystem));
-
+        IPage<MeterMidPayItemSystem> pages = payItemSystemService.page(Condition.getPage(query), Condition.getQueryWrapper(meterMidPayItemSystem).lambda().orderByAsc(MeterMidPayItemSystem::getSort));
         Map<String, String> meterPayTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
         Map<String, String> meterPayAppTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_applicable_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
 
@@ -347,7 +345,9 @@ public class MidPayItemController extends BladeController {
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "项目中期支付项分页", notes = "传入MeterMidPayItemProjectDTO、Query")
     public R<IPage<MeterMidPayItemProjectVO>> projectPage(@RequestBody MeterMidPayItemProjectDTO dto, @RequestBody Query query) {
-        IPage<MeterMidPayItemProject> pages = payItemProjectService.page(Condition.getPage(query), Condition.getQueryWrapper(dto));
+        QueryWrapper<MeterMidPayItemProject> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.orderByAsc("sort");
+        IPage<MeterMidPayItemProject> pages = payItemProjectService.page(Condition.getPage(query), queryWrapper);
 
         Map<String, String> meterPayTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
         Map<String, String> meterPayAppTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_applicable_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
@@ -542,7 +542,9 @@ public class MidPayItemController extends BladeController {
     @ApiOperationSupport(order = 16)
     @ApiOperation(value = "合同段中期支付项分页", notes = "传入MeterMidPayItemContractDTO、Query")
     public R<IPage<MeterMidPayItemContractVO>> contractPage(@RequestBody MeterMidPayItemContractDTO dto, @RequestBody Query query) {
-        IPage<MeterMidPayItemContract> pages = payItemContractService.page(Condition.getPage(query), Condition.getQueryWrapper(dto));
+        QueryWrapper<MeterMidPayItemContract> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.orderByAsc("sort");
+        IPage<MeterMidPayItemContract> pages = payItemContractService.page(Condition.getPage(query), queryWrapper);
 
         Map<String, String> meterPayTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
         Map<String, String> meterPayAppTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_applicable_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));

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

@@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -48,6 +51,8 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.Month;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Function;
@@ -419,6 +424,7 @@ public class TaskController extends BladeController {
                                         .eq(AttachmentForm::getProjectId, approvalDTO.getProjectId()));
                                 List<AttachmentFormTask> attachmentFormTasks = BeanUtil.copyProperties(attachmentForms, AttachmentFormTask.class);
                                 for (AttachmentFormTask attachmentFormTask : attachmentFormTasks) {
+                                    attachmentFormTask.setId(SnowFlakeUtil.getId());
                                     attachmentFormTask.setTaskId(taskId);
                                 }
                                 /*复制变更令的附件信息VO*/
@@ -612,14 +618,14 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "任务废除(任务撤销、驳回审批)", notes = "按一期废除,即按整条任务废除(中期计量申请、材料计量单、开工预付款计量单、变更令、任务查看-废除任务)")
     @PushMessage(clientId = ClientIdConstant.METER_CLIENT_ID)
-    public R<Object> repeal(@RequestBody TaskRepealDTO taskRepealDTO) {
+    public R<Object> repeal(@RequestBody TaskRepealDTO taskRepealDTO) throws JsonProcessingException {
         /*加锁*/
         String redisValue = bladeRedis.get("meter:repeal:user:" + SecureUtil.getUserId());
         if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
-            return R.fail(400, "请勿重复提交,30秒后再尝试");
+            return R.fail(400, "请勿重复提交,10秒后再尝试");
         }
         bladeRedis.set("meter:repeal:user:" + SecureUtil.getUserId(), "1");
-        bladeRedis.expire("meter:repeal:user:" + SecureUtil.getUserId(), 30);
+        bladeRedis.expire("meter:repeal:user:" + SecureUtil.getUserId(), 10);
 
         if (ObjectUtil.isNotEmpty(taskRepealDTO) && ObjectUtil.isNotEmpty(taskRepealDTO.getTaskId())) {
             if (ObjectUtil.isNotEmpty(taskRepealDTO.getMeterTaskRepealDesc()) && taskRepealDTO.getMeterTaskRepealDesc().length() > 1000) {
@@ -684,6 +690,41 @@ public class TaskController extends BladeController {
                         jdbcTemplate.execute("DELETE FROM s_middle_meter_apply_task WHERE contract_period_id = '" + periodId + "' AND task_id = " + taskRepealDTO.getTaskId());
                         jdbcTemplate.execute("DELETE FROM s_inventory_form_apply_task WHERE contract_period_id = '" + periodId + "' AND task_id = " + taskRepealDTO.getTaskId());
 
+                        /*还原修改过的清单信息*/
+                        List<InventoryFormApply> restoreInventoryFormApplyList = new ArrayList<>();
+                        for (Long middleMeterAppliesId : middleMeterAppliesIds) {
+                            List<TaskDataUpdateRecord> query = jdbcTemplate.query("SELECT * FROM s_task_data_update_record WHERE data_id = " + middleMeterAppliesId, new BeanPropertyRowMapper<>(TaskDataUpdateRecord.class));
+                            ObjectMapper objectMapper = new ObjectMapper();
+                            for (TaskDataUpdateRecord taskDataUpdateRecord : query) {
+                                String rawFormDataJson = taskDataUpdateRecord.getRawFormDataJson();
+                                Map<String, Object> jsonMap = objectMapper.readValue(rawFormDataJson, new TypeReference<Map<String, Object>>() {
+                                });
+                                Map<String, Object> businessDateMap = (Map<String, Object>) jsonMap.get("businessDate");
+                                Map<String, Object> modifiedJsonMap = new HashMap<>(jsonMap);
+                                if (businessDateMap != null) {
+                                    modifiedJsonMap.remove("businessDate");
+                                }
+                                InventoryFormApplyTask inventoryFormApplyTask = objectMapper.convertValue(modifiedJsonMap, InventoryFormApplyTask.class);
+                                InventoryFormApply inventoryFormApply = BeanUtil.copyProperties(inventoryFormApplyTask, InventoryFormApply.class);
+                                if (inventoryFormApply != null) {
+                                    inventoryFormApply.setApproveStatus(0);
+                                    if (businessDateMap != null) {
+                                        int year = (int) businessDateMap.get("year");
+                                        String month = (String) businessDateMap.get("month");
+                                        LocalDate businessDate = LocalDate.of(year, Month.valueOf(month), 1);
+                                        inventoryFormApplyTask.setBusinessDate(businessDate);
+                                    }
+                                }
+                                restoreInventoryFormApplyList.add(inventoryFormApply);
+                            }
+                        }
+                        if (restoreInventoryFormApplyList.size() > 0) {
+                            if (inventoryFormApplyService.updateBatchById(restoreInventoryFormApplyList)) {
+                                /*删除修改的操作记录信息*/
+                                jdbcTemplate.execute("DELETE FROM s_task_data_update_record WHERE data_id in(" + StringUtils.join(middleMeterAppliesIds, ",") + ")");
+                            }
+                        }
+
                     } else if (task.getMeterTaskType().equals(2)) {
                         /*==================== 材料计量单 ====================*/
                         /*获取原始的材料数量*/
@@ -743,6 +784,10 @@ public class TaskController extends BladeController {
                             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());
+
+                            /*删除单条废除的历史记录*/
+                            jdbcTemplate.execute("DELETE FROM s_task_data_update_record WHERE data_id = " + taskRepealDTO.getTaskId());
+
                         }
                     }
 
@@ -952,7 +997,7 @@ public class TaskController extends BladeController {
     @GetMapping("/detail")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "任务详情", notes = "传入任务id")
-    public R<TaskDetailVO> detail(@RequestParam String id) {
+    public R<TaskDetailVO> detail(@RequestParam String id) throws JsonProcessingException {
         if (ObjectUtil.isEmpty(id) || ObjectUtil.isEmpty(SecureUtil.getUserId())) {
             throw new ServiceException("任务id、用户信息不能为空");
         }
@@ -990,7 +1035,7 @@ public class TaskController extends BladeController {
             }
             vo.setTaskProcessInfo(taskProcessInfo);
 
-            /*中间业务taskVO复制数据(只有待审批、已审批任务才能查看到具体的taskVO复制数据,因为废除任务时taskVO被删除)*/
+            /*中间业务taskVO复制数据(只有待审批、已审批任务才能查看到具体的taskVO复制数据,因为废除任务时taskVO被删除,但是单条驳回时有记录单条数据的历史信息,所以通过的任务还是能查看到)*/
             if (ObjectUtil.isNotEmpty(task.getFormDataId()) && Arrays.asList(1, 2).contains(task.getStatus())) {
                 /*获取当条任务所有批注信息*/
                 Map<String, TaskComment> taskCommentMap = jdbcTemplate.query("SELECT * FROM s_task_comment WHERE task_id = " + id, new BeanPropertyRowMapper<>(TaskComment.class))
@@ -1054,9 +1099,17 @@ public class TaskController extends BladeController {
 
                 } else if (task.getMeterTaskType().equals(4)) {
                     /*==================== 变更令 ====================*/
+                    /*变更令有两种情况*/
+                    //1.单条通过显示
                     List<Long> longs = Func.toLongList(periodId);
-                    List<ChangeTokenFormTask> changeTokenFormTasks = changeTokenFormServiceTask.getBaseMapper().selectBatchIds(longs);
+                    List<ChangeTokenFormTask> changeTokenFormTasks = changeTokenFormServiceTask.getBaseMapper()
+                            .selectList(Wrappers.<ChangeTokenFormTask>lambdaQuery()
+                                    .eq(ChangeTokenFormTask::getTaskId, id)
+                                    .in(ChangeTokenFormTask::getId, longs));
                     List<ChangeTokenFormTaskVO> changeTokenFormTaskVOS = BeanUtil.copyProperties(changeTokenFormTasks, ChangeTokenFormTaskVO.class);
+                    if (ObjectUtil.isEmpty(changeTokenFormTaskVOS)) {
+                        changeTokenFormTaskVOS = new ArrayList<>();
+                    }
                     for (ChangeTokenFormTaskVO changeTokenFormTaskVO : changeTokenFormTaskVOS) {
                         String key = SecureUtil.getUserId() + ":" + changeTokenFormTaskVO.getId();
                         TaskComment orDefault = taskCommentMap.getOrDefault(key, null);
@@ -1066,23 +1119,68 @@ public class TaskController extends BladeController {
                             changeTokenFormTaskVO.setIsComment(0);
                         }
                     }
-                    vo.setTaskCenterDataInfo(changeTokenFormTaskVOS);
 
+                    /*已审批的任务才会去追加查看,单条驳回的历史记录信息*/
+                    if (task.getStatus().equals(2)) {
+                        //2.单条驳回显示(历史记录)data_id=id=taskId
+                        List<TaskDataUpdateRecord> query = jdbcTemplate.query("SELECT * FROM s_task_data_update_record WHERE data_id = " + id, new BeanPropertyRowMapper<>(TaskDataUpdateRecord.class));
+                        if (query.size() > 0) {
+                            ObjectMapper objectMapper = new ObjectMapper();
+                            for (TaskDataUpdateRecord taskDataUpdateRecord : query) {
+                                String rawChangCenterDataJson = taskDataUpdateRecord.getRawChangCenterDataJson();
+                                Map<String, Object> jsonMap = objectMapper.readValue(rawChangCenterDataJson, new TypeReference<Map<String, Object>>() {
+                                });
+                                Map<String, Object> businessDateMap = (Map<String, Object>) jsonMap.get("businessDate");
+                                Map<String, Object> designDateMap = (Map<String, Object>) jsonMap.get("designDate");
+                                Map<String, Object> changeApprovalDateMap = (Map<String, Object>) jsonMap.get("changeApprovalDate");
+                                Map<String, Object> modifiedJsonMap = new HashMap<>(jsonMap);
+                                if (businessDateMap != null || designDateMap != null || changeApprovalDateMap != null) {
+                                    modifiedJsonMap.remove("businessDate");
+                                    modifiedJsonMap.remove("designDate");
+                                    modifiedJsonMap.remove("changeApprovalDate");
+                                }
+                                ChangeTokenFormTaskVO changeTokenFormTaskVO = objectMapper.convertValue(modifiedJsonMap, ChangeTokenFormTaskVO.class);
+                                if (changeTokenFormTaskVO != null) {
+                                    if (businessDateMap != null) {
+                                        int year = (int) businessDateMap.get("year");
+                                        String month = (String) businessDateMap.get("month");
+                                        LocalDate businessDate = LocalDate.of(year, Month.valueOf(month), 1);
+                                        changeTokenFormTaskVO.setBusinessDate(businessDate);
+                                    }
+                                    if (designDateMap != null) {
+                                        int year = (int) designDateMap.get("year");
+                                        String month = (String) designDateMap.get("month");
+                                        LocalDate designDate = LocalDate.of(year, Month.valueOf(month), 1);
+                                        changeTokenFormTaskVO.setDesignDate(designDate);
+                                    }
+                                    if (changeApprovalDateMap != null) {
+                                        int year = (int) changeApprovalDateMap.get("year");
+                                        String month = (String) changeApprovalDateMap.get("month");
+                                        LocalDate changeApprovalDate = LocalDate.of(year, Month.valueOf(month), 1);
+                                        changeTokenFormTaskVO.setChangeApprovalDate(changeApprovalDate);
+                                    }
+                                }
+                                changeTokenFormTaskVOS.add(changeTokenFormTaskVO);
+                            }
+                        }
+                    }
+                    vo.setTaskCenterDataInfo(changeTokenFormTaskVOS);
                 }
             }
         }
+
         return R.data(200, vo, "操作成功");
     }
 
     @GetMapping("/data/detail")
     @ApiOperationSupport(order = 6)
     @ApiOperation(value = "任务数据信息详情", notes = "传入任务id,数据dataId")
-    public R<TaskDataDetailVO> dataDetail(@RequestParam String id, @RequestParam String dataId) {
+    public R<TaskDataDetailVO> dataDetail(@RequestParam String id, @RequestParam String dataId) throws JsonProcessingException {
         if (ObjectUtil.isEmpty(id) || ObjectUtil.isEmpty(dataId)) {
             throw new ServiceException("任务id、数据id不能为空");
         }
         TaskDataDetailVO vo = new TaskDataDetailVO();
-        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);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,form_data_id,status FROM u_task WHERE id = " + id, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             if (task.getMeterTaskType().equals(1)) {
                 MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(dataId);
@@ -1113,25 +1211,111 @@ public class TaskController extends BladeController {
                 vo.setBasicsInfo(startPayMeterFormTask);
 
             } else if (task.getMeterTaskType().equals(4)) {
-                ChangeTokenFormVO2 changeTokenFormVO = changeTokenFormService.getBaseMapper().detailCopy(Long.parseLong(dataId));
-                if (changeTokenFormVO != null) {
-                    List<ChangeNodeVO> nodeListCopy = changeTokenFormService.getBaseMapper().getNodeListCopy(changeTokenFormVO.getContractId(), changeTokenFormVO.getId());
-                    if (nodeListCopy.size() > 0) {
-                        List<ChangeFormVO2> formListCopy = changeTokenFormService.getBaseMapper().getFormListCopy(changeTokenFormVO.getContractId(), changeTokenFormVO.getId());
-                        if (formListCopy.size() > 0) {
-                            Map<Long, List<ChangeFormVO2>> map = formListCopy.stream().collect(Collectors.groupingBy(ChangeFormVO2::getContractMeterId));
-                            for (ChangeNodeVO nodeVO : nodeListCopy) {
-                                List<ChangeFormVO2> vo2s = map.get(nodeVO.getId());
-                                nodeVO.setFormList(vo2s);
+                /*待审批任务正常显示*/
+                if (new Integer(1).equals(task.getStatus())) {
+                    ChangeTokenFormVO2 changeTokenFormVO = changeTokenFormService.getBaseMapper().detailCopy(Long.parseLong(dataId));
+                    if (changeTokenFormVO != null) {
+                        List<ChangeNodeVO> nodeListCopy = changeTokenFormService.getBaseMapper().getNodeListCopy(changeTokenFormVO.getContractId(), changeTokenFormVO.getId());
+                        if (nodeListCopy.size() > 0) {
+                            List<ChangeFormVO2> formListCopy = changeTokenFormService.getBaseMapper().getFormListCopy(changeTokenFormVO.getContractId(), changeTokenFormVO.getId());
+                            if (formListCopy.size() > 0) {
+                                Map<Long, List<ChangeFormVO2>> map = formListCopy.stream().collect(Collectors.groupingBy(ChangeFormVO2::getContractMeterId));
+                                for (ChangeNodeVO nodeVO : nodeListCopy) {
+                                    List<ChangeFormVO2> vo2s = map.get(nodeVO.getId());
+                                    nodeVO.setFormList(vo2s);
+                                }
+                            } else {
+                                for (ChangeNodeVO nodeVO : nodeListCopy) {
+                                    nodeVO.setNodeUrl(middleMeterApplyService.getNodeDivide(nodeVO.getId()));
+                                }
                             }
-                        } else {
-                            for (ChangeNodeVO nodeVO : nodeListCopy) {
-                                nodeVO.setNodeUrl(middleMeterApplyService.getNodeDivide(nodeVO.getId()));
+                            changeTokenFormVO.setNodeList(nodeListCopy);
+                            vo.setChangeTokenFormVO(changeTokenFormVO);
+                        }
+                    }
+                }
+
+                /*已审批、已废除任务,需要判断显示*/
+                if (Arrays.asList(2, 3).contains(task.getStatus())) {
+                    //2.单条驳回显示(历史记录)data_id=入参的id=taskId;form_id=入参的dataId=变更令id
+                    List<TaskDataUpdateRecord> query = jdbcTemplate.query("SELECT * FROM s_task_data_update_record WHERE data_id = " + id + " AND form_id = " + dataId, new BeanPropertyRowMapper<>(TaskDataUpdateRecord.class));
+                    if (query.size() == 1) {
+                        ObjectMapper objectMapper = new ObjectMapper();
+                        TaskDataDetailVO taskDataDetailVO = new TaskDataDetailVO();
+                        TaskDataUpdateRecord taskDataUpdateRecord = query.get(0);
+                        String rawChangRightDataJson = taskDataUpdateRecord.getRawChangRightDataJson();
+                        Map<String, Object> jsonMap = objectMapper.readValue(rawChangRightDataJson, new TypeReference<Map<String, Object>>() {
+                        });
+
+                        /*部位、清单信息*/
+                        Map<String, Object> changeTokenFormVOMap = (Map<String, Object>) jsonMap.get("changeTokenFormVO");
+                        Map<String, Object> designDateMap = (Map<String, Object>) changeTokenFormVOMap.get("designDate");
+                        Map<String, Object> businessDateMap = (Map<String, Object>) changeTokenFormVOMap.get("businessDate");
+                        Map<String, Object> changeApprovalDateMap = (Map<String, Object>) changeTokenFormVOMap.get("changeApprovalDate");
+                        Map<String, Object> modifiedChangeTokenFormVOMap = new HashMap<>(changeTokenFormVOMap);
+                        if (businessDateMap != null || designDateMap != null || changeApprovalDateMap != null) {
+                            modifiedChangeTokenFormVOMap.remove("businessDate");
+                            modifiedChangeTokenFormVOMap.remove("designDate");
+                            modifiedChangeTokenFormVOMap.remove("changeApprovalDate");
+                        }
+                        ChangeTokenFormVO2 changeTokenFormVO2 = objectMapper.convertValue(modifiedChangeTokenFormVOMap, ChangeTokenFormVO2.class);
+                        if (changeTokenFormVO2 != null) {
+                            if (businessDateMap != null) {
+                                int year = (int) businessDateMap.get("year");
+                                String month = (String) businessDateMap.get("month");
+                                LocalDate businessDate = LocalDate.of(year, Month.valueOf(month), 1);
+                                changeTokenFormVO2.setBusinessDate(businessDate);
+                            }
+                            if (designDateMap != null) {
+                                int year = (int) designDateMap.get("year");
+                                String month = (String) designDateMap.get("month");
+                                LocalDate designDate = LocalDate.of(year, Month.valueOf(month), 1);
+                                changeTokenFormVO2.setDesignDate(designDate);
+                            }
+                            if (changeApprovalDateMap != null) {
+                                int year = (int) changeApprovalDateMap.get("year");
+                                String month = (String) changeApprovalDateMap.get("month");
+                                LocalDate changeApprovalDate = LocalDate.of(year, Month.valueOf(month), 1);
+                                changeTokenFormVO2.setChangeApprovalDate(changeApprovalDate);
+                            }
+                            taskDataDetailVO.setChangeTokenFormVO(changeTokenFormVO2);
+                        }
+
+                        /*附件*/
+                        List<Object> attachmentFormTaskList = (List<Object>) jsonMap.get("attachmentFormTask");
+                        List<AttachmentFormTask> attachmentFormTaskListResult = new ArrayList<>();
+                        for (Object item : attachmentFormTaskList) {
+                            AttachmentFormTask attachmentFormTask = objectMapper.convertValue(item, AttachmentFormTask.class);
+                            attachmentFormTaskListResult.add(attachmentFormTask);
+                        }
+                        taskDataDetailVO.setAttachmentFormTask(attachmentFormTaskListResult);
+
+                        /*单条驳回数据,直接返回*/
+                        return R.data(200, taskDataDetailVO, "操作成功");
+
+                    } else if (query.size() == 0) {
+                        /*没有历史记录说明当前任务全是通过的数据,没有单条驳回的*/
+                        ChangeTokenFormVO2 changeTokenFormVO = changeTokenFormService.getBaseMapper().detailCopy(Long.parseLong(dataId));
+                        if (changeTokenFormVO != null) {
+                            List<ChangeNodeVO> nodeListCopy = changeTokenFormService.getBaseMapper().getNodeListCopy(changeTokenFormVO.getContractId(), changeTokenFormVO.getId());
+                            if (nodeListCopy.size() > 0) {
+                                List<ChangeFormVO2> formListCopy = changeTokenFormService.getBaseMapper().getFormListCopy(changeTokenFormVO.getContractId(), changeTokenFormVO.getId());
+                                if (formListCopy.size() > 0) {
+                                    Map<Long, List<ChangeFormVO2>> map = formListCopy.stream().collect(Collectors.groupingBy(ChangeFormVO2::getContractMeterId));
+                                    for (ChangeNodeVO nodeVO : nodeListCopy) {
+                                        List<ChangeFormVO2> vo2s = map.get(nodeVO.getId());
+                                        nodeVO.setFormList(vo2s);
+                                    }
+                                } else {
+                                    for (ChangeNodeVO nodeVO : nodeListCopy) {
+                                        nodeVO.setNodeUrl(middleMeterApplyService.getNodeDivide(nodeVO.getId()));
+                                    }
+                                }
+                                changeTokenFormVO.setNodeList(nodeListCopy);
+                                vo.setChangeTokenFormVO(changeTokenFormVO);
                             }
                         }
-                        changeTokenFormVO.setNodeList(nodeListCopy);
                     }
-                    vo.setChangeTokenFormVO(changeTokenFormVO);
                 }
             }
 
@@ -1286,11 +1470,11 @@ public class TaskController extends BladeController {
     @PostMapping("/data/inventoryFormApplyTask/update")
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "清单数据修改", notes = "传入InventoryFormApplyTaskDTO")
-    public R<Object> dataInventoryFormApplyTaskUpdate(@RequestBody InventoryFormApplyTaskDTO dto) {
+    public R<Object> dataInventoryFormApplyTaskUpdate(@RequestBody InventoryFormApplyTaskDTO dto) throws JsonProcessingException {
         if (ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id,form_data_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
@@ -1298,7 +1482,9 @@ public class TaskController extends BladeController {
             if (ObjectUtil.isEmpty(obj)) {
                 throw new ServiceException("操作异常");
             }
+
             obj.setId(dto.getTaskDetailId());
+
             InventoryFormApplyTask inventoryFormApplyTask = inventoryFormApplyServiceTask.getById(obj.getId());
             if (ObjectUtil.isEmpty(inventoryFormApplyTask)) {
                 throw new ServiceException("未获取到清单数据");
@@ -1307,6 +1493,18 @@ public class TaskController extends BladeController {
             obj.setProjectId(Long.parseLong(task.getProjectId()));
             obj.setContractId(Long.parseLong(task.getContractId()));
 
+            /*获取原始计量清单数据(任务整体驳回时需要恢复,因为下面逻辑去修改了原始数据,/data/detail接口又必须用原始数据查询)*/
+            String sql = "SELECT * FROM s_task_data_update_record WHERE data_id = ? AND form_id = ?";
+            List<TaskDataUpdateRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskDataUpdateRecord.class),
+                    inventoryFormApplyTask.getMiddleMeterId(), inventoryFormApplyTask.getId());
+            if (query.size() == 0) {
+                /*存储原始计量清单数据*/
+                ObjectMapper objectMapper = new ObjectMapper();
+                String jsonString = objectMapper.writeValueAsString(inventoryFormApplyTask);
+                jdbcTemplate.update("INSERT INTO s_task_data_update_record (id, data_id, form_id, raw_form_data_json) VALUES (?, ?, ?, ?)",
+                        SnowFlakeUtil.getId(), inventoryFormApplyTask.getMiddleMeterId(), inventoryFormApplyTask.getId(), jsonString);
+            }
+
             /*需要修改原始数据(统计累计计量量的时候需要查原始表数据)*/
             InventoryFormApply inventoryFormApply = BeanUtil.copyProperties(obj, InventoryFormApply.class);
 
@@ -1446,8 +1644,8 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "材料数据修改", notes = "传入MaterialMeterFormTask")
     public R<Object> dataMaterialMeterFormServiceTaskUpdate(@RequestBody MaterialMeterFormTask obj) {
-        if (ObjectUtil.isEmpty(obj.getTaskId())) {
-            throw new ServiceException("未获取到taskId");
+        if (ObjectUtil.isEmpty(obj.getTaskId()) || ObjectUtil.isEmpty(obj.getId())) {
+            throw new ServiceException("未获取到taskId、id");
         }
         Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
@@ -1479,8 +1677,8 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 11)
     @ApiOperation(value = "开工预付款数据修改", notes = "传入StartPayMeterFormTask")
     public R<Object> dataStartPayMeterFormServiceTaskUpdate(@RequestBody StartPayMeterFormTask obj) {
-        if (ObjectUtil.isEmpty(obj.getTaskId())) {
-            throw new ServiceException("未获取到taskId");
+        if (ObjectUtil.isEmpty(obj.getTaskId()) || ObjectUtil.isEmpty(obj.getId())) {
+            throw new ServiceException("未获取到taskId、id");
         }
         Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
@@ -1499,8 +1697,8 @@ public class TaskController extends BladeController {
     @ApiOperationSupport(order = 12)
     @ApiOperation(value = "变更令-基础信息修改", notes = "传入ChangeTokenFormTask")
     public R<Object> dataChangeTokenFromUpdate(@RequestBody ChangeTokenFormTask obj) {
-        if (ObjectUtil.isEmpty(obj.getTaskId())) {
-            throw new ServiceException("未获取到taskId");
+        if (ObjectUtil.isEmpty(obj.getTaskId()) || ObjectUtil.isEmpty(obj.getId())) {
+            throw new ServiceException("未获取到taskId、id");
         }
         Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
@@ -1718,7 +1916,7 @@ public class TaskController extends BladeController {
     @PostMapping("/data/audit")
     @ApiOperationSupport(order = 18)
     @ApiOperation(value = "单条数据同意或驳回", notes = "传入TaskAuditDTO")
-    public R<Object> dataAudit(@RequestBody TaskAuditDTO dto) {
+    public R<Object> dataAudit(@RequestBody TaskAuditDTO dto) throws JsonProcessingException {
         if (ObjectUtil.isEmpty(dto.getDataId()) || ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("任务id、数据id不能为空");
         }
@@ -1751,6 +1949,33 @@ public class TaskController extends BladeController {
                             .set(ChangeTokenFormTask::getRepealDesc, ObjectUtil.isNotEmpty(dto.getRepealDesc()) ? dto.getRepealDesc() : null)
                             .eq(ChangeTokenFormTask::getId, dto.getDataId()));
 
+                    /*变更令单条驳回后,会存在重新上报情况,需要保留驳回前的记录信息显示在旧任务中,那么需要存储历史记录*/
+                    if (dto.getAuditStatus().equals("2")) {
+                        /*获取变更令*/
+                        TaskDetailVO data = this.detail(dto.getTaskId()).getData();
+                        Object taskCenterDataInfo = data.getTaskCenterDataInfo();
+                        List<ChangeTokenFormTaskVO> changeTokenFormTaskVOS = (List<ChangeTokenFormTaskVO>) taskCenterDataInfo;
+                        ChangeTokenFormTaskVO changeTokenFormTaskVO = changeTokenFormTaskVOS.stream().filter(f -> f.getId().equals(Long.parseLong(dto.getDataId()))).findAny().orElse(null);
+                        if (changeTokenFormTaskVO != null) {
+                            /*获取部位、清单信息*/
+                            TaskDataDetailVO formAndBW = this.dataDetail(dto.getTaskId(), dto.getDataId()).getData();
+                            if (formAndBW != null) {
+                                /*存储历史记录*/
+                                ObjectMapper objectMapper = new ObjectMapper();
+                                String jsonStringChangeTokenFormTaskVO = objectMapper.writeValueAsString(changeTokenFormTaskVO);
+                                String jsonStringFormAndBW = objectMapper.writeValueAsString(formAndBW);
+
+                                /*此处data_id=taskId,form_id=变更令id*/
+                                String sql = "SELECT * FROM s_task_data_update_record WHERE data_id = ? AND form_id = ?";
+                                List<TaskDataUpdateRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TaskDataUpdateRecord.class),
+                                        dto.getTaskId(), changeTokenFormTaskVO.getId());
+                                if (query.size() == 0) {
+                                    jdbcTemplate.update("INSERT INTO s_task_data_update_record (id, data_id, form_id, raw_chang_center_data_json, raw_chang_right_data_json) VALUES (?, ?, ?, ?, ?)",
+                                            SnowFlakeUtil.getId(), dto.getTaskId(), changeTokenFormTaskVO.getId(), jsonStringChangeTokenFormTaskVO, jsonStringFormAndBW);
+                                }
+                            }
+                        }
+                    }
                 }
                 return R.success("操作成功");
             }
@@ -1770,10 +1995,10 @@ public class TaskController extends BladeController {
         /*加锁*/
         String redisValue = bladeRedis.get("meter:approve:user:" + SecureUtil.getUserId());
         if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
-            return R.fail(400, "请勿重复提交,30秒后再尝试");
+            return R.fail(400, "请勿重复提交,10秒后再尝试");
         }
         bladeRedis.set("meter:approve:user:" + SecureUtil.getUserId(), "1");
-        bladeRedis.expire("meter:approve:user:" + SecureUtil.getUserId(), 30);
+        bladeRedis.expire("meter:approve:user:" + SecureUtil.getUserId(), 10);
 
         String sql_1 = "SELECT * FROM u_task WHERE id = ?";
         Task task = jdbcTemplate.query(sql_1, new Object[]{dto.getTaskId()}, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
@@ -1899,9 +2124,9 @@ public class TaskController extends BladeController {
             }
         } else if (task.getMeterTaskType().equals(4)) {
             List<ChangeTokenFormTask> query = jdbcTemplate.query("SELECT id FROM s_change_token_form_task WHERE status != 2 AND id IN(" + formDataId + ")", new BeanPropertyRowMapper<>(ChangeTokenFormTask.class));
-            List<Long> collect = query.stream().map(ChangeTokenFormTask::getId).collect(Collectors.toList());
-            if (collect.size() > 0) {
-                jdbcTemplate.execute("UPDATE s_change_token_form_task SET status = 1 WHERE id IN(" + StringUtils.join(collect, ",") + ")");
+            List<Long> ids = query.stream().map(ChangeTokenFormTask::getId).collect(Collectors.toList());
+            if (ids.size() > 0) {
+                jdbcTemplate.execute("UPDATE s_change_token_form_task SET status = 1 WHERE id IN(" + StringUtils.join(ids, ",") + ")");
             }
         }
     }
@@ -1968,16 +2193,37 @@ public class TaskController extends BladeController {
         } else if (task.getMeterTaskType().equals(4)) {
             List<String> formDataIds = Func.toStrList(formDataId);
             List<ChangeTokenFormTask> changeTokenFormTasks = changeTokenFormServiceTask.getBaseMapper().selectList(Wrappers.<ChangeTokenFormTask>lambdaQuery()
-                    .in(ChangeTokenFormTask::getId, formDataIds)
-                    .eq(ChangeTokenFormTask::getStatus, 1));
-            List<Long> ids = changeTokenFormTasks.stream().map(ChangeTokenFormTask::getId).collect(Collectors.toList());
-            if (ids.size() > 0) {
+                    .eq(ChangeTokenFormTask::getTaskId, dto.getTaskId())
+                    .in(ChangeTokenFormTask::getId, formDataIds));
+
+            /*修改status=1的通过的变更令数据的审批状态=已审批*/
+            List<Long> ids_1 = changeTokenFormTasks.stream().filter(f -> f.getStatus().equals(1)).map(ChangeTokenFormTask::getId).collect(Collectors.toList());
+            if (ids_1.size() > 0) {
                 UpdateWrapper<ChangeTokenFormTask> updateWrapper = new UpdateWrapper<>();
-                updateWrapper.in("id", ids);
+                updateWrapper.eq("task_id", dto.getTaskId());
+                updateWrapper.in("id", ids_1);
                 ChangeTokenFormTask updateEntity = new ChangeTokenFormTask();
                 updateEntity.setApproveStatus(2);
                 changeTokenFormServiceTask.update(updateEntity, updateWrapper);
             }
+
+            /*删除status=2的单条驳回的变更令、部位、清单数据taskVO,并修改原始变更令数据的审批状态=未上报,status=未选中*/
+            List<Long> ids_2 = changeTokenFormTasks.stream().filter(f -> f.getStatus().equals(2)).map(ChangeTokenFormTask::getId).collect(Collectors.toList());
+            if (ids_2.size() > 0) {
+                /*原始变更令审批状态修改为=0未上报,单条驳回状态=0未选中,可重复上报*/
+                UpdateWrapper<ChangeTokenForm> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", ids_2);
+                ChangeTokenForm updateEntity = new ChangeTokenForm();
+                updateEntity.setApproveStatus(0);
+                updateEntity.setStatus(0);
+                changeTokenFormService.update(updateEntity, updateWrapper);
+
+                /*删除*/
+                jdbcTemplate.execute("DELETE FROM s_change_token_form_task WHERE task_id = " + dto.getTaskId() + " AND id IN(" + StringUtils.join(ids_2, ",") + ")");
+                jdbcTemplate.execute("DELETE FROM s_change_token_meter_task WHERE task_id = " + dto.getTaskId() + " AND change_token_id IN(" + StringUtils.join(ids_2, ",") + ")");
+                jdbcTemplate.execute("DELETE FROM s_change_token_inventory_task WHERE task_id = " + dto.getTaskId() + " AND change_token_id IN(" + StringUtils.join(ids_2, ",") + ")");
+            }
+
         }
         return this;
     }

+ 1 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -1385,6 +1385,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                         if (linkTasks != null && linkTasks.size() > 0) {
                             this.integrationMethod(vor, linkTasks);
                         }
+                        vor.setTaskId(maxTaskObject.getId());
                         vor.setReportNumber(String.valueOf(tasks.get(0).getBatch()));
                     }
                 }