瀏覽代碼

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

huangtf 1 年之前
父節點
當前提交
72dce3df84
共有 24 個文件被更改,包括 671 次插入71 次删除
  1. 80 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/SaveApplyDTO.java
  2. 3 1
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java
  3. 6 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java
  4. 33 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveInspectPreviewVO.java
  5. 3 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveTaskPageVO.java
  6. 5 2
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java
  7. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java
  8. 28 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java
  9. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ContractClient.java
  10. 4 1
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  11. 1 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  12. 80 15
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  13. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java
  14. 10 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  15. 29 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  16. 13 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  17. 20 4
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java
  18. 182 35
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  19. 4 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/PdfResizeTool.java
  20. 101 9
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  21. 36 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java
  22. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java
  23. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  24. 7 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

+ 80 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/dto/SaveApplyDTO.java

@@ -0,0 +1,80 @@
+package org.springblade.archive.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.archive.vo.ArchivesAutoVO2;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @Param   保存验收申请的表单
+ * @Author wangwl
+ * @Date 2023/11/7 15:03
+ **/
+@Data
+public class SaveApplyDTO implements Serializable {
+
+    private static final long serialVersionUID = 15678567L;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "验收日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    @ApiModelProperty("附件PDF地址")
+    private String attachmentPdfUrl;
+
+    @ApiModelProperty(value = "档案id,逗号分隔")
+    private String archiveIds;
+
+    @ApiModelProperty(value = "专家信息集合")
+    private List<ExpertInfo> list;
+
+    @ApiModelProperty(value = "申请说明")
+    private String taskContent;
+
+
+    @ApiModelProperty("自定义流程,所选的审批人ID和姓名集合")
+    private List<CustomUserTask> userTasks;
+
+
+    @Data
+    public static class ExpertInfo {
+
+        @ApiModelProperty("姓名")
+        private String name;
+
+        @ApiModelProperty("职位")
+        private String position;
+
+        @ApiModelProperty("是否为组长,0否1是")
+        private Integer isLeader;
+
+        @ApiModelProperty("身份证号")
+        private String idNumber;
+
+        @ApiModelProperty("手机号")
+        private String phone;
+
+    }
+
+    @Data
+    public static class CustomUserTask {
+        private String userId;
+        private String userName;
+
+        public CustomUserTask(String userId, String userName) {
+            this.userId = userId;
+            this.userName = userName;
+        }
+    }
+}

