yxk-20260710

首节点跳过的情况,允许用户写入审批意见
This commit is contained in:
ye1023
2026-07-10 15:13:22 +08:00
parent b2cddd6c10
commit 85e8688d29
4 changed files with 82 additions and 4 deletions
@@ -33,6 +33,7 @@ import java.util.Map;
public class TaskCreatedAutoSubmitListener implements TaskListener { public class TaskCreatedAutoSubmitListener implements TaskListener {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final String DEFAULT_START_APPROVAL_OPINION = "发起督办流程。";
private static ISysBaseAPI sysBaseAPI; private static ISysBaseAPI sysBaseAPI;
private static IExtActBpmLogService extActBpmLogService; private static IExtActBpmLogService extActBpmLogService;
protected static RuntimeService runtimeService; protected static RuntimeService runtimeService;
@@ -72,6 +73,7 @@ public class TaskCreatedAutoSubmitListener implements TaskListener {
} }
String applyUserId = (String)delegateTask.getVariable("applyUserId"); String applyUserId = (String)delegateTask.getVariable("applyUserId");
String startApprovalOpinion = resolveStartApprovalOpinion(delegateTask);
//设置任务处理人为发起人 //设置任务处理人为发起人
taskService.setAssignee(delegateTask.getId(), applyUserId); taskService.setAssignee(delegateTask.getId(), applyUserId);
//自动完成 //自动完成
@@ -79,7 +81,7 @@ public class TaskCreatedAutoSubmitListener implements TaskListener {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
//记录审批日志 //记录审批日志
String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()); String username = resolveUsername(applyUserId);
LoginUser user = sysBaseAPI.getUserByName(username); LoginUser user = sysBaseAPI.getUserByName(username);
String processInstanceId = delegateTask.getProcessInstanceId(); String processInstanceId = delegateTask.getProcessInstanceId();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
@@ -94,16 +96,39 @@ public class TaskCreatedAutoSubmitListener implements TaskListener {
bpmlog.setOpUserName(user.getRealname()); bpmlog.setOpUserName(user.getRealname());
} }
bpmlog.setProcInstId(processInstanceId); bpmlog.setProcInstId(processInstanceId);
bpmlog.setRemarks("系统自动完成"); bpmlog.setRemarks(startApprovalOpinion);
bpmlog.setTaskDefKey(delegateTask.getTaskDefinitionKey()); bpmlog.setTaskDefKey(delegateTask.getTaskDefinitionKey());
bpmlog.setTaskId(delegateTask.getId()); bpmlog.setTaskId(delegateTask.getId());
bpmlog.setTaskName(delegateTask.getName()); bpmlog.setTaskName(delegateTask.getName());
extActBpmLogService.save(bpmlog); extActBpmLogService.save(bpmlog);
// 首节点自动完成原本只写旧日志,这里同步补写新审批历史表用于页面展示。 // 首节点由系统自动推进,但审批历史按发起人的审批动作展示。
extActBpmLogService.saveSystemApprovalOpinion(bpmlog, delegateTask.getCreateTime()); extActBpmLogService.saveStartApprovalOpinion(bpmlog, delegateTask.getCreateTime());
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
} }
private String resolveStartApprovalOpinion(DelegateTask delegateTask) {
Object opinion = delegateTask.getVariable("startApprovalOpinion");
if (opinion != null) {
String text = String.valueOf(opinion).trim();
if (text.length() > 0) {
return text;
}
}
return DEFAULT_START_APPROVAL_OPINION;
}
private String resolveUsername(String applyUserId) {
try {
String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest());
if (username != null && username.trim().length() > 0) {
return username;
}
} catch (Exception ignored) {
// 周期任务等非 Web 请求场景没有 request/token,使用流程发起人兜底。
}
return applyUserId;
}
public RepositoryService getRepositoryService(){ public RepositoryService getRepositoryService(){
return SpringContextUtils.getBean(RepositoryService.class); return SpringContextUtils.getBean(RepositoryService.class);
} }
@@ -57,6 +57,14 @@ public interface IExtActBpmLogService extends IService<ExtActBpmLog> {
* @param startTime 任务创建时间 * @param startTime 任务创建时间
*/ */
void saveSystemApprovalOpinion(ExtActBpmLog bpmLog, Date startTime); void saveSystemApprovalOpinion(ExtActBpmLog bpmLog, Date startTime);
/**
* 将首节点自动完成的发起审批意见同步写入新审批历史表。
*
* @param bpmLog 旧审批日志
* @param startTime 任务创建时间
*/
void saveStartApprovalOpinion(ExtActBpmLog bpmLog, Date startTime);
/** /**
@@ -241,6 +241,36 @@ public class ExtActBpmLogServiceImpl extends ServiceImpl<ExtActBpmLogMapper, Ext
} }
} }
/**
* 首节点自动完成本质仍由系统推进,但业务上代表发起人提交审批。
*/
@Override
public void saveStartApprovalOpinion(ExtActBpmLog bpmLog, Date startTime) {
if (bpmLog == null) {
return;
}
try {
ProcessInstance processInstance = null;
if (oConvertUtils.isNotEmpty(bpmLog.getProcInstId())) {
processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(bpmLog.getProcInstId()).singleResult();
}
String username = bpmLog.getOpUserId();
LoginUser user = oConvertUtils.isNotEmpty(username) ? sysBaseAPI.getUserByName(username) : null;
ApprovalDeptInfo approvalDept = resolveCurrentApprovalDept(user, username);
saveTaskApprovalOpinion(bpmLog, processInstance, RECORD_TYPE_PROCESS,
ACTION_APPROVE, resolveActionResult(bpmLog.getRemarks(), ACTION_APPROVE),
startTime,
approvalDept.id,
approvalDept.name,
approvalDept.code);
} catch (Exception e) {
log.error("补写发起审批历史失败,已保留原 ext_act_bpm_log。procInstId={}, taskId={}",
bpmLog.getProcInstId(), bpmLog.getTaskId(), e);
}
}
/** /**
* 以旧表写入结果为准,新审批意见表只做尽力双写,失败不能影响办理主流程。 * 以旧表写入结果为准,新审批意见表只做尽力双写,失败不能影响办理主流程。
*/ */
@@ -732,6 +732,21 @@ public class ExtActProcessServiceImpl extends ServiceImpl<ExtActProcessMapper, E
dataForm = new HashMap<String, Object>(); dataForm = new HashMap<String, Object>();
} }
// 督办类发起弹窗传入的审批意见不落新字段,启动时提升为流程变量供首节点监听器读取。
if(oConvertUtils.isNotEmpty(jsonData)){
try {
Map<String, Object> submittedJsonData = JSONHelper.json2MapNoObj(jsonData);
if(submittedJsonData != null){
Object startApprovalOpinion = submittedJsonData.get("startApprovalOpinion");
if(oConvertUtils.isNotEmpty(startApprovalOpinion)){
dataForm.put("startApprovalOpinion", startApprovalOpinion);
}
}
} catch (Exception parseException) {
log.warn("解析流程发起 jsonData 中的审批意见失败,跳过。flowCode={}, id={}", flowCode, id, parseException);
}
}
dataForm.put(WorkFlowGlobals.BPM_DATA_ID, id); dataForm.put(WorkFlowGlobals.BPM_DATA_ID, id);
dataForm.put(WorkFlowGlobals.BPM_FORM_CONTENT_URL, formUrl); dataForm.put(WorkFlowGlobals.BPM_FORM_CONTENT_URL, formUrl);
if(oConvertUtils.isNotEmpty(formUrlMobile)){ if(oConvertUtils.isNotEmpty(formUrlMobile)){