Merge branch 'master' into feature/20260519

This commit is contained in:
wsm
2026-05-22 16:31:37 +08:00
9 changed files with 347 additions and 20 deletions
@@ -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<TaskApprovalOpinion, ITaskApprovalOpinionService> {
@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<IPage<TaskApprovalOpinion>> queryPageList(TaskApprovalOpinion taskApprovalOpinion,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<TaskApprovalOpinion> queryWrapper = QueryGenerator.initQueryWrapper(taskApprovalOpinion, req.getParameterMap());
Page<TaskApprovalOpinion> page = new Page<TaskApprovalOpinion>(pageNo, pageSize);
IPage<TaskApprovalOpinion> 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<String> 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<String> 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<String> 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<String> 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<TaskApprovalOpinion> 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);
}
}
@@ -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;
}
@@ -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<TaskApprovalOpinion> {
}
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.taskapprovalopinion.mapper.TaskApprovalOpinionMapper">
</mapper>
@@ -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<TaskApprovalOpinion> {
}
@@ -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<TaskApprovalOpinionMapper, TaskApprovalOpinion> implements ITaskApprovalOpinionService {
}
@@ -84,4 +84,8 @@ public class TaskList implements Serializable {
@TableField(exist = false) @TableField(exist = false)
@Schema(description = "创建时间字符串") @Schema(description = "创建时间字符串")
private java.lang.String createTimeStr; private java.lang.String createTimeStr;
@TableField(exist = false)
@Schema(description = "当前用户权限等级:1=所有者,2=可编辑,3=可阅读")
private java.lang.String myPermission;
} }
@@ -7,17 +7,7 @@
FROM task_list t FROM task_list t
WHERE t.del_flag = '0' WHERE t.del_flag = '0'
AND ( AND (
-- 条件1同一部门的人能看到互相创建的清单 -- 条件1当前用户是所有者(permission=1
-- 注意:task_list.create_by 存的是 username,所以用 u.username 匹配
<if test="orgCode != null and orgCode != ''">
EXISTS (
SELECT 1 FROM sys_user u
WHERE u.username = t.create_by
AND u.org_code = #{orgCode}
)
OR
</if>
-- 条件2:当前用户是所有者(permission=1
EXISTS ( EXISTS (
SELECT 1 FROM task_list_permission p SELECT 1 FROM task_list_permission p
WHERE p.main_id = t.id WHERE p.main_id = t.id
@@ -25,7 +15,7 @@
AND p.permission = '1' AND p.permission = '1'
AND p.del_flag = '0' AND p.del_flag = '0'
) )
-- 条件3:当前用户是协作者(permission=2/3 -- 条件2:当前用户是协作者(permission=2/3
OR EXISTS ( OR EXISTS (
SELECT 1 FROM task_list_permission p SELECT 1 FROM task_list_permission p
WHERE p.main_id = t.id WHERE p.main_id = t.id
@@ -33,7 +23,7 @@
AND p.permission IN ('2', '3') AND p.permission IN ('2', '3')
AND p.del_flag = '0' AND p.del_flag = '0'
) )
-- 条件4:清单中某任务的负责人/参与人是当前用户 -- 条件3:清单中某任务的负责人/参与人是当前用户
OR EXISTS ( OR EXISTS (
SELECT 1 FROM task_list_detial d SELECT 1 FROM task_list_detial d
WHERE d.main_id = t.id WHERE d.main_id = t.id
@@ -44,7 +34,7 @@
) )
) )
) )
-- 条件5:密级过滤(用户密级数值 > 清单密级数值才能看到) -- 条件4:密级过滤(用户密级数值 > 清单密级数值才能看到)
AND ( AND (
t.secret_level IS NULL t.secret_level IS NULL
OR t.secret_level &lt; #{userSecLevel} OR t.secret_level &lt; #{userSecLevel}
@@ -197,8 +197,8 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = loginUser.getId(); String userId = loginUser.getId();
Integer sortOrder = 1; Integer maxSort = taskListFavoriteService.getMaxSortOrderByType(userId, null, "0");
taskListFavoriteMapper.shiftSortOrderUpByType(userId, "0", sortOrder); Integer sortOrder = maxSort + 1;
TaskListFavorite favorite = new TaskListFavorite(); TaskListFavorite favorite = new TaskListFavorite();
favorite.setMainId(null); favorite.setMainId(null);
@@ -500,7 +500,7 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
query.in(TaskList::getId, mainIds); query.in(TaskList::getId, mainIds);
query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel)); query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel));
query.orderByAsc(TaskList::getCreateTime); query.orderByAsc(TaskList::getCreateTime);
return enrichListSummaries(taskListMapper.selectList(query)); return enrichListSummaries(taskListMapper.selectList(query), userId);
} }
@Override @Override
@@ -514,7 +514,7 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
String orgCode = loginUser.getOrgCode(); String orgCode = loginUser.getOrgCode();
List<TaskList> lists = taskListMapper.selectVisibleLists(userId, userSecLevel, orgCode); List<TaskList> lists = taskListMapper.selectVisibleLists(userId, userSecLevel, orgCode);
return enrichListSummaries(lists); return enrichListSummaries(lists, userId);
} }
@Override @Override
@@ -541,14 +541,14 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
query.in(TaskList::getId, mainIds); query.in(TaskList::getId, mainIds);
query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel)); query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel));
query.orderByAsc(TaskList::getCreateTime); query.orderByAsc(TaskList::getCreateTime);
return enrichListSummaries(taskListMapper.selectList(query)); return enrichListSummaries(taskListMapper.selectList(query), userId);
} }
private String normalizePid(String pid) { private String normalizePid(String pid) {
return oConvertUtils.isNotEmpty(pid) ? pid : null; return oConvertUtils.isNotEmpty(pid) ? pid : null;
} }
private List<TaskList> enrichListSummaries(List<TaskList> lists) { private List<TaskList> enrichListSummaries(List<TaskList> lists, String currentUserId) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (TaskList list : lists) { for (TaskList list : lists) {
if (list.getCreateTime() != null) { if (list.getCreateTime() != null) {
@@ -564,6 +564,9 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
if (ownerUser != null) { if (ownerUser != null) {
list.setOwnerName(ownerUser.getRealname()); list.setOwnerName(ownerUser.getRealname());
} }
if (currentUserId != null && currentUserId.equals(owner.getUserId())) {
list.setMyPermission("1");
}
} }
LambdaQueryWrapper<TaskListPermission> collabQuery = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TaskListPermission> collabQuery = new LambdaQueryWrapper<>();