yxk-20260714
拆分我的待阅已阅并新增抄送轻量列表接口 - 新增抄送阅读状态支持,ext_act_task_cc 增加 isRead/readTime 映射 - 新增抄送已阅接口,校验当前用户必须为抄送接收人 - 新增我的抄送轻量列表接口 /act/process/extActTaskCc/myList - 轻量列表以 ext_act_task_cc 为主表查询,返回业务标题、流程名称、抄送节点、发起人、抄送人、抄送时间、已阅时间等字段 - 前端拆分为我的待阅、我的已阅页面,旧我的抄送页面兼容待阅 - 前端列表切换到轻量接口,移除办理人、开始时间、结束时间、耗时等历史任务字段 - 加宽业务标题列,门户待阅预览同步调整 - 新增 Flyway 菜单迁移和抄送查询索引
This commit is contained in:
+35
@@ -10,6 +10,7 @@ import org.jeecg.common.system.util.JwtUtil;
|
||||
import org.jeecg.common.util.SqlInjectionUtil;
|
||||
import org.jeecg.common.util.oConvertUtils;
|
||||
import org.jeecg.modules.extbpm.process.entity.ExtActTaskCc;
|
||||
import org.jeecg.modules.extbpm.process.pojo.CcTaskListDTO;
|
||||
import org.jeecg.modules.extbpm.process.service.IExtActTaskCcService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
@@ -40,6 +41,40 @@ import lombok.extern.slf4j.Slf4j;
|
||||
public class ExtActTaskCcController {
|
||||
@Autowired
|
||||
private IExtActTaskCcService extActTaskCcService;
|
||||
|
||||
/**
|
||||
* 我的抄送轻量列表
|
||||
* @param pageNo
|
||||
* @param pageSize
|
||||
* @param isReadParam
|
||||
* @param bpmBizTitle
|
||||
* @param processDefinitionName
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/myList")
|
||||
public Result<IPage<CcTaskListDTO>> myList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
|
||||
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
|
||||
@RequestParam(name="isRead", required=false) String isReadParam,
|
||||
@RequestParam(name="bpmBizTitle", required=false) String bpmBizTitle,
|
||||
@RequestParam(name="processDefinitionName", required=false) String processDefinitionName,
|
||||
HttpServletRequest request) {
|
||||
Result<IPage<CcTaskListDTO>> result = new Result<IPage<CcTaskListDTO>>();
|
||||
String username = JwtUtil.getUserNameByToken(request);
|
||||
if (oConvertUtils.isEmpty(username)) {
|
||||
result.error500("用户未登录");
|
||||
return result;
|
||||
}
|
||||
Integer isRead = null;
|
||||
if ("0".equals(isReadParam) || "1".equals(isReadParam)) {
|
||||
isRead = Integer.valueOf(isReadParam);
|
||||
}
|
||||
Page<CcTaskListDTO> page = new Page<CcTaskListDTO>(pageNo, pageSize);
|
||||
IPage<CcTaskListDTO> pageList = extActTaskCcService.queryMyCcList(page, username, isRead, bpmBizTitle, processDefinitionName);
|
||||
result.setSuccess(true);
|
||||
result.setResult(pageList);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表查询
|
||||
|
||||
+11
@@ -4,7 +4,10 @@ import java.util.List;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.jeecg.modules.extbpm.process.entity.ExtActTaskCc;
|
||||
import org.jeecg.modules.extbpm.process.pojo.CcTaskListDTO;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
|
||||
/**
|
||||
* @Description: 任务抄送表
|
||||
@@ -14,4 +17,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
*/
|
||||
public interface ExtActTaskCcMapper extends BaseMapper<ExtActTaskCc> {
|
||||
|
||||
/**
|
||||
* 查询当前用户的抄送轻量列表。
|
||||
*/
|
||||
List<CcTaskListDTO> queryMyCcList(Page<CcTaskListDTO> page,
|
||||
@Param("ccUserName") String ccUserName,
|
||||
@Param("isRead") Integer isRead,
|
||||
@Param("bpmBizTitle") String bpmBizTitle,
|
||||
@Param("processDefinitionName") String processDefinitionName);
|
||||
}
|
||||
|
||||
+63
-1
@@ -2,4 +2,66 @@
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.jeecg.modules.extbpm.process.mapper.ExtActTaskCcMapper">
|
||||
|
||||
</mapper>
|
||||
<resultMap id="CcTaskListDTO" type="org.jeecg.modules.extbpm.process.pojo.CcTaskListDTO">
|
||||
<result column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="ccId" property="ccId" jdbcType="VARCHAR"/>
|
||||
<result column="taskId" property="taskId" jdbcType="VARCHAR"/>
|
||||
<result column="processInstanceId" property="processInstanceId" jdbcType="VARCHAR"/>
|
||||
<result column="bpmBizTitle" property="bpmBizTitle" jdbcType="VARCHAR"/>
|
||||
<result column="processDefinitionName" property="processDefinitionName" jdbcType="VARCHAR"/>
|
||||
<result column="taskName" property="taskName" jdbcType="VARCHAR"/>
|
||||
<result column="processApplyUserId" property="processApplyUserId" jdbcType="VARCHAR"/>
|
||||
<result column="processApplyUserName" property="processApplyUserName" jdbcType="VARCHAR"/>
|
||||
<result column="ccFromUserId" property="ccFromUserId" jdbcType="VARCHAR"/>
|
||||
<result column="ccFromUserName" property="ccFromUserName" jdbcType="VARCHAR"/>
|
||||
<result column="ccCreateTime" property="ccCreateTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="isRead" property="isRead" jdbcType="INTEGER"/>
|
||||
<result column="readTime" property="readTime" jdbcType="TIMESTAMP"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="queryMyCcList" resultMap="CcTaskListDTO">
|
||||
SELECT
|
||||
cc.TASK_ID AS id
|
||||
,cc.ID AS ccId
|
||||
,COALESCE(NULLIF(cc.TASK_DEF_KEY, ''), aht.TASK_DEF_KEY_) AS taskId
|
||||
,cc.PROC_INST_ID AS processInstanceId
|
||||
,hiv.TEXT_ AS bpmBizTitle
|
||||
,arp.NAME_ AS processDefinitionName
|
||||
,COALESCE(NULLIF(cc.TASK_NAME, ''), aht.NAME_) AS taskName
|
||||
,ahp.START_USER_ID_ AS processApplyUserId
|
||||
,COALESCE(apply_user.realname, ahp.START_USER_ID_) AS processApplyUserName
|
||||
,cc.FROM_USER_NAME AS ccFromUserId
|
||||
,COALESCE(cc_from_user.realname, cc.FROM_USER_NAME) AS ccFromUserName
|
||||
,COALESCE(cc.CREATE_TIME, aht.END_TIME_, aht.START_TIME_) AS ccCreateTime
|
||||
,cc.IS_READ AS isRead
|
||||
,cc.READ_TIME AS readTime
|
||||
FROM EXT_ACT_TASK_CC cc
|
||||
LEFT JOIN ACT_HI_TASKINST aht
|
||||
ON aht.ID_ = cc.TASK_ID
|
||||
AND aht.PROC_INST_ID_ = cc.PROC_INST_ID
|
||||
LEFT JOIN ACT_RE_PROCDEF arp
|
||||
ON arp.ID_ = COALESCE(NULLIF(cc.PROC_DEF_ID, ''), aht.PROC_DEF_ID_)
|
||||
LEFT JOIN ACT_HI_PROCINST ahp
|
||||
ON ahp.ID_ = cc.PROC_INST_ID
|
||||
LEFT JOIN ACT_HI_VARINST hiv
|
||||
ON hiv.PROC_INST_ID_ = cc.PROC_INST_ID
|
||||
AND hiv.EXECUTION_ID_ = cc.PROC_INST_ID
|
||||
AND hiv.NAME_ = 'bpm_biz_title'
|
||||
LEFT JOIN sys_user apply_user
|
||||
ON apply_user.username = ahp.START_USER_ID_
|
||||
LEFT JOIN sys_user cc_from_user
|
||||
ON cc_from_user.username = cc.FROM_USER_NAME
|
||||
WHERE cc.CC_USER_NAME = #{ccUserName}
|
||||
<if test="isRead != null">
|
||||
AND cc.IS_READ = #{isRead}
|
||||
</if>
|
||||
<if test="bpmBizTitle != null and bpmBizTitle != ''">
|
||||
AND hiv.TEXT_ LIKE concat(concat('%', #{bpmBizTitle}), '%')
|
||||
</if>
|
||||
<if test="processDefinitionName != null and processDefinitionName != ''">
|
||||
AND arp.NAME_ LIKE concat(concat('%', #{processDefinitionName}), '%')
|
||||
</if>
|
||||
ORDER BY COALESCE(cc.CREATE_TIME, aht.END_TIME_, aht.START_TIME_) DESC, cc.ID DESC
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
package org.jeecg.modules.extbpm.process.pojo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 我的抄送轻量列表,只承载待阅/已阅页面需要展示和打开详情的字段。
|
||||
*/
|
||||
@Data
|
||||
public class CcTaskListDTO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 历史任务ID,用于打开流程历史详情 */
|
||||
private String id;
|
||||
/** 抄送记录ID,用于标记已阅 */
|
||||
private String ccId;
|
||||
/** 节点定义key,用于打开流程历史详情 */
|
||||
private String taskId;
|
||||
/** 流程实例ID,用于打开流程历史详情 */
|
||||
private String processInstanceId;
|
||||
|
||||
/** 业务标题 */
|
||||
private String bpmBizTitle;
|
||||
/** 流程名称 */
|
||||
private String processDefinitionName;
|
||||
/** 抄送节点 */
|
||||
private String taskName;
|
||||
|
||||
/** 流程发起人用户名 */
|
||||
private String processApplyUserId;
|
||||
/** 流程发起人姓名 */
|
||||
private String processApplyUserName;
|
||||
/** 抄送人用户名 */
|
||||
private String ccFromUserId;
|
||||
/** 抄送人姓名 */
|
||||
private String ccFromUserName;
|
||||
|
||||
/** 抄送时间 */
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date ccCreateTime;
|
||||
/** 抄送阅读状态:0-待阅,1-已阅 */
|
||||
private Integer isRead;
|
||||
/** 已阅时间 */
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date readTime;
|
||||
}
|
||||
+12
@@ -1,9 +1,12 @@
|
||||
package org.jeecg.modules.extbpm.process.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.flowable.bpmn.model.FlowNode;
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.modules.extbpm.process.entity.ExtActTaskCc;
|
||||
import org.jeecg.modules.extbpm.process.pojo.CcTaskListDTO;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.HashMap;
|
||||
@@ -37,4 +40,13 @@ public interface IExtActTaskCcService extends IService<ExtActTaskCc> {
|
||||
|
||||
public List<FlowNode> findFlowNodesByActivityId(String processDefId, String activityId);
|
||||
|
||||
/**
|
||||
* 查询我的抄送轻量列表。
|
||||
*/
|
||||
public IPage<CcTaskListDTO> queryMyCcList(Page<CcTaskListDTO> page,
|
||||
String username,
|
||||
Integer isRead,
|
||||
String bpmBizTitle,
|
||||
String processDefinitionName);
|
||||
|
||||
}
|
||||
|
||||
+2
@@ -511,6 +511,8 @@ public class ExtActBpmLogServiceImpl extends ServiceImpl<ExtActBpmLogMapper, Ext
|
||||
taskCcEntity.setFromUserName(username);
|
||||
taskCcEntity.setCcUserName(ccUserName);
|
||||
taskCcEntity.setIsRead(0);
|
||||
taskCcEntity.setCreateBy(username);
|
||||
taskCcEntity.setCreateTime(new Date());
|
||||
extActTaskCcMapper.insert(taskCcEntity);
|
||||
this.ccNotice(username, taskCcEntity);
|
||||
}
|
||||
|
||||
+9
@@ -2,8 +2,10 @@ package org.jeecg.modules.extbpm.process.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang.StreamUtils;
|
||||
import org.flowable.bpmn.model.Process;
|
||||
@@ -40,6 +42,7 @@ import org.jeecg.modules.extbpm.process.exception.BpmException;
|
||||
import org.jeecg.modules.extbpm.process.mapper.ExtActBpmFileMapper;
|
||||
import org.jeecg.modules.extbpm.process.mapper.ExtActBpmLogMapper;
|
||||
import org.jeecg.modules.extbpm.process.mapper.ExtActTaskCcMapper;
|
||||
import org.jeecg.modules.extbpm.process.pojo.CcTaskListDTO;
|
||||
import org.jeecg.modules.extbpm.process.service.IExtActBpmLogService;
|
||||
import org.jeecg.modules.extbpm.process.service.IExtActTaskCcService;
|
||||
import org.jeecg.modules.extbpm.util.BpmSytemMsgPushUtil;
|
||||
@@ -94,6 +97,12 @@ public class ExtActTaskCcServiceImpl extends ServiceImpl<ExtActTaskCcMapper, Ext
|
||||
@Autowired
|
||||
private IExtActBpmLogService extActBpmLogService;
|
||||
|
||||
@Override
|
||||
public IPage<CcTaskListDTO> queryMyCcList(Page<CcTaskListDTO> page, String username, Integer isRead, String bpmBizTitle, String processDefinitionName) {
|
||||
List<CcTaskListDTO> records = extActTaskCcMapper.queryMyCcList(page, username, isRead, bpmBizTitle, processDefinitionName);
|
||||
return page.setRecords(records);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<Object> processComplete(HashMap<String, String> map, HttpServletRequest request) {
|
||||
Result<Object> result = new Result<Object>();
|
||||
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
-- 抄送阅读状态字段:兼容已手工加字段的环境,缺失时自动补齐。
|
||||
SET @add_cc_is_read_sql = IF(
|
||||
(SELECT COUNT(1)
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'ext_act_task_cc'
|
||||
AND column_name = 'is_read') = 0,
|
||||
'ALTER TABLE `ext_act_task_cc` ADD COLUMN `is_read` tinyint(1) DEFAULT 0 COMMENT ''是否已阅:0待阅,1已阅'' AFTER `cc_user_name`',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE add_cc_is_read_stmt FROM @add_cc_is_read_sql;
|
||||
EXECUTE add_cc_is_read_stmt;
|
||||
DEALLOCATE PREPARE add_cc_is_read_stmt;
|
||||
|
||||
SET @add_cc_read_time_sql = IF(
|
||||
(SELECT COUNT(1)
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'ext_act_task_cc'
|
||||
AND column_name = 'read_time') = 0,
|
||||
'ALTER TABLE `ext_act_task_cc` ADD COLUMN `read_time` datetime DEFAULT NULL COMMENT ''已阅时间'' AFTER `is_read`',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE add_cc_read_time_stmt FROM @add_cc_read_time_sql;
|
||||
EXECUTE add_cc_read_time_stmt;
|
||||
DEALLOCATE PREPARE add_cc_read_time_stmt;
|
||||
|
||||
UPDATE `ext_act_task_cc`
|
||||
SET `is_read` = 0
|
||||
WHERE `is_read` IS NULL;
|
||||
|
||||
-- 旧“我的抄送”菜单沿用原 ID 改为“我的待阅”,保留既有角色/部门授权关系。
|
||||
UPDATE `sys_permission`
|
||||
SET `name` = '我的待阅',
|
||||
`url` = '/task/myUnreadCcTaskList',
|
||||
`component` = 'super/bpm/process/personalOffice/myCcTask/MyUnreadCcTaskList',
|
||||
`sort_no` = 3.00,
|
||||
`update_by` = 'admin',
|
||||
`update_time` = NOW()
|
||||
WHERE `id` = '1527569492930560001';
|
||||
|
||||
-- 新增“我的已阅”菜单。
|
||||
INSERT IGNORE INTO `sys_permission`(
|
||||
`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`,
|
||||
`menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`,
|
||||
`hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`,
|
||||
`del_flag`, `rule_flag`, `status`, `internal_or_external`
|
||||
) VALUES (
|
||||
'2026071300010000001', '1526860315136425986', '我的已阅', '/task/myReadCcTaskList',
|
||||
'super/bpm/process/personalOffice/myCcTask/MyReadCcTaskList', 1, NULL, NULL,
|
||||
1, NULL, '0', 4.00, 0, NULL, 1, 0,
|
||||
0, 0, NULL, 'admin', NOW(), NULL, NULL,
|
||||
0, 0, NULL, 0
|
||||
);
|
||||
|
||||
-- 将已拥有“我的待阅”的角色同步授权到“我的已阅”。
|
||||
INSERT INTO `sys_role_permission`(`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`)
|
||||
SELECT
|
||||
MD5(CONCAT('cc-read-role:', srp.`role_id`)),
|
||||
srp.`role_id`,
|
||||
'2026071300010000001',
|
||||
srp.`data_rule_ids`,
|
||||
NOW(),
|
||||
srp.`operate_ip`
|
||||
FROM `sys_role_permission` srp
|
||||
WHERE srp.`permission_id` = '1527569492930560001'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `sys_role_permission` target
|
||||
WHERE target.`role_id` = srp.`role_id`
|
||||
AND target.`permission_id` = '2026071300010000001'
|
||||
);
|
||||
|
||||
-- 将已拥有“我的待阅”的部门同步授权到“我的已阅”。
|
||||
INSERT INTO `sys_depart_permission`(`id`, `depart_id`, `permission_id`, `data_rule_ids`)
|
||||
SELECT
|
||||
MD5(CONCAT('cc-read-depart:', sdp.`depart_id`)),
|
||||
sdp.`depart_id`,
|
||||
'2026071300010000001',
|
||||
sdp.`data_rule_ids`
|
||||
FROM `sys_depart_permission` sdp
|
||||
WHERE sdp.`permission_id` = '1527569492930560001'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM `sys_depart_permission` target
|
||||
WHERE target.`depart_id` = sdp.`depart_id`
|
||||
AND target.`permission_id` = '2026071300010000001'
|
||||
);
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
-- 我的待阅/已阅轻量列表按接收人、阅读状态和抄送时间查询。
|
||||
SET @add_cc_read_index_sql = IF(
|
||||
(SELECT COUNT(1)
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'ext_act_task_cc'
|
||||
AND index_name = 'idx_ext_act_task_cc_user_read_time') = 0,
|
||||
'ALTER TABLE `ext_act_task_cc` ADD INDEX `idx_ext_act_task_cc_user_read_time` (`cc_user_name`, `is_read`, `create_time`)',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE add_cc_read_index_stmt FROM @add_cc_read_index_sql;
|
||||
EXECUTE add_cc_read_index_stmt;
|
||||
DEALLOCATE PREPARE add_cc_read_index_stmt;
|
||||
Reference in New Issue
Block a user