diff --git a/common/src/main/java/com/ccsens/common/bean/dto/CTaskDto.java b/common/src/main/java/com/ccsens/common/bean/dto/CTaskDto.java index 8afaa68d..1eec904e 100644 --- a/common/src/main/java/com/ccsens/common/bean/dto/CTaskDto.java +++ b/common/src/main/java/com/ccsens/common/bean/dto/CTaskDto.java @@ -74,7 +74,7 @@ public class CTaskDto { } @Data - @ApiModel("查询子任务信息") + @ApiModel("任务详情id") public static class FindSonTask{ @NotNull(message = "任务id不能为空") @ApiModelProperty("任务详情id") @@ -91,6 +91,8 @@ public class CTaskDto { private Long startTime; @ApiModelProperty("结束时间") private Long endTime; + @ApiModelProperty("特殊时间格式") + private String specialTime; @ApiModelProperty("描述") private String description; @NotNull(message = "项目id不能为空") @@ -125,4 +127,51 @@ public class CTaskDto { @ApiModelProperty("项目名称") private String name; } + + @Data + @ApiModel("新建任务") + public static class UpdateTask{ + @NotBlank(message = "任务id不能为空") + @ApiModelProperty("任务id") + private Long id; + @NotNull(message = "项目id不能为空") + @ApiModelProperty("项目id") + private Long projectId; + @ApiModelProperty("任务名") + private String name; + @ApiModelProperty("开始时间") + private Long startTime; + @ApiModelProperty("结束时间") + private Long endTime; + @ApiModelProperty("特殊时间格式") + private String specialTime; + @ApiModelProperty("描述") + private String description; + @ApiModelProperty("父任务id") + private Long parentTaskId; + @ApiModelProperty("上道工序id(任务id)") + private Long processTaskId; + @ApiModelProperty("上道工序类型(0开始前,1开始时,2开始后,3结束前,4结束时,5结束后)") + private Byte processType = 4; + @ApiModelProperty("关联的绝对时间") + private Long timeDifference = 0L; + @ApiModelProperty("是否日常任务 0否 1是") + private Byte global; + + @ApiModelProperty("负责人") + private List roleIdList; + @ApiModelProperty("检查人") + private List checkerIdList; + @ApiModelProperty("交付物名") + private List deliverList; + } + + @Data + @ApiModel("删除任务") + public static class DeleteTask{ + @NotNull(message = "任务id不能为空") + @ApiModelProperty("任务id") + private Long id; + } + } diff --git a/common/src/main/java/com/ccsens/common/bean/vo/CPluginVo.java b/common/src/main/java/com/ccsens/common/bean/vo/CPluginVo.java index 85228f16..9080d205 100644 --- a/common/src/main/java/com/ccsens/common/bean/vo/CPluginVo.java +++ b/common/src/main/java/com/ccsens/common/bean/vo/CPluginVo.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.Min; + /** * @author 逗 @@ -30,4 +32,27 @@ public class CPluginVo { } + @Data + @ApiModel("任务关联的插件信息") + public static class TaskPlugin{ + @ApiModelProperty("插件id") + private Long id; + @ApiModelProperty("插件名称") + private String name; + @ApiModelProperty("插件简介") + private String intro; + @ApiModelProperty("插件版本") + private String version; + @ApiModelProperty("参数") + private String param; + @ApiModelProperty("行") + private int row = 1; + @ApiModelProperty("列") + private int col = 1; + @ApiModelProperty("跨行") + private int rowspan = 1; + @ApiModelProperty("跨列") + private int colspan = 1; + } + } diff --git a/common/src/main/java/com/ccsens/common/persist/dao/LabelDao.java b/common/src/main/java/com/ccsens/common/persist/dao/LabelDao.java index 4212e568..39194e17 100644 --- a/common/src/main/java/com/ccsens/common/persist/dao/LabelDao.java +++ b/common/src/main/java/com/ccsens/common/persist/dao/LabelDao.java @@ -12,4 +12,11 @@ public interface LabelDao extends LabelMapper { String queryIsPm(Long labelId); Long getLabelByTypeAndLevel(@Param("type")int type, @Param("level")int level); + + /** + * 根据业务id和类型删除关联标签信息 + * @param businessId 业务id + * @param type 业务类型 + */ + void delByBusinessIdAndType(@Param("businessId") Long businessId, @Param("type") byte type); } diff --git a/common/src/main/java/com/ccsens/common/persist/dao/ProRoleTaskDao.java b/common/src/main/java/com/ccsens/common/persist/dao/ProRoleTaskDao.java index 8b390948..726a4263 100644 --- a/common/src/main/java/com/ccsens/common/persist/dao/ProRoleTaskDao.java +++ b/common/src/main/java/com/ccsens/common/persist/dao/ProRoleTaskDao.java @@ -41,4 +41,11 @@ public interface ProRoleTaskDao extends ProRoleTaskMapper { * @return 检查人列表 */ List queryCheckerOfTask(@Param("detailId") Long detailId); + + /** + * 删除任务和角色的关联关系 + * @param detailId 任务id + * @param roleDuty 类型(0负责人 1检查人) + */ + void delByTaskDetailIdAndType(@Param("detailId")Long detailId, @Param("roleDuty")byte roleDuty); } diff --git a/common/src/main/java/com/ccsens/common/persist/dao/ProTaskSubDao.java b/common/src/main/java/com/ccsens/common/persist/dao/ProTaskSubDao.java index a70e9d1f..a54772c2 100644 --- a/common/src/main/java/com/ccsens/common/persist/dao/ProTaskSubDao.java +++ b/common/src/main/java/com/ccsens/common/persist/dao/ProTaskSubDao.java @@ -33,4 +33,10 @@ public interface ProTaskSubDao extends ProTaskSubMapper { * @return 分解任务 */ ProTaskSub findNextTaskSub(@Param("nextTaskDetailId") Long nextTaskDetailId,@Param("planTime") Long planTime); + + /** + * 删除分解的任务 + * @param taskDetailId 任务详情id + */ + void deleteOldSubTask(@Param("taskDetailId")Long taskDetailId); } diff --git a/common/src/main/java/com/ccsens/common/service/ITaskService.java b/common/src/main/java/com/ccsens/common/service/ITaskService.java index 8dddcb11..d888695c 100644 --- a/common/src/main/java/com/ccsens/common/service/ITaskService.java +++ b/common/src/main/java/com/ccsens/common/service/ITaskService.java @@ -1,6 +1,7 @@ package com.ccsens.common.service; import com.ccsens.common.bean.dto.CTaskDto; +import com.ccsens.common.bean.vo.CPluginVo; import com.ccsens.common.bean.vo.CTaskVo; import java.util.List; @@ -72,4 +73,19 @@ public interface ITaskService { * @return 项目下的所有任务 */ List queryTaskOfProject(CTaskDto.QueryTaskOfProject param,Long userId); + + /** + * 修改任务信息 + */ + void updateTaskDetail(CTaskDto.UpdateTask param,Long userId); + + /** + * 删除任务 + */ + void deleteTaskDetail(CTaskDto.FindSonTask param,Long userId); + + /** + * 查看任务下的插件信息 + */ + List queryPluginByTaskId(CTaskDto.FindSonTask param, Long userId); } diff --git a/common/src/main/java/com/ccsens/common/service/TaskService.java b/common/src/main/java/com/ccsens/common/service/TaskService.java index e50dc895..75985574 100644 --- a/common/src/main/java/com/ccsens/common/service/TaskService.java +++ b/common/src/main/java/com/ccsens/common/service/TaskService.java @@ -4,9 +4,12 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.ccsens.common.bean.dto.CTaskDto; import com.ccsens.common.bean.message.TaskMessageWithStatus; import com.ccsens.common.bean.po.*; +import com.ccsens.common.bean.vo.CPluginVo; +import com.ccsens.common.bean.vo.CProjectVo; import com.ccsens.common.bean.vo.CTaskVo; import com.ccsens.common.persist.dao.*; import com.ccsens.common.persist.mapper.ProTaskStatusRecordMapper; @@ -16,6 +19,8 @@ import com.ccsens.util.JacksonUtil; import com.ccsens.util.bean.message.common.InMessage; import com.ccsens.util.bean.message.common.MessageConstant; import com.ccsens.util.config.RabbitMQConfig; +import com.ccsens.util.cron.CronConstant; +import com.ccsens.util.cron.NatureToDate; import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.AmqpTemplate; @@ -66,6 +71,8 @@ public class TaskService implements ITaskService { private ProParentTaskDao parentTaskDao; @Resource private ProRoleTaskDao roleTaskDao; + @Resource + private ProProjectDao proProjectDao; /** * 判断当前用户的角色是否被设置不可见(是否有权限查看任务) @@ -629,6 +636,12 @@ public class TaskService implements ITaskService { @Override public List saveTask(CTaskDto.SaveTask param, Long userId) { + //根据项目id查找项目基本信息(id 名称 开始结束时间) + CProjectVo.ProjectInfo projectById = proProjectDao.findProjectById(param.getProjectId()); + if (ObjectUtil.isNull(projectById)){ + throw new BaseException(CommonCodeError.PROJECT_NOT_FOUND); + } + //任务详情 ProTaskDetail proTaskDetail = new ProTaskDetail(); proTaskDetail.setId(snowflake.nextId()); @@ -636,15 +649,7 @@ public class TaskService implements ITaskService { proTaskDetail.setDescription(param.getDescription()); taskDetailDao.insertSelective(proTaskDetail); //任务分解信息 - ProTaskSub taskSub = new ProTaskSub(); - taskSub.setId(snowflake.nextId()); - taskSub.setTaskDetailId(proTaskDetail.getId()); - if (ObjectUtil.isNotNull(param.getStartTime()) && ObjectUtil.isNotNull(param.getEndTime())) { - taskSub.setPlanStartTime(param.getStartTime()); - taskSub.setPlanEndTime(param.getEndTime()); - taskSub.setPlanDuration(param.getEndTime() - param.getStartTime()); - } - taskSubDao.insertSelective(taskSub); + saveSubTask(param.getSpecialTime(), proTaskDetail.getId(), param.getStartTime(), param.getEndTime(), projectById); //任务添加标签(天,普通/日常任务) //天 Long labelOfDay = labelDao.getLabelByTypeAndLevel(0, 4); @@ -673,28 +678,13 @@ public class TaskService implements ITaskService { proParentTask.setTaskDetailId(proTaskDetail.getId()); parentTaskDao.insertSelective(proParentTask); } - //角色任务关联表(负责人) + //添加负责人 if (CollectionUtil.isNotEmpty(param.getRoleIdList())) { - for (Long roleId : param.getRoleIdList()) { - ProRoleTask roleTask = new ProRoleTask(); - roleTask.setId(snowflake.nextId()); - roleTask.setRoleId(roleId); - roleTask.setTaskId(proTaskDetail.getId()); - roleTask.setOperator(userId); - roleTaskDao.insertSelective(roleTask); - } + saveTaskRole(param.getRoleIdList(), userId, proTaskDetail.getId(), (byte) 0); } - //TODO 检查人(待定) + //检查人 if (CollectionUtil.isNotEmpty(param.getCheckerIdList())) { - for (Long checkId : param.getCheckerIdList()) { - ProRoleTask roleTask = new ProRoleTask(); - roleTask.setId(snowflake.nextId()); - roleTask.setRoleId(checkId); - roleTask.setTaskId(proTaskDetail.getId()); - roleTask.setRoleDuty((byte)1); - roleTask.setOperator(userId); - roleTaskDao.insertSelective(roleTask); - } + saveTaskRole(param.getCheckerIdList(), userId, proTaskDetail.getId(), (byte) 1); } //上下道工序 if (ObjectUtil.isNotNull(param.getProcessTaskId())) { @@ -725,9 +715,139 @@ public class TaskService implements ITaskService { return taskList; } + private void saveTaskRole(List roleIdList, Long userId, Long taskDetailId, byte roleDuty) { + //角色任务关联表 + for (Long roleId : roleIdList) { + ProRoleTask roleTask = new ProRoleTask(); + roleTask.setId(snowflake.nextId()); + roleTask.setRoleId(roleId); + roleTask.setTaskId(taskDetailId); + roleTask.setRoleDuty(roleDuty); + roleTask.setOperator(userId); + roleTaskDao.insertSelective(roleTask); + } + } + + private void saveSubTask(String specialTime, Long taskDetailId, Long startTime, Long endTime, CProjectVo.ProjectInfo projectById) { + if(StrUtil.isBlank(specialTime)) { + ProTaskSub taskSub = new ProTaskSub(); + taskSub.setId(snowflake.nextId()); + taskSub.setTaskDetailId(taskDetailId); + if (ObjectUtil.isNotNull(startTime) && ObjectUtil.isNotNull(endTime)) { + taskSub.setPlanStartTime(startTime); + taskSub.setPlanEndTime(endTime); + taskSub.setPlanDuration(endTime - startTime); + } + taskSubDao.insertSelective(taskSub); + }else { + Date startDate = new Date(projectById.getPlanStartTime()); + Date endDate = new Date(projectById.getPlanEndTime()); + try { + List taskDateList = + NatureToDate.generateDates(specialTime, startDate, endDate); + if (CollectionUtil.isNotEmpty(taskDateList)) { + List proTaskSubList = new ArrayList<>(); + for (CronConstant.TaskDate taskDate : taskDateList) { + + ProTaskSub proTaskSub = new ProTaskSub(); + proTaskSub.setId(snowflake.nextId()); + proTaskSub.setTaskDetailId(taskDetailId); + proTaskSub.setPlanStartTime(taskDate.getStartDate().getTime()); + proTaskSub.setPlanEndTime(taskDate.getEndDate().getTime()); + proTaskSub.setPlanDuration(proTaskSub.getPlanEndTime() - proTaskSub.getPlanStartTime()); + proTaskSubList.add(proTaskSub); + } + if(CollectionUtil.isNotEmpty(proTaskSubList)){ + taskSubDao.insertAllTaskSub(proTaskSubList); + } + } + }catch (Exception e1){ + throw new BaseException(String.valueOf(e1)); + } + } + } + @Override public List queryTaskOfProject(CTaskDto.QueryTaskOfProject param, Long userId) { return taskDetailDao.queryTaskOfProject(param); } + @Override + public void updateTaskDetail(CTaskDto.UpdateTask param, Long userId) { + //查找分解任务信息 + ProTaskSub taskSub = taskSubDao.selectByPrimaryKey(param.getId()); + if (ObjectUtil.isNull(taskSub)) { + throw new BaseException(CommonCodeError.NOT_TASK); + } + //查找任务详情信息 + ProTaskDetail proTaskDetail = taskDetailDao.selectByPrimaryKey(taskSub.getTaskDetailId()); + if (ObjectUtil.isNull(proTaskDetail)) { + throw new BaseException(CommonCodeError.NOT_TASK); + } + //查找项目信息 + CProjectVo.ProjectInfo projectById = proProjectDao.findProjectById(param.getProjectId()); + if (ObjectUtil.isNull(projectById)){ + throw new BaseException(CommonCodeError.PROJECT_NOT_FOUND); + } + //修改任务信息 + if(StrUtil.isNotBlank(param.getName())){ + proTaskDetail.setName(param.getName()); + } + if(StrUtil.isNotBlank(param.getDescription())){ + proTaskDetail.setDescription(param.getDescription()); + } + if(StrUtil.isNotBlank(param.getSpecialTime())){ + proTaskDetail.setCycle(param.getSpecialTime()); + } + taskDetailDao.updateByPrimaryKeySelective(proTaskDetail); + //如果时间发生了改变。将之前的分解任务全部删除,重新添加 + if(StrUtil.isNotBlank(param.getSpecialTime()) || (ObjectUtil.isNotNull(param.getStartTime()) && ObjectUtil.isNotNull(param.getEndTime()))){ + //删除以前的分解任务 + taskSubDao.deleteOldSubTask(taskSub.getTaskDetailId()); + //添加新的分解任务 + saveSubTask(param.getSpecialTime(),proTaskDetail.getId(),param.getStartTime(),param.getEndTime(),projectById); + } + //TODO 删除任务之前的任务类型的标签,重新添加 + + if(CollectionUtil.isNotEmpty(param.getRoleIdList())){ + //删除旧的负责人 + roleTaskDao.delByTaskDetailIdAndType(proTaskDetail.getId(), (byte)0); + //添加新的负责人 + saveTaskRole(param.getCheckerIdList(), userId, proTaskDetail.getId(), (byte) 0); + } + if(CollectionUtil.isNotEmpty(param.getRoleIdList())){ + //删除旧的检查人 + roleTaskDao.delByTaskDetailIdAndType(proTaskDetail.getId(), (byte)1); + //添加新的检查人 + saveTaskRole(param.getCheckerIdList(), userId, proTaskDetail.getId(), (byte) 1); + } + } + + @Override + public void deleteTaskDetail(CTaskDto.FindSonTask param, Long userId) { + //查找任务详情信息 + ProTaskDetail proTaskDetail = taskDetailDao.selectByPrimaryKey(param.getDetailId()); + if (ObjectUtil.isNull(proTaskDetail)) { + throw new BaseException(CommonCodeError.NOT_TASK); + } + //删除任务详情 + proTaskDetail.setRecStatus((byte) 2); + taskDetailDao.updateByPrimaryKeySelective(proTaskDetail); + //删除任务分解信息 + taskSubDao.deleteOldSubTask(proTaskDetail.getId()); + //删除任务角色关联信息 + roleTaskDao.delByTaskDetailIdAndType(proTaskDetail.getId(), (byte)0); + roleTaskDao.delByTaskDetailIdAndType(proTaskDetail.getId(), (byte)1); + //删除任务标签信息 + labelDao.delByBusinessIdAndType(proTaskDetail.getId(),(byte)0); + + //TODO 删除任务上下级关系 + //TODO 删除任务流转信息 + } + + @Override + public List queryPluginByTaskId(CTaskDto.FindSonTask param, Long userId) { + + return null; + } } \ No newline at end of file diff --git a/common/src/main/resources/mapper_dao/LabelDao.xml b/common/src/main/resources/mapper_dao/LabelDao.xml index ade2f1dd..2d3dee70 100644 --- a/common/src/main/resources/mapper_dao/LabelDao.xml +++ b/common/src/main/resources/mapper_dao/LabelDao.xml @@ -2,6 +2,16 @@ + + UPDATE + t_label_business + SET + rec_status = 2 + WHERE + business_id = #{businessId} + and business_type = #{type} + + SELECT diff --git a/common/src/main/resources/mapper_dao/ProTaskSubDao.xml b/common/src/main/resources/mapper_dao/ProTaskSubDao.xml index fe1c01f9..d8ced7ae 100644 --- a/common/src/main/resources/mapper_dao/ProTaskSubDao.xml +++ b/common/src/main/resources/mapper_dao/ProTaskSubDao.xml @@ -15,6 +15,14 @@ (#{item.id},#{item.planStartTime},#{item.planDuration},#{item.planEndTime},#{item.taskDetailId}) + + update + t_pro_task_sub + set + rec_status = 2 + where + task_detail_id = #{taskDetailId} +