From fc59ddf8030e016a9347d61ae8b13fe71811cd88 Mon Sep 17 00:00:00 2001 From: zhihao <18915542763@163.com> Date: Thu, 30 Apr 2026 09:23:24 +0800 Subject: [PATCH] =?UTF-8?q?czh-20260430-=E5=AE=9E=E7=8E=B0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=AE=A1=E7=90=86=E5=90=8E=E7=AB=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecg-module-supervision/pom.xml | 4 + .../controller/TaskListController.java | 534 ++++++++++++ .../controller/TaskListDetialController.java | 135 ++++ .../modules/tasklist/entity/TaskList.java | 77 ++ .../tasklist/entity/TaskListDetial.java | 160 ++++ .../tasklist/entity/TaskListFavorite.java | 90 +++ .../tasklist/entity/TaskListPermission.java | 71 ++ .../tasklist/mapper/TaskListDetialMapper.java | 63 ++ .../mapper/TaskListFavoriteMapper.java | 47 ++ .../tasklist/mapper/TaskListMapper.java | 17 + .../mapper/TaskListPermissionMapper.java | 31 + .../mapper/xml/TaskListDetialMapper.xml | 180 +++++ .../mapper/xml/TaskListFavoriteMapper.xml | 78 ++ .../tasklist/mapper/xml/TaskListMapper.xml | 5 + .../mapper/xml/TaskListPermissionMapper.xml | 16 + .../service/ITaskListDetialService.java | 36 + .../service/ITaskListFavoriteService.java | 38 + .../service/ITaskListPermissionService.java | 22 + .../tasklist/service/ITaskListService.java | 101 +++ .../impl/TaskListDetialServiceImpl.java | 512 ++++++++++++ .../impl/TaskListFavoriteServiceImpl.java | 69 ++ .../impl/TaskListPermissionServiceImpl.java | 27 + .../service/impl/TaskListServiceImpl.java | 758 ++++++++++++++++++ .../tasklist/vo/AddCollaboratorReq.java | 18 + .../modules/tasklist/vo/CollaboratorVO.java | 21 + .../tasklist/vo/CreateTaskListGroupReq.java | 12 + .../tasklist/vo/CreateTaskListReq.java | 18 + .../modules/tasklist/vo/CreateTaskReq.java | 45 ++ .../modules/tasklist/vo/MoveTaskListReq.java | 18 + .../modules/tasklist/vo/MoveTaskReq.java | 18 + .../modules/tasklist/vo/SubTaskPageReq.java | 18 + .../modules/tasklist/vo/TaskListPage.java | 72 ++ 32 files changed, 3311 insertions(+) create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListDetialController.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListDetial.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListPermission.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListDetialMapper.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListFavoriteMapper.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListPermissionMapper.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListDetialMapper.xml create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListFavoriteMapper.xml create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListPermissionMapper.xml create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListDetialService.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListFavoriteService.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListPermissionService.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListFavoriteServiceImpl.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListPermissionServiceImpl.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/AddCollaboratorReq.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CollaboratorVO.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListGroupReq.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskReq.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskListReq.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskReq.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/SubTaskPageReq.java create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java diff --git a/jeecg-module-supervision/pom.xml b/jeecg-module-supervision/pom.xml index 75ddea8..d8a8670 100644 --- a/jeecg-module-supervision/pom.xml +++ b/jeecg-module-supervision/pom.xml @@ -21,6 +21,10 @@ org.jeecgframework.boot jeecg-boot-module-bpm-flowable + + org.jeecgframework.boot + jeecg-system-local-api + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java new file mode 100644 index 0000000..01749a3 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java @@ -0,0 +1,534 @@ +package org.jeecg.modules.demo.tasklist.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import org.jeecg.modules.demo.tasklist.entity.TaskListFavorite; +import org.jeecg.modules.demo.tasklist.entity.TaskList; +import org.jeecg.modules.demo.tasklist.vo.TaskListPage; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskListReq; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskListGroupReq; +import org.jeecg.modules.demo.tasklist.vo.MoveTaskListReq; +import org.jeecg.modules.demo.tasklist.vo.AddCollaboratorReq; +import org.jeecg.modules.demo.tasklist.vo.CollaboratorVO; +import org.jeecg.modules.demo.tasklist.service.ITaskListService; +import org.jeecg.modules.demo.tasklist.service.ITaskListDetialService; +import org.jeecg.modules.demo.tasklist.service.ITaskListPermissionService; +import org.jeecg.modules.demo.tasklist.service.ITaskListFavoriteService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSON; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.authz.annotation.RequiresPermissions; + + + /** + * @Description: 任务清单表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Tag(name="任务清单表") +@RestController +@RequestMapping("/tasklist/taskList") +@Slf4j +public class TaskListController { + @Autowired + private ITaskListService taskListService; + @Autowired + private ITaskListDetialService taskListDetialService; + @Autowired + private ITaskListPermissionService taskListPermissionService; + @Autowired + private ITaskListFavoriteService taskListFavoriteService; + + /** + * 分页列表查询 + * + * @param taskList + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "任务清单表-分页列表查询") + @Operation(summary="任务清单表-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(TaskList taskList, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskList, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = taskListService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param taskListPage + * @return + */ + @AutoLog(value = "任务清单表-添加") + @Operation(summary="任务清单表-添加") + @RequiresPermissions("tasklist:task_list:add") + @PostMapping(value = "/add") + public Result add(@RequestBody TaskListPage taskListPage) { + TaskList taskList = new TaskList(); + BeanUtils.copyProperties(taskListPage, taskList); + taskListService.saveMain(taskList, taskListPage.getTaskListDetialList(),taskListPage.getTaskListPermissionList(),taskListPage.getTaskListFavoriteList()); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param taskListPage + * @return + */ + @AutoLog(value = "任务清单表-编辑") + @Operation(summary="任务清单表-编辑") + @RequiresPermissions("tasklist:task_list:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody TaskListPage taskListPage) { + TaskList taskList = new TaskList(); + BeanUtils.copyProperties(taskListPage, taskList); + TaskList taskListEntity = taskListService.getById(taskList.getId()); + if(taskListEntity==null) { + return Result.error("未找到对应数据"); + } + taskListService.updateMain(taskList, taskListPage.getTaskListDetialList(),taskListPage.getTaskListPermissionList(),taskListPage.getTaskListFavoriteList()); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "任务清单表-通过id删除") + @Operation(summary="任务清单表-通过id删除") + @RequiresPermissions("tasklist:task_list:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + taskListService.delMain(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "任务清单表-批量删除") + @Operation(summary="任务清单表-批量删除") + @RequiresPermissions("tasklist:task_list:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.taskListService.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "任务清单表-通过id查询") + @Operation(summary="任务清单表-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + TaskList taskList = taskListService.getById(id); + if(taskList==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(taskList); + + } + + @AutoLog(value = "任务清单表-新建任务清单") + @Operation(summary = "新建任务清单") + @PostMapping(value = "/addTaskList") + public Result addTaskList(@RequestBody CreateTaskListReq req) { + try { + String id = taskListService.createTaskList(req); + return Result.OK("创建成功!", id); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-新建任务清单分组") + @Operation(summary = "新建任务清单分组") + @PostMapping(value = "/addTaskListGroup") + public Result addTaskListGroup(@RequestBody CreateTaskListGroupReq req) { + try { + String id = taskListService.createTaskListGroup(req); + return Result.OK("创建成功!", id); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-拖拽移动任务清单") + @Operation(summary = "拖拽移动任务清单") + @PostMapping(value = "/moveTaskList") + public Result moveTaskList(@RequestBody MoveTaskListReq req) { + try { + taskListService.moveTaskList(req); + return Result.OK("移动成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-拖拽移动分组") + @Operation(summary = "拖拽移动分组") + @PostMapping(value = "/moveGroup") + public Result moveGroup(@RequestBody Map params) { + try { + String groupId = (String) params.get("groupId"); + Integer sortOrder = params.get("sortOrder") != null ? ((Number) params.get("sortOrder")).intValue() : null; + taskListService.moveGroup(groupId, sortOrder); + return Result.OK("移动成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-获取当前用户收藏列表") + @Operation(summary = "获取当前用户收藏列表") + @GetMapping(value = "/myFavorites") + public Result> myFavorites() { + List list = taskListService.getMyFavorites(); + return Result.OK(list); + } + + @AutoLog(value = "任务清单表-删除任务清单") + @Operation(summary = "删除任务清单(所有者操作)") + @PostMapping(value = "/deleteTaskList") + public Result deleteTaskList(@RequestBody Map params) { + try { + taskListService.deleteTaskList(params.get("id")); + return Result.OK("删除成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-移除收藏") + @Operation(summary = "从收藏栏移除") + @PostMapping(value = "/removeFavorite") + public Result removeFavorite(@RequestBody Map params) { + try { + taskListService.removeFavorite(params.get("favoriteId")); + return Result.OK("移除成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-添加到收藏") + @Operation(summary = "添加清单到收藏栏") + @PostMapping(value = "/addToFavorites") + public Result addToFavorites(@RequestBody Map params) { + try { + taskListService.addToFavorites(params.get("taskListId")); + return Result.OK("添加成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-移除分组") + @Operation(summary = "从收藏栏移除分组及子项") + @PostMapping(value = "/removeFavoriteGroup") + public Result removeFavoriteGroup(@RequestBody Map params) { + try { + taskListService.removeFavoriteGroup(params.get("groupId")); + return Result.OK("移除成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-重命名分组") + @Operation(summary = "重命名任务清单分组") + @PostMapping(value = "/renameGroup") + public Result renameGroup(@RequestBody Map params) { + try { + taskListService.renameGroup(params.get("groupId"), params.get("newName")); + return Result.OK("重命名成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-重命名清单") + @Operation(summary = "重命名任务清单") + @PostMapping(value = "/renameTaskList") + public Result renameTaskList(@RequestBody Map params) { + try { + taskListService.renameTaskList(params.get("taskListId"), params.get("newName")); + return Result.OK("重命名成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-获取我所有的清单") + @Operation(summary = "获取我所有的清单") + @GetMapping(value = "/myOwnLists") + public Result> myOwnLists() { + List list = taskListService.getMyOwnLists(); + return Result.OK(list); + } + + @AutoLog(value = "任务清单表-获取所有清单") + @Operation(summary = "获取所有清单") + @GetMapping(value = "/allLists") + public Result> getAllLists() { + return Result.OK(taskListService.getAllLists()); + } + + @AutoLog(value = "任务清单表-获取我协作的清单") + @Operation(summary = "获取我协作的清单") + @GetMapping(value = "/myCollabLists") + public Result> myCollabLists() { + List list = taskListService.getMyCollabLists(); + return Result.OK(list); + } + + @AutoLog(value = "任务清单表-获取协作人列表") + @Operation(summary = "获取清单协作人列表") + @GetMapping(value = "/getCollaborators") + public Result> getCollaborators(@RequestParam(name="taskListId", required=true) String taskListId) { + List list = taskListService.getCollaborators(taskListId); + return Result.OK(list); + } + + @AutoLog(value = "任务清单表-添加协作人") + @Operation(summary = "添加协作人") + @PostMapping(value = "/addCollaborator") + public Result addCollaborator(@RequestBody AddCollaboratorReq req) { + try { + taskListService.addCollaborator(req); + return Result.OK("添加成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-移除协作人") + @Operation(summary = "移除协作人") + @PostMapping(value = "/removeCollaborator") + public Result removeCollaborator(@RequestBody Map params) { + try { + taskListService.removeCollaborator(params.get("permissionId")); + return Result.OK("移除成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-修改协作人权限") + @Operation(summary = "修改协作人权限") + @PostMapping(value = "/updateCollaboratorPermission") + public Result updateCollaboratorPermission(@RequestBody Map params) { + try { + taskListService.updateCollaboratorPermission(params.get("permissionId"), params.get("permission")); + return Result.OK("修改成功!"); + } catch (RuntimeException e) { + return Result.error(e.getMessage()); + } + } + + @AutoLog(value = "任务清单表-获取当前用户对清单的权限") + @Operation(summary = "获取当前用户对清单的权限") + @GetMapping(value = "/getMyPermission") + public Result getMyPermission(@RequestParam(name="taskListId", required=true) String taskListId) { + String permission = taskListService.getMyPermission(taskListId); + return Result.OK("查询成功", permission); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "任务清单详情表通过主表ID查询") + @Operation(summary="任务清单详情表主表ID查询") + @GetMapping(value = "/queryTaskListDetialByMainId") + public Result> queryTaskListDetialListByMainId(@RequestParam(name="id",required=true) String id) { + List taskListDetialList = taskListDetialService.selectByMainId(id); + return Result.OK(taskListDetialList); + } + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "任务清单权限表通过主表ID查询") + @Operation(summary="任务清单权限表主表ID查询") + @GetMapping(value = "/queryTaskListPermissionByMainId") + public Result> queryTaskListPermissionListByMainId(@RequestParam(name="id",required=true) String id) { + List taskListPermissionList = taskListPermissionService.selectByMainId(id); + return Result.OK(taskListPermissionList); + } + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "任务清单收藏表通过主表ID查询") + @Operation(summary="任务清单收藏表主表ID查询") + @GetMapping(value = "/queryTaskListFavoriteByMainId") + public Result> queryTaskListFavoriteListByMainId(@RequestParam(name="id",required=true) String id) { + List taskListFavoriteList = taskListFavoriteService.selectByMainId(id); + return Result.OK(taskListFavoriteList); + } + + /** + * 导出excel + * + * @param request + * @param taskList + */ + @RequiresPermissions("tasklist:task_list:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, TaskList taskList) { + + // Step.1 组装查询条件查询数据 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskList, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List taskListList = taskListService.list(queryWrapper); + + // Step.3 组装pageList + List pageList = new ArrayList(); + for (TaskList main : taskListList) { + TaskListPage vo = new TaskListPage(); + BeanUtils.copyProperties(main, vo); + List taskListDetialList = taskListDetialService.selectByMainId(main.getId()); + vo.setTaskListDetialList(taskListDetialList); + List taskListPermissionList = taskListPermissionService.selectByMainId(main.getId()); + vo.setTaskListPermissionList(taskListPermissionList); + List taskListFavoriteList = taskListFavoriteService.selectByMainId(main.getId()); + vo.setTaskListFavoriteList(taskListFavoriteList); + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "任务清单表列表"); + mv.addObject(NormalExcelConstants.CLASS, TaskListPage.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务清单表数据", "导出人:"+sysUser.getRealname(), "任务清单表")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("tasklist:task_list:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List list = ExcelImportUtil.importExcel(file.getInputStream(), TaskListPage.class, params); + for (TaskListPage page : list) { + TaskList po = new TaskList(); + BeanUtils.copyProperties(page, po); + taskListService.saveMain(po, page.getTaskListDetialList(),page.getTaskListPermissionList(),page.getTaskListFavoriteList()); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); + } + + @AutoLog(value = "任务清单表-我负责的任务") + @Operation(summary = "获取当前用户负责的任务") + @GetMapping(value = "/myResponsibleTasks") + public Result> myResponsibleTasks() { + List list = taskListService.myResponsibleTasks(); + return Result.OK(list); + } + + @AutoLog(value = "任务清单表-我关注的任务") + @Operation(summary = "获取当前用户关注的任务") + @GetMapping(value = "/myFollowedTasks") + public Result> myFollowedTasks() { + List list = taskListService.myFollowedTasks(); + return Result.OK(list); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListDetialController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListDetialController.java new file mode 100644 index 0000000..1e862c2 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListDetialController.java @@ -0,0 +1,135 @@ +package org.jeecg.modules.demo.tasklist.controller; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import org.jeecg.modules.demo.tasklist.service.ITaskListDetialService; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskReq; +import org.jeecg.modules.demo.tasklist.vo.MoveTaskReq; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/tasklist/taskListDetial") +public class TaskListDetialController { + + @Autowired + private ITaskListDetialService taskListDetialService; + + @PostMapping(value = "/add") + public Result add(@RequestBody CreateTaskReq req) { + try { + TaskListDetial result = taskListDetialService.createTask(req); + return Result.OK(result); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @PostMapping(value = "/edit") + public Result edit(@RequestBody TaskListDetial task) { + try { + taskListDetialService.editTask(task); + return Result.OK("编辑成功"); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name = "id") String id) { + try { + taskListDetialService.deleteTask(id); + return Result.OK("删除成功"); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @GetMapping(value = "/listByMainId") + public Result> listByMainId(@RequestParam(name = "mainId") String mainId) { + List list = taskListDetialService.queryTopLevelByMainId(mainId); + return Result.OK(list); + } + + @GetMapping(value = "/listAllByMainId") + public Result> listAllByMainId(@RequestParam(name = "mainId") String mainId) { + List list = taskListDetialService.queryAllByMainId(mainId); + return Result.OK(list); + } + + @PostMapping(value = "/toggleStatus") + public Result toggleStatus(@RequestBody Map body) { + try { + String id = body.get("id"); + taskListDetialService.toggleStatus(id); + return Result.OK("操作成功"); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @PostMapping(value = "/moveTask") + public Result moveTask(@RequestBody MoveTaskReq req) { + try { + taskListDetialService.moveTask(req); + return Result.OK("移动成功"); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @PostMapping(value = "/moveTaskGroup") + public Result moveTaskGroup(@RequestBody Map params) { + try { + String taskGroupId = (String) params.get("taskGroupId"); + Integer targetSortOrder = params.get("targetSortOrder") != null ? ((Number) params.get("targetSortOrder")).intValue() : null; + taskListDetialService.moveTaskGroup(taskGroupId, targetSortOrder); + return Result.OK("移动成功"); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @PostMapping(value = "/follow") + public Result follow(@RequestBody Map body) { + try { + String id = body.get("id"); + taskListDetialService.followTask(id); + return Result.OK("关注成功"); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @PostMapping(value = "/unfollow") + public Result unfollow(@RequestBody Map body) { + try { + String id = body.get("id"); + taskListDetialService.unfollowTask(id); + return Result.OK("取消关注成功"); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } + + @GetMapping(value = "/loadSubTasks") + public Result> loadSubTasks( + @RequestParam(name = "parentTaskId") String parentTaskId, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "20") Integer pageSize) { + List list = taskListDetialService.loadSubTasks(parentTaskId, pageNo, pageSize); + return Result.OK(list); + } +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java new file mode 100644 index 0000000..73d494a --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java @@ -0,0 +1,77 @@ +package org.jeecg.modules.demo.tasklist.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: 任务清单表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Schema(description="任务清单表") +@Data +@TableName("task_list") +public class TaskList implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**清单名称*/ + @Excel(name = "清单名称", width = 15) + @Schema(description = "清单名称") + private java.lang.String tasklistName; + /**删除标识*/ + @Excel(name = "删除标识", width = 15) + @Schema(description = "删除标识") + @TableLogic + private java.lang.String delFlag; + + @TableField(exist = false) + @Schema(description = "所有者名称") + private java.lang.String ownerName; + + @TableField(exist = false) + @Schema(description = "协作者名称") + private java.lang.String collaboratorNames; + + @TableField(exist = false) + @Schema(description = "创建时间字符串") + private java.lang.String createTimeStr; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListDetial.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListDetial.java new file mode 100644 index 0000000..d881e7b --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListDetial.java @@ -0,0 +1,160 @@ +package org.jeecg.modules.demo.tasklist.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: 任务清单详情表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Schema(description="任务清单详情表") +@Data +@TableName("task_list_detial") +public class TaskListDetial implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + + @TableField(exist = false) + @Schema(description = "创建人名称") + private java.lang.String createByName; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**主表ID*/ + @Schema(description = "主表ID") + private java.lang.String mainId; + /**父节点ID*/ + @Excel(name = "父节点ID", width = 15) + @Schema(description = "父节点ID") + private java.lang.String pid; + /**是否有子节点*/ + @Excel(name = "是否有子节点", width = 15) + @Schema(description = "是否有子节点") + private java.lang.String hasChild; + /**排序号*/ + @Excel(name = "排序号", width = 15) + @Schema(description = "排序号") + private java.lang.Integer sortOrder; + /**任务名称*/ + @Excel(name = "任务名称", width = 15) + @Schema(description = "任务名称") + private java.lang.String taskName; + /**任务描述*/ + @Excel(name = "任务描述", width = 15) + @Schema(description = "任务描述") + private java.lang.String taskDesc; + /**优先级*/ + @Excel(name = "优先级", width = 15, dicCode = "task_priority") + @Schema(description = "优先级") + private java.lang.String priority; + /**完成状态*/ + @Excel(name = "完成状态", width = 15) + @Schema(description = "完成状态") + private java.lang.Integer taskStatus; + /**负责人ID*/ + @Excel(name = "负责人ID", width = 15) + @Schema(description = "负责人ID") + private java.lang.String assigneeId; + /**负责人*/ + @Excel(name = "负责人", width = 15) + @Schema(description = "负责人") + private java.lang.String assigneeName; + /**关注人ID*/ + @Excel(name = "关注人ID", width = 15) + @Schema(description = "关注人ID") + private java.lang.String followersId; + /**关注人*/ + @Excel(name = "关注人", width = 15) + @Schema(description = "关注人") + private java.lang.String followersName; + /**分配人ID*/ + @Excel(name = "分配人ID", width = 15) + @Schema(description = "分配人ID") + private java.lang.String assignId; + /**分配人*/ + @Excel(name = "分配人", width = 15) + @Schema(description = "分配人") + private java.lang.String assignName; + /**开始时间*/ + @Excel(name = "开始时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "开始时间") + private java.util.Date startTime; + /**结束时间*/ + @Excel(name = "结束时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "结束时间") + private java.util.Date endTime; + /**完成时间*/ + @Excel(name = "完成时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "完成时间") + private java.util.Date completeTime; + /**类型*/ + @Excel(name = "类型", width = 15) + @Schema(description = "类型") + private java.lang.String type; + /**子任务数*/ + @Excel(name = "子任务数", width = 15) + @Schema(description = "子任务数") + private java.lang.Integer subTaskCount; + /**子任务完成数*/ + @Excel(name = "子任务完成数", width = 15) + @Schema(description = "子任务完成数") + private java.lang.Integer completedSubTaskCount; + /**参与人ID*/ + @Excel(name = "参与人ID", width = 15) + @Schema(description = "参与人ID") + private java.lang.String participantId; + /**参与人*/ + @Excel(name = "参与人", width = 15) + @Schema(description = "参与人") + private java.lang.String participantName; + /**其他事项说明*/ + @Excel(name = "其他事项说明", width = 15) + @Schema(description = "其他事项说明") + private java.lang.String remark; + /**删除标识*/ + @Excel(name = "删除标识", width = 15) + @Schema(description = "删除标识") + @TableLogic + private java.lang.String delFlag; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java new file mode 100644 index 0000000..d4f3ba4 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java @@ -0,0 +1,90 @@ +package org.jeecg.modules.demo.tasklist.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: 任务清单收藏表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Schema(description="任务清单收藏表") +@Data +@TableName("task_list_favorite") +public class TaskListFavorite implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**主表ID*/ + @Schema(description = "主表ID") + private java.lang.String mainId; + /**任务清单(分组)名称*/ + @Excel(name = "任务清单(分组)名称", width = 15) + @Schema(description = "任务清单(分组)名称") + private java.lang.String tasklistName; + /**用户ID*/ + @Excel(name = "用户ID", width = 15) + @Schema(description = "用户ID") + private java.lang.String userId; + /**类型(0是分组,1是清单)*/ + @Excel(name = "类型(0是分组,1是清单)", width = 15) + @Schema(description = "类型(0是分组,1是清单)") + private java.lang.String type; + /**父节点ID*/ + @Excel(name = "父节点ID", width = 15) + @Schema(description = "父节点ID") + private java.lang.String pid; + /**是否有子节点*/ + @Excel(name = "是否有子节点", width = 15) + @Schema(description = "是否有子节点") + private java.lang.String hasChild; + /**排序*/ + @Excel(name = "排序", width = 15) + @Schema(description = "排序") + private java.lang.Integer sortOrder; + /**删除标识*/ + @Excel(name = "删除标识", width = 15) + @Schema(description = "删除标识") + @TableLogic + private java.lang.String delFlag; + + @TableField(exist = false) + @Schema(description = "当前用户对该清单的权限") + private java.lang.String permission; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListPermission.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListPermission.java new file mode 100644 index 0000000..5a0959d --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListPermission.java @@ -0,0 +1,71 @@ +package org.jeecg.modules.demo.tasklist.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecg.common.aspect.annotation.Dict; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: 任务清单权限表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Schema(description="任务清单权限表") +@Data +@TableName("task_list_permission") +public class TaskListPermission implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**主表ID*/ + @Schema(description = "主表ID") + private java.lang.String mainId; + /**用户ID*/ + @Excel(name = "用户ID", width = 15) + @Schema(description = "用户ID") + private java.lang.String userId; + /**权限类型*/ + @Excel(name = "权限类型", width = 15, dicCode = "collaboration_permission") + @Dict(dicCode = "collaboration_permission") + @Schema(description = "权限类型") + private java.lang.String permission; + /**删除标识*/ + @Excel(name = "删除标识", width = 15) + @Schema(description = "删除标识") + @TableLogic + private java.lang.String delFlag; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListDetialMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListDetialMapper.java new file mode 100644 index 0000000..755dd87 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListDetialMapper.java @@ -0,0 +1,63 @@ +package org.jeecg.modules.demo.tasklist.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface TaskListDetialMapper extends BaseMapper { + + boolean deleteByMainId(@Param("mainId") String mainId); + + List selectByMainId(@Param("mainId") String mainId); + + void shiftSortOrderUp(@Param("mainId") String mainId, @Param("pid") String pid, @Param("fromSort") Integer fromSort); + + void shiftSortOrderDown(@Param("mainId") String mainId, @Param("pid") String pid, @Param("fromSort") Integer fromSort); + + Integer getMaxSortOrder(@Param("mainId") String mainId, @Param("pid") String pid); + + int appendFollower(@Param("taskId") String taskId, @Param("userId") String userId, @Param("userName") String userName); + + int removeFollower(@Param("taskId") String taskId, @Param("userId") String userId, @Param("userName") String userName); + + int toggleTaskStatus(@Param("taskId") String taskId, @Param("updateBy") String updateBy, @Param("newStatus") Integer newStatus, @Param("completeTime") java.util.Date completeTime); + + List selectAllByMainId(@Param("mainId") String mainId); + + List selectTopLevelByMainId(@Param("mainId") String mainId); + + List selectSubTasksByPage(@Param("parentId") String parentId, @Param("offset") Integer offset, @Param("pageSize") Integer pageSize); + + void updatePidAndSort(@Param("id") String id, @Param("pid") String pid, @Param("sortOrder") Integer sortOrder); + + List selectChildrenByPid(@Param("pid") String pid); + + void resetPidToNull(@Param("pid") String pid, @Param("mainId") String mainId); + + void incrementSubTaskCount(@Param("parentId") String parentId); + + void decrementSubTaskCount(@Param("parentId") String parentId); + + void incrementCompletedSubTaskCount(@Param("parentId") String parentId); + + void decrementCompletedSubTaskCount(@Param("parentId") String parentId); + + void updateHasChild(@Param("parentId") String parentId, @Param("hasChild") String hasChild); + + void shiftSortOrderUpForGroup(@Param("mainId") String mainId, @Param("fromSort") Integer fromSort); + + void shiftSortOrderDownForGroup(@Param("mainId") String mainId, @Param("fromSort") Integer fromSort); + + Integer getMaxSortOrderForGroup(@Param("mainId") String mainId); + + void updateSortOrder(@Param("id") String id, @Param("sortOrder") Integer sortOrder); + + Integer countChildrenByPid(@Param("pid") String pid); + + List selectByAssigneeId(@Param("assigneeId") String assigneeId); + + List selectByFollowersId(@Param("followersId") String followersId); + + void appendAssigner(@Param("taskId") String taskId, @Param("userId") String userId, @Param("userName") String userName); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListFavoriteMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListFavoriteMapper.java new file mode 100644 index 0000000..51aec09 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListFavoriteMapper.java @@ -0,0 +1,47 @@ +package org.jeecg.modules.demo.tasklist.mapper; + +import java.util.List; +import org.jeecg.modules.demo.tasklist.entity.TaskListFavorite; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: 任务清单收藏表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +public interface TaskListFavoriteMapper extends BaseMapper { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(@Param("mainId") String mainId); + + Integer selectMaxSortOrder(@Param("userId") String userId, @Param("pid") String pid); + + Integer selectMaxSortOrderByType(@Param("userId") String userId, @Param("pid") String pid, @Param("type") String type); + + void shiftSortOrderUp(@Param("userId") String userId, @Param("pid") String pid, @Param("fromSort") Integer fromSort); + + void shiftSortOrderDown(@Param("userId") String userId, @Param("pid") String pid, @Param("fromSort") Integer fromSort); + + void shiftSortOrderUpByType(@Param("userId") String userId, @Param("type") String type, @Param("fromSort") Integer fromSort); + + void shiftSortOrderDownByType(@Param("userId") String userId, @Param("type") String type, @Param("fromSort") Integer fromSort); + + Integer countChildrenByPid(@Param("userId") String userId, @Param("pid") String pid); + + void updatePidAndSort(@Param("id") String id, @Param("pid") String pid, @Param("sortOrder") Integer sortOrder); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java new file mode 100644 index 0000000..5ae878a --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.demo.tasklist.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.demo.tasklist.entity.TaskList; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 任务清单表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +public interface TaskListMapper extends BaseMapper { + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListPermissionMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListPermissionMapper.java new file mode 100644 index 0000000..65a6d86 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListPermissionMapper.java @@ -0,0 +1,31 @@ +package org.jeecg.modules.demo.tasklist.mapper; + +import java.util.List; +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: 任务清单权限表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +public interface TaskListPermissionMapper extends BaseMapper { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(@Param("mainId") String mainId); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListDetialMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListDetialMapper.xml new file mode 100644 index 0000000..7832dcc --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListDetialMapper.xml @@ -0,0 +1,180 @@ + + + + + + DELETE FROM task_list_detial WHERE main_id = #{mainId} + + + + + + UPDATE task_list_detial + SET sort_order = sort_order + 1 + WHERE main_id = #{mainId} AND del_flag = '0' + AND (pid = #{pid} OR (#{pid} IS NULL AND pid IS NULL)) + AND sort_order >= #{fromSort} + + + + UPDATE task_list_detial + SET sort_order = sort_order - 1 + WHERE main_id = #{mainId} AND del_flag = '0' + AND (pid = #{pid} OR (#{pid} IS NULL AND pid IS NULL)) + AND sort_order > #{fromSort} + + + + + + UPDATE task_list_detial + SET followers_id = CONCAT(IFNULL(followers_id, ''), ',', #{userId}), + followers_name = CONCAT(IFNULL(followers_name, ''), ',', #{userName}) + WHERE id = #{taskId} AND del_flag = '0' + AND (followers_id IS NULL OR followers_id NOT LIKE CONCAT('%', #{userId}, '%')) + + + + UPDATE task_list_detial + SET followers_id = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', followers_id, ','), CONCAT(',', #{userId}, ','), ',')), + followers_name = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', followers_name, ','), CONCAT(',', #{userName}, ','), ',')) + WHERE id = #{taskId} AND del_flag = '0' + + + + UPDATE task_list_detial + SET task_status = #{newStatus}, + complete_time = #{completeTime}, + update_by = #{updateBy}, update_time = NOW() + WHERE id = #{taskId} AND del_flag = '0' + + + + + + + + + + UPDATE task_list_detial + SET pid = #{pid}, sort_order = #{sortOrder} + WHERE id = #{id} + + + + + + UPDATE task_list_detial + SET pid = NULL + WHERE pid = #{pid} AND main_id = #{mainId} AND del_flag = '0' + + + + UPDATE task_list_detial SET sub_task_count = IFNULL(sub_task_count, 0) + 1, has_child = '1' + WHERE id = #{parentId} + + + + UPDATE task_list_detial SET sub_task_count = GREATEST(IFNULL(sub_task_count, 1) - 1, 0) + WHERE id = #{parentId} + + + + UPDATE task_list_detial SET completed_sub_task_count = IFNULL(completed_sub_task_count, 0) + 1 + WHERE id = #{parentId} + + + + UPDATE task_list_detial SET completed_sub_task_count = GREATEST(IFNULL(completed_sub_task_count, 1) - 1, 0) + WHERE id = #{parentId} + + + + UPDATE task_list_detial SET has_child = #{hasChild} WHERE id = #{parentId} + + + + UPDATE task_list_detial + SET sort_order = sort_order + 1 + WHERE main_id = #{mainId} AND del_flag = '0' + AND type = '0' + AND (pid IS NULL OR pid = '') + AND sort_order >= #{fromSort} + + + + UPDATE task_list_detial + SET sort_order = sort_order - 1 + WHERE main_id = #{mainId} AND del_flag = '0' + AND type = '0' + AND (pid IS NULL OR pid = '') + AND sort_order > #{fromSort} + + + + + + UPDATE task_list_detial SET sort_order = #{sortOrder} WHERE id = #{id} + + + + + + + + + + UPDATE task_list_detial + SET assign_id = TRIM(BOTH ',' FROM CONCAT(IFNULL(assign_id, ''), ',', #{userId})), + assign_name = TRIM(BOTH ',' FROM CONCAT(IFNULL(assign_name, ''), ',', #{userName})) + WHERE id = #{taskId} AND del_flag = '0' + AND (assign_id IS NULL OR assign_id NOT LIKE CONCAT('%', #{userId}, '%')) + + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListFavoriteMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListFavoriteMapper.xml new file mode 100644 index 0000000..22b37a8 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListFavoriteMapper.xml @@ -0,0 +1,78 @@ + + + + + + DELETE + FROM task_list_favorite + WHERE + main_id = #{mainId} + + + + + + + + + UPDATE task_list_favorite + SET sort_order = sort_order + 1 + WHERE user_id = #{userId} AND del_flag = '0' + AND (pid = #{pid} OR (#{pid} IS NULL AND pid IS NULL)) + AND sort_order >= #{fromSort} + + + + UPDATE task_list_favorite + SET sort_order = sort_order - 1 + WHERE user_id = #{userId} AND del_flag = '0' + AND (pid = #{pid} OR (#{pid} IS NULL AND pid IS NULL)) + AND sort_order > #{fromSort} + + + + UPDATE task_list_favorite + SET sort_order = sort_order + 1 + WHERE user_id = #{userId} AND del_flag = '0' + AND type = #{type} + AND pid IS NULL + AND sort_order >= #{fromSort} + + + + UPDATE task_list_favorite + SET sort_order = sort_order - 1 + WHERE user_id = #{userId} AND del_flag = '0' + AND type = #{type} + AND pid IS NULL + AND sort_order > #{fromSort} + + + + + + UPDATE task_list_favorite + SET pid = #{pid}, sort_order = #{sortOrder} + WHERE id = #{id} + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml new file mode 100644 index 0000000..027ad6e --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListPermissionMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListPermissionMapper.xml new file mode 100644 index 0000000..e620060 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListPermissionMapper.xml @@ -0,0 +1,16 @@ + + + + + + DELETE + FROM task_list_permission + WHERE + main_id = #{mainId} + + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListDetialService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListDetialService.java new file mode 100644 index 0000000..988c81f --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListDetialService.java @@ -0,0 +1,36 @@ +package org.jeecg.modules.demo.tasklist.service; + +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskReq; +import org.jeecg.modules.demo.tasklist.vo.MoveTaskReq; + +public interface ITaskListDetialService extends IService { + + List selectByMainId(String mainId); + + TaskListDetial createTask(CreateTaskReq req); + + void editTask(TaskListDetial task); + + void deleteTask(String taskId); + + List queryAllByMainId(String mainId); + + List queryTopLevelByMainId(String mainId); + + void toggleStatus(String taskId); + + void moveTask(MoveTaskReq req); + + void moveTaskGroup(String taskGroupId, Integer targetSortOrder); + + void followTask(String taskId); + + void unfollowTask(String taskId); + + List loadSubTasks(String parentTaskId, Integer pageNo, Integer pageSize); + + void ensureDefaultGroup(String mainId); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListFavoriteService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListFavoriteService.java new file mode 100644 index 0000000..34b5cab --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListFavoriteService.java @@ -0,0 +1,38 @@ +package org.jeecg.modules.demo.tasklist.service; + +import org.jeecg.modules.demo.tasklist.entity.TaskListFavorite; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: 任务清单收藏表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +public interface ITaskListFavoriteService extends IService { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(String mainId); + + Integer getMaxSortOrder(String userId, String pid); + + Integer getMaxSortOrderByType(String userId, String pid, String type); + + void shiftSortOrderUp(String userId, String pid, Integer fromSort); + + void shiftSortOrderDown(String userId, String pid, Integer fromSort); + + void shiftSortOrderUpByType(String userId, String type, Integer fromSort); + + void shiftSortOrderDownByType(String userId, String type, Integer fromSort); + + Integer countChildren(String userId, String pid); + + void updatePidAndSort(String favoriteId, String pid, Integer sortOrder); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListPermissionService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListPermissionService.java new file mode 100644 index 0000000..35895f0 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListPermissionService.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.demo.tasklist.service; + +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: 任务清单权限表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +public interface ITaskListPermissionService extends IService { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(String mainId); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java new file mode 100644 index 0000000..b3a2b4c --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java @@ -0,0 +1,101 @@ +package org.jeecg.modules.demo.tasklist.service; + +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import org.jeecg.modules.demo.tasklist.entity.TaskListFavorite; +import org.jeecg.modules.demo.tasklist.entity.TaskList; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskListReq; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskListGroupReq; +import org.jeecg.modules.demo.tasklist.vo.MoveTaskListReq; +import org.jeecg.modules.demo.tasklist.vo.AddCollaboratorReq; +import org.jeecg.modules.demo.tasklist.vo.CollaboratorVO; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: 任务清单表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +public interface ITaskListService extends IService { + + /** + * 添加一对多 + * + * @param taskList + * @param taskListDetialList + * @param taskListPermissionList + * @param taskListFavoriteList + */ + public void saveMain(TaskList taskList,List taskListDetialList,List taskListPermissionList,List taskListFavoriteList) ; + + /** + * 修改一对多 + * + * @param taskList + * @param taskListDetialList + * @param taskListPermissionList + * @param taskListFavoriteList + */ + public void updateMain(TaskList taskList,List taskListDetialList,List taskListPermissionList,List taskListFavoriteList); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + + String createTaskList(CreateTaskListReq req); + + String createTaskListGroup(CreateTaskListGroupReq req); + + void moveTaskList(MoveTaskListReq req); + + void moveGroup(String groupId, Integer sortOrder); + + List getMyFavorites(); + + void deleteTaskList(String taskListId); + + void removeFavorite(String favoriteId); + + void removeFavoriteGroup(String groupId); + + void renameGroup(String groupId, String newName); + + void renameTaskList(String taskListId, String newName); + + List getMyOwnLists(); + + List getAllLists(); + + List getMyCollabLists(); + + List getCollaborators(String taskListId); + + void addCollaborator(AddCollaboratorReq req); + + void removeCollaborator(String permissionId); + + void updateCollaboratorPermission(String permissionId, String newPermission); + + String getMyPermission(String taskListId); + + void addToFavorites(String taskListId); + + List myResponsibleTasks(); + + List myFollowedTasks(); + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java new file mode 100644 index 0000000..f8b4756 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java @@ -0,0 +1,512 @@ +package org.jeecg.modules.demo.tasklist.service.impl; + +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import org.jeecg.modules.demo.tasklist.mapper.TaskListDetialMapper; +import org.jeecg.modules.demo.tasklist.mapper.TaskListPermissionMapper; +import org.jeecg.modules.demo.tasklist.service.ITaskListDetialService; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskReq; +import org.jeecg.modules.demo.tasklist.vo.MoveTaskReq; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.oConvertUtils; +import org.apache.shiro.SecurityUtils; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import java.util.Set; + +@Service +public class TaskListDetialServiceImpl extends ServiceImpl implements ITaskListDetialService { + + @Autowired + private TaskListDetialMapper taskListDetialMapper; + @Autowired + private TaskListPermissionMapper taskListPermissionMapper; + @Autowired + private ISysBaseAPI sysBaseAPI; + + @Override + public List selectByMainId(String mainId) { + return taskListDetialMapper.selectByMainId(mainId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TaskListDetial createTask(CreateTaskReq req) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + String permission = getPermission(req.getMainId(), userId); + if (permission == null) { + throw new RuntimeException("无权限在此清单中创建任务"); + } + if ("3".equals(permission)) { + throw new RuntimeException("可阅读者无法创建任务"); + } + + if ("1".equals(req.getType()) && oConvertUtils.isEmpty(req.getPid())) { + ensureDefaultGroup(req.getMainId()); + TaskListDetial defaultGroup = findDefaultGroup(req.getMainId()); + if (defaultGroup != null) { + req.setPid(defaultGroup.getId()); + } + } + + TaskListDetial entity = new TaskListDetial(); + entity.setMainId(req.getMainId()); + entity.setTaskName(req.getTaskName()); + entity.setTaskDesc(req.getTaskDesc()); + entity.setPriority(req.getPriority()); + entity.setType(req.getType() != null ? req.getType() : "1"); + entity.setPid(normalizePid(req.getPid())); + entity.setTaskStatus(0); + entity.setSubTaskCount(0); + entity.setCompletedSubTaskCount(0); + entity.setHasChild("0"); + entity.setCreateBy(userId); + entity.setCreateTime(new Date()); + entity.setDelFlag("0"); + entity.setSysOrgCode(loginUser.getOrgCode()); + + if ("1".equals(req.getType()) && oConvertUtils.isNotEmpty(req.getAssigneeId())) { + entity.setAssigneeId(req.getAssigneeId()); + entity.setAssigneeName(translateUserIdsToNames(req.getAssigneeId())); + entity.setAssignId(userId); + entity.setAssignName(loginUser.getRealname()); + } + + if (req.getStartTime() != null) { + entity.setStartTime(req.getStartTime()); + } + if (req.getEndTime() != null) { + entity.setEndTime(req.getEndTime()); + } + + if (req.getSortOrder() != null) { + taskListDetialMapper.shiftSortOrderUp(req.getMainId(), normalizePid(req.getPid()), req.getSortOrder()); + entity.setSortOrder(req.getSortOrder()); + } else { + Integer maxSort = taskListDetialMapper.getMaxSortOrder(req.getMainId(), normalizePid(req.getPid())); + entity.setSortOrder(maxSort + 1); + } + + taskListDetialMapper.insert(entity); + + if ("1".equals(entity.getType()) && oConvertUtils.isNotEmpty(entity.getPid())) { + TaskListDetial parent = taskListDetialMapper.selectById(entity.getPid()); + if (parent != null && "1".equals(parent.getType())) { + taskListDetialMapper.incrementSubTaskCount(parent.getId()); + } + } + + return entity; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void editTask(TaskListDetial task) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListDetial existing = taskListDetialMapper.selectById(task.getId()); + if (existing == null) { + throw new RuntimeException("任务不存在"); + } + + String permission = getPermission(existing.getMainId(), userId); + if (permission == null) { + throw new RuntimeException("无权限编辑此任务"); + } + if ("3".equals(permission)) { + String assigneeId = existing.getAssigneeId(); + if (oConvertUtils.isEmpty(assigneeId) || !assigneeId.contains(userId)) { + throw new RuntimeException("可阅读者只能编辑自己负责的任务"); + } + } + + if (task.getAssigneeId() != null) { + if (oConvertUtils.isNotEmpty(task.getAssigneeId()) && oConvertUtils.isEmpty(task.getAssigneeName())) { + task.setAssigneeName(translateUserIdsToNames(task.getAssigneeId())); + } + if (oConvertUtils.isEmpty(task.getAssigneeId())) { + task.setAssigneeName(""); + } + } + + if (task.getParticipantId() != null) { + if (oConvertUtils.isNotEmpty(task.getParticipantId()) && oConvertUtils.isEmpty(task.getParticipantName())) { + task.setParticipantName(translateUserIdsToNames(task.getParticipantId())); + } + if (oConvertUtils.isEmpty(task.getParticipantId())) { + task.setParticipantName(""); + } + } + + if (task.getFollowersId() != null) { + if (oConvertUtils.isNotEmpty(task.getFollowersId()) && oConvertUtils.isEmpty(task.getFollowersName())) { + task.setFollowersName(translateUserIdsToNames(task.getFollowersId())); + } + if (oConvertUtils.isEmpty(task.getFollowersId())) { + task.setFollowersName(""); + } + } + + task.setUpdateBy(userId); + task.setUpdateTime(new Date()); + + boolean clearStartTime = task.getStartTime() == null && existing.getStartTime() != null; + boolean clearEndTime = task.getEndTime() == null && existing.getEndTime() != null; + + taskListDetialMapper.updateById(task); + + if (clearStartTime || clearEndTime) { + UpdateWrapper uw = new UpdateWrapper<>(); + uw.eq("id", task.getId()); + if (clearStartTime) uw.set("start_time", null); + if (clearEndTime) uw.set("end_time", null); + taskListDetialMapper.update(null, uw); + } + + taskListDetialMapper.appendAssigner(task.getId(), userId, loginUser.getRealname()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTask(String taskId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListDetial existing = taskListDetialMapper.selectById(taskId); + if (existing == null) { + throw new RuntimeException("任务不存在"); + } + + String permission = getPermission(existing.getMainId(), userId); + if (permission == null) { + throw new RuntimeException("无权限删除此任务"); + } + if ("3".equals(permission)) { + throw new RuntimeException("可阅读者无法删除任务"); + } + + if ("0".equals(existing.getType()) && "默认分组".equals(existing.getTaskName())) { + throw new RuntimeException("默认分组不能删除"); + } + + if ("0".equals(existing.getType())) { + taskListDetialMapper.resetPidToNull(taskId, existing.getMainId()); + } + + List children = taskListDetialMapper.selectChildrenByPid(taskId); + for (TaskListDetial child : children) { + deleteTaskRecursive(child); + } + + taskListDetialMapper.deleteById(taskId); + + if (oConvertUtils.isNotEmpty(existing.getPid())) { + TaskListDetial parent = taskListDetialMapper.selectById(existing.getPid()); + if (parent != null && "1".equals(parent.getType())) { + taskListDetialMapper.decrementSubTaskCount(parent.getId()); + if (existing.getTaskStatus() != null && existing.getTaskStatus() == 1) { + taskListDetialMapper.decrementCompletedSubTaskCount(parent.getId()); + } + Integer childCount = taskListDetialMapper.countChildrenByPid(parent.getId()); + if (childCount == null || childCount == 0) { + taskListDetialMapper.updateHasChild(parent.getId(), "0"); + } + } + } + } + + private void deleteTaskRecursive(TaskListDetial task) { + List children = taskListDetialMapper.selectChildrenByPid(task.getId()); + for (TaskListDetial child : children) { + deleteTaskRecursive(child); + } + taskListDetialMapper.deleteById(task.getId()); + } + + @Override + public List queryAllByMainId(String mainId) { + List list = taskListDetialMapper.selectAllByMainId(mainId); + fillCreateByName(list); + return list; + } + + @Override + public List queryTopLevelByMainId(String mainId) { + List list = taskListDetialMapper.selectTopLevelByMainId(mainId); + fillCreateByName(list); + return list; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void toggleStatus(String taskId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListDetial existing = taskListDetialMapper.selectById(taskId); + if (existing == null) { + throw new RuntimeException("任务不存在"); + } + + String permission = getPermission(existing.getMainId(), userId); + if (permission == null) { + throw new RuntimeException("无权限操作此任务"); + } + if ("3".equals(permission)) { + String assigneeId = existing.getAssigneeId(); + if (oConvertUtils.isEmpty(assigneeId) || !assigneeId.contains(userId)) { + throw new RuntimeException("可阅读者只能操作自己负责的任务"); + } + } + + int oldStatus = existing.getTaskStatus() != null ? existing.getTaskStatus() : 0; + int newStatus = oldStatus == 0 ? 1 : 0; + java.util.Date completeTime = oldStatus == 0 ? new java.util.Date() : null; + + taskListDetialMapper.toggleTaskStatus(taskId, userId, newStatus, completeTime); + + if (oConvertUtils.isNotEmpty(existing.getPid())) { + TaskListDetial parent = taskListDetialMapper.selectById(existing.getPid()); + if (parent != null && "1".equals(parent.getType())) { + if (oldStatus == 0) { + taskListDetialMapper.incrementCompletedSubTaskCount(parent.getId()); + } else { + taskListDetialMapper.decrementCompletedSubTaskCount(parent.getId()); + } + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void moveTask(MoveTaskReq req) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListDetial task = taskListDetialMapper.selectById(req.getTaskId()); + if (task == null) { + throw new RuntimeException("任务不存在"); + } + + String permission = getPermission(task.getMainId(), userId); + if (permission == null) { + throw new RuntimeException("无权限移动此任务"); + } + if ("3".equals(permission)) { + throw new RuntimeException("可阅读者无法移动任务"); + } + + String oldPid = normalizePid(task.getPid()); + Integer oldSort = task.getSortOrder(); + String newPid = normalizePid(req.getTargetPid()); + + Integer maxSort = taskListDetialMapper.getMaxSortOrder(task.getMainId(), newPid); + Integer targetSort; + if (req.getTargetSortOrder() != null) { + targetSort = req.getTargetSortOrder(); + } else { + targetSort = maxSort + 1; + } + if (targetSort < 1) targetSort = 1; + if (targetSort > maxSort + 1) targetSort = maxSort + 1; + + taskListDetialMapper.shiftSortOrderDown(task.getMainId(), oldPid, oldSort); + + taskListDetialMapper.shiftSortOrderUp(task.getMainId(), newPid, targetSort); + + taskListDetialMapper.updatePidAndSort(req.getTaskId(), newPid, targetSort); + + if (oConvertUtils.isNotEmpty(oldPid)) { + TaskListDetial oldParent = taskListDetialMapper.selectById(oldPid); + if (oldParent != null && "1".equals(oldParent.getType())) { + Integer childCount = taskListDetialMapper.countChildrenByPid(oldPid); + if (childCount == null || childCount == 0) { + taskListDetialMapper.updateHasChild(oldPid, "0"); + } + taskListDetialMapper.decrementSubTaskCount(oldPid); + } + } + + if (oConvertUtils.isNotEmpty(newPid)) { + TaskListDetial newParent = taskListDetialMapper.selectById(newPid); + if (newParent != null && "1".equals(newParent.getType())) { + taskListDetialMapper.incrementSubTaskCount(newPid); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void moveTaskGroup(String taskGroupId, Integer targetSortOrder) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListDetial group = taskListDetialMapper.selectById(taskGroupId); + if (group == null || !"0".equals(group.getType())) { + throw new RuntimeException("分组不存在"); + } + String mainId = group.getMainId(); + + String permission = getPermission(mainId, userId); + if (permission == null || "3".equals(permission)) { + throw new RuntimeException("无权限移动此分组"); + } + + Integer oldSort = group.getSortOrder(); + Integer maxSort = taskListDetialMapper.getMaxSortOrderForGroup(mainId); + Integer targetSort = targetSortOrder != null ? targetSortOrder : 1; + if (targetSort < 1) targetSort = 1; + if (targetSort > maxSort) targetSort = maxSort; + + taskListDetialMapper.shiftSortOrderDownForGroup(mainId, oldSort); + + taskListDetialMapper.shiftSortOrderUpForGroup(mainId, targetSort); + + taskListDetialMapper.updateSortOrder(taskGroupId, targetSort); + } + + @Override + public void followTask(String taskId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + String userName = loginUser.getRealname(); + taskListDetialMapper.appendFollower(taskId, userId, userName); + } + + @Override + public void unfollowTask(String taskId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + String userName = loginUser.getRealname(); + taskListDetialMapper.removeFollower(taskId, userId, userName); + } + + @Override + public List loadSubTasks(String parentTaskId, Integer pageNo, Integer pageSize) { + if (pageNo == null || pageNo < 1) pageNo = 1; + if (pageSize == null || pageSize < 1) pageSize = 20; + int offset = (pageNo - 1) * pageSize; + List list = taskListDetialMapper.selectSubTasksByPage(parentTaskId, offset, pageSize); + fillCreateByName(list); + return list; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void ensureDefaultGroup(String mainId) { + TaskListDetial defaultGroup = findDefaultGroup(mainId); + if (defaultGroup == null) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + TaskListDetial group = new TaskListDetial(); + group.setMainId(mainId); + group.setTaskName("默认分组"); + group.setType("0"); + group.setPid(null); + group.setSortOrder(0); + group.setHasChild("0"); + group.setSubTaskCount(0); + group.setCompletedSubTaskCount(0); + group.setCreateBy(loginUser.getId()); + group.setCreateTime(new Date()); + group.setDelFlag("0"); + taskListDetialMapper.insert(group); + } + } + + private TaskListDetial findDefaultGroup(String mainId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(TaskListDetial::getMainId, mainId); + query.eq(TaskListDetial::getType, "0"); + query.eq(TaskListDetial::getTaskName, "默认分组"); + query.last("LIMIT 1"); + return taskListDetialMapper.selectOne(query); + } + + private String getPermission(String mainId, String userId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(TaskListPermission::getMainId, mainId); + query.eq(TaskListPermission::getUserId, userId); + TaskListPermission perm = taskListPermissionMapper.selectOne(query); + return perm != null ? perm.getPermission() : null; + } + + private String normalizePid(String pid) { + return oConvertUtils.isNotEmpty(pid) ? pid : null; + } + + private void fillCreateByName(List list) { + if (list == null || list.isEmpty()) { + return; + } + for (TaskListDetial task : list) { + if (oConvertUtils.isNotEmpty(task.getCreateBy())) { + LoginUser createUser = sysBaseAPI.getUserById(task.getCreateBy()); + if (createUser != null) { + task.setCreateByName(createUser.getRealname()); + } + } + if (oConvertUtils.isNotEmpty(task.getAssigneeId()) && oConvertUtils.isEmpty(task.getAssigneeName())) { + task.setAssigneeName(translateUserIdsToNames(task.getAssigneeId())); + } + if (oConvertUtils.isNotEmpty(task.getParticipantId()) && oConvertUtils.isEmpty(task.getParticipantName())) { + task.setParticipantName(translateUserIdsToNames(task.getParticipantId())); + } + if (oConvertUtils.isNotEmpty(task.getFollowersId()) && oConvertUtils.isEmpty(task.getFollowersName())) { + task.setFollowersName(translateUserIdsToNames(task.getFollowersId())); + } + } + } + + private String translateUserIdsToNames(String ids) { + if (oConvertUtils.isEmpty(ids)) { + return null; + } + String[] idArr = ids.split(","); + StringBuilder names = new StringBuilder(); + for (String id : idArr) { + if (oConvertUtils.isNotEmpty(id)) { + LoginUser user = sysBaseAPI.getUserById(id.trim()); + if (user != null) { + if (names.length() > 0) { + names.append(","); + } + names.append(user.getRealname()); + } + } + } + return names.length() > 0 ? names.toString() : null; + } + + private String mergeIds(String existingIds, String newIds) { + Set idSet = new LinkedHashSet<>(); + if (oConvertUtils.isNotEmpty(existingIds)) { + for (String id : existingIds.split(",")) { + String trimmed = id.trim(); + if (oConvertUtils.isNotEmpty(trimmed)) { + idSet.add(trimmed); + } + } + } + if (oConvertUtils.isNotEmpty(newIds)) { + for (String id : newIds.split(",")) { + String trimmed = id.trim(); + if (oConvertUtils.isNotEmpty(trimmed)) { + idSet.add(trimmed); + } + } + } + return idSet.isEmpty() ? null : String.join(",", idSet); + } +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListFavoriteServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListFavoriteServiceImpl.java new file mode 100644 index 0000000..ff8211a --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListFavoriteServiceImpl.java @@ -0,0 +1,69 @@ +package org.jeecg.modules.demo.tasklist.service.impl; + +import org.jeecg.modules.demo.tasklist.entity.TaskListFavorite; +import org.jeecg.modules.demo.tasklist.mapper.TaskListFavoriteMapper; +import org.jeecg.modules.demo.tasklist.service.ITaskListFavoriteService; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: 任务清单收藏表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Service +public class TaskListFavoriteServiceImpl extends ServiceImpl implements ITaskListFavoriteService { + + @Autowired + private TaskListFavoriteMapper taskListFavoriteMapper; + + @Override + public List selectByMainId(String mainId) { + return taskListFavoriteMapper.selectByMainId(mainId); + } + + @Override + public Integer getMaxSortOrder(String userId, String pid) { + Integer max = taskListFavoriteMapper.selectMaxSortOrder(userId, pid); + return max != null ? max : 0; + } + + @Override + public Integer getMaxSortOrderByType(String userId, String pid, String type) { + Integer max = taskListFavoriteMapper.selectMaxSortOrderByType(userId, pid, type); + return max != null ? max : 0; + } + + @Override + public void shiftSortOrderUp(String userId, String pid, Integer fromSort) { + taskListFavoriteMapper.shiftSortOrderUp(userId, pid, fromSort); + } + + @Override + public void shiftSortOrderDown(String userId, String pid, Integer fromSort) { + taskListFavoriteMapper.shiftSortOrderDown(userId, pid, fromSort); + } + + @Override + public void shiftSortOrderUpByType(String userId, String type, Integer fromSort) { + taskListFavoriteMapper.shiftSortOrderUpByType(userId, type, fromSort); + } + + @Override + public void shiftSortOrderDownByType(String userId, String type, Integer fromSort) { + taskListFavoriteMapper.shiftSortOrderDownByType(userId, type, fromSort); + } + + @Override + public Integer countChildren(String userId, String pid) { + return taskListFavoriteMapper.countChildrenByPid(userId, pid); + } + + @Override + public void updatePidAndSort(String favoriteId, String pid, Integer sortOrder) { + taskListFavoriteMapper.updatePidAndSort(favoriteId, pid, sortOrder); + } +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListPermissionServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListPermissionServiceImpl.java new file mode 100644 index 0000000..fc6a148 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListPermissionServiceImpl.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.demo.tasklist.service.impl; + +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import org.jeecg.modules.demo.tasklist.mapper.TaskListPermissionMapper; +import org.jeecg.modules.demo.tasklist.service.ITaskListPermissionService; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: 任务清单权限表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Service +public class TaskListPermissionServiceImpl extends ServiceImpl implements ITaskListPermissionService { + + @Autowired + private TaskListPermissionMapper taskListPermissionMapper; + + @Override + public List selectByMainId(String mainId) { + return taskListPermissionMapper.selectByMainId(mainId); + } +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java new file mode 100644 index 0000000..1ce4d32 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java @@ -0,0 +1,758 @@ +package org.jeecg.modules.demo.tasklist.service.impl; + +import org.jeecg.modules.demo.tasklist.entity.TaskList; +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import org.jeecg.modules.demo.tasklist.entity.TaskListFavorite; +import org.jeecg.modules.demo.tasklist.mapper.TaskListDetialMapper; +import org.jeecg.modules.demo.tasklist.mapper.TaskListPermissionMapper; +import org.jeecg.modules.demo.tasklist.mapper.TaskListFavoriteMapper; +import org.jeecg.modules.demo.tasklist.mapper.TaskListMapper; +import org.jeecg.modules.demo.tasklist.service.ITaskListService; +import org.jeecg.modules.demo.tasklist.service.ITaskListFavoriteService; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskListReq; +import org.jeecg.modules.demo.tasklist.vo.CreateTaskListGroupReq; +import org.jeecg.modules.demo.tasklist.vo.MoveTaskListReq; +import org.jeecg.modules.demo.tasklist.vo.AddCollaboratorReq; +import org.jeecg.modules.demo.tasklist.vo.CollaboratorVO; +import org.jeecg.common.system.api.ISysBaseAPI; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.util.oConvertUtils; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Collection; +import java.util.Objects; + +/** + * @Description: 任务清单表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Service +public class TaskListServiceImpl extends ServiceImpl implements ITaskListService { + + @Autowired + private TaskListMapper taskListMapper; + @Autowired + private TaskListDetialMapper taskListDetialMapper; + @Autowired + private TaskListPermissionMapper taskListPermissionMapper; + @Autowired + private TaskListFavoriteMapper taskListFavoriteMapper; + @Autowired + private ITaskListFavoriteService taskListFavoriteService; + @Autowired + private ISysBaseAPI sysBaseAPI; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(TaskList taskList, List taskListDetialList,List taskListPermissionList,List taskListFavoriteList) { + taskListMapper.insert(taskList); + if(taskListDetialList!=null && taskListDetialList.size()>0) { + for(TaskListDetial entity:taskListDetialList) { + //外键设置 + entity.setMainId(taskList.getId()); + taskListDetialMapper.insert(entity); + } + } + if(taskListPermissionList!=null && taskListPermissionList.size()>0) { + for(TaskListPermission entity:taskListPermissionList) { + //外键设置 + entity.setMainId(taskList.getId()); + taskListPermissionMapper.insert(entity); + } + } + if(taskListFavoriteList!=null && taskListFavoriteList.size()>0) { + for(TaskListFavorite entity:taskListFavoriteList) { + //外键设置 + entity.setMainId(taskList.getId()); + taskListFavoriteMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(TaskList taskList,List taskListDetialList,List taskListPermissionList,List taskListFavoriteList) { + taskListMapper.updateById(taskList); + + //1.先删除子表数据 + taskListDetialMapper.deleteByMainId(taskList.getId()); + taskListPermissionMapper.deleteByMainId(taskList.getId()); + taskListFavoriteMapper.deleteByMainId(taskList.getId()); + + //2.子表数据重新插入 + if(taskListDetialList!=null && taskListDetialList.size()>0) { + for(TaskListDetial entity:taskListDetialList) { + //外键设置 + entity.setMainId(taskList.getId()); + taskListDetialMapper.insert(entity); + } + } + if(taskListPermissionList!=null && taskListPermissionList.size()>0) { + for(TaskListPermission entity:taskListPermissionList) { + //外键设置 + entity.setMainId(taskList.getId()); + taskListPermissionMapper.insert(entity); + } + } + if(taskListFavoriteList!=null && taskListFavoriteList.size()>0) { + for(TaskListFavorite entity:taskListFavoriteList) { + //外键设置 + entity.setMainId(taskList.getId()); + taskListFavoriteMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delMain(String id) { + taskListDetialMapper.deleteByMainId(id); + taskListPermissionMapper.deleteByMainId(id); + taskListFavoriteMapper.deleteByMainId(id); + taskListMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + taskListDetialMapper.deleteByMainId(id.toString()); + taskListPermissionMapper.deleteByMainId(id.toString()); + taskListFavoriteMapper.deleteByMainId(id.toString()); + taskListMapper.deleteById(id); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTaskList(CreateTaskListReq req) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + if (oConvertUtils.isNotEmpty(req.getPid())) { + TaskListFavorite groupFav = taskListFavoriteMapper.selectById(req.getPid()); + if (groupFav == null || !"0".equals(groupFav.getType()) || !userId.equals(groupFav.getUserId())) { + throw new RuntimeException("目标分组不存在或无权限"); + } + } + + Integer targetSort; + if (req.getSortOrder() != null) { + taskListFavoriteService.shiftSortOrderUp(userId, req.getPid(), req.getSortOrder()); + targetSort = req.getSortOrder(); + } else { + String pidForSort = oConvertUtils.isNotEmpty(req.getPid()) ? req.getPid() : null; + targetSort = taskListFavoriteService.getMaxSortOrderByType(userId, pidForSort, "1") + 1; + } + + TaskList taskList = new TaskList(); + taskList.setTasklistName(req.getTasklistName()); + taskListMapper.insert(taskList); + + TaskListDetial defaultGroup = new TaskListDetial(); + defaultGroup.setMainId(taskList.getId()); + defaultGroup.setTaskName("默认分组"); + defaultGroup.setType("0"); + defaultGroup.setPid(null); + defaultGroup.setSortOrder(0); + defaultGroup.setHasChild("0"); + defaultGroup.setSubTaskCount(0); + defaultGroup.setCompletedSubTaskCount(0); + defaultGroup.setCreateBy(userId); + defaultGroup.setCreateTime(new java.util.Date()); + defaultGroup.setDelFlag("0"); + taskListDetialMapper.insert(defaultGroup); + + TaskListFavorite favorite = new TaskListFavorite(); + favorite.setMainId(taskList.getId()); + favorite.setUserId(userId); + favorite.setType("1"); + favorite.setPid(req.getPid()); + favorite.setHasChild("0"); + favorite.setSortOrder(targetSort); + favorite.setTasklistName(req.getTasklistName()); + taskListFavoriteMapper.insert(favorite); + + TaskListPermission permission = new TaskListPermission(); + permission.setMainId(taskList.getId()); + permission.setUserId(userId); + permission.setPermission("1"); + taskListPermissionMapper.insert(permission); + + if (oConvertUtils.isNotEmpty(req.getPid())) { + TaskListFavorite parentFav = new TaskListFavorite(); + parentFav.setId(req.getPid()); + parentFav.setHasChild("1"); + taskListFavoriteMapper.updateById(parentFav); + } + + return taskList.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTaskListGroup(CreateTaskListGroupReq req) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + Integer sortOrder = 1; + taskListFavoriteMapper.shiftSortOrderUpByType(userId, "0", sortOrder); + + TaskListFavorite favorite = new TaskListFavorite(); + favorite.setMainId(null); + favorite.setUserId(userId); + favorite.setType("0"); + favorite.setPid(null); + favorite.setHasChild("0"); + favorite.setSortOrder(sortOrder); + favorite.setTasklistName(req.getTasklistName()); + taskListFavoriteMapper.insert(favorite); + + return favorite.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void moveTaskList(MoveTaskListReq req) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListFavorite favorite = taskListFavoriteMapper.selectById(req.getFavoriteId()); + if (favorite == null || !userId.equals(favorite.getUserId())) { + throw new RuntimeException("无权限操作此记录"); + } + if ("0".equals(favorite.getType())) { + throw new RuntimeException("分组不支持移动操作"); + } + + String oldPid = normalizePid(favorite.getPid()); + Integer oldSort = favorite.getSortOrder(); + + String newPid = null; + if (oConvertUtils.isNotEmpty(req.getTargetGroupId())) { + TaskListFavorite targetGroup = taskListFavoriteMapper.selectById(req.getTargetGroupId()); + if (targetGroup == null || !"0".equals(targetGroup.getType()) || !userId.equals(targetGroup.getUserId())) { + throw new RuntimeException("目标分组不存在或无权限"); + } + newPid = normalizePid(req.getTargetGroupId()); + } + + Integer maxSort = taskListFavoriteService.getMaxSortOrder(userId, newPid); + Integer targetSort; + if (req.getSortOrder() != null) { + targetSort = req.getSortOrder(); + } else { + targetSort = maxSort + 1; + } + if (targetSort < 1) { + targetSort = 1; + } + if (targetSort > maxSort + 1) { + targetSort = maxSort + 1; + } + + taskListFavoriteService.shiftSortOrderDown(userId, oldPid, oldSort); + + taskListFavoriteService.shiftSortOrderUp(userId, newPid, targetSort); + + taskListFavoriteService.updatePidAndSort(req.getFavoriteId(), newPid, targetSort); + + if (oConvertUtils.isNotEmpty(oldPid)) { + Integer remainCount = taskListFavoriteService.countChildren(userId, oldPid); + if (remainCount == 0) { + TaskListFavorite oldParent = new TaskListFavorite(); + oldParent.setId(oldPid); + oldParent.setHasChild("0"); + taskListFavoriteMapper.updateById(oldParent); + } + } + + if (oConvertUtils.isNotEmpty(newPid)) { + TaskListFavorite newParent = new TaskListFavorite(); + newParent.setId(newPid); + newParent.setHasChild("1"); + taskListFavoriteMapper.updateById(newParent); + } + } + + @Override + public List getMyFavorites() { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(TaskListFavorite::getUserId, userId); + query.orderByAsc(TaskListFavorite::getType); + query.orderByAsc(TaskListFavorite::getSortOrder); + List list = taskListFavoriteMapper.selectList(query); + for (TaskListFavorite fav : list) { + if ("1".equals(fav.getType()) && fav.getMainId() != null && fav.getTasklistName() == null) { + TaskList tl = taskListMapper.selectById(fav.getMainId()); + if (tl != null) { + fav.setTasklistName(tl.getTasklistName()); + } + } + if ("1".equals(fav.getType()) && fav.getMainId() != null) { + LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); + permQuery.eq(TaskListPermission::getMainId, fav.getMainId()); + permQuery.eq(TaskListPermission::getUserId, userId); + TaskListPermission perm = taskListPermissionMapper.selectOne(permQuery); + if (perm != null) { + fav.setPermission(perm.getPermission()); + } + } + } + return list; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTaskList(String taskListId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + LambdaQueryWrapper permCheck = new LambdaQueryWrapper<>(); + permCheck.eq(TaskListPermission::getMainId, taskListId); + permCheck.eq(TaskListPermission::getUserId, userId); + permCheck.eq(TaskListPermission::getPermission, "1"); + Long count = taskListPermissionMapper.selectCount(permCheck); + if (count == 0) { + throw new RuntimeException("仅所有者可删除任务清单"); + } + + taskListMapper.deleteById(taskListId); + + LambdaQueryWrapper detailQuery = new LambdaQueryWrapper<>(); + detailQuery.eq(TaskListDetial::getMainId, taskListId); + taskListDetialMapper.delete(detailQuery); + + LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); + permQuery.eq(TaskListPermission::getMainId, taskListId); + taskListPermissionMapper.delete(permQuery); + + LambdaQueryWrapper favQuery = new LambdaQueryWrapper<>(); + favQuery.eq(TaskListFavorite::getMainId, taskListId); + List favs = taskListFavoriteMapper.selectList(favQuery); + for (TaskListFavorite fav : favs) { + String favUserId = fav.getUserId(); + taskListFavoriteMapper.deleteById(fav.getId()); + if (fav.getPid() != null) { + Integer remainCount = taskListFavoriteService.countChildren(favUserId, fav.getPid()); + if (remainCount == 0) { + TaskListFavorite parentUpdate = new TaskListFavorite(); + parentUpdate.setId(fav.getPid()); + parentUpdate.setHasChild("0"); + taskListFavoriteMapper.updateById(parentUpdate); + } + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeFavorite(String favoriteId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListFavorite fav = taskListFavoriteMapper.selectById(favoriteId); + if (fav == null || !userId.equals(fav.getUserId())) { + throw new RuntimeException("无权限操作此记录"); + } + + fav.setDelFlag("1"); + taskListFavoriteMapper.updateById(fav); + + if (fav.getPid() != null) { + Integer remainCount = taskListFavoriteService.countChildren(userId, fav.getPid()); + if (remainCount == 0) { + TaskListFavorite parentUpdate = new TaskListFavorite(); + parentUpdate.setId(fav.getPid()); + parentUpdate.setHasChild("0"); + taskListFavoriteMapper.updateById(parentUpdate); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeFavoriteGroup(String groupId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListFavorite groupFav = taskListFavoriteMapper.selectById(groupId); + if (groupFav == null || !userId.equals(groupFav.getUserId()) || !"0".equals(groupFav.getType())) { + throw new RuntimeException("分组不存在或无权限"); + } + + groupFav.setDelFlag("1"); + taskListFavoriteMapper.updateById(groupFav); + + LambdaQueryWrapper childQuery = new LambdaQueryWrapper<>(); + childQuery.eq(TaskListFavorite::getPid, groupId); + childQuery.eq(TaskListFavorite::getUserId, userId); + List children = taskListFavoriteMapper.selectList(childQuery); + for (TaskListFavorite child : children) { + child.setDelFlag("1"); + taskListFavoriteMapper.updateById(child); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void renameGroup(String groupId, String newName) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListFavorite groupFav = taskListFavoriteMapper.selectById(groupId); + if (groupFav == null || !userId.equals(groupFav.getUserId()) || !"0".equals(groupFav.getType())) { + throw new RuntimeException("分组不存在或无权限"); + } + + groupFav.setTasklistName(newName); + taskListFavoriteMapper.updateById(groupFav); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void moveGroup(String groupId, Integer sortOrder) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskListFavorite group = taskListFavoriteMapper.selectById(groupId); + if (group == null || !userId.equals(group.getUserId()) || !"0".equals(group.getType())) { + throw new RuntimeException("分组不存在或无权限"); + } + + Integer oldSort = group.getSortOrder(); + Integer targetSort = (sortOrder != null) ? sortOrder : 0; + if (targetSort < 1) { + targetSort = 1; + } + + Integer maxSort = taskListFavoriteService.getMaxSortOrderByType(userId, null, "0"); + if (targetSort > maxSort) { + targetSort = maxSort; + } + + taskListFavoriteService.shiftSortOrderDownByType(userId, "0", oldSort); + + taskListFavoriteService.shiftSortOrderUpByType(userId, "0", targetSort); + + taskListFavoriteService.updatePidAndSort(groupId, null, targetSort); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void renameTaskList(String taskListId, String newName) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + TaskList taskList = taskListMapper.selectById(taskListId); + if (taskList == null) { + throw new RuntimeException("清单不存在"); + } + + LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); + permQuery.eq(TaskListPermission::getMainId, taskListId); + permQuery.eq(TaskListPermission::getUserId, userId); + permQuery.in(TaskListPermission::getPermission, "1", "2"); + boolean hasPermission = taskListPermissionMapper.exists(permQuery); + + if (!hasPermission) { + throw new RuntimeException("清单不存在或无权限"); + } + + taskList.setTasklistName(newName); + taskListMapper.updateById(taskList); + + LambdaQueryWrapper favQuery = new LambdaQueryWrapper<>(); + favQuery.eq(TaskListFavorite::getMainId, taskListId); + List favs = taskListFavoriteMapper.selectList(favQuery); + for (TaskListFavorite fav : favs) { + fav.setTasklistName(newName); + taskListFavoriteMapper.updateById(fav); + } + } + + @Override + public List getMyOwnLists() { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); + permQuery.eq(TaskListPermission::getUserId, userId); + permQuery.eq(TaskListPermission::getPermission, "1"); + List perms = taskListPermissionMapper.selectList(permQuery); + + List mainIds = perms.stream().map(TaskListPermission::getMainId).collect(java.util.stream.Collectors.toList()); + if (mainIds.isEmpty()) { + return java.util.Collections.emptyList(); + } + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(TaskList::getId, mainIds); + query.orderByAsc(TaskList::getCreateTime); + return enrichListSummaries(taskListMapper.selectList(query)); + } + + @Override + public List getAllLists() { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); + permQuery.eq(TaskListPermission::getUserId, userId); + List perms = taskListPermissionMapper.selectList(permQuery); + + List mainIds = perms.stream().map(TaskListPermission::getMainId).distinct().collect(java.util.stream.Collectors.toList()); + if (mainIds.isEmpty()) { + return java.util.Collections.emptyList(); + } + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(TaskList::getId, mainIds); + query.orderByAsc(TaskList::getCreateTime); + return enrichListSummaries(taskListMapper.selectList(query)); + } + + @Override + public List getMyCollabLists() { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); + permQuery.eq(TaskListPermission::getUserId, userId); + permQuery.ne(TaskListPermission::getPermission, "1"); + List perms = taskListPermissionMapper.selectList(permQuery); + + List mainIds = perms.stream().map(TaskListPermission::getMainId).collect(java.util.stream.Collectors.toList()); + if (mainIds.isEmpty()) { + return java.util.Collections.emptyList(); + } + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(TaskList::getId, mainIds); + query.orderByAsc(TaskList::getCreateTime); + return enrichListSummaries(taskListMapper.selectList(query)); + } + + private String normalizePid(String pid) { + return oConvertUtils.isNotEmpty(pid) ? pid : null; + } + + private List enrichListSummaries(List lists) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (TaskList list : lists) { + if (list.getCreateTime() != null) { + list.setCreateTimeStr(sdf.format(list.getCreateTime())); + } + + LambdaQueryWrapper ownerQuery = new LambdaQueryWrapper<>(); + ownerQuery.eq(TaskListPermission::getMainId, list.getId()); + ownerQuery.eq(TaskListPermission::getPermission, "1"); + TaskListPermission owner = taskListPermissionMapper.selectOne(ownerQuery); + if (owner != null) { + LoginUser ownerUser = sysBaseAPI.getUserById(owner.getUserId()); + if (ownerUser != null) { + list.setOwnerName(ownerUser.getRealname()); + } + } + + LambdaQueryWrapper collabQuery = new LambdaQueryWrapper<>(); + collabQuery.eq(TaskListPermission::getMainId, list.getId()); + collabQuery.ne(TaskListPermission::getPermission, "1"); + List collabs = taskListPermissionMapper.selectList(collabQuery); + if (!collabs.isEmpty()) { + List collabUserIds = collabs.stream().map(TaskListPermission::getUserId).collect(java.util.stream.Collectors.toList()); + List collabNames = new java.util.ArrayList<>(); + for (String collabUserId : collabUserIds) { + LoginUser collabUser = sysBaseAPI.getUserById(collabUserId); + if (collabUser != null && collabUser.getRealname() != null) { + collabNames.add(collabUser.getRealname()); + } + } + list.setCollaboratorNames(String.join(", ", collabNames)); + } + } + return lists; + } + + @Override + public List getCollaborators(String taskListId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(TaskListPermission::getMainId, taskListId); + query.orderByAsc(TaskListPermission::getCreateTime); + List perms = taskListPermissionMapper.selectList(query); + + List result = new java.util.ArrayList<>(); + for (TaskListPermission perm : perms) { + CollaboratorVO vo = new CollaboratorVO(); + vo.setPermissionId(perm.getId()); + vo.setUserId(perm.getUserId()); + vo.setPermission(perm.getPermission()); + LoginUser user = sysBaseAPI.getUserById(perm.getUserId()); + if (user != null) { + vo.setUsername(user.getRealname()); + } + result.add(vo); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addCollaborator(AddCollaboratorReq req) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String currentUserId = loginUser.getId(); + + LambdaQueryWrapper ownerCheck = new LambdaQueryWrapper<>(); + ownerCheck.eq(TaskListPermission::getMainId, req.getTaskListId()); + ownerCheck.eq(TaskListPermission::getUserId, currentUserId); + ownerCheck.eq(TaskListPermission::getPermission, "1"); + Long ownerCount = taskListPermissionMapper.selectCount(ownerCheck); + if (ownerCount == 0) { + throw new RuntimeException("仅所有者可添加协作人"); + } + + if (!"2".equals(req.getPermission()) && !"3".equals(req.getPermission())) { + throw new RuntimeException("权限类型无效,仅支持可阅读(2)或可编辑(3)"); + } + + LambdaQueryWrapper existCheck = new LambdaQueryWrapper<>(); + existCheck.eq(TaskListPermission::getMainId, req.getTaskListId()); + existCheck.eq(TaskListPermission::getUserId, req.getUserId()); + Long existCount = taskListPermissionMapper.selectCount(existCheck); + if (existCount > 0) { + throw new RuntimeException("该用户已是协作人"); + } + + TaskListPermission permission = new TaskListPermission(); + permission.setMainId(req.getTaskListId()); + permission.setUserId(req.getUserId()); + permission.setPermission(req.getPermission()); + taskListPermissionMapper.insert(permission); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void removeCollaborator(String permissionId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String currentUserId = loginUser.getId(); + + TaskListPermission perm = taskListPermissionMapper.selectById(permissionId); + if (perm == null) { + throw new RuntimeException("权限记录不存在"); + } + if ("1".equals(perm.getPermission())) { + throw new RuntimeException("不能移除所有者"); + } + + LambdaQueryWrapper ownerCheck = new LambdaQueryWrapper<>(); + ownerCheck.eq(TaskListPermission::getMainId, perm.getMainId()); + ownerCheck.eq(TaskListPermission::getUserId, currentUserId); + ownerCheck.eq(TaskListPermission::getPermission, "1"); + Long ownerCount = taskListPermissionMapper.selectCount(ownerCheck); + if (ownerCount == 0) { + throw new RuntimeException("仅所有者可移除协作人"); + } + + taskListPermissionMapper.deleteById(permissionId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCollaboratorPermission(String permissionId, String newPermission) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String currentUserId = loginUser.getId(); + + TaskListPermission perm = taskListPermissionMapper.selectById(permissionId); + if (perm == null) { + throw new RuntimeException("权限记录不存在"); + } + if ("1".equals(perm.getPermission())) { + throw new RuntimeException("不能修改所有者权限"); + } + if (!"2".equals(newPermission) && !"3".equals(newPermission)) { + throw new RuntimeException("权限类型无效"); + } + + LambdaQueryWrapper ownerCheck = new LambdaQueryWrapper<>(); + ownerCheck.eq(TaskListPermission::getMainId, perm.getMainId()); + ownerCheck.eq(TaskListPermission::getUserId, currentUserId); + ownerCheck.eq(TaskListPermission::getPermission, "1"); + Long ownerCount = taskListPermissionMapper.selectCount(ownerCheck); + if (ownerCount == 0) { + throw new RuntimeException("仅所有者可修改协作人权限"); + } + + TaskListPermission update = new TaskListPermission(); + update.setId(permissionId); + update.setPermission(newPermission); + taskListPermissionMapper.updateById(update); + } + + @Override + public String getMyPermission(String taskListId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(TaskListPermission::getMainId, taskListId); + query.eq(TaskListPermission::getUserId, userId); + TaskListPermission perm = taskListPermissionMapper.selectOne(query); + return perm != null ? perm.getPermission() : null; + } + + @Override + public void addToFavorites(String taskListId) { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = loginUser.getId(); + + LambdaQueryWrapper existCheck = new LambdaQueryWrapper<>(); + existCheck.eq(TaskListFavorite::getMainId, taskListId); + existCheck.eq(TaskListFavorite::getUserId, userId); + existCheck.eq(TaskListFavorite::getType, "1"); + Long existCount = taskListFavoriteMapper.selectCount(existCheck); + if (existCount > 0) { + throw new RuntimeException("该清单已在收藏中"); + } + + TaskList taskList = taskListMapper.selectById(taskListId); + if (taskList == null) { + throw new RuntimeException("清单不存在"); + } + + Integer maxSort = taskListFavoriteService.getMaxSortOrderByType(userId, null, "1"); + TaskListFavorite favorite = new TaskListFavorite(); + favorite.setMainId(taskListId); + favorite.setUserId(userId); + favorite.setType("1"); + favorite.setPid(null); + favorite.setHasChild("0"); + favorite.setSortOrder(maxSort + 1); + favorite.setTasklistName(taskList.getTasklistName()); + taskListFavoriteMapper.insert(favorite); + } + + @Override + public List myResponsibleTasks() { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + return taskListDetialMapper.selectByAssigneeId(loginUser.getId()); + } + + @Override + public List myFollowedTasks() { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + return taskListDetialMapper.selectByFollowersId(loginUser.getId()); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/AddCollaboratorReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/AddCollaboratorReq.java new file mode 100644 index 0000000..abf7262 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/AddCollaboratorReq.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "添加协作人请求") +public class AddCollaboratorReq { + + @Schema(description = "清单ID") + private String taskListId; + + @Schema(description = "被添加的用户ID") + private String userId; + + @Schema(description = "权限类型: 2=可编辑 3=可阅读") + private String permission; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CollaboratorVO.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CollaboratorVO.java new file mode 100644 index 0000000..58f5d83 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CollaboratorVO.java @@ -0,0 +1,21 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "协作人信息") +public class CollaboratorVO { + + @Schema(description = "权限记录ID") + private String permissionId; + + @Schema(description = "用户ID") + private String userId; + + @Schema(description = "用户姓名") + private String username; + + @Schema(description = "权限类型: 1=所有者 2=可编辑 3=可阅读") + private String permission; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListGroupReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListGroupReq.java new file mode 100644 index 0000000..cd0f242 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListGroupReq.java @@ -0,0 +1,12 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "创建任务清单分组请求") +public class CreateTaskListGroupReq { + + @Schema(description = "分组名称") + private String tasklistName; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java new file mode 100644 index 0000000..373d3b6 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "创建任务清单请求") +public class CreateTaskListReq { + + @Schema(description = "清单名称") + private String tasklistName; + + @Schema(description = "父分组ID(可选,不传则放在根级别)") + private String pid; + + @Schema(description = "目标排序位置(可选,不传则追加到末尾)") + private Integer sortOrder; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskReq.java new file mode 100644 index 0000000..c735048 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskReq.java @@ -0,0 +1,45 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +@Schema(description = "创建任务请求") +public class CreateTaskReq { + + @Schema(description = "所属清单ID") + private String mainId; + + @Schema(description = "任务名称") + private String taskName; + + @Schema(description = "任务描述") + private String taskDesc; + + @Schema(description = "优先级") + private String priority; + + @Schema(description = "类型:0=任务分组,1=普通任务") + private String type; + + @Schema(description = "父节点ID(分组ID或父任务ID,为空则归入默认分组)") + private String pid; + + @Schema(description = "负责人ID") + private String assigneeId; + + @Schema(description = "开始时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date startTime; + + @Schema(description = "结束时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date endTime; + + @Schema(description = "排序号(指定则在指定位置插入)") + private Integer sortOrder; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskListReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskListReq.java new file mode 100644 index 0000000..2316e76 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskListReq.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "拖拽移动任务清单请求") +public class MoveTaskListReq { + + @Schema(description = "被移动的清单对应的 favorite 记录ID") + private String favoriteId; + + @Schema(description = "目标分组ID(null 或空字符串表示移动到根级别)") + private String targetGroupId; + + @Schema(description = "目标位置排序号(可选,不传则追加到末尾)") + private Integer sortOrder; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskReq.java new file mode 100644 index 0000000..a842689 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/MoveTaskReq.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "拖拽移动任务请求") +public class MoveTaskReq { + + @Schema(description = "任务ID") + private String taskId; + + @Schema(description = "目标父节点ID(分组ID或父任务ID,为空表示移入默认分组)") + private String targetPid; + + @Schema(description = "目标位置排序号(可选,不传则追加到末尾)") + private Integer targetSortOrder; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/SubTaskPageReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/SubTaskPageReq.java new file mode 100644 index 0000000..4a32552 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/SubTaskPageReq.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import lombok.Data; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "子任务分页请求") +public class SubTaskPageReq { + + @Schema(description = "父任务ID") + private String parentTaskId; + + @Schema(description = "页码,默认1") + private Integer pageNo = 1; + + @Schema(description = "每页条数,默认20") + private Integer pageSize = 20; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java new file mode 100644 index 0000000..e821719 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java @@ -0,0 +1,72 @@ +package org.jeecg.modules.demo.tasklist.vo; + +import java.util.List; +import org.jeecg.modules.demo.tasklist.entity.TaskList; +import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; +import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; +import org.jeecg.modules.demo.tasklist.entity.TaskListFavorite; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: 任务清单表 + * @Author: jeecg-boot + * @Date: 2026-04-24 + * @Version: V1.0 + */ +@Data +@Schema(description="任务清单表") +public class TaskListPage { + + /**主键*/ + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**清单名称*/ + @Excel(name = "清单名称", width = 15) + @Schema(description = "清单名称") + private java.lang.String tasklistName; + /**删除标识*/ + @Excel(name = "删除标识", width = 15) + @Schema(description = "删除标识") + private java.lang.String delFlag; + + @ExcelCollection(name="任务清单详情表") + @Schema(description = "任务清单详情表") + private List taskListDetialList; + @ExcelCollection(name="任务清单权限表") + @Schema(description = "任务清单权限表") + private List taskListPermissionList; + @ExcelCollection(name="任务清单收藏表") + @Schema(description = "任务清单收藏表") + private List taskListFavoriteList; + +}