Browse Source

2026-07-16

增加流程异常,触发统一待办补偿删除
master
fengyuan_yang 2 weeks ago
parent
commit
09041d89f3
  1. 353
      src/main/java/com/spring/modules/change/service/impl/ChangeManagementServiceImpl.java

353
src/main/java/com/spring/modules/change/service/impl/ChangeManagementServiceImpl.java

@ -1306,36 +1306,41 @@ public class ChangeManagementServiceImpl extends ServiceImpl<ChangeManagementMap
// 通过函数获取流程标题 2024-12-25 // 通过函数获取流程标题 2024-12-25
String requestName = changeManagementMapper.getRequestNameByFunction(paramData.getSite(), paramData.getClassificationNo(), paramData.getWorkflowId(), paramData.getWorkflowName(), paramData.getNodeId(), paramData.getNodeName(), paramData.getDocNo(), "", paramData.getUserName(), DateUtils.getStringNow(), "", paramData.getMenuName(), "下达"); String requestName = changeManagementMapper.getRequestNameByFunction(paramData.getSite(), paramData.getClassificationNo(), paramData.getWorkflowId(), paramData.getWorkflowName(), paramData.getNodeId(), paramData.getNodeName(), paramData.getDocNo(), "", paramData.getUserName(), DateUtils.getStringNow(), "", paramData.getMenuName(), "下达");
// 统一待办接口
for (String key : dcas.keySet()) {
// 创建单点登录地址
String url = loginTokenUrl + "?dca=" + key + "&token=" + dcas.get(key).split("#")[0] + "&site=" + paramData.getSite() + "&path=" + paramData.getPath() + "&docNo=" + paramData.getDocNo();
ReceiveRequestInfoParam receiveRequestInfoParam = new ReceiveRequestInfoParam(
paramData.getUserId(),
"PLM",
paramData.getWorkflowId() + paramData.getRequestId(),
requestName,
paramData.getWorkflowName(),
String.valueOf(isRemarks.get(0).get("nodeName")),
url,
"0",
"0",
paramData.getUserId(),
DateUtils.getStringNow(),
dcas.get(key).split("#")[1],
DateUtils.getStringNow(),
String.valueOf(new Date().getTime()));
String receiveRequestInfoURL = apiUrlOa + "/oa/interface/receiveRequestInfoByJson";
ResponseData receiveRequestInfoResponse = HttpClientUtil.doPostByRawWithOA(receiveRequestInfoURL, receiveRequestInfoParam);
if (!"0".equals(receiveRequestInfoResponse.getCode())) {
throw new RuntimeException("统一待办异常信息:" + receiveRequestInfoResponse.getMsg());
List<String> createdTodoOaUsers = new ArrayList<>();
try {
// 统一待办接口
for (String key : dcas.keySet()) {
String oaUserId = dcas.get(key).split("#")[1];
// 创建单点登录地址
String url = loginTokenUrl + "?dca=" + key + "&token=" + dcas.get(key).split("#")[0] + "&site=" + paramData.getSite() + "&path=" + paramData.getPath() + "&docNo=" + paramData.getDocNo();
ReceiveRequestInfoParam receiveRequestInfoParam = new ReceiveRequestInfoParam(
paramData.getUserId(),
"PLM",
paramData.getWorkflowId() + paramData.getRequestId(),
requestName,
paramData.getWorkflowName(),
String.valueOf(isRemarks.get(0).get("nodeName")),
url,
"0",
"0",
paramData.getUserId(),
DateUtils.getStringNow(),
oaUserId,
DateUtils.getStringNow(),
String.valueOf(new Date().getTime()));
invokeReceiveRequestInfo(receiveRequestInfoParam);
createdTodoOaUsers.add(oaUserId);
} }
}
// 将第一个节点记录修改为同意
paramData.setStepId(10);
paramData.setBu(paramData.getBu() == null ? "" : paramData.getBu());
changeManagementMapper.updateProcessFormToAgree(paramData);
// 将第一个节点记录修改为同意
paramData.setStepId(10);
paramData.setBu(paramData.getBu() == null ? "" : paramData.getBu());
changeManagementMapper.updateProcessFormToAgree(paramData);
} catch (Exception e) {
cleanupReceiveRequestInfoOnException(paramData, type, paramData.getWorkflowId(), paramData.getRequestId(),
createdTodoOaUsers, "issueFunction", "after-receive-exception");
throw e;
}
} }
/** /**
@ -1728,6 +1733,8 @@ public class ChangeManagementServiceImpl extends ServiceImpl<ChangeManagementMap
} }
} }
} else { // 未结束 } else { // 未结束
List<String> createdTodoOaUsers = new ArrayList<>();
try {
// 调用获取最新节点ID的接口 // 调用获取最新节点ID的接口
String getWorkflowRequestURL = apiUrlOa + "/oa/interface/getWorkflowRequest"; String getWorkflowRequestURL = apiUrlOa + "/oa/interface/getWorkflowRequest";
ResponseData getWorkflowRequestResponses = HttpClientUtil.doPostByRawWithOA(getWorkflowRequestURL, requestOperatorInfoParam); ResponseData getWorkflowRequestResponses = HttpClientUtil.doPostByRawWithOA(getWorkflowRequestURL, requestOperatorInfoParam);
@ -1775,11 +1782,8 @@ public class ChangeManagementServiceImpl extends ServiceImpl<ChangeManagementMap
paramData.getUserId(), paramData.getUserId(),
DateUtils.getStringNow(), DateUtils.getStringNow(),
String.valueOf(new Date().getTime())); String.valueOf(new Date().getTime()));
String receiveRequestInfoURL = apiUrlOa + "/oa/interface/receiveRequestInfoByJson";
ResponseData receiveRequestInfoResponse = HttpClientUtil.doPostByRawWithOA(receiveRequestInfoURL, receiveRequestInfoParam);
if (!"0".equals(receiveRequestInfoResponse.getCode())) {
throw new RuntimeException("统一待办异常信息:" + receiveRequestInfoResponse.getMsg());
}
invokeReceiveRequestInfo(receiveRequestInfoParam);
createdTodoOaUsers.add(paramData.getUserId());
// 如果没有isRemark = 0的则return // 如果没有isRemark = 0的则return
if (isRemarks.isEmpty()) { if (isRemarks.isEmpty()) {
return; return;
@ -1947,6 +1951,7 @@ public class ChangeManagementServiceImpl extends ServiceImpl<ChangeManagementMap
// 9统一待办接口 // 9统一待办接口
for (String key : dcas.keySet()) { for (String key : dcas.keySet()) {
String oaUserId = dcas.get(key).split("#")[1];
// 创建单点登录地址 // 创建单点登录地址
String url = loginTokenUrl + "?dca=" + key + "&token=" + dcas.get(key).split("#")[0] + "&site=" + paramData.getSite() + "&path=" + paramData.getPath() + "&docNo=" + paramData.getDocNo(); String url = loginTokenUrl + "?dca=" + key + "&token=" + dcas.get(key).split("#")[0] + "&site=" + paramData.getSite() + "&path=" + paramData.getPath() + "&docNo=" + paramData.getDocNo();
ReceiveRequestInfoParam receiveRequestInfoParam = new ReceiveRequestInfoParam( ReceiveRequestInfoParam receiveRequestInfoParam = new ReceiveRequestInfoParam(
@ -1961,14 +1966,16 @@ public class ChangeManagementServiceImpl extends ServiceImpl<ChangeManagementMap
"0", "0",
paramData.getUserId(), paramData.getUserId(),
DateUtils.getStringNow(), DateUtils.getStringNow(),
dcas.get(key).split("#")[1],
oaUserId,
DateUtils.getStringNow(), DateUtils.getStringNow(),
String.valueOf(new Date().getTime())); String.valueOf(new Date().getTime()));
String receiveRequestInfoURL = apiUrlOa + "/oa/interface/receiveRequestInfoByJson";
ResponseData receiveRequestInfoResponse = HttpClientUtil.doPostByRawWithOA(receiveRequestInfoURL, receiveRequestInfoParam);
if (!"0".equals(receiveRequestInfoResponse.getCode())) {
throw new RuntimeException("统一待办异常信息:" + receiveRequestInfoResponse.getMsg());
}
invokeReceiveRequestInfo(receiveRequestInfoParam);
createdTodoOaUsers.add(oaUserId);
}
} catch (Exception e) {
cleanupReceiveRequestInfoOnException(paramData, type, paramData.getWorkflowId(), paramData.getRequestId(),
createdTodoOaUsers, "agreeFunction", "after-receive-exception");
throw asRuntimeException(e);
} }
} }
@ -2033,121 +2040,126 @@ public class ChangeManagementServiceImpl extends ServiceImpl<ChangeManagementMap
changeManagementMapper.updateProcessForm3(paramData); changeManagementMapper.updateProcessForm3(paramData);
} }
if (isRemarks.isEmpty()) { // 已结束
// 反刷单据状态为 "已完成"
paramData.setStatus("已完成");
// 查最后一个节点的stepId
List<PlmRequestDetailVo> nodeDetailLast = changeManagementMapper.queryNodeDetailLast(paramData.getSite(), paramData.getClassificationNo(), paramData.getWorkflowId());
paramData.setStepId(nodeDetailLast.get(0).getStepId());
changeManagementMapper.updateChangeStatus2(paramData);
// 2025-05-13 删除异构系统指定人员待办流程异常信息
for (OaUserData oaUser : oaUserList) {
deleteUserRequestInfoWithLog(
paramData.getSite(),
paramData.getDocNo(),
type,
paramData.getWorkflowId(),
paramData.getRequestId(),
oaUser.getId(),
"rejectFunction",
"finish",
paramData.getUserName()
);
}
} else { // 未结束
// 存放isRemark为0的域控账号
Map<String, String> dcas = new HashMap<>();
int stepId = changeManagementMapper.getStepId(paramData.getClassificationNo(), String.valueOf(isRemarks.get(0).get("nodeid")), paramData.getSite());
paramData.setStepId(stepId);
for (Map<String, Object> isRemark : isRemarks) {
// 根据 userId 调用获取人员信息接口获得域控账号
// 根据oa人员id获取域控账号
List<OaUserData> accounts = sysUserDao.selectAccountByOaId(String.valueOf(isRemark.get("userid")));
if (accounts.isEmpty()) {
throw new RuntimeException("未获取到OA人员对应的域控账号!");
List<String> createdTodoOaUsers = new ArrayList<>();
try {
if (isRemarks.isEmpty()) { // 已结束
// 反刷单据状态为 "已完成"
paramData.setStatus("已完成");
// 查最后一个节点的stepId
List<PlmRequestDetailVo> nodeDetailLast = changeManagementMapper.queryNodeDetailLast(paramData.getSite(), paramData.getClassificationNo(), paramData.getWorkflowId());
paramData.setStepId(nodeDetailLast.get(0).getStepId());
changeManagementMapper.updateChangeStatus2(paramData);
// 2025-05-13 删除异构系统指定人员待办流程异常信息
for (OaUserData oaUser : oaUserList) {
deleteUserRequestInfoWithLog(
paramData.getSite(),
paramData.getDocNo(),
type,
paramData.getWorkflowId(),
paramData.getRequestId(),
oaUser.getId(),
"rejectFunction",
"finish",
paramData.getUserName()
);
} }
// 域控账号
isRemark.put("domainControlAccount", accounts.get(0).getLoginId());
// 节点名称
String nodeName = changeManagementMapper.getNodeName(paramData.getSite(), paramData.getClassificationNo(), String.valueOf(isRemark.get("nodeid")));
isRemark.put("nodeName", nodeName);
try { // 域控账号和token
dcas.put(String.valueOf(accounts.get(0).getLoginId()), AESUtil.encrypt(String.valueOf(accounts.get(0).getLoginId())) + "#" + isRemark.get("userid"));
} catch (Exception e) {
logger.info(e.getMessage());
} else { // 未结束
// 存放isRemark为0的域控账号
Map<String, String> dcas = new HashMap<>();
int stepId = changeManagementMapper.getStepId(paramData.getClassificationNo(), String.valueOf(isRemarks.get(0).get("nodeid")), paramData.getSite());
paramData.setStepId(stepId);
for (Map<String, Object> isRemark : isRemarks) {
// 根据 userId 调用获取人员信息接口获得域控账号
// 根据oa人员id获取域控账号
List<OaUserData> accounts = sysUserDao.selectAccountByOaId(String.valueOf(isRemark.get("userid")));
if (accounts.isEmpty()) {
throw new RuntimeException("未获取到OA人员对应的域控账号!");
}
// 域控账号
isRemark.put("domainControlAccount", accounts.get(0).getLoginId());
// 节点名称
String nodeName = changeManagementMapper.getNodeName(paramData.getSite(), paramData.getClassificationNo(), String.valueOf(isRemark.get("nodeid")));
isRemark.put("nodeName", nodeName);
try { // 域控账号和token
dcas.put(String.valueOf(accounts.get(0).getLoginId()), AESUtil.encrypt(String.valueOf(accounts.get(0).getLoginId())) + "#" + isRemark.get("userid"));
} catch (Exception e) {
logger.info(e.getMessage());
}
// 新增流程单据表
ProcessFormEntity processFormEntity = new ProcessFormEntity();
processFormEntity.setSite(paramData.getSite());
processFormEntity.setBu("");
processFormEntity.setRequestId(paramData.getRequestId());
processFormEntity.setWorkflowId(paramData.getWorkflowId());
processFormEntity.setNodeId(String.valueOf(isRemark.get("nodeid")));
processFormEntity.setDomainControlAccount(String.valueOf(accounts.get(0).getLoginId()));
processFormEntity.setDocumentNo(paramData.getDocNo());
processFormEntity.setDocumentType(type);
processFormEntity.setCreateBy(paramData.getUserName());
processFormEntity.setIsRemark(0);
processFormEntity.setClassificationNo(paramData.getClassificationNo());
processFormEntity.setMenuId(paramData.getMenuId());
// 根据 siteburequestId 得到序号
int seqNo = changeManagementMapper.getSeqNo(processFormEntity);
processFormEntity.setSeqNo(seqNo);
processFormEntity.setStepId(stepId);
processFormEntity.setRejectNodeId(processForm.getNodeId());
changeManagementMapper.saveProcessForm(processFormEntity);
} }
// 新增流程单据表
ProcessFormEntity processFormEntity = new ProcessFormEntity();
processFormEntity.setSite(paramData.getSite());
processFormEntity.setBu("");
processFormEntity.setRequestId(paramData.getRequestId());
processFormEntity.setWorkflowId(paramData.getWorkflowId());
processFormEntity.setNodeId(String.valueOf(isRemark.get("nodeid")));
processFormEntity.setDomainControlAccount(String.valueOf(accounts.get(0).getLoginId()));
processFormEntity.setDocumentNo(paramData.getDocNo());
processFormEntity.setDocumentType(type);
processFormEntity.setCreateBy(paramData.getUserName());
processFormEntity.setIsRemark(0);
processFormEntity.setClassificationNo(paramData.getClassificationNo());
processFormEntity.setMenuId(paramData.getMenuId());
// 根据 siteburequestId 得到序号
int seqNo = changeManagementMapper.getSeqNo(processFormEntity);
processFormEntity.setSeqNo(seqNo);
processFormEntity.setStepId(stepId);
processFormEntity.setRejectNodeId(processForm.getNodeId());
changeManagementMapper.saveProcessForm(processFormEntity);
}
// 修改该变更单的 stepId
changeManagementMapper.updateStepId2(paramData);
// 修改该变更单的 stepId
changeManagementMapper.updateStepId2(paramData);
// 通过函数获取流程标题 2024-12-25
String requestName = changeManagementMapper.getRequestNameByFunction(paramData.getSite(), paramData.getClassificationNo(), paramData.getWorkflowId(), paramData.getWorkflowName(), paramData.getNodeId(), paramData.getNodeName(), paramData.getDocNo(), "N", paramData.getUserName(), DateUtils.getStringNow(), paramData.getRejectOpinion(), paramData.getMenuName(), "提交");
// 通过函数获取流程标题 2024-12-25
String requestName = changeManagementMapper.getRequestNameByFunction(paramData.getSite(), paramData.getClassificationNo(), paramData.getWorkflowId(), paramData.getWorkflowName(), paramData.getNodeId(), paramData.getNodeName(), paramData.getDocNo(), "N", paramData.getUserName(), DateUtils.getStringNow(), paramData.getRejectOpinion(), paramData.getMenuName(), "提交");
for (OaUserData oaUser : oaUserList) {
deleteUserRequestInfoWithLog(
paramData.getSite(),
paramData.getDocNo(),
type,
paramData.getWorkflowId(),
paramData.getRequestId(),
oaUser.getId(),
"rejectFunction",
"before-send",
paramData.getUserName()
);
}
for (OaUserData oaUser : oaUserList) {
deleteUserRequestInfoWithLog(
paramData.getSite(),
paramData.getDocNo(),
type,
paramData.getWorkflowId(),
paramData.getRequestId(),
oaUser.getId(),
"rejectFunction",
"before-send",
paramData.getUserName()
);
}
// 9统一待办接口
for (String key : dcas.keySet()) {
// 创建单点登录地址
String url = loginTokenUrl + "?dca=" + key + "&token=" + dcas.get(key).split("#")[0] + "&site=" + paramData.getSite() + "&path=" + paramData.getPath() + "&docNo=" + paramData.getDocNo();
ReceiveRequestInfoParam receiveRequestInfoParam = new ReceiveRequestInfoParam(
paramData.getUserId(),
"PLM",
paramData.getWorkflowId() + paramData.getRequestId(),
requestName,
paramData.getWorkflowName(),
String.valueOf(isRemarks.get(0).get("nodeName")),
url,
"0",
"0",
paramData.getUserId(),
DateUtils.getStringNow(),
dcas.get(key).split("#")[1],
DateUtils.getStringNow(),
String.valueOf(new Date().getTime()));
String receiveRequestInfoURL = apiUrlOa + "/oa/interface/receiveRequestInfoByJson";
ResponseData receiveRequestInfoResponse = HttpClientUtil.doPostByRawWithOA(receiveRequestInfoURL, receiveRequestInfoParam);
if (!"0".equals(receiveRequestInfoResponse.getCode())) {
throw new RuntimeException("统一待办异常信息:" + receiveRequestInfoResponse.getMsg());
// 9统一待办接口
for (String key : dcas.keySet()) {
String oaUserId = dcas.get(key).split("#")[1];
// 创建单点登录地址
String url = loginTokenUrl + "?dca=" + key + "&token=" + dcas.get(key).split("#")[0] + "&site=" + paramData.getSite() + "&path=" + paramData.getPath() + "&docNo=" + paramData.getDocNo();
ReceiveRequestInfoParam receiveRequestInfoParam = new ReceiveRequestInfoParam(
paramData.getUserId(),
"PLM",
paramData.getWorkflowId() + paramData.getRequestId(),
requestName,
paramData.getWorkflowName(),
String.valueOf(isRemarks.get(0).get("nodeName")),
url,
"0",
"0",
paramData.getUserId(),
DateUtils.getStringNow(),
oaUserId,
DateUtils.getStringNow(),
String.valueOf(new Date().getTime()));
invokeReceiveRequestInfo(receiveRequestInfoParam);
createdTodoOaUsers.add(oaUserId);
} }
} }
}
// 2025-12-03 ECN驳回申请要修改提交和会签标识为N时间置空
if ("ECN".equals(type)) {
changeManagementMapper.updateChangeItemForReject(paramData.getSite(), paramData.getDocNo());
changeManagementMapper.updateChangeCountersignatureItemForReject(paramData.getSite(), paramData.getDocNo());
// 2025-12-03 ECN驳回申请要修改提交和会签标识为N时间置空
if ("ECN".equals(type)) {
changeManagementMapper.updateChangeItemForReject(paramData.getSite(), paramData.getDocNo());
changeManagementMapper.updateChangeCountersignatureItemForReject(paramData.getSite(), paramData.getDocNo());
}
} catch (Exception e) {
cleanupReceiveRequestInfoOnException(paramData, type, paramData.getWorkflowId(), paramData.getRequestId(),
createdTodoOaUsers, "rejectFunction", "after-receive-exception");
throw asRuntimeException(e);
} }
} }
@ -2648,6 +2660,55 @@ public class ChangeManagementServiceImpl extends ServiceImpl<ChangeManagementMap
} }
} }
private void invokeReceiveRequestInfo(ReceiveRequestInfoParam receiveRequestInfoParam) {
String receiveRequestInfoURL = apiUrlOa + "/oa/interface/receiveRequestInfoByJson";
ResponseData receiveRequestInfoResponse = HttpClientUtil.doPostByRawWithOA(receiveRequestInfoURL, receiveRequestInfoParam);
if (!"0".equals(receiveRequestInfoResponse.getCode())) {
throw new RuntimeException("统一待办异常信息:" + receiveRequestInfoResponse.getMsg());
}
}
/**
* receiveRequestInfoByJson 调用成功后如果后续逻辑异常补偿删除统一待办避免脏数据
*/
private void cleanupReceiveRequestInfoOnException(ParamData paramData, String documentType, String workflowId, String requestId,
Collection<String> createdTodoOaUsers, String callMethod, String callScene) {
if (createdTodoOaUsers == null || createdTodoOaUsers.isEmpty()) {
return;
}
Set<String> userIds = createdTodoOaUsers.stream()
.filter(StringUtils::isNotBlank)
.collect(Collectors.toCollection(LinkedHashSet::new));
if (userIds.isEmpty()) {
return;
}
logger.warn("{}流程异常,触发统一待办补偿删除, site={}, documentNo={}, flowId={}, userCount={}",
callMethod, paramData.getSite(), paramData.getDocNo(),
StringUtils.defaultString(workflowId) + StringUtils.defaultString(requestId), userIds.size());
for (String oaUserId : userIds) {
deleteUserRequestInfoWithLog(
paramData.getSite(),
paramData.getDocNo(),
documentType,
workflowId,
requestId,
oaUserId,
callMethod,
callScene,
paramData.getUserName()
);
}
}
private RuntimeException asRuntimeException(Exception e) {
if (e instanceof RuntimeException) {
return (RuntimeException) e;
}
return new RuntimeException(e);
}
/** /**
* 删除OA待办并记录接口调用日志无论成功失败都不影响主流程 * 删除OA待办并记录接口调用日志无论成功失败都不影响主流程
*/ */

Loading…
Cancel
Save