diff --git a/tall/src/main/java/com/ccsens/tall/service/IProjectService.java b/tall/src/main/java/com/ccsens/tall/service/IProjectService.java index f9acec51..f3ab081e 100644 --- a/tall/src/main/java/com/ccsens/tall/service/IProjectService.java +++ b/tall/src/main/java/com/ccsens/tall/service/IProjectService.java @@ -64,4 +64,12 @@ public interface IProjectService { * @param userId 当前用户id */ void projectToTemplate(ProjectDto.ProjectToTemplate param, Long userId); + + /** + * 根据模板复制项目 + * @param param 项目id + * @param userId 当前用户id + * @return 复制成功的项目 + */ + ProjectVo.ProjectInfo copyProjectNew(ProjectDto.ProjectIdDto param, Long userId); } diff --git a/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java b/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java index dec2a74c..8b00184a 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProTaskDetailService.java @@ -947,6 +947,18 @@ public class ProTaskDetailService implements IProTaskDetailService { taskDetail.setParentName(parentTask.getName()); } } + //查找任务是否有webPath + ProPluginConfigExample pluginConfigExample = new ProPluginConfigExample(); + pluginConfigExample.createCriteria().andTaskIdEqualTo(taskDetail.getDetailId()); + List proPluginConfigs = pluginConfigDao.selectByExample(pluginConfigExample); + if(CollectionUtil.isNotEmpty(proPluginConfigs)){ + for (ProPluginConfig pluginConfig : proPluginConfigs) { + taskDetail.setWebPath(pluginConfig.getWebPath()); + taskDetail.setRoutineLocation(pluginConfig.getRoutineLocation()); + taskDetail.setImportParam(pluginConfig.getImportParam()); + } + } + } return taskDetail; diff --git a/tall/src/main/java/com/ccsens/tall/service/ProjectService.java b/tall/src/main/java/com/ccsens/tall/service/ProjectService.java index 42203dc7..310aa29f 100644 --- a/tall/src/main/java/com/ccsens/tall/service/ProjectService.java +++ b/tall/src/main/java/com/ccsens/tall/service/ProjectService.java @@ -3,7 +3,6 @@ package com.ccsens.tall.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.ccsens.tall.bean.dto.MemberRoleDto; @@ -12,7 +11,6 @@ import com.ccsens.tall.bean.po.*; import com.ccsens.tall.bean.vo.LabelVo; import com.ccsens.tall.bean.vo.ProjectVo; import com.ccsens.tall.persist.dao.*; -import com.ccsens.tall.persist.mapper.ProMemberRoleMapper; import com.ccsens.tall.persist.mapper.SysImitationMapper; import com.ccsens.util.CodeEnum; import com.ccsens.util.DateUtil; @@ -58,8 +56,12 @@ public class ProjectService implements IProjectService { @Resource private TaskPluginDao pluginDao; @Resource + private ProPluginConfigDao pluginConfigDao; + @Resource private TaskDeliverDao taskDeliverDao; @Resource + private ProTaskInputDocDao taskInputDocDao; + @Resource private IProRoleService proRoleService; @Resource private Snowflake snowflake; @@ -85,6 +87,8 @@ public class ProjectService implements IProjectService { private SysProjectLabelDao sysProjectLabelDao; @Resource private RobotService robotService; + @Resource + private ProRemindDao remindDao; @Override @@ -635,6 +639,7 @@ public class ProjectService implements IProjectService { newProject.setName(oldProject.getName() + "-副本"); newProject.setTemplate((byte) 0); saveProject(newProject); + //该用户关注新项目 UserAttention userAttention = new UserAttention(); userAttention.setId(snowflake.nextId()); @@ -716,7 +721,7 @@ public class ProjectService implements IProjectService { } //添加对谁不可见 copyRoleExclude(oldRoleList, oldRoleMap, newRoleMap); - //复制任务 + //复制任务(包括分解任务) copyTask(oldProjectId, newProjectId, oldRoleMap, newRoleMap); } } @@ -741,9 +746,15 @@ public class ProjectService implements IProjectService { } /** - * 复制任务 + * 复制任务、插件、插件配置和交付物、任务配置 */ private void copyTask(Long oldProjectId, Long newProjectId, Map oldRoleMap, Map newRoleMap) { + Map oldIdAndNewId = new HashMap<>(); + SysProject oldProject = sysProjectDao.selectByPrimaryKey(oldProjectId); + SysProject newProject = sysProjectDao.selectByPrimaryKey(newProjectId); + //两个项目的时间差 + long timeDifference = newProject.getBeginTime() - oldProject.getBeginTime(); + ProTaskDetailExample detailExample = new ProTaskDetailExample(); detailExample.createCriteria().andProjectIdEqualTo(oldProjectId).andLevelEqualTo((byte) 1); List detailList = taskDetailDao.selectByExample(detailExample); @@ -753,11 +764,19 @@ public class ProjectService implements IProjectService { BeanUtil.copyProperties(oldDetail, newDetail); newDetail.setId(snowflake.nextId()); newDetail.setProjectId(newProjectId); + //设置任务的时间 + newDetail.setBeginTime(newDetail.getBeginTime()+timeDifference); + newDetail.setEndTime(newDetail.getEndTime()+timeDifference); + newDetail.setCreatedAt(null); + newDetail.setUpdatedAt(null); newDetail.setExecutorRole(newRoleMap.get(oldRoleMap.get(newDetail.getExecutorRole()))); if (newDetail.getCheckerRole() != 0) { newDetail.setCheckerRole(newRoleMap.get(oldRoleMap.get(newDetail.getCheckerRole()))); } taskDetailDao.insertSelective(newDetail); + oldIdAndNewId.put(oldDetail.getId(),newDetail.getId()); + //复制分解任务 + copyTaskSubTime(timeDifference,newDetail.getId(),oldDetail.getId()); //查找一级任务下的二级任务 ProTaskDetailExample oldSecondTask = new ProTaskDetailExample(); oldSecondTask.createCriteria().andParentIdEqualTo(oldDetail.getId()).andLevelEqualTo((byte) 2); @@ -773,9 +792,17 @@ public class ProjectService implements IProjectService { if (newSecondDetail.getCheckerRole() != 0) { newSecondDetail.setCheckerRole(newRoleMap.get(oldRoleMap.get(newSecondDetail.getCheckerRole()))); } + //设置任务的时间 + newSecondDetail.setBeginTime(newDetail.getBeginTime()+timeDifference); + newSecondDetail.setEndTime(newDetail.getEndTime()+timeDifference); + newSecondDetail.setCreatedAt(null); + newSecondDetail.setUpdatedAt(null); taskDetailDao.insertSelective(newSecondDetail); + oldIdAndNewId.put(oldSecondDetail.getId(),newSecondDetail.getId()); + //复制分解任务 + copyTaskSubTime(timeDifference,newSecondDetail.getId(),oldSecondDetail.getId()); //分解时间 - taskToSubTime(newSecondDetail); + //taskToSubTime(newSecondDetail); //查找二级任务的子任务 ProTaskDetailExample oldSubTask = new ProTaskDetailExample(); oldSubTask.createCriteria().andParentIdEqualTo(oldSecondDetail.getId()).andLevelEqualTo((byte) 3); @@ -791,18 +818,74 @@ public class ProjectService implements IProjectService { if (newSubDetail.getCheckerRole() != 0) { newSubDetail.setCheckerRole(newRoleMap.get(oldRoleMap.get(newSubDetail.getCheckerRole()))); } + //设置任务的时间 + newSubDetail.setBeginTime(newDetail.getBeginTime()+timeDifference); + newSubDetail.setEndTime(newDetail.getEndTime()+timeDifference); + newSubDetail.setCreatedAt(null); + newSubDetail.setUpdatedAt(null); taskDetailDao.insertSelective(newSubDetail); + oldIdAndNewId.put(oldSubDetail.getId(),newSubDetail.getId()); + //复制分解任务 + copyTaskSubTime(timeDifference,newSubDetail.getId(),oldSubDetail.getId()); //分解时间 - taskToSubTime(newSubDetail); - copyPluginAndDeliver(oldDetail.getId(), newDetail.getId(), oldRoleMap, newRoleMap); + //taskToSubTime(newSubDetail); + //复制插件、插件配置和交付物 + copyPluginAndDeliver(oldSubDetail.getId(), newSubDetail.getId(), oldRoleMap, newRoleMap,oldIdAndNewId,newProjectId); + copyTaskConfig(oldSubDetail.getId(),newSubDetail.getId(),oldProjectId,newProjectId); } } - copyPluginAndDeliver(oldDetail.getId(), newDetail.getId(), oldRoleMap, newRoleMap); - copyTaskConfig(oldDetail.getId(),newDetail.getId(),oldProjectId,newProjectId); + copyPluginAndDeliver(oldSecondDetail.getId(), newSecondDetail.getId(), oldRoleMap, newRoleMap,oldIdAndNewId,newProjectId); + copyTaskConfig(oldSecondDetail.getId(),newSecondDetail.getId(),oldProjectId,newProjectId); } } - copyPluginAndDeliver(oldDetail.getId(), newDetail.getId(), oldRoleMap, newRoleMap); + copyPluginAndDeliver(oldDetail.getId(), newDetail.getId(), oldRoleMap, newRoleMap,oldIdAndNewId,newProjectId); copyTaskConfig(oldDetail.getId(),newDetail.getId(),oldProjectId,newProjectId); + + + } + } + } + + /** + * 复制分解任务和任务提示信息 + * @param newTaskDetailId 新的详情任务 + * @param timeDifference 时间差 + */ + public void copyTaskSubTime(Long timeDifference,Long newTaskDetailId,Long oldTaskDetailId){ + Map oldTaskSubIdAndNewId = new HashMap<>(); + //复制分解任务 + ProTaskSubTimeExample proTaskSubTimeExample = new ProTaskSubTimeExample(); + proTaskSubTimeExample.createCriteria().andTaskDetailIdEqualTo(oldTaskDetailId); + List oldTaskSubTimes = taskSubTimeDao.selectByExample(proTaskSubTimeExample); + if (CollectionUtil.isNotEmpty(oldTaskSubTimes)){ + for (ProTaskSubTime oldTaskSubTime : oldTaskSubTimes) { + ProTaskSubTime newTaskSubTime = new ProTaskSubTime(); + BeanUtil.copyProperties(oldTaskSubTime,newTaskSubTime); + newTaskSubTime.setId(snowflake.nextId()); + newTaskSubTime.setTaskDetailId(newTaskDetailId); + newTaskSubTime.setBeginTime(oldTaskSubTime.getBeginTime()+timeDifference); + newTaskSubTime.setEndTime(oldTaskSubTime.getEndTime()+timeDifference); + newTaskSubTime.setRealBeginTime(oldTaskSubTime.getRealBeginTime()+timeDifference); + newTaskSubTime.setRealEndTime(oldTaskSubTime.getRealEndTime()+timeDifference); + newTaskSubTime.setCreatedAt(null); + newTaskSubTime.setUpdatedAt(null); + taskSubTimeDao.insertSelective(newTaskSubTime); + oldTaskSubIdAndNewId.put(oldTaskSubTime.getId(),newTaskSubTime.getId()); + //复制任务提示信息 + ProRemindExample remindExample = new ProRemindExample(); + remindExample.createCriteria().andSubTaskIdEqualTo(oldTaskSubTime.getId()); + List proReminds = remindDao.selectByExample(remindExample); + if (CollectionUtil.isNotEmpty(proReminds)){ + for (ProRemind oldRemind : proReminds) { + ProRemind newRemind = new ProRemind(); + BeanUtil.copyProperties(oldRemind,newRemind); + newRemind.setId(snowflake.nextId()); + newRemind.setSubTaskId(oldTaskSubIdAndNewId.get(oldTaskSubTime.getId())); + newRemind.setCreatedAt(null); + newRemind.setUpdatedAt(null); + remindDao.insertSelective(newRemind); + } + } } } } @@ -863,9 +946,10 @@ public class ProjectService implements IProjectService { } /** - * 复制插件和交付物 + * 复制插件·插件配置和交付物 */ - private void copyPluginAndDeliver(Long oldTaskId, Long newTaskId, Map oldRoleMap, Map newRoleMap) { + private void copyPluginAndDeliver(Long oldTaskId, Long newTaskId, Map oldRoleMap, Map newRoleMap,Map oldTaskIdAndNewId,Long projectId) { + Map oldPluginIdAndNewId = new HashMap<>(); //插件 ProTaskPluginExample pluginExample = new ProTaskPluginExample(); pluginExample.createCriteria().andTaskDetailIdEqualTo(oldTaskId); @@ -877,10 +961,34 @@ public class ProjectService implements IProjectService { newPlugin.setId(snowflake.nextId()); newPlugin.setTaskDetailId(newTaskId); newPlugin.setMemberRoleId(newRoleMap.get(oldRoleMap.get(newPlugin.getMemberRoleId()))); + newPlugin.setCreatedAt(null); + newPlugin.setUpdatedAt(null); pluginDao.insertSelective(newPlugin); + oldPluginIdAndNewId.put(plugin.getId(),newPlugin.getId()); } } + //插件配置表 + ProPluginConfigExample pluginConfigExample = new ProPluginConfigExample(); + pluginConfigExample.createCriteria().andTaskIdEqualTo(oldTaskId); + List oldPluginConfigs = pluginConfigDao.selectByExample(pluginConfigExample); + if (CollectionUtil.isNotEmpty(oldPluginConfigs)){ + for (ProPluginConfig oldPluginConfig : oldPluginConfigs) { + ProPluginConfig newPluginConfig = new ProPluginConfig(); + BeanUtil.copyProperties(oldPluginConfig,newPluginConfig); + newPluginConfig.setId(snowflake.nextId()); + if (0 != newPluginConfig.getTaskId()){ + newPluginConfig.setTaskId(oldTaskIdAndNewId.get(oldTaskId)); + } + newPluginConfig.setPluginId(oldPluginIdAndNewId.get(oldPluginConfig.getPluginId())); + newPluginConfig.setCreatedAt(null); + newPluginConfig.setUpdatedAt(null); + pluginConfigDao.insertSelective(newPluginConfig); + } + } + + //交付物 + //输出文档 ProTaskDeliverExample deliverExample = new ProTaskDeliverExample(); deliverExample.createCriteria().andTaskDetailIdEqualTo(oldTaskId); List proTaskDeliverList = taskDeliverDao.selectByExample(deliverExample); @@ -892,9 +1000,26 @@ public class ProjectService implements IProjectService { newTaskDeliver.setTaskDetailId(newTaskId); newTaskDeliver.setCheckStatus(0); newTaskDeliver.setIsUpload(0); + newTaskDeliver.setCreatedAt(null); + newTaskDeliver.setUpdatedAt(null); taskDeliverDao.insertSelective(newTaskDeliver); } } + //输入文档 + ProTaskInputDocExample taskInputDocExample = new ProTaskInputDocExample(); + taskInputDocExample.createCriteria().andTaskDetailIdEqualTo(oldTaskId); + List oldTaskInputDocs = taskInputDocDao.selectByExample(taskInputDocExample); + if (CollectionUtil.isNotEmpty(oldTaskInputDocs)){ + for (ProTaskInputDoc oldTaskInputDoc : oldTaskInputDocs) { + ProTaskInputDoc newTaskInputDoc = new ProTaskInputDoc(); + BeanUtil.copyProperties(oldTaskInputDoc,newTaskInputDoc); + newTaskInputDoc.setId(snowflake.nextId()); + newTaskInputDoc.setIsUpload(0); + newTaskInputDoc.setCreatedAt(null); + newTaskInputDoc.setUpdatedAt(null); + taskInputDocDao.insertSelective(newTaskInputDoc); + } + } } /** @@ -1313,4 +1438,59 @@ public class ProjectService implements IProjectService { } + /** + * 根据模板复制项目 + * @param param 项目id + * @param userId 当前用户id + * @return 复制后的项目 + */ + @Override + public ProjectVo.ProjectInfo copyProjectNew(ProjectDto.ProjectIdDto param, Long userId) { + //当前时间 + long currentTime = System.currentTimeMillis(); + SysProject oldProject = sysProjectDao.selectByPrimaryKey(param.getProjectId()); + //项目开始时间和结束时间的时间差 + Long timeDifference = oldProject.getEndTime() - oldProject.getBeginTime(); + + //复制项目 + SysProject newProject = new SysProject(); + BeanUtil.copyProperties(oldProject,newProject); + newProject.setId(snowflake.nextId()); + newProject.setCreatorId(userId); + newProject.setName(oldProject.getName()+"-副本"); + newProject.setTemplate((byte)0); + newProject.setBeginTime(currentTime); + newProject.setEndTime(currentTime+timeDifference); + newProject.setCreatedAt(null); + newProject.setUpdatedAt(null); + sysProjectDao.insertSelective(newProject); + //复制项目配置表 + ProShowExample showExample = new ProShowExample(); + showExample.createCriteria().andProjectIdEqualTo(oldProject.getId()); + List oldShows = proShowDao.selectByExample(showExample); + if (CollectionUtil.isNotEmpty(oldShows)){ + for (ProShow oldShow : oldShows) { + ProShow newShow = new ProShow(); + BeanUtil.copyProperties(oldShow,newShow); + newShow.setId(snowflake.nextId()); + newShow.setProjectId(newProject.getId()); + newShow.setCreatedAt(null); + newShow.setUpdatedAt(null); + } + } + + //该用户关注新项目 + UserAttention userAttention = new UserAttention(); + userAttention.setId(snowflake.nextId()); + userAttention.setUserId(userId); + userAttention.setProjectId(newProject.getId()); + attentionDao.insertSelective(userAttention); + //添加角色 + copyRole(oldProject.getId(), newProject.getId()); + //复制项目配置信息 + copyProjectConfig(oldProject.getId(), newProject.getId()); + //复制项目下的角色 + return null; + } + } diff --git a/tall/src/main/java/com/ccsens/tall/web/ProjectController.java b/tall/src/main/java/com/ccsens/tall/web/ProjectController.java index a1855567..3941c5be 100644 --- a/tall/src/main/java/com/ccsens/tall/web/ProjectController.java +++ b/tall/src/main/java/com/ccsens/tall/web/ProjectController.java @@ -1,5 +1,7 @@ package com.ccsens.tall.web; +import com.ccsens.cloudutil.annotation.MustLogin; +import com.ccsens.tall.annotation.MustLoginTall; import com.ccsens.tall.bean.dto.ProjectDto; import com.ccsens.tall.bean.dto.TaskDto; import com.ccsens.tall.bean.vo.ProjectVo; @@ -321,7 +323,7 @@ public class ProjectController { return JsonResponse.newInstance().ok(); } - + @MustLoginTall @ApiOperation(value = "将项目转化为模板", notes = "") @RequestMapping(value = "/projectToTemplate", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) public JsonResponse projectToTemplate(@ApiParam @Validated @RequestBody QueryDto params) throws Exception { @@ -331,4 +333,13 @@ public class ProjectController { return JsonResponse.newInstance().ok(); } + @MustLogin + @ApiOperation(value = "根据模板复制项目新", notes = "") + @RequestMapping(value = "/copyProject", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse copyProjectNew(@ApiParam @Validated @RequestBody QueryDto params) throws Exception { + log.info("根据模板复制项目新:{}",params); + ProjectVo.ProjectInfo projectInfo = projectService.copyProjectNew(params.getParam(),params.getUserId()); + log.info("根据模板复制项目新结束"); + return JsonResponse.newInstance().ok(projectInfo); + } } diff --git a/tall/src/main/java/com/ccsens/tall/web/TaskController.java b/tall/src/main/java/com/ccsens/tall/web/TaskController.java index 6d431691..6eab29e7 100644 --- a/tall/src/main/java/com/ccsens/tall/web/TaskController.java +++ b/tall/src/main/java/com/ccsens/tall/web/TaskController.java @@ -322,4 +322,12 @@ public class TaskController { List aboutWeekTask = taskDetailService.selectAboutWeekTask(params.getParam(),params.getUserId()); return JsonResponse.newInstance().ok(aboutWeekTask); } + + @MustLoginTall + @ApiOperation(value = "给任务增加分解任务",notes = "") + @RequestMapping(value = "/addSubTaskForDetailTask", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse> addSubTaskForDetailTask(@ApiParam @Validated @RequestBody QueryDto params) throws Exception { + List aboutWeekTask = taskDetailService.selectAboutWeekTask(params.getParam(),params.getUserId()); + return JsonResponse.newInstance().ok(aboutWeekTask); + } } diff --git a/tall/src/main/resources/application.yml b/tall/src/main/resources/application.yml index b5408a3a..ebc544af 100644 --- a/tall/src/main/resources/application.yml +++ b/tall/src/main/resources/application.yml @@ -1,5 +1,5 @@ spring: profiles: - active: dev - include: util-dev,common + active: test + include: util-test,common diff --git a/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml b/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml index a220a531..34a92d0a 100644 --- a/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml +++ b/tall/src/main/resources/mapper_dao/TaskSubTimeDao.xml @@ -77,10 +77,12 @@ t_pro_sub_time_member m LEFT JOIN t_pro_task_sub_time s on m.task_sub_time_id = s.id WHERE m.rec_status = 0 - and m.member_id in - - #{id} - + + and m.member_id in + + #{id} + + )t on t.sId = s.id LEFT JOIN (