提交 a6ac3515 authored 作者: kxjia's avatar kxjia

合并代码

...@@ -168,6 +168,29 @@ export function todoListAll() { ...@@ -168,6 +168,29 @@ export function todoListAll() {
}) })
} }
// 转办任务 why 2026-4-7 add
export function assign(data) {
return defHttp.post({
url: '/flowable/task/assign',
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
})
}
......
...@@ -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,
......
...@@ -276,4 +276,16 @@ public class FlowTaskController { ...@@ -276,4 +276,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);
}
} }
...@@ -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) ;
public Result<List<String>> todoListAll(); public Result<List<String>> todoListAll();
......
...@@ -470,7 +470,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFl ...@@ -470,7 +470,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFl
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult(); Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult();
result.put("deployId", DeployId); result.put("deployId", DeployId);
result.put("taskId", task.getId()); result.put("taskId", task.getId());
result.put("procInsId", task.getProcessDefinitionId()); result.put("procInsId", task.getProcessInstanceId());
result.put("executionId", task.getExecutionId()); result.put("executionId", task.getExecutionId());
result.put("instanceId", task.getProcessInstanceId()); result.put("instanceId", task.getProcessInstanceId());
...@@ -603,6 +603,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFl ...@@ -603,6 +603,7 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFl
e.printStackTrace(); e.printStackTrace();
return Result.error("流程启动错误"); return Result.error("流程启动错误");
} }
} }
......
...@@ -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);
...@@ -1302,7 +1307,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask ...@@ -1302,7 +1307,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()
...@@ -2183,7 +2187,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask ...@@ -2183,7 +2187,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
.processInstanceId(procInsId) .processInstanceId(procInsId)
.orderByHistoricTaskInstanceStartTime().asc() .orderByHistoricTaskInstanceStartTime().asc()
.list(); .list();
String urlquerystr=""; String urlquerystr = "";
// 1. 获取历史活动实例 // 1. 获取历史活动实例
List<HistoricActivityInstance> activities = historyService List<HistoricActivityInstance> activities = historyService
.createHistoricActivityInstanceQuery() .createHistoricActivityInstanceQuery()
...@@ -2197,6 +2201,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask ...@@ -2197,6 +2201,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
.createHistoricProcessInstanceQuery() .createHistoricProcessInstanceQuery()
.processInstanceId(procInsId) .processInstanceId(procInsId)
.singleResult(); .singleResult();
if(historicProcessInstance!=null){
BpmnModel bpmnModel = repositoryService BpmnModel bpmnModel = repositoryService
.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); .getBpmnModel(historicProcessInstance.getProcessDefinitionId());
...@@ -2210,9 +2215,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask ...@@ -2210,9 +2215,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
UserTask userTask = (UserTask) flowElement; UserTask userTask = (UserTask) flowElement;
// 获取任务实例信息(如果有) // 获取任务实例信息(如果有)
if (activity.getTaskId() != null) { if (activity.getTaskId() != null) {
HistoricTaskInstance task = historyService HistoricTaskInstance task = historyService
...@@ -2224,25 +2226,25 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask ...@@ -2224,25 +2226,25 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
// 获取流程变量 // 获取流程变量
Map<String, Object> formValues = getProcessVariables(task.getId()); Map<String, Object> formValues = getProcessVariables(task.getId());
if(formValues!=null){ if (formValues != null) {
// 获取流程变量 // 获取流程变量
String formUrlparval=""; String formUrlparval = "";
String formUrlpar=""; String formUrlpar = "";
if(formValues.get("dataId")==null){ if (formValues.get("dataId") == null) {
if(formValues.get("_value")!=null){ if (formValues.get("_value") != null) {
Map zdv=(Map)formValues.get("_value"); Map zdv = (Map) formValues.get("_value");
formUrlpar=(String)zdv.get("dataName"); formUrlpar = (String) zdv.get("dataName");
formUrlparval=zdv.get("dataId").toString(); formUrlparval = zdv.get("dataId").toString();
} }
}else{ } else {
formUrlparval=formValues.get("dataId").toString(); formUrlparval = formValues.get("dataId").toString();
formUrlpar=formValues.get("dataName").toString(); formUrlpar = formValues.get("dataName").toString();
} }
urlquerystr=formUrlpar+"="+formUrlparval; urlquerystr = formUrlpar + "=" + formUrlparval;
break; break;
} }
...@@ -2253,6 +2255,8 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask ...@@ -2253,6 +2255,8 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
} }
} }
}
...@@ -2725,5 +2729,176 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask ...@@ -2725,5 +2729,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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论