+ 3 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -168,8 +168,10 @@ public class ArchivesAuto extends BaseEntity {
 
     private Integer isLock;  //案卷锁定  0未锁  1已锁定    (已锁定的案卷,自动归档执行不再拆卷重新组卷)
 
-    //是否查阅,0,未查阅,1已查阅
+    @ApiModelProperty("是否查阅,0未查阅1已查阅")
     private Integer isReviewed;
+    @ApiModelProperty("申请验收状态,0未申请或已申请1验收中")
+    private Integer isApply;
 
     //是否是影音
     public boolean isMedia() {

+ 6 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java

@@ -31,4 +31,10 @@ public interface ArchiveAutoClient {
 
     @PostMapping(API_PREFIX + "/getByProjectIdOrNew")
     ArchiveProjectConfig getByProjectIdOrNew(@RequestParam Long projectId);
+
+    /**
+     * 批量修改档案申请验收状态
+     */
+    @PostMapping(API_PREFIX + "/batchUpdateIsApply")
+    R<Boolean> batchUpdateIsApply(@RequestParam Integer isApply,@RequestParam List<Long> ids);
 }

+ 33 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveInspectPreviewVO.java

@@ -0,0 +1,33 @@
+package org.springblade.archive.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.archive.entity.ArchivesAuto;
+
+import java.util.List;
+
+/**
+ * @Param   档案巡检主页预览
+ * @Author wangwl
+ * @Date 2023/11/3 15:55
+ **/
+@Data
+public class ArchiveInspectPreviewVO {
+
+    @ApiModelProperty("单位归档资料头信息")
+    private String unitInfo;
+
+    @ApiModelProperty("单位归档资料")
+    private List<NodeList> nodeLists;
+
+    @Data
+    public static class NodeList {
+
+        @ApiModelProperty("节点归档资料头信息")
+        private String nodeInfo;
+
+        @ApiModelProperty("档案集合")
+        private List<ArchivesAutoVO2> list;
+    }
+
+}

+ 3 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchiveTaskPageVO.java

@@ -42,4 +42,7 @@ public class ArchiveTaskPageVO implements Serializable {
     @ApiModelProperty(value = "签字人员集合")
     private List<Object> taskApproveUserNamesList;
 
+    @ApiModelProperty(value = "任务类型")
+    private Integer type;
+
 }

+ 5 - 2
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO2.java

@@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
 import org.springblade.archive.entity.ArchivesAuto;
 
 /**
- * @author yangyj
+ * @author wangwl 包含当前单位主节点字段
  * @Date 2023/2/17 10:40
  * @description TODO
  */
@@ -15,5 +15,8 @@ import org.springblade.archive.entity.ArchivesAuto;
 public class ArchivesAutoVO2 extends ArchivesAuto {
 
     @ApiModelProperty("主节点")
-    private String masterNode;
+    private Long masterNode;
+
+    @ApiModelProperty("保管期限名称")
+    private String storageTimeValue;
 }

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

@@ -129,6 +129,12 @@ public class Task extends BaseEntity {
     @ApiModelProperty("合同段ID")
     private String contractId;
 
+    @ApiModelProperty("申请验收的档案id")
+    private String archiveIds;
+
+    @ApiModelProperty("附件PDF地址")
+    private String attachmentPdfUrl;
+
     /**
      * 试验自检记录id
      */

+ 28 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java

@@ -32,6 +32,34 @@ public interface TaskClient {
     String QUERY_BUSINESS_TABLE_E_VISA_CONFIG = API_PREFIX + "/query-business-table-e-visa-config";
     String QUERY_TASK_CONTRACT_ID = API_PREFIX + "/query-task-contract-id";
     String QUERY_TASK_ALL_BATCH = API_PREFIX + "/query-contract-all-batch";
+    String SAVE_TASK = API_PREFIX + "/save_task";
+    String SAVE_TASK_PARALLEL = API_PREFIX + "/save_task_parallel";
+    String QUERY_USER_TASK = API_PREFIX + "/query-user-task";
+    String DELETE_USER_TASK = API_PREFIX + "/delete-user-task";
+
+    /**
+     * 保存任务
+     */
+    @PostMapping(SAVE_TASK)
+    void saveTask(@RequestBody Task task);
+
+    /**
+     * 保存副任务
+     */
+    @PostMapping(SAVE_TASK_PARALLEL)
+    void saveTaskParallel(@RequestBody TaskParallel taskParallel);
+
+    /**
+     * 获取用户指定类型指定状态的任务
+     */
+    @GetMapping(QUERY_USER_TASK)
+    List<Task> queryUserTask(@RequestParam Long projectId,@RequestParam Integer type,@RequestParam Long reportUser,@RequestParam Integer status);
+
+    /**
+     * 删除用户待审批的验收任务
+     */
+    @GetMapping(DELETE_USER_TASK)
+    Boolean deleteUserTask(@RequestParam Long projectId,@RequestParam Long reportUser);
 
 
     /**

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

@@ -70,4 +70,10 @@ public interface ContractClient {
     @GetMapping(API_PREFIX + "/updateIsArchivesAutoById")
     void updateIsArchivesAutoById(@RequestParam Long id, @RequestParam Integer isArchivesAuto);
 
+    /**
+     *  根据项目id获取指定类型合同段
+     */
+    @GetMapping(API_PREFIX + "/getContractByProjectIdAndType")
+    List<ContractInfo> getContractByProjectIdAndType(@RequestParam Long projectId,@RequestParam Integer contractType);
+
 }

+ 4 - 1
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -21,6 +21,7 @@ import io.swagger.annotations.ApiParam;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.system.user.dto.UserDTO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.UserInfo;
 import org.springblade.system.user.entity.UserOauth;
@@ -49,6 +50,7 @@ public interface IUserClient {
     String USER_INFO_BY_ACCOUNT = API_PREFIX + "/user-info-by-account";
     String USER_AUTH_INFO = API_PREFIX + "/user-auth-info";
     String SAVE_USER = API_PREFIX + "/save-user";
+    String SAVE_USER_DTO = API_PREFIX + "/save-user-dto";
     String REMOVE_USER = API_PREFIX + "/remove-user";
     String RESET_USER = API_PREFIX + "/reset-password";
     String USER_STATUS = API_PREFIX + "/user-status";
@@ -172,6 +174,7 @@ public interface IUserClient {
     @GetMapping(USER_LIST_INFO_BY_IDS)
     List<User> userInfoByIds(@RequestBody List<Long> userIds);
 
-
+    @PostMapping(SAVE_USER_DTO)
+    R<Boolean> saveUserDTO(@RequestBody UserDTO user);
 
 }

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

@@ -306,6 +306,7 @@ public class ArchiveFileTaskController extends BladeController {
                     vo.setTaskStatusName(task.getStatus().equals(1) ? "待审批" : task.getStatus().equals(2) ? "已审批" : "已废除");
                     vo.setStartTime(task.getStartTime());
                     vo.setEndTime(task.getEndTime());
+                    vo.setType(task.getType());
                     vo.setTaskDesc(task.getTaskContent());
                     vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
                     List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());

+ 80 - 15
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -32,9 +32,11 @@ import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.message.BasicNameValuePair;
+import org.springblade.archive.dto.SaveApplyDTO;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.utils.CallBgrsjk;
 import org.springblade.archive.utils.FileUtils;
+import org.springblade.archive.vo.ArchiveInspectPreviewVO;
 import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.InformationQuery;
@@ -674,21 +676,6 @@ public class ArchivesAutoController extends BladeController {
         return R.data(archivesAuto);
     }
 
-	/**
-	 * 在线验收-根据单位显示档案
-	 */
-	@GetMapping("/getUnitArchivesAutoView")
-	@ApiOperationSupport(order = 11)
-	@ApiOperation(value = "在线验收-根据单位显示档案", notes = "传入项目id,和单位类型")
-	@ApiImplicitParams(value = {
-			@ApiImplicitParam(name = "unitType", value = "单位类型,1建设2监理3施工4科研", required = true),
-			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
-	})
-	public R<List<CheckoutVO>> getArchivesAutoViewByUnit(@RequestParam Integer unitType, Long projectId) {
-		List<CheckoutVO> list = archivesAutoService.getArchivesAutoViewByUnit(unitType,projectId);
-		return R.data(list);
-	}
-
 	/**
 	 * 批量下载档案
 	 */
@@ -699,4 +686,82 @@ public class ArchivesAutoController extends BladeController {
 		ServletOutputStream outputStream = response.getOutputStream();
 		archivesAutoService.batchDownloadFileToZip(ids,response);
 	}
+
+	/**
+	 * 验收申请-汇总目录
+	 */
+	@GetMapping("/getAllUnitArchivesView")
+	@ApiOperationSupport(order = 20)
+	@ApiOperation(value = "验收申请-汇总目录", notes = "传入项目id,返回数组,为所有单位归档资料")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<List<ArchiveInspectPreviewVO>> getAllUnitArchivesView(@RequestParam Long projectId) {
+		List<ArchiveInspectPreviewVO> vos = archivesAutoService.getAllUnitArchivesView(projectId);
+		return R.data(vos);
+	}
+
+	/**
+	 * 验收申请-查看申请状态
+	 */
+	@GetMapping("/getApplyStatus")
+	@ApiOperationSupport(order = 21)
+	@ApiOperation(value = "验收申请-查看申请状态", notes = "传入项目id,返回true代表申请中,false代表未申请")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<Boolean> getApplyStatus(@RequestParam Long projectId) {
+		return R.data(archivesAutoService.getApplyStatus(projectId));
+	}
+
+	/**
+	 * 验收申请-撤销申请
+	 */
+	@GetMapping("/annulApply")
+	@ApiOperationSupport(order = 22)
+	@ApiOperation(value = "验收申请-撤销申请", notes = "传入项目id")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R annulApply(@RequestParam Long projectId) {
+		archivesAutoService.annulApply(projectId);
+		return R.data("撤销成功");
+	}
+
+	/**
+	 * 验收申请-申请保存
+	 */
+	@PostMapping("/saveApply")
+	@ApiOperationSupport(order = 23)
+	@ApiOperation(value = "验收申请-申请保存", notes = "传入保存表单,档案id用逗号分隔")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "taskName", value = "任务名称", required = true),
+			@ApiImplicitParam(name = "startDate", value = "验收日期", required = true),
+			@ApiImplicitParam(name = "archiveIds", value = "档案id,逗号分隔", required = true),
+			@ApiImplicitParam(name = "list", value = "专家信息集合", required = true),
+			@ApiImplicitParam(name = "taskContent", value = "申请说明", required = false),
+			@ApiImplicitParam(name = "userTasks", value = "自定义流程,所选的审批人ID和姓名集合", required = true)
+	})
+	public R saveApply(@RequestBody SaveApplyDTO dto) {
+		archivesAutoService.saveApply(dto);
+		return R.data("申请成功");
+	}
+
+
+
+	/**
+	 * 在线验收-根据单位显示档案
+	 */
+	@GetMapping("/getUnitArchivesAutoView")
+	@ApiOperationSupport(order = 30)
+	@ApiOperation(value = "在线验收-根据单位显示档案", notes = "传入项目id,和单位类型")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "unitType", value = "单位类型,1建设2监理3施工4科研", required = true),
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+	})
+	public R<ArchiveInspectPreviewVO> getArchivesAutoViewByUnit(@RequestParam Integer unitType, Long projectId) {
+		ArchiveInspectPreviewVO vo = archivesAutoService.getArchivesAutoViewByUnit(unitType,projectId,1);
+		return R.data(vo);
+	}
 }

