|
|
|
@ -24,7 +24,7 @@ import org.dromara.workflow.api.RemoteWorkflowService;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.springframework.util.ObjectUtils;
|
|
|
|
|
|
|
|
|
|
import io.seata.spring.annotation.GlobalTransactional;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
@ -223,17 +223,17 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
|
|
|
|
|
if (count==0||count==1){
|
|
|
|
|
// 如果没有未完成的检查实例,设置状态为3
|
|
|
|
|
dmsBillsInspectInstance.setInspectStatus("3");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 【参考润滑工单】工作流完成处理
|
|
|
|
|
Long inspectInstanceId = dmsInspectInstanceDetail.getInspectInstanceId();
|
|
|
|
|
String businessId = inspectInstanceId.toString();
|
|
|
|
|
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (currentActiveTaskId != null) {
|
|
|
|
|
// 【关键】设置消息类型为非null的List(避免原始错误)
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("system"); // 系统消息
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 【工作流推进】完成当前活跃任务
|
|
|
|
|
boolean taskCompleted = remoteWorkflowService.completeTaskIgnoreAuth(currentActiveTaskId, "巡检工单完成,自动推进");
|
|
|
|
|
if (!taskCompleted) {
|
|
|
|
@ -330,11 +330,13 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 扫描设备验证并获取巡检项目信息
|
|
|
|
|
* 【参考开始保养】完善工作流启动和推进逻辑
|
|
|
|
|
*
|
|
|
|
|
* @param dmsBillsInspectInstanceScan
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
public DmsInspectInstanceDetailVo scanInspectInstanceDetail(DmsBillsInspectInstanceScanBo dmsBillsInspectInstanceScan) {
|
|
|
|
|
// 根据检查实例ID和设备编码查询检查工单详细信息
|
|
|
|
|
DmsInspectInstanceDetailVo dmsInspectInstanceDetail = dmsInspectInstanceDetailMapper.selectDmsInspectInstanceDetailByUI(dmsBillsInspectInstanceScan.getInspectInstanceId(),
|
|
|
|
@ -343,6 +345,131 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
|
|
|
|
|
if (dmsInspectInstanceDetail == null) {
|
|
|
|
|
throw new ServiceException("无此设备的检查工单");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 【参考开始保养】查询巡检工单实例信息
|
|
|
|
|
DmsBillsInspectInstance inspectInstance = baseMapper.selectById(dmsBillsInspectInstanceScan.getInspectInstanceId());
|
|
|
|
|
if (inspectInstance == null) {
|
|
|
|
|
throw new ServiceException("巡检工单不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 【参考开始保养】获取当前巡检状态
|
|
|
|
|
String inspectStatus = inspectInstance.getInspectStatus() == null ?
|
|
|
|
|
DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_TO_INSPECT : inspectInstance.getInspectStatus();
|
|
|
|
|
|
|
|
|
|
// 【参考开始保养】如果巡检状态为已完成,抛出异常
|
|
|
|
|
if (inspectStatus.equals(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_FINISH)) {
|
|
|
|
|
throw new ServiceException("已经巡检完成");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取当前日期时间
|
|
|
|
|
Date currentDate = new Date();
|
|
|
|
|
|
|
|
|
|
// 【参考开始保养】如果巡检状态为待巡检,进行工作流启动处理
|
|
|
|
|
if (inspectStatus.equals(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_TO_INSPECT)) {
|
|
|
|
|
// 设置巡检状态为巡检中
|
|
|
|
|
inspectInstance.setInspectStatus(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_INSPECTING);
|
|
|
|
|
// 设置实际开始巡检时间为当前时间
|
|
|
|
|
inspectInstance.setRealBeginTime(currentDate);
|
|
|
|
|
|
|
|
|
|
// 【参考开始保养】检查工作流是否已经启动
|
|
|
|
|
DmsBillsInspectInstance latestInstance = baseMapper.selectById(inspectInstance.getInspectInstanceId());
|
|
|
|
|
|
|
|
|
|
if (latestInstance != null && latestInstance.getWfDefinitionId() == null) {
|
|
|
|
|
// 【参考开始保养】工作流未启动,需要启动
|
|
|
|
|
try {
|
|
|
|
|
// 创建远程启动流程对象
|
|
|
|
|
org.dromara.workflow.api.domain.RemoteStartProcess startProcess = new org.dromara.workflow.api.domain.RemoteStartProcess();
|
|
|
|
|
// 设置流程代码(需要根据实际的巡检工作流代码设置)
|
|
|
|
|
startProcess.setFlowCode(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_WF_CODE);
|
|
|
|
|
// 获取业务ID(巡检实例ID)
|
|
|
|
|
String businessId = inspectInstance.getInspectInstanceId().toString();
|
|
|
|
|
startProcess.setBusinessId(businessId);
|
|
|
|
|
|
|
|
|
|
// 启动工作流程
|
|
|
|
|
org.dromara.workflow.api.domain.RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
|
|
|
|
|
|
|
|
|
|
// 获取流程实例ID和任务ID
|
|
|
|
|
Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId();
|
|
|
|
|
Long taskId = remoteStartProcessReturn.getTaskId();
|
|
|
|
|
|
|
|
|
|
if (processInstanceId == null) {
|
|
|
|
|
throw new ServiceException("巡检工作流启动失败");
|
|
|
|
|
} else {
|
|
|
|
|
// 存储流程实例ID
|
|
|
|
|
inspectInstance.setWfDefinitionId(processInstanceId);
|
|
|
|
|
|
|
|
|
|
// 【参考开始保养】异步推进工作流
|
|
|
|
|
if (taskId != null) {
|
|
|
|
|
// 自动推进工作流
|
|
|
|
|
org.dromara.workflow.api.domain.RemoteCompleteTask remoteCompleteTask = new org.dromara.workflow.api.domain.RemoteCompleteTask();
|
|
|
|
|
remoteCompleteTask.setTaskId(taskId);
|
|
|
|
|
remoteCompleteTask.setMessage("巡检开始,自动推进");
|
|
|
|
|
// 设置消息类型为非null的List
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("system"); // 系统消息
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
if (!taskCompleted) {
|
|
|
|
|
log.error("巡检工作流推进失败,任务ID: {}", taskId);
|
|
|
|
|
} else {
|
|
|
|
|
log.info("巡检工单 {} 工作流推进成功", inspectInstance.getInspectInstanceId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 【参考开始保养】捕获工作流启动异常
|
|
|
|
|
if (e.getMessage() != null && e.getMessage().contains("该单据已提交过申请")) {
|
|
|
|
|
log.warn("巡检工单 {} 工作流已存在,跳过启动: {}", inspectInstance.getInspectInstanceId(), e.getMessage());
|
|
|
|
|
// 重新查询获取工作流ID
|
|
|
|
|
DmsBillsInspectInstance updatedInstance = baseMapper.selectById(inspectInstance.getInspectInstanceId());
|
|
|
|
|
if (updatedInstance != null && updatedInstance.getWfDefinitionId() != null) {
|
|
|
|
|
inspectInstance.setWfDefinitionId(updatedInstance.getWfDefinitionId());
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.error("巡检工单 {} 工作流启动失败: {}", inspectInstance.getInspectInstanceId(), e.getMessage());
|
|
|
|
|
throw new ServiceException("巡检工作流启动失败: " + e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (latestInstance != null && latestInstance.getWfDefinitionId() != null) {
|
|
|
|
|
// 【参考开始保养】工作流已启动,推进当前活跃任务
|
|
|
|
|
Long processInstanceId = latestInstance.getWfDefinitionId();
|
|
|
|
|
inspectInstance.setWfDefinitionId(processInstanceId);
|
|
|
|
|
|
|
|
|
|
log.info("巡检工单 {} 工作流已启动,流程实例ID: {},查询当前活跃任务",
|
|
|
|
|
inspectInstance.getInspectInstanceId(), processInstanceId);
|
|
|
|
|
|
|
|
|
|
// 根据流程实例ID获取当前活跃任务ID
|
|
|
|
|
Long currentActiveTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(processInstanceId);
|
|
|
|
|
|
|
|
|
|
if (currentActiveTaskId != null) {
|
|
|
|
|
log.info("巡检工单 {} 找到当前活跃任务ID: {}",
|
|
|
|
|
inspectInstance.getInspectInstanceId(), currentActiveTaskId);
|
|
|
|
|
|
|
|
|
|
// 直接推进工作流
|
|
|
|
|
org.dromara.workflow.api.domain.RemoteCompleteTask remoteCompleteTask = new org.dromara.workflow.api.domain.RemoteCompleteTask();
|
|
|
|
|
remoteCompleteTask.setTaskId(currentActiveTaskId);
|
|
|
|
|
remoteCompleteTask.setMessage("巡检开始,推进工作流");
|
|
|
|
|
// 设置消息类型为非null的List
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("user"); // 用户操作
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
if (!taskCompleted) {
|
|
|
|
|
log.error("巡检工作流推进失败,任务ID: {}", currentActiveTaskId);
|
|
|
|
|
} else {
|
|
|
|
|
log.info("巡检工单 {} 工作流推进成功", inspectInstance.getInspectInstanceId());
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.warn("巡检工单 {} 无法获取当前活跃任务,流程可能已完成", inspectInstance.getInspectInstanceId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新巡检实例信息
|
|
|
|
|
baseMapper.updateById(inspectInstance);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取设备ID
|
|
|
|
|
Long deviceId = dmsInspectInstanceDetail.getMachineId();
|
|
|
|
|
// 创建查询检查实例详细项目的参数对象
|
|
|
|
@ -360,30 +487,18 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
|
|
|
|
|
// 将查询结果设置到检查工单详情对象中
|
|
|
|
|
dmsInspectInstanceDetail.setDmsInspectInstanceDetailProjectList(dmsInspectInstanceDetailProjects);
|
|
|
|
|
|
|
|
|
|
// 更新检查工单的开始时间
|
|
|
|
|
DmsBillsInspectInstanceBo dmsBillsInspectInstance = new DmsBillsInspectInstanceBo();
|
|
|
|
|
// 设置检查实例ID
|
|
|
|
|
dmsBillsInspectInstance.setInspectInstanceId(dmsBillsInspectInstanceScan.getInspectInstanceId());
|
|
|
|
|
// 设置实际开始时间为当前时间
|
|
|
|
|
dmsBillsInspectInstance.setRealBeginTime(new Date());
|
|
|
|
|
// dmsBillsInspectInstance.setInspectStatus("2");
|
|
|
|
|
|
|
|
|
|
// FIXME: 梳理流程,完善更新方法
|
|
|
|
|
// int i = dmsBillsInspectInstanceMapper.updateDmsBillsInspectInstance(dmsBillsInspectInstance);
|
|
|
|
|
// 使用BO更新检查实例信息
|
|
|
|
|
this.updateByBo(dmsBillsInspectInstance);
|
|
|
|
|
|
|
|
|
|
// 返回检查实例详情对象
|
|
|
|
|
return dmsInspectInstanceDetail;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新点巡检工单明细项目信息
|
|
|
|
|
* 【参考完成保养】添加工作流完成逻辑
|
|
|
|
|
*
|
|
|
|
|
* @param dmsInspectInstanceDetail 点巡检工单明细
|
|
|
|
|
* @return 处理后的点巡检工单明细,包含更新后的状态信息
|
|
|
|
|
*/
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
private DmsInspectInstanceDetailBo handleDmsInspectInstanceDetailProject(DmsInspectInstanceDetailBo dmsInspectInstanceDetail) {
|
|
|
|
|
// 【初始化状态】默认设置为完成状态和通过状态
|
|
|
|
|
String instanceDetailStatus = DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH;
|
|
|
|
@ -451,6 +566,72 @@ public class DmsBillsInspectInstanceServiceImpl implements IDmsBillsInspectInsta
|
|
|
|
|
toUpdatedList.add(inspectInstanceDetailProject);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 【参考完成保养】如果当前明细已完成,检查是否需要完成整个巡检工单
|
|
|
|
|
if (instanceDetailStatus.equals(DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH)) {
|
|
|
|
|
Long inspectInstanceId = dmsInspectInstanceDetail.getInspectInstanceId();
|
|
|
|
|
|
|
|
|
|
// 【参考完成保养】查询所有明细的完成情况
|
|
|
|
|
try {
|
|
|
|
|
// 查询同一巡检工单下的所有明细
|
|
|
|
|
DmsInspectInstanceDetailBo queryDetail = new DmsInspectInstanceDetailBo();
|
|
|
|
|
queryDetail.setInspectInstanceId(inspectInstanceId);
|
|
|
|
|
|
|
|
|
|
// 这里需要查询所有明细的状态,判断是否全部完成
|
|
|
|
|
// 注意:需要排除当前正在处理的明细
|
|
|
|
|
List<DmsInspectInstanceDetailVo> allDetails = dmsInspectInstanceDetailMapper.selectDmsInspectInstanceDetailJoinList(queryDetail);
|
|
|
|
|
|
|
|
|
|
// 统计未完成的明细数量(排除当前处理的明细)
|
|
|
|
|
long incompleteCount = allDetails.stream()
|
|
|
|
|
.filter(detail -> !detail.getInstanceDetailId().equals(dmsInspectInstanceDetail.getInstanceDetailId()))
|
|
|
|
|
.filter(detail -> detail.getInstanceDetailStatus() == null
|
|
|
|
|
|| !detail.getInstanceDetailStatus().equals(DmsConstants.DMS_INSPECT_INSTANCE_DETAIL_STATUS_FINISH))
|
|
|
|
|
.count();
|
|
|
|
|
|
|
|
|
|
// 【参考完成保养】如果所有明细都已完成,完成工作流
|
|
|
|
|
if (incompleteCount == 0) {
|
|
|
|
|
log.info("巡检工单 {} 所有明细已完成,开始完成工作流", inspectInstanceId);
|
|
|
|
|
|
|
|
|
|
// 【参考完成保养】完成巡检工作流
|
|
|
|
|
String businessId = inspectInstanceId.toString();
|
|
|
|
|
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
|
|
|
|
|
|
|
|
|
|
if (currentActiveTaskId != null) {
|
|
|
|
|
org.dromara.workflow.api.domain.RemoteCompleteTask remoteCompleteTask = new org.dromara.workflow.api.domain.RemoteCompleteTask();
|
|
|
|
|
remoteCompleteTask.setTaskId(currentActiveTaskId);
|
|
|
|
|
remoteCompleteTask.setMessage("巡检工单完成,自动推进");
|
|
|
|
|
// 设置消息类型为非null的List
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("system"); // 系统消息
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
// 完成工作流任务
|
|
|
|
|
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
if (!taskCompleted) {
|
|
|
|
|
log.error("巡检工作流完成失败,当前活跃任务ID: {}", currentActiveTaskId);
|
|
|
|
|
} else {
|
|
|
|
|
log.info("巡检工单 {} 工作流完成成功,任务ID: {}", inspectInstanceId, currentActiveTaskId);
|
|
|
|
|
|
|
|
|
|
// 【参考完成保养】更新巡检工单主表状态为已完成
|
|
|
|
|
DmsBillsInspectInstance inspectInstance = baseMapper.selectById(inspectInstanceId);
|
|
|
|
|
if (inspectInstance != null) {
|
|
|
|
|
inspectInstance.setInspectStatus(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_FINISH);
|
|
|
|
|
inspectInstance.setRealEndTime(new Date());
|
|
|
|
|
baseMapper.updateById(inspectInstance);
|
|
|
|
|
log.info("巡检工单 {} 状态已更新为完成", inspectInstanceId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.warn("巡检工单 {} 无法获取当前活跃任务ID,工作流可能已完成或异常", inspectInstanceId);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.info("巡检工单 {} 还有 {} 个明细未完成,暂不完成工作流", inspectInstanceId, incompleteCount);
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("检查巡检工单完成状态时发生异常: {}", e.getMessage(), e);
|
|
|
|
|
// 不影响主流程,继续执行
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 【设置返回结果】设置处理后的状态和项目列表
|
|
|
|
|
returnInspectInstanceDetail.setInspectStatus(inspectStatus);
|
|
|
|
|
returnInspectInstanceDetail.setInstanceDetailStatus(instanceDetailStatus);
|
|
|
|
|