Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
zrch-risk-39
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Administrator
zrch-risk-39
Commits
daf1e3f7
提交
daf1e3f7
authored
4月 08, 2026
作者:
whydesc
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
--转办转阅功能实现
上级
4c79503d
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
265 行增加
和
2 行删除
+265
-2
todo.js
zrch-risk-client-39/src/components/Process/api/todo.js
+17
-0
TodoIndex.vue
...-39/src/views/flowable/task/todo/components/TodoIndex.vue
+58
-1
FlowTaskController.java
...jeecg/modules/flowable/controller/FlowTaskController.java
+12
-0
IFlowTaskService.java
.../org/jeecg/modules/flowable/service/IFlowTaskService.java
+2
-0
FlowTaskServiceImpl.java
...cg/modules/flowable/service/impl/FlowTaskServiceImpl.java
+176
-1
没有找到文件。
zrch-risk-client-39/src/components/Process/api/todo.js
浏览文件 @
daf1e3f7
...
@@ -162,6 +162,23 @@ export function assign(data) {
...
@@ -162,6 +162,23 @@ export function assign(data) {
data
:
data
data
:
data
})
})
}
}
// 转办任务 why 2026-4-8 add
export
function
assignRead
(
data
)
{
return
defHttp
.
post
({
url
:
'/flowable/task/assignRead'
,
data
:
data
})
}
// 查询待阅任务列表
export
function
todoReadList
(
query
)
{
return
defHttp
.
get
({
url
:
'/flowable/task/todoReadList'
,
params
:
query
})
}
...
...
zrch-risk-client-39/src/views/flowable/task/todo/components/TodoIndex.vue
浏览文件 @
daf1e3f7
...
@@ -26,6 +26,10 @@
...
@@ -26,6 +26,10 @@
<
template
#
icon
><CloseCircleOutlined
/></
template
>
<
template
#
icon
><CloseCircleOutlined
/></
template
>
转办
转办
</a-button>
</a-button>
<a-button
type=
"danger"
size=
"large"
@
click=
"handleAssignReadTask"
:loading=
"assiReadgning"
class=
"action-btn"
>
<
template
#
icon
><CloseCircleOutlined
/></
template
>
转阅
</a-button>
</a-space>
</a-space>
</div>
</div>
<div
class=
"action-right"
>
<div
class=
"action-right"
>
...
@@ -216,7 +220,7 @@
...
@@ -216,7 +220,7 @@
// API
// API
import
{
flowRecord
}
from
'/@/components/Process/api/finished'
;
import
{
flowRecord
}
from
'/@/components/Process/api/finished'
;
import
{
flowXmlAndNode
}
from
'/@/components/Process/api/definition'
;
import
{
flowXmlAndNode
}
from
'/@/components/Process/api/definition'
;
import
{
complete
,
flowTaskForm
,
getNextFlowNode
,
getMyTaskFlow
,
assign
}
from
'/@/components/Process/api/todo'
;
import
{
complete
,
flowTaskForm
,
getNextFlowNode
,
getMyTaskFlow
,
assign
,
assignRead
}
from
'/@/components/Process/api/todo'
;
import
{
flowTaskInfo
}
from
'/@/components/Process/api/process'
;
import
{
flowTaskInfo
}
from
'/@/components/Process/api/process'
;
// 组件
// 组件
...
@@ -291,6 +295,7 @@
...
@@ -291,6 +295,7 @@
const
isFixed
=
ref
(
true
);
const
isFixed
=
ref
(
true
);
const
assigning
=
ref
(
false
);
const
assigning
=
ref
(
false
);
const
assiReadgning
=
ref
(
false
);
const
userType
=
computed
(()
=>
{
const
userType
=
computed
(()
=>
{
return
nextNode
.
value
?.
type
||
''
;
return
nextNode
.
value
?.
type
||
''
;
});
});
...
@@ -769,6 +774,58 @@
...
@@ -769,6 +774,58 @@
}
}
};
};
//转阅处理
const
handleAssignReadTask
=
async
()
=>
{
if
(
assiReadgning
.
value
)
return
;
try
{
assiReadgning
.
value
=
true
;
const
submitData
=
{
instanceId
:
taskForm
.
instanceId
,
deployId
:
taskForm
.
deployId
,
taskId
:
taskForm
.
taskId
,
comment
:
''
,
values
:
{},
};
const
formData
=
await
validate
();
Object
.
assign
(
submitData
,
formData
);
submitData
.
comment
=
submitData
.
comment
||
''
;
//test1 1958436761110269953
// submitData.values['targetUserId'] = '1959869916657950721';
if
(
userType
.
value
===
'user'
)
{
submitData
.
values
[
'targetUserId'
]
=
formData
.
checkSendUser
;
submitData
.
values
[
'approvalType'
]
=
'user'
;
if
(
formData
.
checkSendUser
)
{
submitData
.
values
[
'targetUserId'
]
=
formData
.
checkSendUser
;
submitData
.
values
[
'approvalType'
]
=
'user'
;
}
}
else
if
(
formData
.
checkSendRole
)
{
submitData
.
values
[
'targetUserId'
]
=
formData
.
checkSendRole
;
submitData
.
values
[
'approvalType'
]
=
'role'
;
}
// 执行发送
const
result
=
await
assignRead
(
submitData
);
message
.
success
(
'任务转阅成功'
);
emit
(
'success'
,
result
);
emit
(
'callback'
);
}
catch
(
error
:
any
)
{
if
(
error
.
errorFields
)
{
message
.
error
(
'请完善表单信息'
);
}
else
{
console
.
error
(
'转阅任务失败:'
,
error
);
message
.
error
(
error
.
message
||
'转阅任务失败'
);
}
}
finally
{
assiReadgning
.
value
=
false
;
}
};
defineExpose
({
defineExpose
({
iniData
,
iniData
,
...
...
zrch-risk-server-39/jeecg-module-system/jeecg-module-flowable/src/main/java/org/jeecg/modules/flowable/controller/FlowTaskController.java
浏览文件 @
daf1e3f7
...
@@ -270,4 +270,16 @@ public class FlowTaskController {
...
@@ -270,4 +270,16 @@ public class FlowTaskController {
return
flowTaskService
.
getMyTaskFlow
(
flowTaskVo
);
return
flowTaskService
.
getMyTaskFlow
(
flowTaskVo
);
}
}
@PostMapping
(
value
=
"/assignRead"
)
public
Result
assignRead
(
@RequestBody
FlowTaskVo
flowTaskVo
)
{
flowTaskService
.
assignReadTask
(
flowTaskVo
);
return
Result
.
OK
();
}
//待阅列表
@GetMapping
(
value
=
"/todoReadList"
)
public
Result
todoReadList
(
@RequestParam
Integer
pageNum
,
@RequestParam
Integer
pageSize
)
{
return
flowTaskService
.
todoReadList
(
pageNum
,
pageSize
);
}
}
}
zrch-risk-server-39/jeecg-module-system/jeecg-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IFlowTaskService.java
浏览文件 @
daf1e3f7
...
@@ -175,6 +175,8 @@ public interface IFlowTaskService {
...
@@ -175,6 +175,8 @@ public interface IFlowTaskService {
public
FlowNextDto
getFlowNodeType
(
String
taskId
);
public
FlowNextDto
getFlowNodeType
(
String
taskId
);
public
Result
flowFormAllData
(
String
deployId
,
String
taskId
);
public
Result
flowFormAllData
(
String
deployId
,
String
taskId
);
public
Result
getMyTaskFlow
(
FlowTaskVo
flowTaskVo
);
public
Result
getMyTaskFlow
(
FlowTaskVo
flowTaskVo
);
public
void
assignReadTask
(
FlowTaskVo
flowTaskVo
);
public
Result
todoReadList
(
Integer
pageNum
,
Integer
pageSize
)
;
...
...
zrch-risk-server-39/jeecg-module-system/jeecg-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
浏览文件 @
daf1e3f7
...
@@ -71,6 +71,7 @@ import org.springframework.stereotype.Service;
...
@@ -71,6 +71,7 @@ import org.springframework.stereotype.Service;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.io.InputStream
;
import
java.io.InputStream
;
import
java.math.BigInteger
;
import
java.nio.charset.StandardCharsets
;
import
java.nio.charset.StandardCharsets
;
import
java.text.SimpleDateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.*
;
...
@@ -1143,6 +1144,9 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
...
@@ -1143,6 +1144,9 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
ProcessDefinition
pd
=
repositoryService
.
createProcessDefinitionQuery
()
ProcessDefinition
pd
=
repositoryService
.
createProcessDefinitionQuery
()
.
processDefinitionId
(
hisIns
.
getProcessDefinitionId
())
.
processDefinitionId
(
hisIns
.
getProcessDefinitionId
())
.
singleResult
();
.
singleResult
();
if
(
pd
!=
null
)
{
flowTask
.
setDeployId
(
pd
.
getDeploymentId
());
flowTask
.
setDeployId
(
pd
.
getDeploymentId
());
flowTask
.
setProcDefName
(
pd
.
getName
());
flowTask
.
setProcDefName
(
pd
.
getName
());
flowTask
.
setProcDefVersion
(
pd
.
getVersion
());
flowTask
.
setProcDefVersion
(
pd
.
getVersion
());
...
@@ -1156,6 +1160,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
...
@@ -1156,6 +1160,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
List
<
HistoricTaskInstance
>
historicTaskInstance
=
historyService
.
createHistoricTaskInstanceQuery
().
processInstanceId
(
hisIns
.
getId
()).
orderByHistoricTaskInstanceEndTime
().
desc
().
list
();
List
<
HistoricTaskInstance
>
historicTaskInstance
=
historyService
.
createHistoricTaskInstanceQuery
().
processInstanceId
(
hisIns
.
getId
()).
orderByHistoricTaskInstanceEndTime
().
desc
().
list
();
flowTask
.
setTaskId
(
historicTaskInstance
.
get
(
0
).
getId
());
flowTask
.
setTaskId
(
historicTaskInstance
.
get
(
0
).
getId
());
}
}
}
flowList
.
add
(
flowTask
);
flowList
.
add
(
flowTask
);
}
}
page
.
setRecords
(
flowList
);
page
.
setRecords
(
flowList
);
...
@@ -1278,7 +1283,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
...
@@ -1278,7 +1283,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
// 获取用户所属的角色Ids
// 获取用户所属的角色Ids
List
<
String
>
userRoleIds
=
iFlowThirdService
.
getUserRoleIdsByUserId
(
userName
);
List
<
String
>
userRoleIds
=
iFlowThirdService
.
getUserRoleIdsByUserId
(
userName
);
// 方法1:使用任务候选用户查询(如果系统支持)
// 方法1:使用任务候选用户查询(如果系统支持)
TaskQuery
taskQuery
=
taskService
.
createTaskQuery
()
TaskQuery
taskQuery
=
taskService
.
createTaskQuery
()
.
active
()
.
active
()
...
@@ -2701,5 +2705,176 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
...
@@ -2701,5 +2705,176 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
}
}
/**
* 转办任务
*
* @param flowTaskVo 请求实体参数
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
assignReadTask
(
FlowTaskVo
flowTaskVo
)
{
SysUser
loginUser
=
iFlowThirdService
.
getLoginUser
();
// 1. (可选) 记录转办人,便于追溯。将原办理人记录在 Owner 字段中
taskService
.
setOwner
(
flowTaskVo
.
getTaskId
(),
loginUser
.
getId
());
if
(
flowTaskVo
.
getValues
()!=
null
){
if
(
flowTaskVo
.
getValues
().
get
(
"approvalType"
)!=
null
){
if
(
flowTaskVo
.
getValues
().
get
(
"approvalType"
).
toString
().
equals
(
"user"
)){
if
(
flowTaskVo
.
getValues
().
get
(
"targetUserId"
)!=
null
){
//目标用户
String
targetUserId
=
flowTaskVo
.
getValues
().
get
(
"targetUserId"
).
toString
();
SysUser
targetuser
=
iFlowThirdService
.
getUserByUserid
(
targetUserId
);
// 添加一个用户为任务的候选人,使其能在候选任务列表中看到该任务
//taskService.addCandidateUser(flowTaskVo.getTaskId(), targetUserId);
// 为任务添加一个“阅读者”身份链接
taskService
.
addUserIdentityLink
(
flowTaskVo
.
getTaskId
(),
targetUserId
,
"reader"
);
Date
date
=
new
Date
();
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
String
curdate
=
sdf
.
format
(
date
);
// 3. (可选) 添加一条评论或日志,记录这次转办动作
//taskService.addComment(flowTaskVo.getTaskId(), null, originalUserId + " 将任务转办给 " + targetUserId);
taskService
.
addComment
(
flowTaskVo
.
getTaskId
(),
flowTaskVo
.
getInstanceId
(),
curdate
+
loginUser
.
getRealname
()
+
" 将任务转阅给 "
+
targetuser
.
getRealname
());
}
}
else
{
}
}
}
}
/**
* 待阅任务列表
*
* @param pageNum 当前页码
* @param pageSize 每页条数
* @return
*/
@Override
public
Result
todoReadList
(
Integer
pageNum
,
Integer
pageSize
)
{
Page
<
FlowTaskDto
>
page
=
new
Page
<>();
String
userId
=
iFlowThirdService
.
getLoginUser
().
getId
();
String
userName
=
iFlowThirdService
.
getLoginUser
().
getUsername
();
// 获取用户所属的角色Ids
List
<
String
>
userRoleIds
=
iFlowThirdService
.
getUserRoleIdsByUserId
(
userName
);
// 构建 UNION 查询,包含 reader 类型
String
sql
=
"SELECT T.*, 'reader' AS TASK_TYPE_ FROM ACT_RU_TASK T "
+
" INNER JOIN ACT_RU_IDENTITYLINK L ON T.ID_ = L.TASK_ID_ "
+
" WHERE L.TYPE_ = 'reader' AND L.USER_ID_ = #{userId} "
+
" AND T.SUSPENSION_STATE_ = 1 "
+
"ORDER BY CREATE_TIME_ DESC"
;
// 统计总数的 SQL
String
countSql
=
"SELECT COUNT(*) FROM ("
+
" SELECT T.ID_ FROM ACT_RU_TASK T INNER JOIN ACT_RU_IDENTITYLINK L ON T.ID_ = L.TASK_ID_ "
+
" WHERE L.TYPE_ = 'reader' AND L.USER_ID_ = #{userId} AND T.SUSPENSION_STATE_ = 1"
+
") UNION_TASKS"
;
// 查询总数 - 返回 BigInteger
BigInteger
totalBigInt
=
(
BigInteger
)
taskService
.
createNativeTaskQuery
()
.
sql
(
countSql
)
.
parameter
(
"userId"
,
userId
)
.
singleResult
();
// 设置分页总数
long
total
=
totalBigInt
!=
null
?
totalBigInt
.
longValue
()
:
0L
;
page
.
setTotal
(
total
);
// 查询分页数据
List
<
Task
>
taskList
=
taskService
.
createNativeTaskQuery
()
.
sql
(
sql
)
.
parameter
(
"userId"
,
userId
)
.
listPage
((
pageNum
-
1
)
*
pageSize
,
pageSize
);
List
<
FlowTaskDto
>
flowList
=
new
ArrayList
<>();
for
(
Task
task
:
taskList
)
{
FlowTaskDto
flowTask
=
new
FlowTaskDto
();
// 当前流程信息
flowTask
.
setTaskId
(
task
.
getId
());
flowTask
.
setTaskDefKey
(
task
.
getTaskDefinitionKey
());
flowTask
.
setCreateTime
(
task
.
getCreateTime
());
flowTask
.
setProcDefId
(
task
.
getProcessDefinitionId
());
flowTask
.
setTaskName
(
task
.
getName
());
// 设置任务类型
/**
if (task.getAssignee() != null && task.getAssignee().equals(userId)) {
flowTask.setTaskType("assignee"); // 个人任务
} else {
flowTask.setTaskType("candidate"); // 候选任务
}
*/
flowTask
.
setTaskType
(
"reader"
);
// 转阅人/抄送人(自定义类型),只读权限,无需处理任务,仅用于信息同步
// 流程定义信息
ProcessDefinition
pd
=
repositoryService
.
createProcessDefinitionQuery
()
.
processDefinitionId
(
task
.
getProcessDefinitionId
())
.
singleResult
();
flowTask
.
setDeployId
(
pd
.
getDeploymentId
());
flowTask
.
setProcDefName
(
pd
.
getName
());
flowTask
.
setProcDefVersion
(
pd
.
getVersion
());
flowTask
.
setProcInsId
(
task
.
getProcessInstanceId
());
flowTask
.
setCategory
(
pd
.
getCategory
());
// 流程发起人信息
HistoricProcessInstance
historicProcessInstance
=
historyService
.
createHistoricProcessInstanceQuery
()
.
processInstanceId
(
task
.
getProcessInstanceId
())
.
singleResult
();
//SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId());
SysUser
startUser
=
iFlowThirdService
.
getUserByUserid
(
historicProcessInstance
.
getStartUserId
());
if
(
startUser
==
null
){
startUser
=
iFlowThirdService
.
getUserByUsername
(
historicProcessInstance
.
getStartUserId
());
}
List
<
String
>
departNamesByUsername
=
iFlowThirdService
.
getDepartNamesByUsername
(
historicProcessInstance
.
getStartUserId
());
if
(
departNamesByUsername
==
null
||(
departNamesByUsername
!=
null
&&
departNamesByUsername
.
size
()==
0
)){
departNamesByUsername
=
iFlowThirdService
.
getDepartNamesByUserId
(
historicProcessInstance
.
getStartUserId
());
}
flowTask
.
setStartUserId
(
startUser
.
getUsername
());
flowTask
.
setStartUserName
(
startUser
.
getRealname
());
flowTask
.
setStartDeptName
(
CollUtil
.
join
(
departNamesByUsername
,
","
));
//why add 2025-11-25 得到 dataId
// 1. 获取单个变量
String
executionId
=
task
.
getExecutionId
();
Object
variableValue
=
runtimeService
.
getVariable
(
executionId
,
"dataId"
);
if
(
variableValue
!=
null
){
Object
variableValueName
=
runtimeService
.
getVariable
(
executionId
,
"dataName"
);
flowTask
.
setDataId
(
variableValue
.
toString
());
flowTask
.
setDataName
(
variableValueName
.
toString
());
}
FlowNextDto
flowtDto
=
getFlowNodeType
(
task
.
getId
());
if
(
flowtDto
!=
null
){
flowTask
.
setNodeisApprove
(
flowtDto
.
isNodeisApprove
());
}
flowList
.
add
(
flowTask
);
}
page
.
setRecords
(
flowList
);
return
Result
.
OK
(
page
);
}
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论