+ 5 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java

@@ -38,4 +38,9 @@ public class ArchiveAutoClientImpl implements ArchiveAutoClient {
     public ArchiveProjectConfig getByProjectIdOrNew(@RequestParam Long projectId){
         return archiveProjectConfigService.getByProjectIdOrNew(projectId);
     }
+
+    @Override
+    public R<Boolean> batchUpdateIsApply(Integer isApply, List<Long> ids) {
+        return archivesAutoService.batchUpdateIsApply(isApply,ids);
+    }
 }

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

@@ -163,4 +163,14 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
     List<ArchiveFile> batchSearchArchiveFile(@Param("ids") List<Long> longs);
 
 	List<ArchivesAuto> getArchives(@Param("ids") List<Long> longs);
+
+    List<ArchiveTreeContract> getUnitSecondNode(@Param("firstNode") Long firstNode);
+
+	List<ArchiveTreeContract> getTertiaryNode(@Param("ids") List<Long> ids);
+
+	ArchiveTreeContract getUnitFirstNode(@Param("projectId") Long projectId,@Param("nodeType") String nodeType);
+
+	//用于档案巡检查询单位下档案
+	List<ArchivesAutoVO2> getUnitAllArchive2(@Param("firstNode") Long firstNode,@Param("grade") Integer grade,@Param("isApply") Integer isApply);
+
 }

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

@@ -971,6 +971,35 @@
             #{id}
         </foreach>
     </select>
