Browse Source

管控计划

liuyc 1 year ago
parent
commit
fcbc9f26ae
17 changed files with 686 additions and 11 deletions
  1. 15 0
      blade-service-api/blade-control-api/pom.xml
  2. 19 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/PlanInfoDTO.java
  3. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskInfoDTO.java
  4. 19 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/PlanInfo.java
  5. 64 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskInfo.java
  6. 39 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanInfoVO.java
  7. 16 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanTaskRecordVO.java
  8. 47 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPageVO.java
  9. 0 4
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/test.java
  10. 33 7
      blade-service/blade-control/src/main/java/org/springblade/control/controller/PlanInfoController.java
  11. 71 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskInfoController.java
  12. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskInfoMapper.java
  13. 13 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskInfoMapper.xml
  14. 11 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/PlanInfoService.java
  15. 28 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/TaskInfoService.java
  16. 118 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInfoServiceImpl.java
  17. 161 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskInfoServiceImpl.java

+ 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 {
-}

+ 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 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/PlanInfoService.java

@@ -1,10 +1,21 @@
 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);
+
 }

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

@@ -0,0 +1,28 @@
+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 org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+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);
+
+}

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

@@ -1,14 +1,132 @@
 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;
+    private final TaskInfoServiceImpl taskInfoServiceImpl;
+
+    @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=暂存数据)
+            taskInfoServiceImpl.update(Wrappers.<TaskInfo>lambdaUpdate().set(TaskInfo::getIsSubmitOrSuspend, dto.getTaskDataStatus()).in(TaskInfo::getId, 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;
+    }
+
+
+}