|
|
|
@ -1,44 +1,116 @@
|
|
|
|
|
package org.dromara.dms.dubbo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
|
|
import com.alibaba.ttl.TtlRunnable;
|
|
|
|
|
import com.github.yulichang.toolkit.JoinWrappers;
|
|
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
import io.seata.spring.annotation.GlobalTransactional;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
|
|
import org.apache.dubbo.config.annotation.DubboService;
|
|
|
|
|
import org.apache.dubbo.rpc.RpcContext;
|
|
|
|
|
import org.dromara.common.core.constant.DmsConstants;
|
|
|
|
|
import org.dromara.common.core.domain.R;
|
|
|
|
|
import org.dromara.common.core.utils.ObjectUtils;
|
|
|
|
|
import org.dromara.dms.api.RemoteInspectInstanceService;
|
|
|
|
|
import org.dromara.dms.domain.*;
|
|
|
|
|
import org.dromara.dms.mapper.*;
|
|
|
|
|
import org.dromara.dms.service.impl.DmsInspectProjectDeviceServiceImpl;
|
|
|
|
|
import org.dromara.workflow.api.RemoteWorkflowService;
|
|
|
|
|
import org.dromara.workflow.api.domain.RemoteCompleteTask;
|
|
|
|
|
import org.dromara.workflow.api.domain.RemoteStartProcess;
|
|
|
|
|
import org.dromara.workflow.api.domain.RemoteStartProcessReturn;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@Service
|
|
|
|
|
@DubboService
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceService {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final DmsPlanInspectMapper dmsPlanInspectMapper;
|
|
|
|
|
|
|
|
|
|
private final DmsInspectRouteDetailMapper dmsInspectRouteDetailMapper;
|
|
|
|
|
|
|
|
|
|
private final DmsBillsInspectInstanceMapper dmsBillsInspectInstanceMapper;
|
|
|
|
|
|
|
|
|
|
private final DmsInspectInstanceDetailMapper dmsInspectInstanceDetailMapper;
|
|
|
|
|
|
|
|
|
|
private final DmsInspectInstanceDetailProjectMapper dmsInspectInstanceDetailProjectMapper;
|
|
|
|
|
|
|
|
|
|
private final DmsInspectProjectDeviceMapper dmsInspectProjectDeviceMapper;
|
|
|
|
|
|
|
|
|
|
@DubboReference(timeout = 10000)
|
|
|
|
|
private RemoteWorkflowService remoteWorkflowService;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional( rollbackFor = Exception.class )
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
public R<Integer> insertInspectInstance(String planInspectCode, String tenantId, Long userId){
|
|
|
|
|
// 【重要】在主线程中先登录,确保后续所有调用都有认证上下文
|
|
|
|
|
StpUtil.login(userId, "login");
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 创建检查实例
|
|
|
|
|
R<Long> rInspectInstanceId = createInspectInstance(planInspectCode, tenantId, userId);
|
|
|
|
|
Long inspectInstanceId = rInspectInstanceId.getData();
|
|
|
|
|
String businessId = inspectInstanceId.toString();
|
|
|
|
|
|
|
|
|
|
if (!R.isSuccess(rInspectInstanceId)) {
|
|
|
|
|
return R.fail();
|
|
|
|
|
} else {
|
|
|
|
|
// 启动工作流
|
|
|
|
|
RemoteStartProcess remoteStartProcess = new RemoteStartProcess();
|
|
|
|
|
remoteStartProcess.setBusinessId(businessId);
|
|
|
|
|
remoteStartProcess.setFlowCode(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_WF_CODE);
|
|
|
|
|
RemoteStartProcessReturn result = remoteWorkflowService.startWorkFlow(remoteStartProcess);
|
|
|
|
|
|
|
|
|
|
if (ObjectUtils.isEmpty(result)) {
|
|
|
|
|
return R.fail();
|
|
|
|
|
} else {
|
|
|
|
|
Long taskId = result.getTaskId();
|
|
|
|
|
// 【简化方案】异步处理工作流推进,避免死锁
|
|
|
|
|
CompletableFuture.runAsync(TtlRunnable.get(() -> {
|
|
|
|
|
try {
|
|
|
|
|
// 【关键】在异步线程中重新登录相同用户
|
|
|
|
|
StpUtil.login(userId, "login");
|
|
|
|
|
|
|
|
|
|
// 【执行业务】更新检查工单的工作流信息
|
|
|
|
|
updateInspectWorkflow(inspectInstanceId, taskId);
|
|
|
|
|
|
|
|
|
|
log.info("检查工单 {} 异步工作流处理完成", inspectInstanceId);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("检查工单 {} 异步工作流处理失败: {}", inspectInstanceId, e.getMessage(), e);
|
|
|
|
|
} finally {
|
|
|
|
|
// 【清理】清理登录状态,避免线程池复用时的状态污染
|
|
|
|
|
try {
|
|
|
|
|
StpUtil.logout();
|
|
|
|
|
} catch (Exception ignored) {
|
|
|
|
|
// 忽略登出时的异常
|
|
|
|
|
}
|
|
|
|
|
// 清理RpcContext
|
|
|
|
|
try {
|
|
|
|
|
RpcContext.removeContext();
|
|
|
|
|
} catch (Exception ignored) {
|
|
|
|
|
// 忽略清理时的异常
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
return R.ok(1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
// 【主线程清理】确保主线程执行完成后清理登录状态
|
|
|
|
|
try {
|
|
|
|
|
StpUtil.logout();
|
|
|
|
|
} catch (Exception ignored) {
|
|
|
|
|
// 忽略登出异常
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private R<Long> createInspectInstance(String planInspectCode, String tenantId, Long userId) {
|
|
|
|
|
// 使用 replaceAll 方法将双引号替换为空字符串
|
|
|
|
|
String result = planInspectCode.replaceAll("\"", "");
|
|
|
|
|
// 根据检查计划代码查询检查计划信息
|
|
|
|
@ -58,30 +130,22 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
|
|
|
|
|
DmsBillsInspectInstance dmsBillsInspectInstance = new DmsBillsInspectInstance();
|
|
|
|
|
// 设置检查实例的相关属性
|
|
|
|
|
dmsBillsInspectInstance.setPlanInspectId(dmsPlanInspect.getPlanInspectId());
|
|
|
|
|
// dmsBillsInspectInstance.setWfProcessId(105l);
|
|
|
|
|
dmsBillsInspectInstance.setInspectType(dmsPlanInspect.getInspectType());//检查类型(1巡检 2点检)
|
|
|
|
|
dmsBillsInspectInstance.setPlanBeginTime(dmsPlanInspect.getPlanTime());
|
|
|
|
|
dmsBillsInspectInstance.setPlanEndTime(new Date(dmsPlanInspect.getPlanTime().getTime()+dmsPlanInspect.getTimeLimit()*1000l));
|
|
|
|
|
dmsBillsInspectInstance.setInspectRouteId(dmsPlanInspect.getInspectRouteId());
|
|
|
|
|
// dmsBillsInspectInstance.setDeviceAmount(dmsPlanInspect.getDeviceAmount());//设备数量FIXME:没有这个字段
|
|
|
|
|
dmsBillsInspectInstance.setPerformer(dmsPlanInspect.getPerformer());//执行人
|
|
|
|
|
|
|
|
|
|
// dmsBillsInspectInstance.setIsFlag("1");
|
|
|
|
|
dmsBillsInspectInstance.setInspectStatus(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_TO_INSPECT);//待巡检
|
|
|
|
|
dmsBillsInspectInstance.setCreateBy(userId);
|
|
|
|
|
dmsBillsInspectInstance.setTenantId(tenantId);
|
|
|
|
|
// 插入检查实例并返回影响的行数
|
|
|
|
|
int i = dmsBillsInspectInstanceMapper.insert(dmsBillsInspectInstance);
|
|
|
|
|
|
|
|
|
|
// List<DmsBillsInspectInstance> dmsBillsInspectInstances = dmsBillsInspectInstanceMapper.selectDmsBillsInspectInstanceList(dmsBillsInspectInstance);
|
|
|
|
|
|
|
|
|
|
//新建点巡检工单明细
|
|
|
|
|
/* DmsInspectRouteDetail queryInspectRouteDetail = new DmsInspectRouteDetail();
|
|
|
|
|
queryInspectRouteDetail.setInspectRouteId(dmsBillsInspectInstance.getInspectRouteId());*/
|
|
|
|
|
// 查询检查路线明细
|
|
|
|
|
MPJLambdaWrapper<DmsInspectRouteDetail> lqw = JoinWrappers.lambda(DmsInspectRouteDetail.class)
|
|
|
|
|
.eq(DmsInspectRouteDetail::getInspectRouteId, dmsBillsInspectInstance.getInspectRouteId());
|
|
|
|
|
List<DmsInspectRouteDetail> dmsInspectRouteDetails = dmsInspectRouteDetailMapper.selectList(lqw);
|
|
|
|
|
|
|
|
|
|
// 遍历检查路线明细,生成检查实例明细
|
|
|
|
|
for(DmsInspectRouteDetail dmsInspectRouteDetail:dmsInspectRouteDetails){
|
|
|
|
|
DmsInspectInstanceDetail dmsInspectInstanceDetail = new DmsInspectInstanceDetail();
|
|
|
|
@ -91,38 +155,60 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
|
|
|
|
|
dmsInspectInstanceDetail.setMachineId(deviceId);
|
|
|
|
|
dmsInspectInstanceDetail.setInstanceDetailStatus("1");//(1待巡检 2巡检中 3已完成)
|
|
|
|
|
dmsInspectInstanceDetail.setInspectStandard(dmsInspectRouteDetail.getInspectStandard());
|
|
|
|
|
dmsInspectInstanceDetail.setInspectStatus("0");//FIXME:为什么设置为异常?设备状态(1正常 0异常)
|
|
|
|
|
dmsInspectInstanceDetail.setInspectStatus("0");//设备状态(1正常 0异常)
|
|
|
|
|
dmsInspectInstanceDetail.setTenantId(tenantId);
|
|
|
|
|
dmsInspectInstanceDetail.setCreateBy(userId);
|
|
|
|
|
// dmsInspectInstanceDetail.setCreateTime(new Date());
|
|
|
|
|
dmsInspectInstanceDetailMapper.insert(dmsInspectInstanceDetail);
|
|
|
|
|
|
|
|
|
|
// 查询项目ID
|
|
|
|
|
Long projectId = dmsInspectInstanceDetailMapper.selectProjectId(dmsInspectRouteDetail.getInspectStandard());
|
|
|
|
|
|
|
|
|
|
DmsInspectProjectDevice queryInspectProjectDevice = new DmsInspectProjectDevice();
|
|
|
|
|
queryInspectProjectDevice.setTargetType("2");//FIXME:关联类型(1设备类型)
|
|
|
|
|
queryInspectProjectDevice.setTargetType("2");//关联类型
|
|
|
|
|
queryInspectProjectDevice.setTargetId(deviceId);
|
|
|
|
|
MPJLambdaWrapper<DmsInspectProjectDevice> DmsInspectProjectDeviceLQW = JoinWrappers.lambda(DmsInspectProjectDevice.class)
|
|
|
|
|
.eq(DmsInspectProjectDevice::getTargetType, "2")//FIXME:关联类型(1设备类型)
|
|
|
|
|
.eq(DmsInspectProjectDevice::getTargetType, "2")//关联类型
|
|
|
|
|
.eq(DmsInspectProjectDevice::getTargetId, deviceId);
|
|
|
|
|
List<DmsInspectProjectDevice> dmsInspectProjectDevices = dmsInspectProjectDeviceMapper.selectList(DmsInspectProjectDeviceLQW);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for(DmsInspectProjectDevice dmsInspectProjectDevice:dmsInspectProjectDevices){
|
|
|
|
|
DmsInspectInstanceDetailProject dmsInspectInstanceDetailProject = new DmsInspectInstanceDetailProject();
|
|
|
|
|
dmsInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId());
|
|
|
|
|
dmsInspectInstanceDetailProject.setInspectProjectId(projectId);
|
|
|
|
|
|
|
|
|
|
dmsInspectInstanceDetailProject.setTenantId(tenantId);
|
|
|
|
|
dmsInspectInstanceDetailProject.setCreateBy(userId);
|
|
|
|
|
dmsInspectInstanceDetailProjectMapper.insert(dmsInspectInstanceDetailProject);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回成功结果和影响的行数
|
|
|
|
|
return R.ok(i);
|
|
|
|
|
// 返回成功结果和检查实例ID
|
|
|
|
|
return R.ok(dmsBillsInspectInstance.getInspectInstanceId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateInspectWorkflow(Long businessId, Long taskId) {
|
|
|
|
|
try {
|
|
|
|
|
// 1. 更新工作流ID
|
|
|
|
|
DmsBillsInspectInstance inspectInstance = dmsBillsInspectInstanceMapper.selectById(businessId);
|
|
|
|
|
if (inspectInstance != null) {
|
|
|
|
|
inspectInstance.setWfDefinitionId(taskId);
|
|
|
|
|
dmsBillsInspectInstanceMapper.updateById(inspectInstance);
|
|
|
|
|
log.info("检查工单 {} 工作流ID更新成功: {}", businessId, taskId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 推进工作流状态
|
|
|
|
|
RemoteCompleteTask completeTask = new RemoteCompleteTask();
|
|
|
|
|
completeTask.setTaskId(taskId);
|
|
|
|
|
completeTask.setMessage("检查工单启动,自动推进");
|
|
|
|
|
// 设置消息类型为非null的List
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("system"); // 系统消息
|
|
|
|
|
completeTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
// 【关键】调用工作流推进
|
|
|
|
|
remoteWorkflowService.completeTask(completeTask);
|
|
|
|
|
log.info("检查工单 {} 工作流推进成功", businessId);
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("检查工单 {} 工作流更新失败: {}", businessId, e.getMessage(), e);
|
|
|
|
|
// 注意:这里不抛出异常,避免影响主流程
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|