瀏覽代碼

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

yangyj 2 年之前
父節點
當前提交
18b415cc4b
共有 30 個文件被更改,包括 812 次插入89 次删除
  1. 22 6
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  2. 15 0
      blade-service-api/blade-control-api/pom.xml
  3. 19 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/PlanInfoDTO.java
  4. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskInfoDTO.java
  5. 19 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/PlanInfo.java
  6. 64 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskInfo.java
  7. 39 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanInfoVO.java
  8. 16 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanTaskRecordVO.java
  9. 47 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPageVO.java
  10. 0 4
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/test.java
  11. 2 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
  12. 1 0
      blade-service-api/pom.xml
  13. 14 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  14. 24 17
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  15. 10 10
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  16. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  17. 46 34
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  18. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  19. 33 7
      blade-service/blade-control/src/main/java/org/springblade/control/controller/PlanInfoController.java
  20. 71 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskInfoController.java
  21. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskInfoMapper.java
  22. 13 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskInfoMapper.xml
  23. 11 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/PlanInfoService.java
  24. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/TaskInfoService.java
  25. 117 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInfoServiceImpl.java
  26. 161 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskInfoServiceImpl.java
  27. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
  28. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  29. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  30. 1 0
      blade-service/pom.xml

+ 22 - 6
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -295,13 +295,24 @@ public class LargeFileEndpoint {
 		QueryWrapper<LargeFile> wrapper = new QueryWrapper<LargeFile>()
 				.eq("file_key", param.getIdentifier()).eq("is_deleted",0).eq("shard_index",param.getChunkNumber()).orderByDesc("shard_index");
 		LargeFile list = iLargeFileService.getOne(wrapper);
-		if(list != null ){
-			result.setSuccess(true);
-			result.setMsg("该分片已上传!");
-			result.setData(list.getShardIndex());
-			result.setCode(200);
-			return result;
+		int state =0;
+
+		if(list != null){
+			if(StringUtils.isNotEmpty(list.getPath())){
+				File chfile = new File(list.getPath());
+				if(chfile.exists()){
+					result.setSuccess(true);
+					result.setMsg("该分片已上传!");
+					result.setData(list.getShardIndex());
+					result.setCode(200);
+					return result;
+				}else{
+					iLargeFileService.remove(wrapper);
+				}
+			}
 		}
+
+
 		// 文件名称
 		String fileName = getFileName(param);
 		// 临时文件名称
@@ -309,6 +320,7 @@ public class LargeFileEndpoint {
 		// 获取文件路径
 		/**Windows文件路径要加在哪个盘**/
 		String filePath =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
+		//String filePath ="/Users/hongchuangyanfa/Desktop/largeFile/";
 
 		File tempFile = buildUploadFile(tempFileName);
 
@@ -336,6 +348,8 @@ public class LargeFileEndpoint {
 		largeFile.setSuffix(param.getObjectType());
 		iLargeFileService.save(largeFile);
 
+		if(param.getTotalChunks()== param.getChunkNumber()){
+			Thread.sleep(400);
 		//第八步 检查文件是否全部完成上传
 		lock.lock();
 		try {
@@ -404,6 +418,7 @@ public class LargeFileEndpoint {
 		} finally {
 			lock.unlock();
 		}
+		}
 		result.setCode(200);
 		result.setSuccess(true);
 		result.setMsg("上传成功!");
@@ -451,6 +466,7 @@ public class LargeFileEndpoint {
 	 */
 	private String buildUploadDir() {
 		String fullDir =ParamCache.getValue(CommonConstant.SYS_LOCAL_URL)+"largeFile/";
+		//String fullDir ="/Users/hongchuangyanfa/Desktop/largeFile/";
 		File dir = new File(fullDir);
 		if (!dir.exists()) {
 			dir.mkdirs();

+ 15 - 0
blade-service-api/blade-control-api/pom.xml

@@ -10,4 +10,19 @@
     <modelVersion>4.0.0</modelVersion>
     <artifactId>blade-control-api</artifactId>
     <version>${bladex.project.version}</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-user-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+        </dependency>
+    </dependencies>
+    <packaging>jar</packaging>
+
+
 </project>

+ 19 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/PlanInfoDTO.java

@@ -0,0 +1,19 @@
+package org.springblade.control.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.PlanInfo;
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PlanInfoDTO extends PlanInfo {
+
+    @ApiModelProperty(value = "任务ids,字符串逗号拼接")
+    private String taskIds;
+
+    @ApiModelProperty(value = "任务数据状态 1=提交数据 2=暂存数据")
+    private String taskDataStatus;
+
+}

+ 25 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskInfoDTO.java

@@ -0,0 +1,25 @@
+package org.springblade.control.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.TaskInfo;
+import org.springblade.core.mp.base.BaseEntity;
+
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class TaskInfoDTO extends TaskInfo {
+
+    @ApiModelProperty(value = "1=我的任务、2=我关联的计划任务、3=查看全部计划任务")
+    private String type;
+
+    @ApiModelProperty(value = "计划部门")
+    private String planDept;
+
+    @ApiModelProperty(value = "计划状态")
+    private String planStatus;
+
+}

+ 19 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/PlanInfo.java

@@ -1,23 +1,42 @@
 package org.springblade.control.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
 
 import java.util.Date;
 
+/**
+ * 计划表
+ */
 @Data
 @TableName("c_control_plan_info")
 @EqualsAndHashCode(callSuper = true)
 public class PlanInfo extends BaseEntity {
 
     private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "计划名称")
     private String planName;
+
+    @ApiModelProperty(value = "计划编号")
     private String planNumber;
+
+    @ApiModelProperty(value = "计划部门")
     private Integer planDept;
+
+    @ApiModelProperty(value = "计划类型")
     private Integer planType;
+
+    @ApiModelProperty(value = "计划开始时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd", timezone = "GMT+8")
     private Date planStartDate;
+
+    @ApiModelProperty(value = "计划结束时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd", timezone = "GMT+8")
     private Date planEndDate;
 
 }

+ 64 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskInfo.java

@@ -0,0 +1,64 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.util.Date;
+
+
+/**
+ * 计划任务表
+ */
+@Data
+@TableName("c_control_task_info")
+@EqualsAndHashCode(callSuper = true)
+public class TaskInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "任务描述")
+    private String taskDesc;
+
+    @ApiModelProperty(value = "任务类型")
+    private Integer taskType;
+
+    @ApiModelProperty(value = "任务完成指标")
+    private String taskStandard;
+
+    @ApiModelProperty(value = "任务开始日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd", timezone = "GMT+8")
+    private Date taskStartDate;
+
+    @ApiModelProperty(value = "任务结束日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd", timezone = "GMT+8")
+    private Date taskEndDate;
+
+    @ApiModelProperty(value = "总工作日")
+    private String totalWorkDays;
+
+    @ApiModelProperty(value = "关联项目id")
+    private Long relatedProjectId;
+
+    @ApiModelProperty(value = "是否关联预算 0=否 1=是")
+    private Integer isRelatedBudget;
+
+    @ApiModelProperty(value = "关联的项目环节")
+    private Integer projectProcess;
+
+    @ApiModelProperty(value = "任务人id")
+    private Long taskUserId;
+
+    @ApiModelProperty(value = "协助人id")
+    private Long taskUserIdAssist;
+
+    @ApiModelProperty(value = "部门负责人id")
+    private Long taskUserIdLeader;
+
+    @ApiModelProperty(value = "任务数据状态 1=提交数据 2=暂存数据")
+    private Integer isSubmitOrSuspend;
+
+}

+ 39 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanInfoVO.java

@@ -0,0 +1,39 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PlanInfoVO implements Serializable {
+
+    @ApiModelProperty(value = "计划id")
+    private String id;
+
+    @ApiModelProperty(value = "计划编号")
+    private String planNumber;
+
+    @ApiModelProperty(value = "计划名称")
+    private String planName;
+
+    @ApiModelProperty(value = "计划类型")
+    private String planTypeName;
+
+    @ApiModelProperty(value = "计划起止日期")
+    private String planStartAndEndDate;
+
+    @ApiModelProperty(value = "任务总数量")
+    private String taskCount;
+
+    @ApiModelProperty(value = "已完成计划")
+    private String taskComplete;
+
+    @ApiModelProperty(value = "未完成计划")
+    private String taskIncomplete;
+
+    @ApiModelProperty(value = "计划制定人")
+    private String planFormulateUserName;
+
+
+}

+ 16 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanTaskRecordVO.java

@@ -0,0 +1,16 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName("c_control_plan_task_record")
+public class PlanTaskRecordVO implements Serializable {
+
+    private Long id;
+    private Long planId;
+    private Long taskId;
+
+}

+ 47 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPageVO.java

@@ -0,0 +1,47 @@
+package org.springblade.control.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class TaskPageVO implements Serializable {
+
+    @ApiModelProperty(value = "任务id")
+    private String id;
+
+    @ApiModelProperty(value = "计划名称")
+    private String planName;
+
+    @ApiModelProperty(value = "任务状态")
+    private String status;
+
+    @ApiModelProperty(value = "任务描述")
+    private String taskDesc;
+
+    @ApiModelProperty(value = "任务完成指标")
+    private String taskStandard;
+
+    @ApiModelProperty(value = "任务完成期限")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd", timezone = "GMT+8")
+    private Date taskEndDate;
+
+    @ApiModelProperty(value = "任务人")
+    private String taskUserName;
+
+    @ApiModelProperty(value = "协助人")
+    private String taskUserAssistName;
+
+    @ApiModelProperty(value = "部门负责人")
+    private String taskUserLeaderName;
+
+    @ApiModelProperty(value = "关联的项目环节名称")
+    private String projectProcessName;
+
+    @ApiModelProperty(value = "关联项目")
+    private String relatedProjectName;
+
+}

+ 0 - 4
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/test.java

@@ -1,4 +0,0 @@
-package org.springblade.control.vo;
-
-public class test {
-}

+ 2 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java

@@ -30,8 +30,8 @@ public interface ArchiveTreeContractClient {
     @PostMapping(API_PREFIX + "/getListByProjectId")
     List<ArchiveTreeContract> getListByProjectId(@RequestParam Long projectId);
 
-    @PostMapping(API_PREFIX + "/getSelectNodeByGroupId")
-    List<ArchiveTreeContract> getSelectNodeByGroupId(@RequestParam Long projectId,@RequestParam Long archiveAutoGroupId);
+    @PostMapping(API_PREFIX + "/getStorageNodeByGroupId")
+    List<ArchiveTreeContract> getStorageNodeByGroupId(@RequestParam Long projectId,@RequestParam Long archiveAutoGroupId);
 
     @PostMapping(API_PREFIX + "/getArchiveTreeContractById")
     ArchiveTreeContract getArchiveTreeContractById(@RequestParam Long id);

+ 1 - 0
blade-service-api/pom.xml

@@ -25,6 +25,7 @@
         <module>blade-manager-api</module>
         <module>blade-e-visa-api</module>
         <module>blade-archive-api</module>
+        <module>blade-control-api</module>
     </modules>
 
     <dependencies>

+ 14 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -23,7 +23,9 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
+import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.resource.feign.IOSSClient;
 import org.springframework.web.bind.annotation.*;
@@ -54,6 +56,7 @@ public class ArchiveFileController extends BladeController {
     private final ArchiveTreeContractClient archiveTreeContractClient;
     private final EVisaClient eVisaClient;
     private final WbsTreeContractClient wbsTreeContractClient;
+    private final ContractClient contractClient;
     /**
      * 上传文件
      *
@@ -320,4 +323,15 @@ public class ArchiveFileController extends BladeController {
     public R removeAllocation(@RequestParam String boxName,@RequestParam Integer boxNumber) {
         return R.status(this.archiveFileClient.updateArchiveFileByBoxNameOne(boxName,boxNumber));
     }
+
+    /**
+     * 获取当前责任者
+     */
+    @GetMapping("/getDutyUser")
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "文件收集-上传文件责任者")
+    public R getDutyUser(Long contractId) {
+        ContractInfo contractById = contractClient.getContractById(contractId);
+        return R.data(contractById);
+    }
 }

+ 24 - 17
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -326,25 +326,32 @@ public class ArchivesAutoController extends BladeController {
 	 */
 	@PostMapping("/archiveAutoMethod")
 	public R archiveAutoMethod(Long projectId,Long contractId,Long nodeId) {
-		//先验证当前项目是否在自动组卷中,组卷中直接返回
-		ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
-		Integer isArchivesAuto = projectInfo.getIsArchivesAuto();
-		if(isArchivesAuto!=null && isArchivesAuto==1){
-			return R.fail("当前项目已经在自动组卷中");
+		try{
+			//先验证当前项目是否在自动组卷中,组卷中直接返回
+			ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
+			Integer isArchivesAuto = projectInfo.getIsArchivesAuto();
+			if(isArchivesAuto!=null && isArchivesAuto==1){
+				return R.fail("当前项目已经在自动组卷中");
+			}
+			//设置自动组卷中
+			projectClient.updateIsArchivesAutoById(projectId,1);
+
+			//将项目未锁定案卷拆卷
+			archivesAutoService.splitArchvies(projectId);
+			//项目自动组卷入口
+			archivesAutoService.archiveAutoMethod(projectId);
+			//刷新项目档号
+			archivesAutoService.refreshFileNumberNoSlipt(projectId,contractId,nodeId);
+
+			return R.data("自动组卷结束");
+		}catch (Exception e){
+			e.printStackTrace();
+			return R.fail(e.getMessage());
+		}finally {
+			//设置自动组卷结束
+			projectClient.updateIsArchivesAutoById(projectId,0);
 		}
-		//设置自动组卷中
-		projectClient.updateIsArchivesAutoById(projectId,1);
-
-		//将项目未锁定案卷拆卷
-		archivesAutoService.splitArchvies(projectId);
-		//项目自动组卷入口
-		archivesAutoService.archiveAutoMethod(projectId);
-		//刷新项目档号
-		archivesAutoService.refreshFileNumberNoSlipt(projectId,contractId,nodeId);
 
-		//设置自动组卷结束
-		projectClient.updateIsArchivesAutoById(projectId,0);
-		return R.data("自动组卷结束");
 	}
 
 	/**

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

@@ -532,8 +532,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
 		String[] split = archiveStartDateAndEndDate.split(",");
-		String startDate=split[0];
-		String endDate=split[1];
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
 		int fileN =waitArchiveFiles.size();
 
 		String archiveName=builtArchiveName(waitArchiveFiles,node,false);//获取案卷题名
@@ -565,14 +565,14 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId,Long projectId){
 
 		//获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
-		List<ArchiveTreeContract> selectList=archiveTreeContractClient.getSelectNodeByGroupId(projectId,archiveAutoGroupId);
-		//分类并卷节点默认采用设置节点的第一个节点为案卷归属节点。
+		List<ArchiveTreeContract> selectList=archiveTreeContractClient.getStorageNodeByGroupId(projectId,archiveAutoGroupId);
+		//分类并卷节点默认采用同类型下第一个存储节点为归属节点
 		ArchiveTreeContract node = selectList.get(0);
 		//获取案卷文件起止时间
 		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
 		String[] split = archiveStartDateAndEndDate.split(",");
-		String startDate=split[0];
-		String endDate=split[1];
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
 		int fileN =waitArchiveFiles.size();
 		//获取案卷内文件总页数
 		int pageN=0;
@@ -610,8 +610,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//获取案卷文件起止时间
 		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
 		String[] split = archiveStartDateAndEndDate.split(",");
-		String startDate=split[0];
-		String endDate=split[1];
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
 		int fileN =waitArchiveFiles.size();
 
 
@@ -654,8 +654,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//获取案卷文件起止时间
 		String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
 		String[] split = archiveStartDateAndEndDate.split(",");
-		String startDate=split[0];
-		String endDate=split[1];
+		String startDate= split.length>=1 ?split[0]:"";
+		String endDate=split.length>=2 ?split[1]:"";
 		int fileN =waitArchiveFiles.size();
 		//获取案卷内文件总页数
 		int pageN=0;

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

@@ -36,7 +36,7 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
 
 	Integer selectArchiveFilePageByBoxNameCount(@Param("vo") ArchiveFileVO vo);
 	/**
-	 * 自定义分页
+	 * 自定义分页 (如果有节点id传入,排序优先级按节点排序)
 	 */
 	List<ArchiveFile> selectArchiveFilePage(@Param("current") Integer current, @Param("size") Integer size, @Param("vo") ArchiveFileVO vo);
 

+ 46 - 34
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -67,90 +67,102 @@
     </update>
 
     <select id="selectArchiveFileCount" resultType="java.lang.Integer">
-        select count(id) from u_archive_file where is_deleted = 0
+        select count(u.id) from u_archive_file u
+        <if test="vo.nodeIds != null and vo.nodeIds != ''">
+         left join m_archive_tree_contract t on t.id = u.node_id
+        </if>
+         where u.is_deleted = 0
         <if test="vo.isApprovalValue != null and vo.isApprovalValue != ''">
-            and status = #{vo.isApprovalValue}
+            and u.status = #{vo.isApprovalValue}
         </if>
         <if test="vo.isCertificationValue != null and vo.isCertificationValue != ''">
-            and is_certification = #{vo.isCertificationValue}
+            and u.is_certification = #{vo.isCertificationValue}
         </if>
         <if test="vo.projectId != null and vo.projectId != ''">
-            and project_id = #{vo.projectId}
+            and u.project_id = #{vo.projectId}
         </if>
         <if test="vo.archiveId != null and vo.archiveId != ''">
-            and archive_id = #{vo.archiveId}
+            and u.archive_id = #{vo.archiveId}
         </if>
         <choose>
             <when test="vo.isArchive != null and vo.isArchive != ''">
-                and  is_auto_file = #{vo.isArchive}
+                and  u.is_auto_file = #{vo.isArchive}
             </when>
             <when test="vo.archiveId != null and vo.archiveId != ''">
                 and 1=1
             </when>
             <otherwise>
-                and (is_auto_file is null or is_auto_file != 1)
+                and (u.is_auto_file is null or u.is_auto_file != 1)
             </otherwise>
         </choose>
         <if test="vo.nodeIds != null and vo.nodeIds != ''">
-            and node_id in
+            and u.node_id in
             <foreach collection="vo.nodeIdArray" item="nodeId" open="(" separator="," close=")">
                 #{nodeId}
             </foreach>
         </if>
         <if test="vo.queryValue != null and vo.queryValue != ''">
             and (
-                file_name like concat('%',#{vo.queryValue},'%') or
-                file_number like concat('%',#{vo.queryValue},'%') or
-                duty_user like concat('%',#{vo.queryValue},'%') or
-                sheet_source like concat('%',#{vo.queryValue},'%') or
-                drawing_no like concat('%',#{vo.queryValue},'%') or
-                cite_change_number like concat('%',#{vo.queryValue},'%')
+            u.file_name like concat('%',#{vo.queryValue},'%') or
+            u.file_number like concat('%',#{vo.queryValue},'%') or
+            u.duty_user like concat('%',#{vo.queryValue},'%') or
+            u.sheet_source like concat('%',#{vo.queryValue},'%') or
+            u.drawing_no like concat('%',#{vo.queryValue},'%') or
+            u.cite_change_number like concat('%',#{vo.queryValue},'%')
                 )
         </if>
     </select>
 
     <select id="selectArchiveFilePage" resultMap="archiveFileResultMap">
-        select * from u_archive_file where is_deleted = 0
+        select u.* from u_archive_file u
+        <if test="vo.nodeIds != null and vo.nodeIds != ''">
+            left join m_archive_tree_contract t on t.id = u.node_id
+        </if>
+        where u.is_deleted = 0
         <if test="vo.isApprovalValue != null and vo.isApprovalValue != ''">
-            and status = #{vo.isApprovalValue}
+            and u.status = #{vo.isApprovalValue}
         </if>
         <if test="vo.isCertificationValue != null and vo.isCertificationValue != ''">
-            and is_certification = #{vo.isCertificationValue}
+            and u.is_certification = #{vo.isCertificationValue}
         </if>
         <if test="vo.projectId != null and vo.projectId != ''">
-            and project_id = #{vo.projectId}
+            and u.project_id = #{vo.projectId}
         </if>
         <if test="vo.archiveId != null and vo.archiveId != ''">
-            and archive_id = #{vo.archiveId}
+            and u.archive_id = #{vo.archiveId}
         </if>
         <choose>
             <when test="vo.isArchive != null and vo.isArchive != ''">
-                and  is_auto_file = #{vo.isArchive}
+                and  u.is_auto_file = #{vo.isArchive}
             </when>
             <when test="vo.archiveId != null and vo.archiveId != ''">
                 and 1=1
             </when>
             <otherwise>
-                and (is_auto_file is null or is_auto_file != 1)
+                and (u.is_auto_file is null or u.is_auto_file != 1)
             </otherwise>
         </choose>
         <if test="vo.nodeIds != null and vo.nodeIds != ''">
-            and node_id in
+            and u.node_id in
             <foreach collection="vo.nodeIdArray" item="nodeId" open="(" separator="," close=")">
                 #{nodeId}
             </foreach>
         </if>
         <if test="vo.queryValue != null and vo.queryValue != ''">
             and (
-                file_name like concat('%',#{vo.queryValue},'%') or
-                file_number like concat('%',#{vo.queryValue},'%') or
-                duty_user like concat('%',#{vo.queryValue},'%') or
-                sheet_source like concat('%',#{vo.queryValue},'%') or
-                drawing_no like concat('%',#{vo.queryValue},'%') or
-                cite_change_number like concat('%',#{vo.queryValue},'%')
+            u.file_name like concat('%',#{vo.queryValue},'%') or
+            u.file_number like concat('%',#{vo.queryValue},'%') or
+            u.duty_user like concat('%',#{vo.queryValue},'%') or
+            u.sheet_source like concat('%',#{vo.queryValue},'%') or
+            u.drawing_no like concat('%',#{vo.queryValue},'%') or
+            u.cite_change_number like concat('%',#{vo.queryValue},'%')
             )
         </if>
-        order by sort,create_time DESC
+        order by
+        <if test="vo.nodeIds != null and vo.nodeIds != ''">
+             t.tree_sort,
+        </if>
+        u.sort,u.create_time
         limit #{current}, #{size}
     </select>
 
@@ -191,7 +203,7 @@
             cite_change_number like concat('%',#{vo.queryValue},'%')
             )
         </if>
-        order by box_number,sort,create_time DESC
+        order by box_number,sort,create_time
 
     </select>
     <select id="selectArchiveFilePageByBoxName" resultMap="archiveFileResultMap">
@@ -231,7 +243,7 @@
             cite_change_number like concat('%',#{vo.queryValue},'%')
             )
         </if>
-        order by box_number,sort,create_time DESC
+        order by box_number,sort,create_time
         limit #{current}, #{size}
     </select>
     <select id="getDeleteDataByIds" resultType="org.springblade.business.entity.ArchiveFile">
@@ -280,7 +292,7 @@
                 #{id}
             </foreach>
         </if>
-        order by sort,create_time DESC
+        order by sort,create_time
     </select>
     <select id="getArchiveFileByFileIds" resultMap="archiveFileResultMap">
         select * from u_archive_file where is_deleted = 0
@@ -290,7 +302,7 @@
                 #{id}
             </foreach>
         </if>
-        order by sort,create_time DESC
+        order by sort,create_time
     </select>
     <select id="getListByProjectId" resultType="org.springblade.business.entity.ArchiveFile">
         select id,project_id as projectId,node_id as nodeId,file_number as fileNumber,file_name as fileName,file_time as fileTime,file_url as fileUrl,pdf_file_url as pdfFileUrl,archive_id as archiveId,status,is_deleted as isDeleted,create_time as createTime
@@ -305,7 +317,7 @@
     <select id="getAllArchiveFileUrl" resultType="org.springblade.business.entity.ArchiveFile">
         SELECT uaf.file_url ,uaf.pdf_file_url
         FROM u_archive_file uaf
-        WHERE  uaf.project_id = #{projectId};
+        WHERE  uaf.project_id = #{projectId} and uaf.is_deleted = 0;
     </select>
     <select id="getAllArchiveFileByArchiveIds" resultType="org.springblade.business.entity.ArchiveFile">
         SELECT * FROM u_archive_file

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

@@ -126,7 +126,9 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 			baseMapper.updateArchiveFileByBoxNameOne(boxName,boxNumber);
 			if(map.get("ids") != null ) {
 				String ids = (String) map.get("ids");
-				baseMapper.updateArchiveFileByBoxName(Func.toLongList(ids), boxName, boxNumber);
+				if(!ids.isEmpty()) {
+					baseMapper.updateArchiveFileByBoxName(Func.toLongList(ids), boxName, boxNumber);
+				}
 			}
 		}
 		return true;

+ 33 - 7
blade-service/blade-control/src/main/java/org/springblade/control/controller/PlanInfoController.java

@@ -6,12 +6,15 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.control.dto.PlanInfoDTO;
 import org.springblade.control.entity.PlanInfo;
+import org.springblade.control.service.PlanInfoService;
+import org.springblade.control.vo.PlanInfoVO;
 import org.springblade.core.boot.ctrl.BladeController;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
 
 
 @RestController
@@ -20,11 +23,34 @@ import org.springframework.web.bind.annotation.RestController;
 @Api(value = "计划接口", tags = "计划接口")
 public class PlanInfoController extends BladeController {
 
+    private final PlanInfoService planInfoService;
+
     @PostMapping("/page")
     @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "计划分页查询")
-    public IPage<PlanInfo> page(@RequestBody PlanInfo vo) {
-        return null;
+    @ApiOperation(value = "计划分页查询", notes = "传入Query、PlanInfoDTO")
+    public R<IPage<PlanInfoVO>> planPage(@RequestBody Query query, @RequestBody PlanInfoDTO dto) {
+        return R.data(planInfoService.planPage(Condition.getPage(query), dto));
+    }
+
+    @PostMapping("/submit")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "计划新增或编辑", notes = "传入PlanInfoDTO")
+    public R<Object> planSubmit(PlanInfoDTO dto) {
+        return R.status(planInfoService.planSubmit(dto));
+    }
+
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "计划删除", notes = "传入计划id")
+    public R<Object> planRemove(@RequestParam String id) {
+        return R.status(planInfoService.planRemove(id));
+    }
+
+    @GetMapping("/detail")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "计划详情", notes = "传入计划id")
+    public R<PlanInfo> planDetail(@RequestParam String id) {
+        return R.data(planInfoService.planDetail(id));
     }
 
 }

+ 71 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskInfoController.java

@@ -0,0 +1,71 @@
+package org.springblade.control.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.control.dto.TaskInfoDTO;
+import org.springblade.control.entity.TaskInfo;
+import org.springblade.control.service.TaskInfoService;
+import org.springblade.control.vo.TaskPageVO;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/task")
+@Api(value = "计划任务接口", tags = "计划任务接口")
+public class TaskInfoController extends BladeController {
+
+    private final TaskInfoService taskInfoService;
+
+    @PostMapping("/submit")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "任务新增或修改", notes = "传入TaskInfo")
+    public R<Object> taskSubmit(@RequestBody TaskInfo obj) {
+        return R.status(taskInfoService.taskSubmit(obj));
+    }
+
+    @GetMapping("/list")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "任务列表", notes = "传入计划id")
+    public R<List<TaskInfo>> taskList(@RequestParam String id) {
+        return R.data(taskInfoService.taskList(id));
+    }
+
+    @PostMapping("/remove")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "任务删除", notes = "传入任务id")
+    public R<Object> taskRemove(@RequestParam String id) {
+        return R.status(taskInfoService.taskRemove(id));
+    }
+
+    @PostMapping("/repeal")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "任务废除", notes = "传入任务id")
+    public R<Object> taskRepeal(@RequestParam String id) {
+        return R.status(taskInfoService.taskRepeal(id));
+    }
+
+    @PostMapping("/page")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "我的任务page分页", notes = "传入Query、TaskInfoDTO")
+    public R<IPage<TaskPageVO>> taskPage(@RequestBody Query query, @RequestBody TaskInfoDTO dto) {
+        return R.data(taskInfoService.taskPage(Condition.getPage(query), dto));
+    }
+
+    @PostMapping("/relation/submit")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "关联任务提交", notes = "传入任务ids、当前用户信息")
+    public R<Object> taskRelationSubmit(String taskIds, BladeUser user) {
+        return R.status(taskInfoService.taskRelationSubmit(taskIds, user));
+    }
+
+}

+ 7 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskInfoMapper.java

@@ -0,0 +1,7 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.control.entity.TaskInfo;
+
+public interface TaskInfoMapper extends BaseMapper<TaskInfo> {
+}

+ 13 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskInfoMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.control.mapper.TaskInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.TaskInfo">
+        <result column="id" property="id"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+    </resultMap>
+
+
+</mapper>

+ 11 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/PlanInfoService.java

@@ -1,10 +1,19 @@
 package org.springblade.control.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.PlanInfoDTO;
 import org.springblade.control.entity.PlanInfo;
+import org.springblade.control.vo.PlanInfoVO;
 import org.springblade.core.mp.base.BaseService;
-import org.springframework.stereotype.Service;
 
-@Service
 public interface PlanInfoService extends BaseService<PlanInfo> {
 
+    IPage<PlanInfoVO> planPage(IPage<PlanInfo> page, PlanInfoDTO dto);
+
+    boolean planSubmit(PlanInfoDTO dto);
+
+    boolean planRemove(String id);
+
+    PlanInfo planDetail(String id);
+
 }

+ 26 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/TaskInfoService.java

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.TaskInfoDTO;
+import org.springblade.control.entity.TaskInfo;
+import org.springblade.control.vo.TaskPageVO;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.secure.BladeUser;
+
+import java.util.List;
+
+public interface TaskInfoService extends BaseService<TaskInfo> {
+
+    boolean taskSubmit(TaskInfo obj);
+
+    List<TaskInfo> taskList(String id);
+
+    boolean taskRemove(String id);
+
+    boolean taskRepeal(String id);
+
+    IPage<TaskPageVO> taskPage(IPage<TaskInfo> page, TaskInfoDTO dto);
+
+    boolean taskRelationSubmit(String taskIds, BladeUser user);
+
+}

+ 117 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInfoServiceImpl.java

@@ -1,14 +1,131 @@
 package org.springblade.control.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.PlanInfoDTO;
 import org.springblade.control.entity.PlanInfo;
+import org.springblade.control.entity.TaskInfo;
 import org.springblade.control.mapper.PlanInfoMapper;
 import org.springblade.control.service.PlanInfoService;
+import org.springblade.control.vo.PlanInfoVO;
+import org.springblade.control.vo.PlanTaskRecordVO;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.system.entity.DictBiz;
+import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 @AllArgsConstructor
 @Service
 public class PlanInfoServiceImpl extends BaseServiceImpl<PlanInfoMapper, PlanInfo> implements PlanInfoService {
 
+    private final JdbcTemplate jdbcTemplate;
+
+    @Override
+    public IPage<PlanInfoVO> planPage(IPage<PlanInfo> page, PlanInfoDTO dto) {
+        QueryWrapper<PlanInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        if (ObjectUtil.isNotEmpty(dto.getPlanType())) {
+            queryWrapper.lambda().eq(PlanInfo::getPlanType, dto.getPlanType());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getPlanDept())) {
+            queryWrapper.lambda().eq(PlanInfo::getPlanDept, dto.getPlanDept());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getPlanName())) {
+            queryWrapper.lambda().eq(PlanInfo::getPlanName, dto.getPlanName());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getPlanStartDate()) && ObjectUtil.isNotEmpty(dto.getPlanEndDate())) {
+            queryWrapper.lambda().ge(PlanInfo::getPlanStartDate, dto.getPlanStartDate()).le(PlanInfo::getPlanEndDate, dto.getPlanEndDate());
+        }
+        IPage<PlanInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, PlanInfo::getCreateTime));
+        List<DictBiz> query = jdbcTemplate.query("select dict_key,dict_value from blade_dict_biz where code= 'plan_type' and parent_id != 0", new BeanPropertyRowMapper<>(DictBiz.class));
+        List<PlanInfo> records = pages.getRecords();
+
+        List<Long> planIds = records.stream().map(PlanInfo::getId).collect(Collectors.toList());
+        Map<Long, List<PlanTaskRecordVO>> mapsRecord = jdbcTemplate.queryForList("select plan_id,task_id from c_control_plan_task_record where plan_id in(" + StringUtils.join(planIds, ",") + ")", PlanTaskRecordVO.class).stream().collect(Collectors.groupingBy(PlanTaskRecordVO::getPlanId));
+
+        return pages.convert(planInfo -> {
+            PlanInfoVO vo = new PlanInfoVO();
+            BeanUtils.copyProperties(planInfo, vo);
+
+            vo.setId(planInfo.getId() + "");
+            vo.setPlanName(StringUtils.isNotEmpty(planInfo.getPlanName()) ? planInfo.getPlanName() : "");
+            vo.setPlanNumber(StringUtils.isNotEmpty(planInfo.getPlanNumber()) ? planInfo.getPlanNumber() : "");
+
+            for (DictBiz dictBiz : query) {
+                if (dictBiz.getDictKey().equals(planInfo.getPlanType() + "")) {
+                    vo.setPlanTypeName(dictBiz.getDictValue());
+                    break;
+                }
+            }
+
+            vo.setPlanStartAndEndDate(planInfo.getPlanStartDate() + "~" + planInfo.getPlanEndDate());
+
+            List<PlanTaskRecordVO> planTaskRecordVOS = mapsRecord.get(planInfo.getId());
+            if (planTaskRecordVOS != null && planTaskRecordVOS.size() > 0) {
+                //任务总数
+                vo.setTaskCount(planTaskRecordVOS.size() + "");
+                List<Long> taskIds = planTaskRecordVOS.stream().map(PlanTaskRecordVO::getTaskId).collect(Collectors.toList());
+                //已完成任务数
+                Long taskCompletedCount = jdbcTemplate.queryForObject("select count(1) from c_control_task_info where status = 2 and id in(" + StringUtils.join(taskIds, ",") + ")", Long.class);
+                vo.setTaskComplete(taskCompletedCount + "");
+                //未完成任务数
+                Long taskIncompleteCount = jdbcTemplate.queryForObject("select count(1) from c_control_task_info where status != 2 and id in(" + StringUtils.join(taskIds, ",") + ")", Long.class);
+                vo.setTaskIncomplete(taskIncompleteCount + "");
+            }
+            vo.setPlanFormulateUserName(StringUtils.isNotEmpty(SecureUtil.getUserName()) ? SecureUtil.getUserName() : "");
+            return vo;
+        });
+    }
+
+    @Override
+    public boolean planSubmit(PlanInfoDTO dto) {
+        this.saveOrUpdate(dto);
+        if (ObjectUtil.isNotEmpty(dto.getId()) && StringUtils.isNotEmpty(dto.getTaskIds()) && StringUtils.isNotEmpty(dto.getTaskDataStatus())) {
+            //绑定计划与任务关系
+            List<String> taskIds = Func.toStrList(dto.getTaskIds());
+            for (String taskId : taskIds) {
+                jdbcTemplate.execute("insert into c_control_plan_task_record(id,plan_id,task_id) values(" + SnowFlakeUtil.getId() + "," + dto.getId() + "," + taskId + ")");
+            }
+            //修改任务数据状态为提交或暂存(任务数据状态 1=提交数据 2=暂存数据)
+            jdbcTemplate.execute("update from c_control_task_info set is_submit_or_suspend = " + dto.getTaskDataStatus() + " where id in(" + StringUtils.join(taskIds, ",") + ")");
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean planRemove(String id) {
+        //删除计划
+        jdbcTemplate.execute("delete from c_control_plan_info where id = " + id);
+
+        //删除计划内任务
+        List<PlanTaskRecordVO> planTaskRecordVOS = jdbcTemplate.queryForList("select task_id from c_control_plan_task_record where plan_id = " + id, PlanTaskRecordVO.class);
+        List<Long> taskIds = planTaskRecordVOS.stream().map(PlanTaskRecordVO::getTaskId).collect(Collectors.toList());
+        jdbcTemplate.execute("delete from c_control_task_info where id in(" + StringUtils.join(taskIds, ",") + ")");
+
+        //删除关联关系
+        jdbcTemplate.execute("delete from c_control_plan_task_record where plan_id = " + id);
+        return true;
+    }
+
+    @Override
+    public PlanInfo planDetail(String id) {
+        return baseMapper.selectById(id);
+    }
+
+
 }

+ 161 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskInfoServiceImpl.java

@@ -0,0 +1,161 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.control.dto.TaskInfoDTO;
+import org.springblade.control.entity.PlanInfo;
+import org.springblade.control.entity.TaskInfo;
+import org.springblade.control.mapper.TaskInfoMapper;
+import org.springblade.control.service.TaskInfoService;
+import org.springblade.control.vo.TaskPageVO;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.system.user.entity.User;
+import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@AllArgsConstructor
+@Service
+public class TaskInfoServiceImpl extends BaseServiceImpl<TaskInfoMapper, TaskInfo> implements TaskInfoService {
+
+    private final JdbcTemplate jdbcTemplate;
+    private final PlanInfoServiceImpl planInfoServiceImpl;
+
+    @Override
+    public boolean taskSubmit(TaskInfo obj) {
+        obj.setStatus(0); //默认未完成
+        return this.saveOrUpdate(obj);
+    }
+
+    @Override
+    public List<TaskInfo> taskList(String id) {
+        if (StringUtils.isNotEmpty(id)) {
+            List<Long> taskIds = jdbcTemplate.queryForList("select task_id from c_control_plan_task_record where plan_id = " + id, Long.class);
+            List<TaskInfo> taskInfos = baseMapper.selectBatchIds(taskIds);
+
+            //TODO 项目名称、进度等,返回VO
+            for (TaskInfo taskInfo : taskInfos) {
+
+            }
+            return null;
+        }
+        return null;
+    }
+
+    @Override
+    public boolean taskRemove(String id) {
+        if (StringUtils.isNotEmpty(id)) {
+            //物理删除
+            jdbcTemplate.execute("delete from c_control_task_info where id = " + id);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean taskRepeal(String id) {
+        return this.update(Wrappers.<TaskInfo>lambdaUpdate().set(TaskInfo::getStatus, 3).eq(TaskInfo::getId, id));
+    }
+
+    @Override
+    public IPage<TaskPageVO> taskPage(IPage<TaskInfo> page, TaskInfoDTO dto) {
+        if (("1").equals(dto.getType()) || ("3").equals(dto.getType())) {
+            //我的任务、全部任务
+            List<Long> taskIds = null;
+            if (ObjectUtil.isNotEmpty(dto.getPlanDept())) {
+                //获取对应部门计划任务信息
+                List<PlanInfo> planInfos = planInfoServiceImpl.getBaseMapper().selectList(Wrappers.<PlanInfo>lambdaQuery().eq(PlanInfo::getPlanDept, dto.getPlanDept()));
+                List<Long> planIds = planInfos.stream().map(PlanInfo::getId).collect(Collectors.toList());
+                taskIds = jdbcTemplate.queryForList("select task_id from c_control_plan_task_record where plan_id in(" + StringUtils.join(planIds, ",") + ")", Long.class);
+            }
+            QueryWrapper<TaskInfo> queryWrapper = Condition.getQueryWrapper(dto);
+            if (("1").equals(dto.getType())) {
+                if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+                    throw new ServiceException("未获取到当前用户信息,原因:userId is null");
+                }
+                //查询当前用户的任务,我的任务,否则查询全部任务
+                queryWrapper.lambda().eq(TaskInfo::getTaskUserId, SecureUtil.getUserId());
+            }
+            if (ObjectUtil.isNotEmpty(dto.getStatus())) {
+                //任务状态
+                queryWrapper.lambda().eq(TaskInfo::getStatus, dto.getStatus());
+            }
+            if (ObjectUtil.isNotEmpty(dto.getTaskStartDate()) && ObjectUtil.isNotEmpty(dto.getTaskEndDate())) {
+                //开始时间、结束时间
+                queryWrapper.lambda().ge(TaskInfo::getTaskStartDate, dto.getTaskStartDate()).le(TaskInfo::getTaskEndDate, dto.getTaskEndDate());
+            }
+            if (ObjectUtil.isNotEmpty(taskIds)) {
+                //部门对应的计划中的任务
+                queryWrapper.lambda().in(TaskInfo::getId, taskIds);
+            }
+            IPage<TaskInfo> taskInfoPage = this.page(page, queryWrapper.lambda().orderBy(true, true, TaskInfo::getCreateTime));
+
+            List<Long> taskIdsResult = taskInfoPage.getRecords().stream().map(TaskInfo::getId).collect(Collectors.toList());
+            String sql = "SELECT cctr.task_id, pi.plan_name FROM c_control_plan_task_record cctr LEFT JOIN plan_info pi ON cctr.plan_id = pi.id WHERE cctr.task_id IN (" + StringUtils.join(taskIdsResult, ",") + ")";
+            List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);
+            Map<Long, String> taskPlanMap = new HashMap<>();
+            for (Map<String, Object> row : result) {
+                Long taskId = (Long) row.get("task_id");
+                String planName = (String) row.get("plan_name");
+                if (!taskPlanMap.containsKey(taskId)) {
+                    taskPlanMap.put(taskId, planName);
+                }
+            }
+
+            List<Long> taskUserIds = taskInfoPage.getRecords().stream().map(TaskInfo::getTaskUserId).collect(Collectors.toList());
+            List<Long> taskUserIdsAssist = taskInfoPage.getRecords().stream().map(TaskInfo::getTaskUserIdAssist).collect(Collectors.toList());
+            List<Long> taskUserIdsLeader = taskInfoPage.getRecords().stream().map(TaskInfo::getTaskUserIdLeader).collect(Collectors.toList());
+            taskUserIds.addAll(taskUserIdsAssist);
+            taskUserIds.addAll(taskUserIdsLeader);
+            Set<Long> sets = new HashSet<>(taskUserIds);
+            List<User> query = jdbcTemplate.query("select id,name from blade_user where id in(" + StringUtils.join(sets, ",") + ")", new BeanPropertyRowMapper<>(User.class));
+            Map<Long, String> idNameMap = new HashMap<>();
+            for (User user : query) {
+                idNameMap.put(user.getId(), user.getName());
+            }
+
+            return taskInfoPage.convert(taskInfo -> {
+                TaskPageVO vo = new TaskPageVO();
+                BeanUtils.copyProperties(taskInfo, vo);
+                vo.setId(taskInfo.getId() + "");
+                vo.setStatus(ObjectUtil.isNotEmpty(taskInfo.getStatus()) ? taskInfo.getStatus().toString() : "");
+                vo.setPlanName(StringUtils.isNotEmpty(taskPlanMap.get(taskInfo.getId())) ? taskPlanMap.get(taskInfo.getId()) : "");
+                vo.setTaskDesc(ObjectUtil.isNotEmpty(taskInfo.getTaskDesc()) ? taskInfo.getTaskDesc() : "");
+                vo.setTaskStandard(ObjectUtil.isNotEmpty(taskInfo.getTaskStandard()) ? taskInfo.getTaskStandard() : "");
+                vo.setTaskEndDate(ObjectUtil.isNotEmpty(taskInfo.getTaskEndDate()) ? taskInfo.getTaskEndDate() : null);
+                vo.setTaskUserName(StringUtils.isNotEmpty(idNameMap.get(taskInfo.getTaskUserId())) ? idNameMap.get(taskInfo.getTaskUserId()) : "");
+                vo.setTaskUserAssistName(StringUtils.isNotEmpty(idNameMap.get(taskInfo.getTaskUserIdAssist())) ? idNameMap.get(taskInfo.getTaskUserIdAssist()) : "");
+                vo.setTaskUserLeaderName(StringUtils.isNotEmpty(idNameMap.get(taskInfo.getTaskUserIdLeader())) ? idNameMap.get(taskInfo.getTaskUserIdLeader()) : "");
+                //TODO 项目环节、项目
+
+
+                return vo;
+            });
+
+        } else if (("2").equals(dto.getType())) {
+            //我关联的任务 TODO
+
+        }
+        return null;
+    }
+
+    @Override
+    public boolean taskRelationSubmit(String taskIds, BladeUser user) {
+        //TODO
+        return false;
+    }
+
+
+}

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java

@@ -55,8 +55,8 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
     }
 
     @Override
-    public List<ArchiveTreeContract> getSelectNodeByGroupId(Long projectId,Long archiveAutoGroupId) {
-        List<ArchiveTreeContract> list = archiveTreeContractMapper.getSelectNodeByGroupId(projectId,archiveAutoGroupId);
+    public List<ArchiveTreeContract> getStorageNodeByGroupId(Long projectId,Long archiveAutoGroupId) {
+        List<ArchiveTreeContract> list = archiveTreeContractMapper.getStorageNodeByGroupId(projectId,archiveAutoGroupId);
         archiveTreeContractService.fillDefaultArchiveAutoInfo(list);
         return list;
     }

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

@@ -74,7 +74,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 
 	List<ArchiveTreeContract> getListByProjectId(@Param("projectId")Long projectId);
 
-	List<ArchiveTreeContract> getSelectNodeByGroupId(@Param("projectId") Long projectId,@Param("archiveAutoGroupId") Long archiveAutoGroupId);
+	List<ArchiveTreeContract> getStorageNodeByGroupId(@Param("projectId") Long projectId,@Param("archiveAutoGroupId") Long archiveAutoGroupId);
 
 	@MapKey("id")
 	List<Map<String, Object>> getArchiveTreeAndArchiveCount(@Param("projectId") Long projectId,@Param("nodeId") Long nodeId);

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

@@ -338,7 +338,7 @@
     </select>
 
 
-    <select id="getSelectNodeByGroupId" resultMap="archiveTreeContractResultMap">
+    <select id="getStorageNodeByGroupId" resultMap="archiveTreeContractResultMap">
         SELECT
             *
         FROM
@@ -348,7 +348,7 @@
           AND project_id = #{projectId}
           AND is_deleted = 0
           AND archive_auto_type =2
-          AND archive_auto_group_select =1
+          AND is_storage_node =1
           AND archive_auto_group_id =#{archiveAutoGroupId}
         order by tree_sort asc
     </select>

+ 1 - 0
blade-service/pom.xml

@@ -25,6 +25,7 @@
         <module>blade-business</module>
         <module>blade-e-visa</module>
         <module>blade-archive</module>
+        <module>blade-control</module>
     </modules>
 
     <dependencies>