|
|
@ -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<Long, String> oldRoleMap, Map<String, Long> newRoleMap) { |
|
|
|
Map<Long,Long> 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<ProTaskDetail> 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<Long,Long> oldTaskSubIdAndNewId = new HashMap<>(); |
|
|
|
//复制分解任务
|
|
|
|
ProTaskSubTimeExample proTaskSubTimeExample = new ProTaskSubTimeExample(); |
|
|
|
proTaskSubTimeExample.createCriteria().andTaskDetailIdEqualTo(oldTaskDetailId); |
|
|
|
List<ProTaskSubTime> 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<ProRemind> 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<Long, String> oldRoleMap, Map<String, Long> newRoleMap) { |
|
|
|
private void copyPluginAndDeliver(Long oldTaskId, Long newTaskId, Map<Long, String> oldRoleMap, Map<String, Long> newRoleMap,Map<Long,Long> oldTaskIdAndNewId,Long projectId) { |
|
|
|
Map<Long,Long> 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<ProPluginConfig> 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<ProTaskDeliver> 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<ProTaskInputDoc> 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<ProShow> 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; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|