+    <select id="getUnitSecondNode" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select * from m_archive_tree_contract WHERE is_deleted = 0 and  parent_id  = #{firstNode}
+    </select>
+    <select id="getTertiaryNode" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select * from m_archive_tree_contract WHERE is_deleted = 0 and  parent_id  in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+    <select id="getUnitFirstNode" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select * from m_archive_tree_contract WHERE is_deleted = 0 and  parent_id  =
+        (select id from m_archive_tree_contract
+        WHERE project_id = #{projectId} and is_deleted = 0 and parent_id = 0)
+        <if test="nodeType == null">
+            and tree_code is null
+        </if>
+        <if test="nodeType != null and nodeType != ''">
+            and tree_code = #{nodeType}
+        </if>
+    </select>
+    <select id="getUnitAllArchive2" resultType="org.springblade.archive.vo.ArchivesAutoVO2">
+        select
+               SUBSTRING_INDEX(SUBSTRING_INDEX(matc.ancestors,",",#{grade}),",",-1) as masterNode,
+               uaa.id,uaa.name,uaa.page_n ,uaa.remark ,uaa.file_number,
+                (select bdb.dict_value  from blade_dict_biz bdb WHERE bdb.is_sealed = 0 and bdb.code = 'storage_period' and bdb.dict_key = uaa.storage_time limit 1 ) as storageTimeValue
+        from m_archive_tree_contract matc right join u_archives_auto uaa on matc.id = uaa.node_id
+        WHERE uaa.is_deleted = 0 and matc.is_deleted = 0 and uaa.is_apply = #{isApply} and matc.ancestors like concat("%",#{firstNode},"%")
+        order by uaa.tree_sort
+    </select>
 
 
     <update id="splitFiles">

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

@@ -16,7 +16,9 @@
  */
 package org.springblade.archive.service;
 
+import org.springblade.archive.dto.SaveApplyDTO;
 import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.vo.ArchiveInspectPreviewVO;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
@@ -106,7 +108,17 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	// 语音搜索
 	R searchInfo(MultipartFile file) throws IOException;
 
-    List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId);
+    ArchiveInspectPreviewVO getArchivesAutoViewByUnit(Integer unitType, Long projectId,Integer isApply);
+
+    List<ArchiveInspectPreviewVO> getAllUnitArchivesView(Long projectId);
 
     void batchDownloadFileToZip(String ids, HttpServletResponse response);
+
+	void saveApply(SaveApplyDTO dto);
+
+	R<Boolean> batchUpdateIsApply(Integer isApply, List<Long> ids);
+
+	Boolean getApplyStatus(Long projectId);
+
+	void annulApply(Long projectId);
 }

+ 20 - 4
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -22,6 +22,7 @@ import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.constant.OssConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.common.vo.DataVO;
 import org.springblade.common.vo.FileSize;
 import org.springblade.core.oss.model.BladeFile;
@@ -895,21 +896,27 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
     public String upFile(InputStream inputStream, Long projectId) {
         String url = "";
         Long id = SnowFlakeUtil.getId();
-        String localPdf = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL) + "/pdf/" + id + ".pdf";
+        Long id1 = SnowFlakeUtil.getId();
+        String localPdfIn = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL) + "/pdf/" + id + ".pdf";
+        String localPdfOut = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL) + "/pdf/" + id1 + ".pdf";
+        if (SystemUtils.isWindows()) {
+            localPdfIn = "c://upload/pdf/" + id + ".pdf";
+            localPdfOut = "c://upload/pdf/" + id1 + ".pdf";
+        }
         String fileName = id + ".pdf";
         OutputStream outputStream = null;
         try {
             //合并PDF
             byte[] bytes = FileUtils.InputStreamToBytes(inputStream);
-            outputStream = new FileOutputStream(localPdf);
+            outputStream = new FileOutputStream(localPdfIn);
             outputStream.write(bytes);
 
             //设置PDF每页大小为A4,内容等比缩放,方向同步
-            //PdfResizeTool.resizeToA4WithContentScaling(localPdf, localPdf);
+            PdfResizeTool.resizeToA4WithContentScaling(localPdfIn, localPdfOut);
 
             //上传到OSS
             String absoluteFileName = FileUtils.getOssPath(OssConstant.ARCHIVE_DIRECTORY, fileName, projectId);
-            BladeFile file = newIOSSClient.uploadFile(absoluteFileName, localPdf);
+            BladeFile file = newIOSSClient.uploadFile(absoluteFileName, localPdfOut);
             url = file.getLink();
         } catch (Exception e) {
             e.printStackTrace();
@@ -919,6 +926,15 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
                 if (outputStream != null) {
                     outputStream.close();
                 }
+                //删除临时文件
+                File localPdfInFile = new File(localPdfIn);
+                if (localPdfInFile.exists()) {
+                    localPdfInFile.delete();
+                }
+                File localPdfOutFile = new File(localPdfOut);
+                if (localPdfOutFile.exists()) {
+                    localPdfOutFile.delete();
+                }
             } catch (IOException ex) {
                 ex.printStackTrace();
             }

+ 182 - 35
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -24,11 +24,13 @@ import com.aliyun.oss.OSSClient;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.dto.SaveApplyDTO;
 import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.service.IArchiveAutoPdfService;
@@ -37,14 +39,18 @@ import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.utils.ArchiveTreeUtil;
 import org.springblade.archive.utils.FileTransJavaDemo;
 import org.springblade.archive.utils.FileUtils;
+import org.springblade.archive.vo.ArchiveInspectPreviewVO;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.archive.mapper.ArchivesAutoMapper;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.archive.vo.ArchivesAutoVO2;
 import org.springblade.archive.vo.CheckoutVO;
 import org.springblade.business.entity.ArchiveFile;
+import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.business.feign.MetadataClassificationClient;
+import org.springblade.business.feign.TaskClient;
 import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.IDUtils;
@@ -77,10 +83,12 @@ import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
@@ -128,6 +136,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final IArchiveOfflineVersionInfoService versionInfoService;
 
+	private final TaskClient taskClient;
+
+
+
 
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
@@ -2374,6 +2386,21 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return R.data(jsonObject);
 	}
 
+	/**
+	 * 验收申请-汇总目录
+	 * @param projectId
+	 * @return
+	 */
+	@Override
+	public List<ArchiveInspectPreviewVO> getAllUnitArchivesView(Long projectId) {
+		List<ArchiveInspectPreviewVO> vos = new ArrayList<>();
+		vos.add(this.getArchivesAutoViewByUnit(1,projectId,0));
+		vos.add(this.getArchivesAutoViewByUnit(2,projectId,0));
+		vos.add(this.getArchivesAutoViewByUnit(3,projectId,0));
+		vos.removeIf(Objects::isNull);
+		return vos;
+	}
+
 	/**
 	 * 在线验收-根据单位显示档案
 	 * @param unitType
@@ -2381,43 +2408,74 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * @return
 	 */
 	@Override
