diff --git a/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java b/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java index 6f83dd9f..5566fe9a 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/process/controller/BusinessProcessController.java @@ -60,6 +60,13 @@ public class BusinessProcessController extends BladeController { return R.data(businessProcessService.processSubmit(param)); } + @GetMapping("/hasMkProcessInstance") + @ApiOperationSupport(order = 8) + @Operation(summary = "查询MK流程实例是否存在", description = "传入业务id(formInstanceId),有数据则无需删除/重新提交") + public R hasMkProcessInstance(@Valid @NotBlank(message = "业务id不能为空") String bizId) { + return R.data(businessProcessService.hasMkProcessInstance(bizId)); + } + @PostMapping("/processDelete") @ApiOperationSupport(order = 7) public R processDelete(@RequestBody MKProcessCreateDTO param) { diff --git a/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java b/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java index e3b7834a..fd25cbb5 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/process/service/IBusinessProcessService.java @@ -34,6 +34,14 @@ public interface IBusinessProcessService extends IService { */ String processSubmit(MKProcessCreateDTO param); + /** + * 按业务 id 查询 MK 流程实例是否仍有数据(本地有 processInstanceId 且 MK getProcessInfo 有返回) + * + * @param bizId 业务 id(如客商 id / formInstanceId) + * @return true=流程实例仍存在 + */ + boolean hasMkProcessInstance(String bizId); + /** * 按业务表单实例 id 删除 MK 流程(不删除本地业务流程记录,供驳回后重新提交使用) * diff --git a/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java index 088c83d5..fe45212a 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/process/service/impl/BusinessProcessServiceImpl.java @@ -137,6 +137,35 @@ public class BusinessProcessServiceImpl extends ServiceImpllambdaQuery() + .eq(BusinessProcess::getBizId, bizId) + ); + // 已有流程实例且 MK 仍能查到详情时,不再删除、不再重新创建提交 + if (businessProcess != null && StringUtil.isNotBlank(businessProcess.getProcessInstanceId())) { + String existingProcessInstanceId = businessProcess.getProcessInstanceId(); + Object existingProcessInfo = this.getProcessInfo(existingProcessInstanceId, loginName); + if (hasProcessInfoData(existingProcessInfo)) { + log.info("MK流程实例已存在,跳过创建并提交流程 formInstanceId={} processInstanceId={}", + param.getFormInstanceId(), existingProcessInstanceId); + businessProcess.setApproveStatus(ApproveStatusEnum.APPROVING.getValue()); + if (StringUtil.isNotBlank(param.getSubject())) { + businessProcess.setSubject(param.getSubject()); + } + businessProcess.setPromoterLoginName(loginName); + this.updateById(businessProcess); + this.getCurrentNodes(existingProcessInstanceId, loginName); + this.syncBizFromProcessInfo(bizType, param.getFormInstanceId(), existingProcessInfo); + return existingProcessInstanceId; + } + } + MKProcessCreateDTO mkParam = new MKProcessCreateDTO(); mkParam.setFormInstanceId(param.getFormInstanceId()); mkParam.setSubject(param.getSubject()); @@ -149,15 +178,6 @@ public class BusinessProcessServiceImpl extends ServiceImpllambdaQuery() - .eq(BusinessProcess::getBizId, bizId) - ); if (businessProcess == null) { businessProcess = new BusinessProcess(); businessProcess.setBizId(bizId); @@ -186,6 +206,54 @@ public class BusinessProcessServiceImpl extends ServiceImpllambdaQuery() + .eq(BusinessProcess::getBizId, id) + .last("limit 1") + ); + if (businessProcess == null || StringUtil.isBlank(businessProcess.getProcessInstanceId())) { + return false; + } + String loginName = businessProcess.getPromoterLoginName(); + if (StringUtil.isBlank(loginName)) { + loginName = resolveCurrentUserPhone(); + } + if (StringUtil.isBlank(loginName)) { + log.warn("查询MK流程实例跳过,登录名为空 bizId={} processInstanceId={}", + bizId, businessProcess.getProcessInstanceId()); + return false; + } + Object processInfo = this.getProcessInfo(businessProcess.getProcessInstanceId(), loginName); + return hasProcessInfoData(processInfo); + } + + /** + * MK getProcessInfo 是否返回有效数据 + */ + private boolean hasProcessInfoData(Object processInfo) { + if (processInfo == null) { + return false; + } + if (processInfo instanceof Map map) { + return !map.isEmpty(); + } + if (processInfo instanceof Collection collection) { + return !collection.isEmpty(); + } + if (processInfo instanceof CharSequence text) { + return StringUtil.isNotBlank(text.toString()); + } + return true; + } + @Transactional(rollbackFor = Exception.class) @Override public boolean processDelete(String formInstanceId) { @@ -358,17 +426,20 @@ public class BusinessProcessServiceImpl extends ServiceImpl implement @Override public void decryptPhone(IPhone user) { -// if (user == null) { -// return; -// } -// if (user.getPhone() != null && user.getPhone().length() > 20) { -// user.setPhone(SM2Util.decrypt(user.getPhone(), properties.getPublicKey(), properties.getPrivateKey())); -// } + if (user == null) { + return; + } + if (user.getPhone() != null && user.getPhone().length() > 20) { + user.setPhone(SM2Util.decrypt(user.getPhone(), properties.getPublicKey(), properties.getPrivateKey())); + } } @Override public void encryptPhone(IPhone user) { -// if (user == null) { -// return; -// } -// if(StringUtil.isNotBlank(user.getPhone())) { -// user.setPhone(Hex.toHexString(SM2Util.encrypt(user.getPhone(),properties.getPublicKey()))); -// } + if (user == null) { + return; + } + if (StringUtil.isNotBlank(user.getPhone())) { + user.setPhone(Hex.toHexString(SM2Util.encrypt(user.getPhone(), properties.getPublicKey()))); + } } private void validatePlainPassword(String password) { diff --git a/blade-third-party-api/blade-mk-api/src/main/java/org/springblade/thirdparty/mk/service/impl/MKServiceImpl.java b/blade-third-party-api/blade-mk-api/src/main/java/org/springblade/thirdparty/mk/service/impl/MKServiceImpl.java index e4b05985..eb5b1877 100644 --- a/blade-third-party-api/blade-mk-api/src/main/java/org/springblade/thirdparty/mk/service/impl/MKServiceImpl.java +++ b/blade-third-party-api/blade-mk-api/src/main/java/org/springblade/thirdparty/mk/service/impl/MKServiceImpl.java @@ -323,10 +323,13 @@ public class MKServiceImpl implements IMKService { return null; } String code = codeVO.getCode(); + // 跳转域名使用 thirdParty.mk.baseUrl(loginUrl 在部分环境未配置会导致拼出相对路径 null/...) + AssertUtils.notBlank(properties.getBaseUrl(), "未配置 thirdParty.mk.baseUrl"); + String mkBaseUrl = StringUtil.removeSuffix(properties.getBaseUrl().trim(), StringPool.SLASH); // 审批页面地址 - String approvalUrl = String.format(APPROVAL_URL_FORMAT, properties.getLoginUrl(), processInstanceId, processInstanceId); + String approvalUrl = String.format(APPROVAL_URL_FORMAT, mkBaseUrl, processInstanceId, processInstanceId); // sso回调地址 - return String.format(SSO_CALLBACK_URL_FORMAT, properties.getLoginUrl(), code, UrlUtil.encode(approvalUrl)); + return String.format(SSO_CALLBACK_URL_FORMAT, mkBaseUrl, code, UrlUtil.encode(approvalUrl)); } @Override