From 09041d89f3cde35d3228fca4389206b06c9aaafa Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Thu, 16 Jul 2026 14:45:25 +0800 Subject: [PATCH] =?UTF-8?q?2026-07-16=20=E5=A2=9E=E5=8A=A0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=BC=82=E5=B8=B8=EF=BC=8C=E8=A7=A6=E5=8F=91=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E5=BE=85=E5=8A=9E=E8=A1=A5=E5=81=BF=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ChangeManagementServiceImpl.java | 353 ++++++++++-------- 1 file changed, 207 insertions(+), 146 deletions(-) diff --git a/src/main/java/com/spring/modules/change/service/impl/ChangeManagementServiceImpl.java b/src/main/java/com/spring/modules/change/service/impl/ChangeManagementServiceImpl.java index 1ca2cb78..5962d1bf 100644 --- a/src/main/java/com/spring/modules/change/service/impl/ChangeManagementServiceImpl.java +++ b/src/main/java/com/spring/modules/change/service/impl/ChangeManagementServiceImpl.java @@ -1306,36 +1306,41 @@ public class ChangeManagementServiceImpl extends ServiceImpl 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 createdTodoOaUsers = new ArrayList<>(); + try { // 调用获取最新节点ID的接口 String getWorkflowRequestURL = apiUrlOa + "/oa/interface/getWorkflowRequest"; ResponseData getWorkflowRequestResponses = HttpClientUtil.doPostByRawWithOA(getWorkflowRequestURL, requestOperatorInfoParam); @@ -1775,11 +1782,8 @@ public class ChangeManagementServiceImpl extends ServiceImpl 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 dcas = new HashMap<>(); - int stepId = changeManagementMapper.getStepId(paramData.getClassificationNo(), String.valueOf(isRemarks.get(0).get("nodeid")), paramData.getSite()); - paramData.setStepId(stepId); - for (Map isRemark : isRemarks) { - // 根据 userId 调用获取人员信息接口获得域控账号 - // 根据oa人员id获取域控账号 - List accounts = sysUserDao.selectAccountByOaId(String.valueOf(isRemark.get("userid"))); - if (accounts.isEmpty()) { - throw new RuntimeException("未获取到OA人员对应的域控账号!"); + List createdTodoOaUsers = new ArrayList<>(); + try { + if (isRemarks.isEmpty()) { // 已结束 + // 反刷单据状态为 "已完成" + paramData.setStatus("已完成"); + // 查最后一个节点的stepId + List 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 dcas = new HashMap<>(); + int stepId = changeManagementMapper.getStepId(paramData.getClassificationNo(), String.valueOf(isRemarks.get(0).get("nodeid")), paramData.getSite()); + paramData.setStepId(stepId); + for (Map isRemark : isRemarks) { + // 根据 userId 调用获取人员信息接口获得域控账号 + // 根据oa人员id获取域控账号 + List 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()); + // 根据 site、bu、requestId 得到序号 + 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()); - // 根据 site、bu、requestId 得到序号 - 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 createdTodoOaUsers, String callMethod, String callScene) { + if (createdTodoOaUsers == null || createdTodoOaUsers.isEmpty()) { + return; + } + + Set 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待办并记录接口调用日志(无论成功失败都不影响主流程) */