|
|
@ -51,16 +51,16 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
|
|
|
|
public R<Integer> insertInspectInstance(String planInspectCode, String tenantId, Long userId){
|
|
|
|
public R<Integer> insertInspectInstance(String planInspectCode, String tenantId, Long userId){
|
|
|
|
// 【重要】在主线程中先登录,确保后续所有调用都有认证上下文
|
|
|
|
// 【重要】在主线程中先登录,确保后续所有调用都有认证上下文
|
|
|
|
StpUtil.login(userId, "login");
|
|
|
|
StpUtil.login(userId, "login");
|
|
|
|
|
|
|
|
|
|
|
|
// 【关键修复】设置租户上下文,确保工作流能获取到正确的租户ID
|
|
|
|
// 【关键修复】设置租户上下文,确保工作流能获取到正确的租户ID
|
|
|
|
TenantHelper.setDynamic(tenantId);
|
|
|
|
TenantHelper.setDynamic(tenantId);
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 创建检查实例
|
|
|
|
// 创建检查实例
|
|
|
|
R<Long> rInspectInstanceId = createInspectInstance(planInspectCode, tenantId, userId);
|
|
|
|
R<Long> rInspectInstanceId = createInspectInstance(planInspectCode, tenantId, userId);
|
|
|
|
Long inspectInstanceId = rInspectInstanceId.getData();
|
|
|
|
Long inspectInstanceId = rInspectInstanceId.getData();
|
|
|
|
String businessId = inspectInstanceId.toString();
|
|
|
|
String businessId = inspectInstanceId.toString();
|
|
|
|
|
|
|
|
|
|
|
|
if (!R.isSuccess(rInspectInstanceId)) {
|
|
|
|
if (!R.isSuccess(rInspectInstanceId)) {
|
|
|
|
return R.fail();
|
|
|
|
return R.fail();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -68,30 +68,33 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
|
|
|
|
RemoteStartProcess remoteStartProcess = new RemoteStartProcess();
|
|
|
|
RemoteStartProcess remoteStartProcess = new RemoteStartProcess();
|
|
|
|
remoteStartProcess.setBusinessId(businessId);
|
|
|
|
remoteStartProcess.setBusinessId(businessId);
|
|
|
|
remoteStartProcess.setFlowCode(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_WF_CODE);
|
|
|
|
remoteStartProcess.setFlowCode(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_WF_CODE);
|
|
|
|
|
|
|
|
|
|
|
|
// 【重要】通过Dubbo隐式参数传递租户ID
|
|
|
|
// 【重要】通过Dubbo隐式参数传递租户ID
|
|
|
|
RpcContext.getContext().setAttachment("tenantId", tenantId);
|
|
|
|
RpcContext.getContext().setAttachment("tenantId", tenantId);
|
|
|
|
|
|
|
|
|
|
|
|
RemoteStartProcessReturn result = remoteWorkflowService.startWorkFlow(remoteStartProcess);
|
|
|
|
RemoteStartProcessReturn result = remoteWorkflowService.startWorkFlow(remoteStartProcess);
|
|
|
|
|
|
|
|
|
|
|
|
if (ObjectUtils.isEmpty(result)) {
|
|
|
|
if (ObjectUtils.isEmpty(result)) {
|
|
|
|
return R.fail();
|
|
|
|
return R.fail();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 【关键修复】存储流程实例ID而不是任务ID
|
|
|
|
|
|
|
|
Long processInstanceId = result.getProcessInstanceId();
|
|
|
|
Long taskId = result.getTaskId();
|
|
|
|
Long taskId = result.getTaskId();
|
|
|
|
|
|
|
|
|
|
|
|
// 【简化方案】异步处理工作流推进,避免死锁
|
|
|
|
// 【简化方案】异步处理工作流推进,避免死锁
|
|
|
|
CompletableFuture.runAsync(TtlRunnable.get(() -> {
|
|
|
|
CompletableFuture.runAsync(TtlRunnable.get(() -> {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 【关键】在异步线程中重新登录相同用户
|
|
|
|
// 【关键】在异步线程中重新登录相同用户
|
|
|
|
StpUtil.login(userId, "login");
|
|
|
|
StpUtil.login(userId, "login");
|
|
|
|
|
|
|
|
|
|
|
|
// 【关键修复】在异步线程中重新设置租户上下文
|
|
|
|
// 【关键修复】在异步线程中重新设置租户上下文
|
|
|
|
TenantHelper.setDynamic(tenantId);
|
|
|
|
TenantHelper.setDynamic(tenantId);
|
|
|
|
|
|
|
|
|
|
|
|
log.info("检查工单异步线程中,当前租户ID: {}", TenantHelper.getTenantId());
|
|
|
|
log.info("检查工单异步线程中,当前租户ID: {}", TenantHelper.getTenantId());
|
|
|
|
|
|
|
|
|
|
|
|
// 【执行业务】更新检查工单的工作流信息
|
|
|
|
// 【关键修复】传递流程实例ID而不是任务ID
|
|
|
|
updateInspectWorkflow(inspectInstanceId, taskId);
|
|
|
|
updateInspectWorkflow(inspectInstanceId, processInstanceId, taskId);
|
|
|
|
|
|
|
|
|
|
|
|
log.info("检查工单 {} 异步工作流处理完成", inspectInstanceId);
|
|
|
|
log.info("检查工单 {} 异步工作流处理完成", inspectInstanceId);
|
|
|
|
} catch (Exception e) {
|
|
|
|
} catch (Exception e) {
|
|
|
|
log.error("检查工单 {} 异步工作流处理失败: {}", inspectInstanceId, e.getMessage(), e);
|
|
|
|
log.error("检查工单 {} 异步工作流处理失败: {}", inspectInstanceId, e.getMessage(), e);
|
|
|
@ -168,7 +171,7 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
|
|
|
|
MPJLambdaWrapper<DmsInspectRouteDetail> lqw = JoinWrappers.lambda(DmsInspectRouteDetail.class)
|
|
|
|
MPJLambdaWrapper<DmsInspectRouteDetail> lqw = JoinWrappers.lambda(DmsInspectRouteDetail.class)
|
|
|
|
.eq(DmsInspectRouteDetail::getInspectRouteId, dmsBillsInspectInstance.getInspectRouteId());
|
|
|
|
.eq(DmsInspectRouteDetail::getInspectRouteId, dmsBillsInspectInstance.getInspectRouteId());
|
|
|
|
List<DmsInspectRouteDetail> dmsInspectRouteDetails = dmsInspectRouteDetailMapper.selectList(lqw);
|
|
|
|
List<DmsInspectRouteDetail> dmsInspectRouteDetails = dmsInspectRouteDetailMapper.selectList(lqw);
|
|
|
|
|
|
|
|
|
|
|
|
// 遍历检查路线明细,生成检查实例明细
|
|
|
|
// 遍历检查路线明细,生成检查实例明细
|
|
|
|
for(DmsInspectRouteDetail dmsInspectRouteDetail:dmsInspectRouteDetails){
|
|
|
|
for(DmsInspectRouteDetail dmsInspectRouteDetail:dmsInspectRouteDetails){
|
|
|
|
DmsInspectInstanceDetail dmsInspectInstanceDetail = new DmsInspectInstanceDetail();
|
|
|
|
DmsInspectInstanceDetail dmsInspectInstanceDetail = new DmsInspectInstanceDetail();
|
|
|
@ -206,29 +209,30 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
|
|
|
|
return R.ok(dmsBillsInspectInstance.getInspectInstanceId());
|
|
|
|
return R.ok(dmsBillsInspectInstance.getInspectInstanceId());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void updateInspectWorkflow(Long businessId, Long taskId) {
|
|
|
|
private void updateInspectWorkflow(Long businessId, Long processInstanceId, Long taskId) {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 【关键修复】确保在工作流操作前有正确的租户上下文
|
|
|
|
// 【关键修复】确保在工作流操作前有正确的租户上下文
|
|
|
|
String currentTenantId = TenantHelper.getTenantId();
|
|
|
|
String currentTenantId = TenantHelper.getTenantId();
|
|
|
|
log.info("检查工作流更新前,当前租户ID: {}", currentTenantId);
|
|
|
|
log.info("检查工作流更新前,当前租户ID: {}", currentTenantId);
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 更新工作流ID
|
|
|
|
// 【关键修复】更新流程实例ID而不是任务ID
|
|
|
|
DmsBillsInspectInstance inspectInstance = dmsBillsInspectInstanceMapper.selectById(businessId);
|
|
|
|
DmsBillsInspectInstance inspectInstance = dmsBillsInspectInstanceMapper.selectById(businessId);
|
|
|
|
if (inspectInstance != null) {
|
|
|
|
if (inspectInstance != null) {
|
|
|
|
inspectInstance.setWfDefinitionId(taskId);
|
|
|
|
// 【关键修复】存储流程实例ID而不是任务ID
|
|
|
|
|
|
|
|
inspectInstance.setWfDefinitionId(processInstanceId);
|
|
|
|
int updateResult = dmsBillsInspectInstanceMapper.updateById(inspectInstance);
|
|
|
|
int updateResult = dmsBillsInspectInstanceMapper.updateById(inspectInstance);
|
|
|
|
if (updateResult > 0) {
|
|
|
|
if (updateResult > 0) {
|
|
|
|
log.info("检查工单 {} 工作流ID更新成功: {}", businessId, taskId);
|
|
|
|
log.info("检查工单 {} 工作流实例ID更新成功: {}", businessId, processInstanceId);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
log.error("检查工单 {} 工作流ID更新失败", businessId);
|
|
|
|
log.error("检查工单 {} 工作流实例ID更新失败", businessId);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
log.error("检查工单 {} 不存在,无法更新工作流ID", businessId);
|
|
|
|
log.error("检查工单 {} 不存在,无法更新工作流实例ID", businessId);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 推进工作流状态
|
|
|
|
// 推进工作流状态
|
|
|
|
RemoteCompleteTask completeTask = new RemoteCompleteTask();
|
|
|
|
RemoteCompleteTask completeTask = new RemoteCompleteTask();
|
|
|
|
completeTask.setTaskId(taskId);
|
|
|
|
completeTask.setTaskId(taskId);
|
|
|
|
completeTask.setMessage("检查工单启动,自动推进");
|
|
|
|
completeTask.setMessage("检查工单启动,自动推进");
|
|
|
@ -236,21 +240,21 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
messageTypes.add("system"); // 系统消息
|
|
|
|
messageTypes.add("system"); // 系统消息
|
|
|
|
completeTask.setMessageType(messageTypes);
|
|
|
|
completeTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
|
|
// 【关键修复】在调用工作流推进前再次确认租户上下文
|
|
|
|
// 【关键修复】在调用工作流推进前再次确认租户上下文
|
|
|
|
log.info("检查工作流推进前,当前租户ID: {}", TenantHelper.getTenantId());
|
|
|
|
log.info("检查工作流推进前,当前租户ID: {}", TenantHelper.getTenantId());
|
|
|
|
|
|
|
|
|
|
|
|
// 【重要】通过Dubbo隐式参数传递租户ID
|
|
|
|
// 【重要】通过Dubbo隐式参数传递租户ID
|
|
|
|
RpcContext.getContext().setAttachment("tenantId", currentTenantId);
|
|
|
|
RpcContext.getContext().setAttachment("tenantId", currentTenantId);
|
|
|
|
|
|
|
|
|
|
|
|
// 【关键】调用工作流推进
|
|
|
|
// 【关键】调用工作流推进
|
|
|
|
boolean completeResult = remoteWorkflowService.completeTask(completeTask);
|
|
|
|
boolean completeResult = remoteWorkflowService.completeTaskIgnoreAuth(taskId, "检查工单启动,自动推进");
|
|
|
|
if (completeResult) {
|
|
|
|
if (completeResult) {
|
|
|
|
log.info("检查工单 {} 工作流推进成功", businessId);
|
|
|
|
log.info("检查工单 {} 工作流推进成功", businessId);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
log.warn("检查工单 {} 工作流推进失败,但工单已创建成功", businessId);
|
|
|
|
log.warn("检查工单 {} 工作流推进失败,但工单已创建成功", businessId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
} catch (Exception e) {
|
|
|
|
log.error("检查工单 {} 工作流更新失败: {}", businessId, e.getMessage(), e);
|
|
|
|
log.error("检查工单 {} 工作流更新失败: {}", businessId, e.getMessage(), e);
|
|
|
|
// 注意:这里不抛出异常,避免影响主流程
|
|
|
|
// 注意:这里不抛出异常,避免影响主流程
|
|
|
|