-	public List<CheckoutVO> getArchivesAutoViewByUnit(Integer unitType, Long projectId) {
-		//判断单位
-		if (unitType == 1){
-			//获取所有主节点,如果没有档案不显示可以取消
-			List<ArchiveTreeContract> nodes = baseMapper.getUnitNodeByProjectId(projectId);
-			if (nodes == null || nodes.size() <= 0){
-				return null;
-			}
-			String node = nodes.get(0).getAncestors().split(",")[2];
-			//获取建设单位的所有档案
-			List<ArchivesAutoVO2> vo2s = baseMapper.getUnitAllArchive(node);
-			if (vo2s == null || vo2s.size() <= 0){
-				return null;
-			}
-			List<CheckoutVO> list = new ArrayList<>();
-			CheckoutVO vo = new CheckoutVO();
-			vo.setNodeName("建设单位归档资料");
-			vo.setTotal(vo2s.size());
-			list.add(vo);
-			//根据主节点分组
-			Map<String, List<ArchivesAutoVO2>> map = vo2s.parallelStream().collect(Collectors.groupingBy(ArchivesAutoVO2::getMasterNode));
-			//循环主节点并且存入数据
-			for (ArchiveTreeContract contract : nodes) {
-				CheckoutVO v = new CheckoutVO();
-				v.setNodeName(contract.getFullName());
-				List<ArchivesAutoVO2> vo2List = map.get(contract.getId()+"");
-				if (vo2List != null && vo2List.size() > 0){
-					v.setTotal(vo2List.size());
-					v.setList(vo2List);
-				}else {
-					v.setTotal(0);
-				}
-				list.add(v);
+	public ArchiveInspectPreviewVO getArchivesAutoViewByUnit(Integer unitType, Long projectId,Integer isApply) {
+		//设置节点类型
+		String nodeType = null;
+		if (unitType == 2){
+			nodeType = "S";
+		}else if (unitType == 3){
+			nodeType = "C";
+		}else if (unitType == 4){
+			return null;
+		}
+		//返回值
+		ArchiveInspectPreviewVO vo = new ArchiveInspectPreviewVO();
+		//状态,用于判断是二级节点还是三级节点
+		Boolean isSecondNode = true;
+		//获取当前单位首节点
+		ArchiveTreeContract FirstNode = baseMapper.getUnitFirstNode(projectId, nodeType);
+		if (FirstNode == null){
+			return null;
+		}
+		String unitName = FirstNode.getNodeName();
+		//获取当前单位下的二级节点
+		List<ArchiveTreeContract> unitNodes = baseMapper.getUnitSecondNode(FirstNode.getId());
+		if (unitNodes == null || unitNodes.size() == 0){
+			return null;
+		}
+		//判断二级节点是否为合同段节点
+		Boolean isContractNode = false;
+		if (unitNodes.get(0).getExtType() != null && unitNodes.get(0).getExtType() == 2) {
+			isContractNode = true;
+		}
+		if (isContractNode){
+			isSecondNode = false;
+			//如果为合同段节点,则跳过当前节点,获取三级节点
+			List<Long> ids = unitNodes.stream().map(l -> l.getId()).collect(Collectors.toList());
+			unitNodes = baseMapper.getTertiaryNode(ids);
+		}
+		//获取单位下面所有档案,根据节点等级
+		List<ArchivesAutoVO2> unitAllArchive = new ArrayList<>();
+		if (isContractNode){
+			unitAllArchive = baseMapper.getUnitAllArchive2(FirstNode.getId(),5,isApply);
+		}else {
+			unitAllArchive = baseMapper.getUnitAllArchive2(FirstNode.getId(),4,isApply);
+		}
+		if (unitAllArchive.size() == 0){
+			return null;
+		}
+		vo.setUnitInfo(unitName+"("+unitAllArchive.size()+"卷)");
+		List<ArchiveInspectPreviewVO.NodeList> nodeLists = new ArrayList<>();
+		//档案按照二级节点分组
+		Map<Long, List<ArchivesAutoVO2>> archiveMap = unitAllArchive.stream().collect(Collectors.groupingBy(ArchivesAutoVO2::getMasterNode));
+		//循环二级节点,分别统计档案数据,把档案设置进结果集
+		for (ArchiveTreeContract unitNode : unitNodes) {
+			//获取节点名称
+			String nodeName = unitNode.getNodeName();
+			//获取节点档案
+			List<ArchivesAutoVO2> list = archiveMap.get(unitNode.getId());
+			ArchiveInspectPreviewVO.NodeList nodeList = new ArchiveInspectPreviewVO.NodeList();
+			if (list == null || list.size() == 0){
+				//如果档案为空,直接设置名称跳出
+				nodeList.setNodeInfo(nodeName+"(0卷)");
+			}else {
+				nodeList.setNodeInfo(nodeName+"("+list.size()+"卷)");
+				nodeList.setList(list);
 			}
-			return list;
+			nodeLists.add(nodeList);
 		}
-		return null;
+		vo.setNodeLists(nodeLists);
+		return vo;
 	}
 
 	@Override
@@ -2501,6 +2559,95 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 	}
 
+	@Override
+	@Transactional
+	public void saveApply(SaveApplyDTO dto) {
+		//先获取当前用户是否已经存在验收任务
+		Boolean aBoolean = this.getApplyStatus(dto.getProjectId());
+		if (aBoolean){
+			throw new ServiceException("当前专家已存在验收任务,请勿重复上报");
+		}
+		//设置任务表信息
+		Task task = new Task();
+		Long id = SnowFlakeUtil.getId();
+		task.setId(id);
+		task.setProcessInstanceId(id.toString());
+		task.setProcessDefinitionId(id.toString());
+		task.setProjectId(dto.getProjectId()+"");
+		task.setAttachmentPdfUrl(dto.getAttachmentPdfUrl());
+		task.setCreateTime(new Date());
+		//设置合同段为当前项目指挥部合同段
+		List<ContractInfo> contractInfos = contractClient.getContractByProjectIdAndType(Long.parseLong(task.getProjectId()), 3);
+		if (contractInfos == null || contractInfos.size() != 1){
+			throw new ServiceException("申请验收失败,未找到当前项目的指挥部合同段,请联系管理员");
+		}
+		task.setContractId(contractInfos.get(0).getId()+"");
+		task.setStartTime(dto.getStartDate().toString());
+		task.setReportUser(AuthUtil.getUserId().toString());
+		task.setReportUserName(AuthUtil.getUserName());
+		task.setTaskName(dto.getTaskName());
+		task.setTaskContent(dto.getTaskContent());
+		//数据指向设置为专家信息
+		List<SaveApplyDTO.ExpertInfo> list = dto.getList();
+		if (list == null || list.size() == 0){
+			throw new ServiceException("请设置专家信息");
+		}
+		task.setFormDataId(JSON.toJSONString(list));
+		//类型设置2验收任务
+		task.setType(2);
+		//上报类型4档案数据
+		task.setApprovalType(4);
+		task.setStatus(1);
+		//档案id
+		task.setArchiveIds(dto.getArchiveIds());
+		taskClient.saveTask(task);
+		//根据任务人设置task_parallel
+		List<SaveApplyDTO.CustomUserTask> userTasks = dto.getUserTasks();
+		if (userTasks == null || userTasks.size() == 0){
+			throw new ServiceException("请选择任务人");
+		}
+		for (SaveApplyDTO.CustomUserTask info : userTasks) {
+			TaskParallel taskParallel = new TaskParallel();
+			taskParallel.setProcessInstanceId(id.toString());
+			taskParallel.setParallelProcessInstanceId(id.toString());
+			taskParallel.setTaskUser(info.getUserId());
+			taskParallel.setTaskUserName(info.getUserName());
+			taskParallel.setStatus(1);
+			taskClient.saveTaskParallel(taskParallel);
+		}
+
+
+	}
+
+	@Override
+	public R<Boolean> batchUpdateIsApply(Integer isApply, List<Long> ids) {
+		this.update(new LambdaUpdateWrapper<ArchivesAuto>()
+				.set(ArchivesAuto::getIsApply,isApply)
+				.in(ArchivesAuto::getId,ids));
+		return R.data(true);
+	}
+
+	@Override
+	public Boolean getApplyStatus(Long projectId) {
+		//查出所有当前用户待审批的验收任务
+		Long userId = AuthUtil.getUserId();
+		List<Task> tasks = taskClient.queryUserTask(projectId,2, userId, 1);
+		if (tasks == null || tasks.size() == 0){
+			return false;
+		}else {
+			return true;
+		}
+	}
+
+	@Override
+	public void annulApply(Long projectId) {
+		Long userId = AuthUtil.getUserId();
+		Boolean aBoolean = taskClient.deleteUserTask(projectId, userId);
+		if (!aBoolean){
+			throw  new ServiceException("撤销失败,请联系管理员");
+		}
+	}
+
 	public void deleteFile(String defaultDir,Long id){
 		String dir = defaultDir+"/"+id;
 		String file = defaultDir+"/"+id+".zip";

+ 4 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/PdfResizeTool.java

@@ -5,9 +5,9 @@ import com.itextpdf.kernel.geom.Rectangle;
 import com.itextpdf.kernel.pdf.*;
 import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
 
-
 import java.io.IOException;
 
+
 public class PdfResizeTool {
 
     /**
@@ -54,9 +54,10 @@ public class PdfResizeTool {
         outputDocument.close();
     }
 
-    /*public static void main(String[] args) throws IOException {
+
+    /*public static void main(String[] args) throws Exception {
         String inputPdfPath = "D:\\Download\\66666.pdf";
-        String outputPdfPath = "D:\\Download\\6666611111.pdf";
+        String outputPdfPath = "D:\\Download\\AAAAAAA.pdf";
         resizeToA4WithContentScaling(inputPdfPath, outputPdfPath);
     }*/
 

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

@@ -20,11 +20,14 @@ import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.archive.dto.ArchiveTaskDTO;
+import org.springblade.archive.dto.SaveApplyDTO;
+import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.archive.vo.ArchiveTaskPageVO;
 import org.springblade.business.dto.*;
 import org.springblade.business.entity.*;
 import org.springblade.business.service.*;
 import org.springblade.business.socket.WebSocket;
+import org.springblade.business.utils.StringSPUtils;
 import org.springblade.business.vo.*;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
@@ -46,6 +49,7 @@ import org.springblade.feign.ArchiveFileTaskClient;
 import org.springblade.flow.core.entity.BladeFlow;
 import org.springblade.flow.core.feign.NewFlowClient;
 import org.springblade.flow.core.vo.SendPageVO;
+import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.ProjectInfo;
@@ -56,11 +60,14 @@ import org.springblade.resource.feign.NewISmsClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.entity.Role;
 import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.user.dto.UserDTO;
 import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -101,6 +108,8 @@ public class TaskController extends BladeController {
     private final EVisaClient eVisaClient;
     private final ExcelTabClient excelTabClient;
     private final ArchiveFileTaskClient archiveFileTaskClient;
+    private final IUserClient userClient;
+    private final ArchiveAutoClient archiveClient;
 
     /**
      * 记录短信验证码超时时间
@@ -625,6 +634,7 @@ public class TaskController extends BladeController {
     @PostMapping("/batch-complete-approval-task-archive")
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "批量审批(档案 垂直审批)")
+    @Transactional
     public R<Boolean> batchCompleteApprovalTaskArchive(@RequestBody TaskArchiveOuterLayerDTO taskArchiveOuterLayerDTO) throws IOException {
         if (ObjectUtil.isEmpty(SecureUtil.getUser()) || ObjectUtil.isEmpty(SecureUtil.getUserId()) || SecureUtil.getUserId().equals(-1L)) {
             throw new ServiceException("未获取到当前登陆的用户信息,操作失败");
@@ -644,8 +654,74 @@ public class TaskController extends BladeController {
             for (TaskArchiveDTO taskArchiveDTO : taskArchiveOuterLayerDTO.getTaskArchiveDtoList()) {
                 if (StringUtils.isNotEmpty(taskArchiveDTO.getTaskId())) {
                     //通过checkArchiveTaskUserByCurrent检查,说明当前登陆用户是该条任务的审批人,修改审批任务状态
-                    Task task = jdbcTemplate.queryForObject("select process_instance_id,form_data_id from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
+                    Task task = jdbcTemplate.queryForObject("select id,contract_id,project_id,process_instance_id,form_data_id,type,archive_ids from u_task where id = " + taskArchiveDTO.getTaskId(), new BeanPropertyRowMapper<>(Task.class));
                     if (task != null) {
+                        //判断任务类型是否是验收任务,档案验收任务单独处理修改状态直接返回
+                        if (task.getType() == 2){
+                            //是验收任务直接获取所有的副任务
+                            List<TaskParallel> parallelList = taskParallelService.list(new LambdaQueryWrapper<TaskParallel>().eq(TaskParallel::getProcessInstanceId, task.getId()));
+                            //修改当前用户的副任务状态,保存
+                            for (TaskParallel taskParallel : parallelList) {
+                                if (taskParallel.getTaskUser().equals(AuthUtil.getUserId()+"")){
+                                    taskParallel.setStatus(2);
+                                    taskParallel.setEVisaStatus(1);
+                                    taskParallelService.updateById(taskParallel);
+                                    break;
+                                }
+                            }
+                            parallelList.removeIf(l->l.getStatus() == 2);
+                            //判断是否所有副任务都是完成状态
+                            if (parallelList.size() == 0) {
+                                //都是完成状态,则修改主任务的状态
+                                task.setStatus(2);
+                                taskService.updateById(task);
+                                //保存专家账号
+                                String formDataId = task.getFormDataId();
+                                List<SaveApplyDTO.ExpertInfo> expertInfoList = JSON.parseArray(formDataId, SaveApplyDTO.ExpertInfo.class);
+                                for (SaveApplyDTO.ExpertInfo expertInfo : expertInfoList) {
+                                    UserDTO dto = new UserDTO();
+                                    String phone = expertInfo.getPhone();
+                                    String name = expertInfo.getName();
+                                    dto.setTenantId(AuthUtil.getTenantId());
+                                    dto.setAccount("expert"+phone);
+                                    StringSPUtils stringSPUtils = new StringSPUtils();
+                                    dto.setPassword(stringSPUtils.getStringSP(name)+phone);
+                                    dto.setUserType("3");
+                                    dto.setRealName(name);
+                                    dto.setPhone(phone);
+                                    dto.setDeptId(AuthUtil.getDeptId());
+                                    dto.setStatus(1);
+                                    List<SaveUserInfoByProjectDTO> list = new ArrayList<>();
+                                    SaveUserInfoByProjectDTO projectDTO = new SaveUserInfoByProjectDTO();
+                                    projectDTO.setProjectId(task.getProjectId());
+                                    //专家合同段设置为指挥部
+                                    projectDTO.setContractId(task.getContractId());
+                                    //判断是否为组长
+                                    if (expertInfo.getIsLeader() == 0){
+                                        projectDTO.setRoleId("1656191770880864257");
+                                    }else {
+                                        projectDTO.setRoleId("1656191696348082177");
+                                    }
+                                    list.add(projectDTO);
+                                    dto.setProjectAndUserList(list);
+                                    //单个保存专家信息
+                                    R<Boolean> booleanR = userClient.saveUserDTO(dto);
+                                    if (booleanR.getData() == null ||  booleanR.getData() != true){
+                                        throw new ServiceException("保存专家账号失败");
+                                    }
+                                }
+                                //修改档案类型
+                                String archiveIds = task.getArchiveIds();
+                                if (StringUtils.isNotBlank(archiveIds)){
+                                    List<Long> longs = Func.toLongList(archiveIds);
+                                    R<Boolean> booleanR = archiveClient.batchUpdateIsApply(1, longs);
+                                    if (booleanR.getData() == null || booleanR.getData() != true){
+                                        throw new ServiceException("修改档案类型失败");
+                                    }
+                                }
+                            }
+                           return R.data(true);
+                        }
                         org.springblade.evisa.vo.TaskArchiveDTO eVisaObj = new org.springblade.evisa.vo.TaskArchiveDTO();
                         BeanUtils.copyProperties(taskArchiveDTO, eVisaObj);
                         eVisaObj.setType(1); //审批
@@ -701,8 +777,23 @@ public class TaskController extends BladeController {
             return R.data(true);
 
         } else {
-            //废除任务
             List<String> taskIds = taskArchiveOuterLayerDTO.getTaskArchiveDtoList().stream().map(TaskArchiveDTO::getTaskId).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+            //判断任务类型是否是验收任务,档案验收任务单独处理修改状态直接返回
+            if (taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0) == null || taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0).getTaskId() == null){
+                throw new ServiceException("参数错误,请传入任务id");
+            }
+            Task task = jdbcTemplate.queryForObject("select id,type from u_task where id = " + taskArchiveOuterLayerDTO.getTaskArchiveDtoList().get(0).getTaskId(), new BeanPropertyRowMapper<>(Task.class));
+            if (task != null) {
+                //判断任务类型是否是验收任务,档案验收任务单独处理修改状态直接返回
+                if (task.getType() == 2) {
+                    //修改主任务表
+                    jdbcTemplate.execute("UPDATE u_task set status = 3 WHERE id in (" +StringUtils.join(taskIds, ",")+")");
+                    //修改副任务表
+                    jdbcTemplate.execute("UPDATE u_task_parallel set status = 3 WHERE process_instance_id in (\'"+ StringUtils.join(taskIds, "','")+"\')");
+                    return R.data(true);
+                }
+            }
+            //废除任务
             ArchiveTaskBatchRepealDTO dto = new ArchiveTaskBatchRepealDTO();
             dto.setType(2);
             dto.setIds(StringUtils.join(taskIds, ","));
@@ -1459,7 +1550,7 @@ public class TaskController extends BladeController {
         //封装入参SQL
         List<Object> params = new ArrayList<>();
         Integer eVisaStatus = dto.getVisaStatus();
-        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND status = " + eVisaStatus + " AND approval_type != 4 AND contract_id = " + dto.getContractId()); //approval_type != 4 非档案的任务就是1填报资料,2工程文件,3日志资料
+        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE approval_type != 4 AND contract_id = " + dto.getContractId()); //approval_type != 4 非档案的任务就是1填报资料,2工程文件,3日志资料
 
         if (StringUtils.isNotBlank(dto.getStartTimeValue()) && StringUtils.isNotBlank(dto.getEndTimeValue())) {
             if (dto.getStartTimeValue().equals(dto.getEndTimeValue())) {
@@ -1481,18 +1572,19 @@ public class TaskController extends BladeController {
         //根据每个审批人的情况判断是否成功
         if (eVisaStatus == 1) {
             if (StringUtils.isNotBlank(dto.getEVisaUserName())) {
-                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3 AND u_task_parallel.task_user_name LIKE ?)");
+                sqlString.append(" AND (SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id and task_user_name LIKE ? AND is_deleted=0) = 1");
                 params.add("%" + dto.getEVisaUserName() + "%");
-            } else {
-                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99 AND u_task_parallel.status != 3)");
             }
+                sqlString.append(" AND (SELECT COUNT(1) FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 99" +
+                        " AND u_task_parallel.status != 3 and is_deleted=0) > 0");
         } else {
             if (StringUtils.isNotBlank(dto.getEVisaUserName())) {
-                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 1 AND u_task_parallel.status = 2 AND u_task_parallel.task_user_name LIKE ?)");
+                sqlString.append(" AND (SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id and task_user_name LIKE ? AND is_deleted=0) = 1");
                 params.add("%" + dto.getEVisaUserName() + "%");
-            } else {
-                sqlString.append(" AND EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 1 AND u_task_parallel.status = 2)");
             }
+                sqlString.append(" AND (SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id and is_deleted=0) =" +
+                        "(SELECT COUNT(1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.e_visa_status = 1 AND u_task_parallel.status = 2 and is_deleted=0)");
+
         }
 
         //总数量

+ 36 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.business.feignClient;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
@@ -14,6 +15,7 @@ import org.springblade.business.vo.TaskApprovalVO;
 import org.springblade.business.vo.TaskVO;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.feign.EVisaConfigClient;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -32,6 +34,40 @@ public class TaskClientImpl implements TaskClient {
 
     private final ITaskParallelService taskParallelService;
 
+    @Override
+    public void saveTask(Task task) {
+        taskService.save(task);
+    }
+
+    @Override
+    public void saveTaskParallel(TaskParallel taskParallel) {
+        taskParallelService.save(taskParallel);
+    }
+
+    @Override
+    public List<Task> queryUserTask(Long projectId,Integer type, Long reportUser, Integer status) {
+        return taskService.list(new LambdaQueryWrapper<Task>()
+                .eq(Task::getReportUser,reportUser)
+                .eq(Task::getType,type)
+                .eq(Task::getStatus,status)
+                .eq(Task::getProjectId,projectId));
+    }
+
+    @Override
+    @Transactional
+    public Boolean deleteUserTask(Long projectId,Long reportUser) {
+        //获取任务,并判断是否只有一条
+        List<Task> tasks = this.queryUserTask(projectId,2, reportUser, 1);
+        if (tasks == null || tasks.size() != 1){
+            return false;
+        }
+        //删除主任务
+        taskService.removeById(tasks.get(0));
+        //删除副任务
+        taskParallelService.remove(new LambdaQueryWrapper<TaskParallel>().eq(TaskParallel::getProcessInstanceId,tasks.get(0).getId()+""));
+        return true;
+    }
+
     @Override
     public Map<String, String> queryContractAllBatch(String contract) {
         return taskService.queryContractAllBatch(contract);

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ContractClientImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.feign;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.springblade.core.log.exception.ServiceException;
@@ -93,5 +94,12 @@ public class ContractClientImpl implements ContractClient {
         contractInfoService.updateById(contractInfo);
     }
 
+    @Override
+    public List<ContractInfo> getContractByProjectIdAndType(Long projectId, Integer contractType) {
+        return contractInfoService.list(new LambdaQueryWrapper<ContractInfo>()
+                            .eq(ContractInfo::getPId,projectId)
+                            .eq(ContractInfo::getContractType,contractType));
+    }
+
 
 }

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

@@ -78,6 +78,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     @Autowired
     StringRedisTemplate redisTemplate;
 
+    
     @Override
     public List<WbsTreeContract> selectQueryCurrentNodeByAncestors(List<String> ids, String contractId) {
         return this.baseMapper.selectQueryCurrentNodeByAncestors(ids, contractId);

+ 7 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -22,6 +22,7 @@ import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.system.user.dto.UserDTO;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.UserInfo;
 import org.springblade.system.user.entity.UserOauth;
@@ -129,5 +130,11 @@ public class UserClient implements IUserClient {
         return service.getBaseMapper().selectBatchIds(userIds);
     }
 
+    @Override
+    public R<Boolean> saveUserDTO(UserDTO user) {
+        service.submit2(user);
+        return R.data(true);
+    }
+
 
 }