|
@@ -1,12 +1,13 @@
|
|
|
package com.management.platform.controller;
|
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-import com.management.platform.entity.Task;
|
|
|
-import com.management.platform.entity.User;
|
|
|
+import com.management.platform.entity.*;
|
|
|
import com.management.platform.mapper.UserMapper;
|
|
|
-import com.management.platform.service.TaskService;
|
|
|
+import com.management.platform.service.*;
|
|
|
import com.management.platform.util.HttpRespMsg;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
@@ -14,7 +15,9 @@ import org.springframework.web.bind.annotation.RestController;
|
|
|
import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.time.LocalDate;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -32,8 +35,17 @@ public class TaskController {
|
|
|
@Resource
|
|
|
private TaskService taskService;
|
|
|
@Resource
|
|
|
+ private StagesService stagesService;
|
|
|
+ @Resource
|
|
|
+ private ProjectService projectService;
|
|
|
+ @Resource
|
|
|
+ private UserRecentTaskService userRecentTaskService;
|
|
|
+ @Resource
|
|
|
private UserMapper userMapper;
|
|
|
-
|
|
|
+ @Resource
|
|
|
+ private TaskLogService taskLogService;
|
|
|
+ @Resource
|
|
|
+ private TaskCommentService taskCommentService;
|
|
|
@RequestMapping("/save")
|
|
|
public HttpRespMsg save(Task task) {
|
|
|
String userId = request.getHeader("Token");
|
|
@@ -43,10 +55,22 @@ public class TaskController {
|
|
|
task.setCreateDate(LocalDate.now());
|
|
|
task.setCreaterId(userId);
|
|
|
task.setCreaterName(user.getName());
|
|
|
+ task.setCreatorColor(user.getColor());
|
|
|
task.setCompanyId(user.getCompanyId());
|
|
|
- task.setExecutorName(userMapper.selectById(task.getExecutorId()).getName());
|
|
|
+ if (!StringUtils.isEmpty(task.getExecutorId())) {
|
|
|
+ User executor = userMapper.selectById(task.getExecutorId());
|
|
|
+
|
|
|
+ task.setExecutorName(executor.getName());
|
|
|
+ task.setExecutorColor(executor.getColor());
|
|
|
+ }
|
|
|
+ //有父任务,需要设置名称
|
|
|
+ if (task.getParentTid() != null && task.getParentTname() == null) {
|
|
|
+ task.setParentTname(taskService.getById(task.getParentTid()).getName());
|
|
|
+ }
|
|
|
+ boolean isNew = false;
|
|
|
//新建的任务需要计算排序
|
|
|
if (task.getId() == null) {
|
|
|
+ isNew = true;
|
|
|
QueryWrapper<Task> queryWrapper = new QueryWrapper<Task>();
|
|
|
queryWrapper.eq("stages_id", task.getStagesId()).orderByDesc("seq").last("limit 1");
|
|
|
List<Task> taskList = taskService.list(queryWrapper);
|
|
@@ -55,10 +79,374 @@ public class TaskController {
|
|
|
} else {
|
|
|
task.setSeq(taskList.get(0).getSeq() + 1);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ //更新的情况,需要对比是否修改了任务标题,更新子任务的parentTname
|
|
|
+ if (!taskService.getById(task.getId()).getName().equals(task.getName())) {
|
|
|
+ Task sample = new Task();
|
|
|
+ sample.setParentTname(task.getName());
|
|
|
+ taskService.update(sample, new QueryWrapper<Task>().eq("parent_tid", task.getId()));
|
|
|
+
|
|
|
+ UserRecentTask userRecentTask = new UserRecentTask();
|
|
|
+ userRecentTask.setTaskName(task.getName());
|
|
|
+ userRecentTaskService.update(userRecentTask, new QueryWrapper<UserRecentTask>().eq("task_id", task.getId()));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
taskService.saveOrUpdate(task);
|
|
|
+ //更新执行人近期任务
|
|
|
+ if (!StringUtils.isEmpty(task.getExecutorId())) {
|
|
|
+ saveOrUpdateRecentTask(task, task.getExecutorId());
|
|
|
+ }
|
|
|
+
|
|
|
+ //新增任务,需要重新计算项目进度
|
|
|
+ if (isNew) {
|
|
|
+ updateProjectProgress(task.getProjectId());
|
|
|
+ }
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateProjectProgress(Integer projectId) {
|
|
|
+ //更新项目完成度
|
|
|
+ //只有第一级任务才更新项目进度, 非已撤销状态的
|
|
|
+ List<Task> all = taskService.list(new QueryWrapper<Task>().eq("project_id", projectId).isNull("parent_tid").ne("task_status", 2));
|
|
|
+
|
|
|
+ if (all.size() > 0) {
|
|
|
+ long running = all.stream().filter(a -> a.getTaskStatus() == 1).count();
|
|
|
+ int progress = ((int) running) * 100 / all.size();
|
|
|
+ Project project = new Project();
|
|
|
+ project.setId(projectId);
|
|
|
+ project.setProgress(progress);
|
|
|
+ projectService.updateById(project);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/finish")
|
|
|
+ public HttpRespMsg finish(Task task) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ //进行完成操作时需要检查子任务是否全部完成
|
|
|
+ if (task.getTaskStatus() == 0) {
|
|
|
+ QueryWrapper<Task> subQuery = new QueryWrapper<Task>();
|
|
|
+ subQuery.eq("parent_tid", task.getId()).eq("task_status", 0);
|
|
|
+ int count = taskService.count(subQuery);
|
|
|
+ if (count > 0) {
|
|
|
+ msg.setError("请先完成全部子任务");
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (task.getTaskStatus() == 0) {
|
|
|
+ task.setTaskStatus(1);
|
|
|
+ task.setFinishDate(LocalDate.now());
|
|
|
+ //计算排序,需要移动到最后
|
|
|
+ Task old = taskService.getById(task.getId());
|
|
|
+ if (task.getParentTid() == null) {
|
|
|
+ QueryWrapper<Task> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq("stages_id", old.getStagesId()).isNull("parent_tid").orderByDesc("seq").last("limit 1");
|
|
|
+ List<Task> afterList = taskService.list(queryWrapper);
|
|
|
+ if (afterList.size() > 0) {
|
|
|
+ //取第一个,也就是正序排序的最后一个
|
|
|
+ Task lastItem = afterList.get(0);
|
|
|
+ if (!lastItem.getId().equals(old.getId())) {
|
|
|
+ task.setSeq(lastItem.getSeq() + 1);//当前操作的任务不是最后一个的情况下,需要把它排到最后,+1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (task.getTaskStatus() == 1) {
|
|
|
+ task.setTaskStatus(0);
|
|
|
+ } else {
|
|
|
+ msg.setError("状态不对,无法操作");
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ taskService.updateById(task);
|
|
|
+ //更新项目完成度
|
|
|
+ Task item = taskService.getById(task.getId());
|
|
|
+ if (item.getParentTid() == null) {
|
|
|
+ //只有第一级任务才更新项目进度, 非已撤销状态的
|
|
|
+ List<Task> all = taskService.list(new QueryWrapper<Task>().eq("project_id", item.getProjectId()).isNull("parent_tid").ne("task_status", 2));
|
|
|
+
|
|
|
+ if (all.size() > 0) {
|
|
|
+ long running = all.stream().filter(a -> a.getTaskStatus() == 1).count();
|
|
|
+ int progress = ((int) running) * 100 / all.size();
|
|
|
+ Project project = new Project();
|
|
|
+ project.setId(item.getProjectId());
|
|
|
+ project.setProgress(progress);
|
|
|
+ projectService.updateById(project);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/changeOrder")
|
|
|
+ public HttpRespMsg changeOrder(Integer id, Integer oldIndex, Integer newIndex, Integer oldStagesId, Integer newStagesId) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ Task curItem = new Task();
|
|
|
+ curItem.setId(id);
|
|
|
+ if (!oldStagesId.equals(newStagesId)) {
|
|
|
+ //获取移动到的目标位置上一个数据的seq,计算当前任务的新seq
|
|
|
+ //跨stage移动,旧的stage上移除,切换stages后,旧的任务列表自动会重新排序,不需要再操作
|
|
|
+ curItem.setStagesId(newStagesId);
|
|
|
+ curItem.setStagesName(stagesService.getById(newStagesId).getStagesName());
|
|
|
+ }
|
|
|
+
|
|
|
+ QueryWrapper<Task> queryWrapper = new QueryWrapper<Task>();
|
|
|
+ int startSeq = 0;
|
|
|
+ if (newIndex > 0) {
|
|
|
+ int beforeItemIndex = 0;
|
|
|
+ if (oldStagesId.equals(newStagesId)) {
|
|
|
+ beforeItemIndex = newIndex > oldIndex?newIndex:newIndex-1;
|
|
|
+ } else {
|
|
|
+ //跨stages移动,相当于从下往上移动
|
|
|
+ beforeItemIndex = newIndex-1;
|
|
|
+ }
|
|
|
+ queryWrapper.eq("stages_id", newStagesId).isNull("parent_tid").orderByAsc("seq").last("limit " +beforeItemIndex+", 1");
|
|
|
+ List<Task> taskList = taskService.list(queryWrapper);
|
|
|
+ if (taskList.size() > 0) {
|
|
|
+ Task beforeItem = taskList.get(0);
|
|
|
+ System.out.println("前面的任务:"+beforeItem.getName()+", seq="+beforeItem.getSeq());
|
|
|
+ startSeq = beforeItem.getSeq() + 1;
|
|
|
+ } else {
|
|
|
+ startSeq = 1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //移动到了第一个位置
|
|
|
+ startSeq = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ curItem.setSeq(startSeq);
|
|
|
+ //在新位置下面的包括原来占据新位置的,全部调整,从startSeq开始递增
|
|
|
+ queryWrapper = new QueryWrapper<Task>();
|
|
|
+ queryWrapper.eq("stages_id", newStagesId).isNull("parent_tid").ge("seq", startSeq).orderByAsc("seq");
|
|
|
+ List<Task> taskList = taskService.list(queryWrapper);
|
|
|
+ if (taskList.size() > 0) {
|
|
|
+ List<Task> batchList = new ArrayList<>();
|
|
|
+ for (Task t:taskList) {
|
|
|
+ Task item = new Task();
|
|
|
+ item.setId(t.getId());
|
|
|
+ startSeq++;
|
|
|
+ item.setSeq(startSeq);
|
|
|
+ batchList.add(item);
|
|
|
+ }
|
|
|
+ taskService.updateBatchById(batchList);
|
|
|
+ }
|
|
|
+
|
|
|
+ taskService.updateById(curItem);
|
|
|
return msg;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ @RequestMapping("/list")
|
|
|
+ public HttpRespMsg list(Task task, Integer viewId, String order, boolean isDesc) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ String userId = request.getHeader("Token");
|
|
|
+ QueryWrapper<Task> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq("project_id", task.getProjectId());
|
|
|
+ List<Stages> stagesList = stagesService.list(new QueryWrapper<Stages>().eq("project_id", task.getProjectId()));
|
|
|
+ if (isDesc) {
|
|
|
+ queryWrapper.orderByDesc(order);
|
|
|
+ } else {
|
|
|
+ queryWrapper.orderByAsc(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ //按视图查看
|
|
|
+ if (viewId == 1) {
|
|
|
+ //全部任务
|
|
|
+ } else if (viewId == 2) {
|
|
|
+ //进行中的任务
|
|
|
+ queryWrapper.eq("task_status", 0);
|
|
|
+ } else if (viewId == 3) {
|
|
|
+ //已完成的任务
|
|
|
+ queryWrapper.eq("task_status", 1);
|
|
|
+ } else if (viewId == 4) {
|
|
|
+ //待安排的任务
|
|
|
+ queryWrapper.isNull("executor_id");
|
|
|
+ } else if (viewId == 5) {
|
|
|
+ //我创建的任务
|
|
|
+ queryWrapper.eq("creater_id", userId);
|
|
|
+ } else if (viewId == 6) {
|
|
|
+ //我执行的任务
|
|
|
+ queryWrapper.eq("executor_id", userId);
|
|
|
+ } else if (viewId == 7) {
|
|
|
+ //今天的任务
|
|
|
+ queryWrapper.eq("end_date", LocalDate.now());
|
|
|
+ } else if (viewId == 8) {
|
|
|
+ //已超期的任务,未完成的任务
|
|
|
+ queryWrapper.lt("end_date", LocalDate.now()).eq("task_status", 0);
|
|
|
+ }
|
|
|
+ List<Task> list = taskService.list(queryWrapper);
|
|
|
+ //设置列表名称
|
|
|
+ list.forEach(item->{
|
|
|
+ item.setStagesName(stagesList.stream().filter(s->s.getId().equals(item.getStagesId())).findFirst().get().getStagesName());
|
|
|
+ });
|
|
|
+ msg.data = list;
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 认领任务
|
|
|
+ * @param id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @RequestMapping("/addAsMyTask")
|
|
|
+ public HttpRespMsg addAsMyTask(Integer id) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ String userId = request.getHeader("Token");
|
|
|
+ Task task = new Task();
|
|
|
+ //检查是否已经被认领
|
|
|
+ Task t = taskService.getById(id);
|
|
|
+ if (t.getExecutorId() != null) {
|
|
|
+ if (t.getExecutorId().equals(userId)) {
|
|
|
+ msg.setError("您已认领过该任务,请勿重复操作");
|
|
|
+ } else {
|
|
|
+ msg.setError("该任务已被其他人认领");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ task.setId(id);
|
|
|
+ task.setExecutorId(userId);
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ task.setExecutorName(user.getName());
|
|
|
+ task.setExecutorColor(user.getColor());
|
|
|
+ taskService.updateById(task);
|
|
|
+
|
|
|
+ //更新用户近期任务
|
|
|
+ saveOrUpdateRecentTask(task, userId);
|
|
|
+ }
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveOrUpdateRecentTask(Task task, String userId) {
|
|
|
+ //更新用户近期任务
|
|
|
+ List<UserRecentTask> recentTaskList = userRecentTaskService.list(new QueryWrapper<UserRecentTask>().eq("task_id", task.getId()).eq("user_id", userId));
|
|
|
+ UserRecentTask recentTask = null;
|
|
|
+ if (recentTaskList.size() > 0) {
|
|
|
+ recentTask = recentTaskList.get(0);
|
|
|
+ if (recentTask != null) {
|
|
|
+ userRecentTaskService.removeById(recentTask.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ recentTask = new UserRecentTask();
|
|
|
+ recentTask.setTaskId(task.getId());
|
|
|
+ recentTask.setTaskName(task.getName());
|
|
|
+ recentTask.setProjectId(task.getProjectId());
|
|
|
+ recentTask.setUserId(userId);
|
|
|
+ userRecentTaskService.save(recentTask);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取任务详情
|
|
|
+ * @param id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @RequestMapping("/getTask")
|
|
|
+ public HttpRespMsg getTask(Integer id) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ String userId = request.getHeader("Token");
|
|
|
+ Task task = new Task();
|
|
|
+ Task t = taskService.getById(id);
|
|
|
+ //查询直接子任务
|
|
|
+ QueryWrapper<Task> subQuery = new QueryWrapper<Task>().eq("parent_tid", id);
|
|
|
+ t.setSubTaskList(taskService.list(subQuery));
|
|
|
+ msg.data = t;
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/getSubTask")
|
|
|
+ public HttpRespMsg getSubTask(Integer id) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ String userId = request.getHeader("Token");
|
|
|
+
|
|
|
+ //查询直接子任务
|
|
|
+ QueryWrapper<Task> subQuery = new QueryWrapper<Task>().eq("parent_tid", id);
|
|
|
+ msg.data = taskService.list(subQuery);
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/getRecentTask")
|
|
|
+ public HttpRespMsg getRecentTask(Integer projectId) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ String userId = request.getHeader("Token");
|
|
|
+
|
|
|
+ //查询直接子任务
|
|
|
+ QueryWrapper<UserRecentTask> queryWrapper = new QueryWrapper<UserRecentTask>().eq("project_id", projectId).eq("user_id", userId);
|
|
|
+ queryWrapper.orderByDesc("id");
|
|
|
+ msg.data = userRecentTaskService.list(queryWrapper);
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @RequestMapping("/getMileStoneList")
|
|
|
+ public HttpRespMsg getMileStoneList(Integer projectId) {
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ String userId = request.getHeader("Token");
|
|
|
+
|
|
|
+ QueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().eq("project_id", projectId).eq("task_type", 1);
|
|
|
+ queryWrapper.orderByAsc("id");
|
|
|
+ msg.data = taskService.list(queryWrapper);
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @RequestMapping("/getExecutorPanel")
|
|
|
+ public HttpRespMsg getExecutorPanel(Integer projectId) {
|
|
|
+ return taskService.getExecutorPanel(projectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/getStagesPanel")
|
|
|
+ public HttpRespMsg getStagesPanel(Integer projectId) {
|
|
|
+ return taskService.getStagesPanel(projectId);
|
|
|
+ }
|
|
|
+ @RequestMapping("/getTopCostTask")
|
|
|
+ public HttpRespMsg getTopCostTask(Integer projectId) {
|
|
|
+ return taskService.getTopCostTask(projectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/delete")
|
|
|
+ public HttpRespMsg delete(Integer id) {
|
|
|
+ Task task = taskService.getById(id);
|
|
|
+ if (task.getParentTid() == null) {
|
|
|
+ //删除的是第一级任务,需要调整顺序
|
|
|
+ List<Task> afterList = taskService.list(new QueryWrapper<Task>().eq("stages_id", task.getStagesId()).isNull("parent_tid").gt("seq", task.getSeq()));
|
|
|
+ if (afterList.size() > 0) {
|
|
|
+ List<Task> finalList = new ArrayList<>();
|
|
|
+ afterList.forEach(a->{
|
|
|
+ Task t = new Task();
|
|
|
+ t.setId(a.getId());
|
|
|
+ t.setSeq(a.getSeq() -1);
|
|
|
+ finalList.add(t);
|
|
|
+ });
|
|
|
+ taskService.updateBatchById(finalList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ taskService.removeById(id);
|
|
|
+ //删除任务日志
|
|
|
+ taskLogService.remove(new QueryWrapper<TaskLog>().eq("task_id", id));
|
|
|
+ //删除留言
|
|
|
+ taskCommentService.remove(new QueryWrapper<TaskComment>().eq("task_id", id));
|
|
|
+ deleteSubTask(task);
|
|
|
+
|
|
|
+ //删除根任务,需要重新计算项目进度
|
|
|
+ if (task.getParentTid() == null) {
|
|
|
+ updateProjectProgress(task.getProjectId());
|
|
|
+ }
|
|
|
+ return new HttpRespMsg();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void deleteSubTask(Task task) {
|
|
|
+ List<Task> subTasks = taskService.list(new QueryWrapper<Task>().eq("parent_tid", task.getId()));
|
|
|
+ if (subTasks.size() > 0) {
|
|
|
+ taskService.remove(new QueryWrapper<Task>().eq("parent_tid", task.getId()));
|
|
|
+ List<Integer> collect = subTasks.stream().map(Task::getId).collect(Collectors.toList());
|
|
|
+ //删除任务日志
|
|
|
+ taskLogService.remove(new QueryWrapper<TaskLog>().in("task_id", collect));
|
|
|
+ //删除留言
|
|
|
+ taskCommentService.remove(new QueryWrapper<TaskComment>().in("task_id", collect));
|
|
|
+ subTasks.forEach(s->{
|
|
|
+ deleteSubTask(s);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|