diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/controller/TaskApprovalOpinionController.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/controller/TaskApprovalOpinionController.java new file mode 100644 index 0000000..83f5ec3 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/controller/TaskApprovalOpinionController.java @@ -0,0 +1,185 @@ +package org.jeecg.modules.taskapprovalopinion.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +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.taskapprovalopinion.entity.TaskApprovalOpinion; +import org.jeecg.modules.taskapprovalopinion.service.ITaskApprovalOpinionService; + +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 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.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +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: task_approval_opinion + * @Author: jeecg-boot + * @Date: 2026-05-21 + * @Version: V1.0 + */ +@Tag(name="task_approval_opinion") +@RestController +@RequestMapping("/taskapprovalopinion/taskApprovalOpinion") +@Slf4j +public class TaskApprovalOpinionController extends JeecgController { + @Autowired + private ITaskApprovalOpinionService taskApprovalOpinionService; + + /** + * 分页列表查询 + * + * @param taskApprovalOpinion + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "task_approval_opinion-分页列表查询") + @Operation(summary="task_approval_opinion-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(TaskApprovalOpinion taskApprovalOpinion, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + + + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(taskApprovalOpinion, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage pageList = taskApprovalOpinionService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param taskApprovalOpinion + * @return + */ + @AutoLog(value = "task_approval_opinion-添加") + @Operation(summary="task_approval_opinion-添加") + @RequiresPermissions("taskapprovalopinion:task_approval_opinion:add") + @PostMapping(value = "/add") + public Result add(@RequestBody TaskApprovalOpinion taskApprovalOpinion) { + if (oConvertUtils.isEmpty(taskApprovalOpinion.getDelFlag())) { + taskApprovalOpinion.setDelFlag("0"); + } + taskApprovalOpinionService.save(taskApprovalOpinion); + + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param taskApprovalOpinion + * @return + */ + @AutoLog(value = "task_approval_opinion-编辑") + @Operation(summary="task_approval_opinion-编辑") + @RequiresPermissions("taskapprovalopinion:task_approval_opinion:edit") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result edit(@RequestBody TaskApprovalOpinion taskApprovalOpinion) { + taskApprovalOpinionService.updateById(taskApprovalOpinion); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "task_approval_opinion-通过id删除") + @Operation(summary="task_approval_opinion-通过id删除") + @RequiresPermissions("taskapprovalopinion:task_approval_opinion:delete") + @DeleteMapping(value = "/delete") + public Result delete(@RequestParam(name="id",required=true) String id) { + taskApprovalOpinionService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "task_approval_opinion-批量删除") + @Operation(summary="task_approval_opinion-批量删除") + @RequiresPermissions("taskapprovalopinion:task_approval_opinion:deleteBatch") + @DeleteMapping(value = "/deleteBatch") + public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.taskApprovalOpinionService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "task_approval_opinion-通过id查询") + @Operation(summary="task_approval_opinion-通过id查询") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id) { + TaskApprovalOpinion taskApprovalOpinion = taskApprovalOpinionService.getById(id); + if(taskApprovalOpinion==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(taskApprovalOpinion); + } + + /** + * 导出excel + * + * @param request + * @param taskApprovalOpinion + */ + @RequiresPermissions("taskapprovalopinion:task_approval_opinion:exportXls") + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, TaskApprovalOpinion taskApprovalOpinion) { + return super.exportXls(request, taskApprovalOpinion, TaskApprovalOpinion.class, "task_approval_opinion"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequiresPermissions("taskapprovalopinion:task_approval_opinion:importExcel") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, TaskApprovalOpinion.class); + } + +} diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/entity/TaskApprovalOpinion.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/entity/TaskApprovalOpinion.java new file mode 100644 index 0000000..9ce5f34 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/entity/TaskApprovalOpinion.java @@ -0,0 +1,107 @@ +package org.jeecg.modules.taskapprovalopinion.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * 审批意见快照表实体。 + */ +@Data +@TableName("task_approval_opinion") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@Schema(description = "task_approval_opinion") +public class TaskApprovalOpinion implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private String id; + + @Schema(description = "记录类型:PROCESS/SUPPLEMENT/SYSTEM") + private String recordType; + + @Schema(description = "事项任务ID,对应 task_task.id") + private String taskTaskId; + + @Schema(description = "关联业务ID") + private String businessId; + + @Schema(description = "流程编码") + private String flowCode; + + @Schema(description = "流程实例ID") + private String processInstId; + + @Schema(description = "Flowable任务ID") + private String flowTaskId; + + @Schema(description = "流程节点Key") + private String taskDefKey; + + @Schema(description = "流程节点名称") + private String taskName; + + @Schema(description = "操作类型") + private String actionType; + + @Schema(description = "操作结果") + private String actionResult; + + @Schema(description = "审批意见或反馈内容") + private String opinion; + + @Schema(description = "办理人账号") + private String opUserId; + + @Schema(description = "办理人姓名") + private String opUserName; + + @Schema(description = "办理人部门ID") + private String opDeptId; + + @Schema(description = "办理人部门名称") + private String opDeptName; + + @Schema(description = "办理人部门编码") + private String opDeptCode; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "办理时间") + private Date opTime; + + @TableLogic + @Schema(description = "删除状态:0正常,1删除") + private String delFlag; + + @Schema(description = "创建人") + private String createBy; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private Date createTime; + + @Schema(description = "更新人") + private String updateBy; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private Date updateTime; + + @Schema(description = "所属部门") + private String sysOrgCode; +} diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/mapper/TaskApprovalOpinionMapper.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/mapper/TaskApprovalOpinionMapper.java new file mode 100644 index 0000000..c23e680 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/mapper/TaskApprovalOpinionMapper.java @@ -0,0 +1,10 @@ +package org.jeecg.modules.taskapprovalopinion.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.taskapprovalopinion.entity.TaskApprovalOpinion; + +/** + * 审批意见快照 Mapper。 + */ +public interface TaskApprovalOpinionMapper extends BaseMapper { +} diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/mapper/xml/TaskApprovalOpinionMapper.xml b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/mapper/xml/TaskApprovalOpinionMapper.xml new file mode 100644 index 0000000..8101995 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/mapper/xml/TaskApprovalOpinionMapper.xml @@ -0,0 +1,4 @@ + + + + diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/service/ITaskApprovalOpinionService.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/service/ITaskApprovalOpinionService.java new file mode 100644 index 0000000..a5eb000 --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/service/ITaskApprovalOpinionService.java @@ -0,0 +1,10 @@ +package org.jeecg.modules.taskapprovalopinion.service; + +import org.jeecg.modules.taskapprovalopinion.entity.TaskApprovalOpinion; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 审批意见快照 Service。 + */ +public interface ITaskApprovalOpinionService extends IService { +} diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/service/impl/TaskApprovalOpinionServiceImpl.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/service/impl/TaskApprovalOpinionServiceImpl.java new file mode 100644 index 0000000..b1499eb --- /dev/null +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/taskapprovalopinion/service/impl/TaskApprovalOpinionServiceImpl.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.taskapprovalopinion.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.jeecg.modules.taskapprovalopinion.entity.TaskApprovalOpinion; +import org.jeecg.modules.taskapprovalopinion.mapper.TaskApprovalOpinionMapper; +import org.jeecg.modules.taskapprovalopinion.service.ITaskApprovalOpinionService; +import org.springframework.stereotype.Service; + +/** + * 审批意见快照 Service 实现。 + */ +@Service +public class TaskApprovalOpinionServiceImpl extends ServiceImpl implements ITaskApprovalOpinionService { +} 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 index 9cf95b5..767014f 100644 --- 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 @@ -84,4 +84,8 @@ public class TaskList implements Serializable { @TableField(exist = false) @Schema(description = "创建时间字符串") private java.lang.String createTimeStr; + + @TableField(exist = false) + @Schema(description = "当前用户权限等级:1=所有者,2=可编辑,3=可阅读") + private java.lang.String myPermission; } 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 index d6aac66..720c930 100644 --- 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 @@ -7,17 +7,7 @@ FROM task_list t WHERE t.del_flag = '0' AND ( - -- 条件1:同一部门的人能看到互相创建的清单 - -- 注意:task_list.create_by 存的是 username,所以用 u.username 匹配 - - EXISTS ( - SELECT 1 FROM sys_user u - WHERE u.username = t.create_by - AND u.org_code = #{orgCode} - ) - OR - - -- 条件2:当前用户是所有者(permission=1) + -- 条件1:当前用户是所有者(permission=1) EXISTS ( SELECT 1 FROM task_list_permission p WHERE p.main_id = t.id @@ -25,7 +15,7 @@ AND p.permission = '1' AND p.del_flag = '0' ) - -- 条件3:当前用户是协作者(permission=2/3) + -- 条件2:当前用户是协作者(permission=2/3) OR EXISTS ( SELECT 1 FROM task_list_permission p WHERE p.main_id = t.id @@ -33,7 +23,7 @@ AND p.permission IN ('2', '3') AND p.del_flag = '0' ) - -- 条件4:清单中某任务的负责人/参与人是当前用户 + -- 条件3:清单中某任务的负责人/参与人是当前用户 OR EXISTS ( SELECT 1 FROM task_list_detial d WHERE d.main_id = t.id @@ -44,7 +34,7 @@ ) ) ) - -- 条件5:密级过滤(用户密级数值 > 清单密级数值才能看到) + -- 条件4:密级过滤(用户密级数值 > 清单密级数值才能看到) AND ( t.secret_level IS NULL OR t.secret_level < #{userSecLevel} 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 index 0a5d63b..dd90ee2 100644 --- 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 @@ -197,8 +197,8 @@ public class TaskListServiceImpl extends ServiceImpl i LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); - Integer sortOrder = 1; - taskListFavoriteMapper.shiftSortOrderUpByType(userId, "0", sortOrder); + Integer maxSort = taskListFavoriteService.getMaxSortOrderByType(userId, null, "0"); + Integer sortOrder = maxSort + 1; TaskListFavorite favorite = new TaskListFavorite(); favorite.setMainId(null); @@ -500,7 +500,7 @@ public class TaskListServiceImpl extends ServiceImpl i query.in(TaskList::getId, mainIds); query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel)); query.orderByAsc(TaskList::getCreateTime); - return enrichListSummaries(taskListMapper.selectList(query)); + return enrichListSummaries(taskListMapper.selectList(query), userId); } @Override @@ -514,7 +514,7 @@ public class TaskListServiceImpl extends ServiceImpl i String orgCode = loginUser.getOrgCode(); List lists = taskListMapper.selectVisibleLists(userId, userSecLevel, orgCode); - return enrichListSummaries(lists); + return enrichListSummaries(lists, userId); } @Override @@ -541,14 +541,14 @@ public class TaskListServiceImpl extends ServiceImpl i query.in(TaskList::getId, mainIds); query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel)); query.orderByAsc(TaskList::getCreateTime); - return enrichListSummaries(taskListMapper.selectList(query)); + return enrichListSummaries(taskListMapper.selectList(query), userId); } private String normalizePid(String pid) { return oConvertUtils.isNotEmpty(pid) ? pid : null; } - private List enrichListSummaries(List lists) { + private List enrichListSummaries(List lists, String currentUserId) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (TaskList list : lists) { if (list.getCreateTime() != null) { @@ -564,6 +564,9 @@ public class TaskListServiceImpl extends ServiceImpl i if (ownerUser != null) { list.setOwnerName(ownerUser.getRealname()); } + if (currentUserId != null && currentUserId.equals(owner.getUserId())) { + list.setMyPermission("1"); + } } LambdaQueryWrapper collabQuery = new LambdaQueryWrapper<>();