|
|
|
@ -46,6 +46,8 @@ import cn.dev33.satoken.stp.StpUtil;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
import org.dromara.dms.mapper.DmsFaultComponentsPartsMapper;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 故障报修工单Service业务层处理
|
|
|
|
@ -75,6 +77,8 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
@DubboReference(timeout = 15000, retries = 1)
|
|
|
|
|
private final RemoteFileService remoteFileService;
|
|
|
|
|
|
|
|
|
|
private final DmsFaultComponentsPartsMapper dmsFaultComponentsPartsMapper;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询故障报修工单
|
|
|
|
|
*
|
|
|
|
@ -176,6 +180,12 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
public Boolean insertByBo(DmsBillsFaultInstanceBo bo) {
|
|
|
|
|
bo.setMachineId((long) bo.getDeviceId());
|
|
|
|
|
|
|
|
|
|
// 【关键修复】处理PDA端outsrcId到outsourcingId的转换
|
|
|
|
|
if (bo.getOutsrcId() != null && bo.getOutsrcId() > 0) {
|
|
|
|
|
bo.setOutsourcingId(Long.valueOf(bo.getOutsrcId()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DmsBillsFaultInstance add = MapstructUtils.convert(bo, DmsBillsFaultInstance.class);
|
|
|
|
|
validEntityBeforeSave(add);
|
|
|
|
|
// 获取当前日期时间
|
|
|
|
@ -222,10 +232,10 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
try {
|
|
|
|
|
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
|
|
|
|
|
StpUtil.setTokenValue(tokenValue);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 4. 【延迟执行】: 稍微延迟,确保主事务完全提交
|
|
|
|
|
Thread.sleep(100);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 5. 【重试机制】: 最多重试3次,每次间隔递增
|
|
|
|
|
int maxRetries = 3;
|
|
|
|
|
for (int i = 0; i < maxRetries; i++) {
|
|
|
|
@ -235,9 +245,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
log.info("异步工作流推进成功,repairInstanceId: {}, 重试次数: {}", add.getRepairInstanceId(), i);
|
|
|
|
|
break; // 成功则退出重试循环
|
|
|
|
|
} catch (Exception retryException) {
|
|
|
|
|
log.warn("异步工作流推进失败,repairInstanceId: {}, 重试次数: {}/{}, 错误: {}",
|
|
|
|
|
log.warn("异步工作流推进失败,repairInstanceId: {}, 重试次数: {}/{}, 错误: {}",
|
|
|
|
|
add.getRepairInstanceId(), i + 1, maxRetries, retryException.getMessage());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (i == maxRetries - 1) {
|
|
|
|
|
// 最后一次重试失败,记录错误
|
|
|
|
|
log.error("异步工作流推进最终失败,repairInstanceId: {}, 请手动处理", add.getRepairInstanceId(), retryException);
|
|
|
|
@ -253,7 +263,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
// 创建故障实例活动对象
|
|
|
|
|
// 【重要修改】创建故障实例活动对象 - 只有PDA创建工单时才生成
|
|
|
|
|
DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity();
|
|
|
|
|
// 设置维修实例ID
|
|
|
|
|
dmsFaultInstanceActivity.setRepairInstanceId(add.getRepairInstanceId());
|
|
|
|
@ -269,9 +279,9 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
dmsFaultInstanceActivity.setMachineId(add.getMachineId());
|
|
|
|
|
// 设置维修类型
|
|
|
|
|
dmsFaultInstanceActivity.setRepairType(add.getRepairType());
|
|
|
|
|
// 如果外部资源ID不为空,则设置外部资源ID
|
|
|
|
|
if (add.getOutsourcingId() != null) {
|
|
|
|
|
dmsFaultInstanceActivity.setOutsourcingId(add.getOutsourcingId());
|
|
|
|
|
// 【关键修复】如果外部资源ID不为空,则设置外部资源ID
|
|
|
|
|
if (bo.getOutsourcingId() != null) {
|
|
|
|
|
dmsFaultInstanceActivity.setOutsourcingId(bo.getOutsourcingId());
|
|
|
|
|
}
|
|
|
|
|
// 设置处理状态为待审批
|
|
|
|
|
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_TO_PICK);
|
|
|
|
@ -281,7 +291,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
dmsFaultInstanceActivityMapper.insert(dmsFaultInstanceActivity);
|
|
|
|
|
//存储图片
|
|
|
|
|
// 获取文件URL列表
|
|
|
|
|
List<String> fileUrls = add.getFileUrls();
|
|
|
|
|
List<String> fileUrls = bo.getFileUrls();
|
|
|
|
|
// 批量插入实例文件记录
|
|
|
|
|
batchInsertInstanceFiles(fileUrls, dmsFaultInstanceActivity.getInstanceActivityId());
|
|
|
|
|
return flag;
|
|
|
|
@ -311,7 +321,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
|
|
|
|
|
// 更新审批状态和工单状态
|
|
|
|
|
workOrder.setApproveStatus(approveStatus);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(approveStatus)) {
|
|
|
|
|
// 审批通过:保持待维修状态
|
|
|
|
|
workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR);
|
|
|
|
@ -322,7 +332,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
|
|
|
|
|
// 先更新工单状态,确保业务数据一致性
|
|
|
|
|
boolean updateResult = baseMapper.updateById(workOrder) > 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!updateResult) {
|
|
|
|
|
throw new ServiceException("工单状态更新失败");
|
|
|
|
|
}
|
|
|
|
@ -336,30 +346,30 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
remoteCompleteTask.setTaskId(currentTaskId);
|
|
|
|
|
remoteCompleteTask.setMessage(message != null ? message : "审批完成");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置消息类型
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("1"); // 站内信
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置消息通知内容
|
|
|
|
|
if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(approveStatus)) {
|
|
|
|
|
remoteCompleteTask.setNotice("故障报修工单审批通过,请及时处理,工单编号:" + workOrder.getBillsFaultCode());
|
|
|
|
|
} else {
|
|
|
|
|
remoteCompleteTask.setNotice("故障报修工单审批被拒绝,工单编号:" + workOrder.getBillsFaultCode());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置工作流变量 - approveStatus用于互斥网关判断
|
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
|
|
|
variables.put("approveStatus", approveStatus);
|
|
|
|
|
variables.put("businessId", repairInstanceId.toString());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
remoteCompleteTask.setVariables(variables);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 推进工作流
|
|
|
|
|
boolean workflowResult = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
if (!workflowResult) {
|
|
|
|
|
log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, approveStatus: {}",
|
|
|
|
|
log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, approveStatus: {}",
|
|
|
|
|
repairInstanceId, approveStatus);
|
|
|
|
|
// 工作流推进失败不影响业务操作的成功
|
|
|
|
|
} else {
|
|
|
|
@ -443,6 +453,14 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
dmsFaultInstanceActivity.setHandleBy(userName);
|
|
|
|
|
dmsFaultInstanceActivity.setHandleTime(currentDate);
|
|
|
|
|
|
|
|
|
|
// 【调试日志】打印传入的活动ID,以确认问题根源
|
|
|
|
|
log.info("调用startRepair时,从控制器传入的instanceActivityId为: {}", dmsFaultInstanceActivity.getInstanceActivityId());
|
|
|
|
|
|
|
|
|
|
// 【关键修复】在插入新的活动记录前,必须将ID设置为空。
|
|
|
|
|
// 这是因为传入的dmsFaultInstanceActivity对象可能包含了由PDA端getBillsFaultInstance4Repair接口返回的
|
|
|
|
|
// 第一个活动节点(process_step_order=1)的ID。如果不清空,MyBatis会尝试使用这个旧ID插入新记录,
|
|
|
|
|
// 如果instance_activity_id不是主键或唯一键,就会导致数据重复;如果是,则会抛出主键冲突异常。
|
|
|
|
|
dmsFaultInstanceActivity.setInstanceActivityId(null);
|
|
|
|
|
// 插入新的故障实例活动记录
|
|
|
|
|
boolean result = dmsFaultInstanceActivityService.insertByBo(dmsFaultInstanceActivity);
|
|
|
|
|
|
|
|
|
@ -457,43 +475,55 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
|
|
|
|
|
// 批量插入实例的附件文件信息
|
|
|
|
|
batchInsertInstanceAfterFiles(dmsFaultInstanceActivity.getFileUrls(), dmsFaultInstanceActivity.getInstanceActivityId());
|
|
|
|
|
|
|
|
|
|
// 获取需要插入的备件列表
|
|
|
|
|
public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity, List<MultipartFile> files) {
|
|
|
|
|
// 更新 dms_fault_instance_activity 表
|
|
|
|
|
DmsFaultInstanceActivity activity = new DmsFaultInstanceActivity();
|
|
|
|
|
activity.setInstanceActivityId(dmsFaultInstanceActivity.getInstanceActivityId());
|
|
|
|
|
activity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH);
|
|
|
|
|
activity.setEndTime(new Date());
|
|
|
|
|
activity.setRepairer(LoginHelper.getLoginUser() == null ? LoginHelper.getUsername() : LoginHelper.getLoginUser().getNickname());
|
|
|
|
|
dmsFaultInstanceActivityMapper.updateById(activity);
|
|
|
|
|
|
|
|
|
|
// 批量保存处理的零部件
|
|
|
|
|
List<DmsFaultComponentsParts> parts = dmsFaultInstanceActivity.getParts();
|
|
|
|
|
if (!CollectionUtils.isEmpty(parts)) {
|
|
|
|
|
for (DmsFaultComponentsParts part : parts) {
|
|
|
|
|
part.setFaultId(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
if (parts != null && !parts.isEmpty()) {
|
|
|
|
|
parts.forEach(part -> {
|
|
|
|
|
part.setRepairInstanceId(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
dmsFaultComponentsPartsMapper.insert(part);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 处理文件上传
|
|
|
|
|
if (files != null && !files.isEmpty()) {
|
|
|
|
|
List<DmsInstanceFile> fileList = new ArrayList<>();
|
|
|
|
|
for (MultipartFile file : files) {
|
|
|
|
|
try {
|
|
|
|
|
RemoteFile remoteFile = remoteFileService.upload(file.getName(), file.getOriginalFilename(), file.getContentType(), file.getBytes());
|
|
|
|
|
DmsInstanceFile instanceFile = new DmsInstanceFile();
|
|
|
|
|
instanceFile.setTargetId(dmsFaultInstanceActivity.getInstanceActivityId());
|
|
|
|
|
instanceFile.setFilePath(remoteFile.getUrl());
|
|
|
|
|
instanceFile.setTargetType("1"); // 维修完成图片
|
|
|
|
|
fileList.add(instanceFile);
|
|
|
|
|
dmsInstanceFileMapper.insert(instanceFile);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
throw new ServiceException("文件上传失败");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dmsFaultInstanceActivityMapper.insertParts(parts);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据维修实例ID查询对应的工单实例
|
|
|
|
|
DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
if (dmsBillsFaultInstance == null) {
|
|
|
|
|
throw new ServiceException("工单不存在");
|
|
|
|
|
// 更新 dms_bills_fault_instance 表
|
|
|
|
|
DmsBillsFaultInstance instance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
if (instance == null) {
|
|
|
|
|
throw new ServiceException("工单不存在: " + dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查工单状态
|
|
|
|
|
String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus();
|
|
|
|
|
if (!dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_REPAIRING)) {
|
|
|
|
|
throw new ServiceException("工单状态不允许完成维修,请先开始维修");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取当前日期和时间
|
|
|
|
|
Date currentDate = new Date();
|
|
|
|
|
String userName = LoginHelper.getLoginUser() == null ? LoginHelper.getUsername() : LoginHelper.getLoginUser().getNickname();
|
|
|
|
|
|
|
|
|
|
// 设置工单状态为维修完成,确认状态为待确认
|
|
|
|
|
dmsBillsFaultInstance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH);
|
|
|
|
|
dmsBillsFaultInstance.setRealEndTime(currentDate);
|
|
|
|
|
dmsBillsFaultInstance.setRepairConfirm("0"); // 设置为待确认状态
|
|
|
|
|
instance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH);
|
|
|
|
|
instance.setRealEndTime(new Date());
|
|
|
|
|
instance.setRepairConfirm("0"); // 设置为待确认状态
|
|
|
|
|
baseMapper.updateById(instance);
|
|
|
|
|
|
|
|
|
|
// 推进工作流
|
|
|
|
|
if (dmsBillsFaultInstance.getWfDefinitionId() != null) {
|
|
|
|
|
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(dmsBillsFaultInstance.getWfDefinitionId());
|
|
|
|
|
if (instance.getWfDefinitionId() != null) {
|
|
|
|
|
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(instance.getWfDefinitionId());
|
|
|
|
|
if (currentTaskId != null) {
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
remoteCompleteTask.setTaskId(currentTaskId);
|
|
|
|
@ -501,7 +531,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("1"); // 站内信
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode());
|
|
|
|
|
remoteCompleteTask.setNotice("故障报修工单维修完成,待主管确认,工单编号:" + instance.getBillsFaultCode());
|
|
|
|
|
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
if (!b) {
|
|
|
|
|
throw new ServiceException("工作流推进失败");
|
|
|
|
@ -509,19 +539,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新工单状态
|
|
|
|
|
baseMapper.updateById(dmsBillsFaultInstance);
|
|
|
|
|
|
|
|
|
|
// 设置工单活动状态为已完成,并记录结束时间和维修人员
|
|
|
|
|
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH);
|
|
|
|
|
dmsFaultInstanceActivity.setEndTime(currentDate);
|
|
|
|
|
dmsFaultInstanceActivity.setRepairer(userName);
|
|
|
|
|
|
|
|
|
|
// 更新故障实例活动记录
|
|
|
|
|
DmsFaultInstanceActivity faultInstanceActivity = MapstructUtils.convert(dmsFaultInstanceActivity, DmsFaultInstanceActivity.class);
|
|
|
|
|
int i = dmsFaultInstanceActivityMapper.updateById(faultInstanceActivity);
|
|
|
|
|
|
|
|
|
|
return i;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -573,7 +591,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
if (currentTaskId != null) {
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
remoteCompleteTask.setTaskId(currentTaskId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置工作流变量 - 用于互斥网关判断分支走向
|
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
|
|
|
if ("1".equals(confirmResult)) {
|
|
|
|
@ -585,27 +603,27 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
remoteCompleteTask.setMessage("主管确认不通过,返回维修环节");
|
|
|
|
|
variables.put("repairConfirm", "1");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
variables.put("businessId", repairInstanceId.toString());
|
|
|
|
|
remoteCompleteTask.setVariables(variables);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("1"); // 站内信
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置消息通知内容
|
|
|
|
|
if ("1".equals(confirmResult)) {
|
|
|
|
|
remoteCompleteTask.setNotice("故障报修工单已完成,工单编号:" + workOrder.getBillsFaultCode());
|
|
|
|
|
} else {
|
|
|
|
|
remoteCompleteTask.setNotice("故障报修工单确认不通过,需重新维修,工单编号:" + workOrder.getBillsFaultCode());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
boolean workflowResult = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
if (!workflowResult) {
|
|
|
|
|
log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, confirmResult: {}",
|
|
|
|
|
log.warn("工作流推进失败,但业务状态已更新成功,repairInstanceId: {}, confirmResult: {}",
|
|
|
|
|
repairInstanceId, confirmResult);
|
|
|
|
|
} else {
|
|
|
|
|
log.info("主管确认完成,工作流推进成功,repairInstanceId: {}, confirmResult: {}",
|
|
|
|
|
log.info("主管确认完成,工作流推进成功,repairInstanceId: {}, confirmResult: {}",
|
|
|
|
|
repairInstanceId, confirmResult);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -626,50 +644,50 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
// 1. 首先更新工单的工作流实例ID,确保关联关系建立
|
|
|
|
|
dmsBillsFaultInstance.setWfDefinitionId(processInstanceId);
|
|
|
|
|
boolean updateResult = baseMapper.updateById(dmsBillsFaultInstance) > 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!updateResult) {
|
|
|
|
|
log.error("更新工单工作流实例ID失败,repairInstanceId: {}, processInstanceId: {}",
|
|
|
|
|
log.error("更新工单工作流实例ID失败,repairInstanceId: {}, processInstanceId: {}",
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("成功更新工单工作流实例ID,repairInstanceId: {}, processInstanceId: {}",
|
|
|
|
|
|
|
|
|
|
log.info("成功更新工单工作流实例ID,repairInstanceId: {}, processInstanceId: {}",
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId);
|
|
|
|
|
|
|
|
|
|
// 2. 然后推进工作流(工单创建后自动推进到审批节点)
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
remoteCompleteTask.setTaskId(taskId);
|
|
|
|
|
remoteCompleteTask.setMessage("工单创建完成,自动推进到审批节点");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置消息类型
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
messageTypes.add("1"); // 站内信
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置消息通知内容
|
|
|
|
|
remoteCompleteTask.setNotice("您有新的故障报修工单需要审批,工单编号:" + dmsBillsFaultInstance.getBillsFaultCode());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置工作流变量(如果需要)
|
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
|
|
|
variables.put("businessId", dmsBillsFaultInstance.getRepairInstanceId().toString());
|
|
|
|
|
variables.put("initiator", LoginHelper.getUsername());
|
|
|
|
|
remoteCompleteTask.setVariables(variables);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
boolean completeResult = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!completeResult) {
|
|
|
|
|
log.error("工作流推进失败,repairInstanceId: {}, taskId: {}",
|
|
|
|
|
log.error("工作流推进失败,repairInstanceId: {}, taskId: {}",
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), taskId);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("工作流推进成功,repairInstanceId: {}, taskId: {}",
|
|
|
|
|
|
|
|
|
|
log.info("工作流推进成功,repairInstanceId: {}, taskId: {}",
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), taskId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("更新工作流异常,repairInstanceId: {}, taskId: {}, processInstanceId: {}",
|
|
|
|
|
log.error("更新工作流异常,repairInstanceId: {}, taskId: {}, processInstanceId: {}",
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), taskId, processInstanceId, e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
@ -754,54 +772,101 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public DmsBillsFaultInstanceVo selectDmsBillsFaultInstanceByRepairInstanceId(Long repairInstanceId) {
|
|
|
|
|
// 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录
|
|
|
|
|
DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId);
|
|
|
|
|
|
|
|
|
|
// 【关键修复】查询零部件信息,确保PDA端兼容性
|
|
|
|
|
List<DmsFaultComponentsPartsVo> partsVoList = baseMapper.selectParts(repairInstanceId);
|
|
|
|
|
if (partsVoList == null) {
|
|
|
|
|
partsVoList = new ArrayList<>(); // 确保不为null
|
|
|
|
|
}
|
|
|
|
|
// 转换为实体对象并设置到工单中
|
|
|
|
|
List<DmsFaultComponentsParts> partsList = MapstructUtils.convert(partsVoList, DmsFaultComponentsParts.class);
|
|
|
|
|
dmsBillsFaultInstance.setParts(partsList);
|
|
|
|
|
|
|
|
|
|
// 创建实例文件查询对象
|
|
|
|
|
DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo();
|
|
|
|
|
// 设置目标类型为故障实例活动
|
|
|
|
|
queryInstanceFile.setTargetType(DmsConstants.DMS_INSTANCE_FILE_TARGET_TYPE_FAULT_INSTANCE_ACTIVITY);
|
|
|
|
|
// 设置目标ID为故障实例的活动ID
|
|
|
|
|
queryInstanceFile.setTargetId(dmsBillsFaultInstance.getInstanceActivityId());
|
|
|
|
|
// 查询实例文件列表
|
|
|
|
|
List<DmsInstanceFileVo> dmsInstanceFiles = DmsInstanceFileService.queryList(queryInstanceFile);
|
|
|
|
|
|
|
|
|
|
// 遍历实例文件列表FIXME
|
|
|
|
|
for (DmsInstanceFileVo dmsInstanceFile : dmsInstanceFiles){
|
|
|
|
|
// 获取文件路径
|
|
|
|
|
String filePath = dmsInstanceFile.getFilePath();
|
|
|
|
|
// 如果文件路径不包含"9005"
|
|
|
|
|
if(!filePath.contains("9005")){
|
|
|
|
|
// 如果文件路径包含"https",将其替换为"http"
|
|
|
|
|
if(filePath.contains("https")){
|
|
|
|
|
filePath.replaceFirst("https","http");
|
|
|
|
|
}
|
|
|
|
|
// 找到"/statics"的索引位置
|
|
|
|
|
int index= filePath.indexOf("/statics");
|
|
|
|
|
// 修改文件路径为新的地址
|
|
|
|
|
filePath = "http://118.25.106.99:9005"+filePath.substring(index);
|
|
|
|
|
// 设置新的URL和文件路径
|
|
|
|
|
dmsInstanceFile.setFilePath(filePath);
|
|
|
|
|
}else{
|
|
|
|
|
// 如果文件路径包含"9005",直接设置URL为文件路径
|
|
|
|
|
dmsInstanceFile.setFilePath(dmsInstanceFile.getFilePath());
|
|
|
|
|
try {
|
|
|
|
|
// 根据repairInstanceId查询故障实例及其关联的设备和第一条活动记录
|
|
|
|
|
DmsBillsFaultInstanceVo dmsBillsFaultInstance = baseMapper.selectFaultInstanceJoinFirstAndDeviceById(repairInstanceId);
|
|
|
|
|
|
|
|
|
|
if (dmsBillsFaultInstance == null) {
|
|
|
|
|
throw new ServiceException("工单不存在,repairInstanceId: " + repairInstanceId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
List<DmsInstanceFile> InstanceFiles = MapstructUtils.convert(dmsInstanceFiles, DmsInstanceFile.class);
|
|
|
|
|
// 将修改后的实例文件列表设置到故障实例中
|
|
|
|
|
dmsBillsFaultInstance.setDmsInstanceFiles(InstanceFiles);
|
|
|
|
|
|
|
|
|
|
// 返回故障实例对象
|
|
|
|
|
return dmsBillsFaultInstance;
|
|
|
|
|
// 【调试日志】输出查询结果,确认outsourcingId是否正确获取
|
|
|
|
|
log.info("查询工单详情,repairInstanceId: {}, outsourcingId: {}, instanceActivityId: {}",
|
|
|
|
|
repairInstanceId, dmsBillsFaultInstance.getOutsourcingId(), dmsBillsFaultInstance.getInstanceActivityId());
|
|
|
|
|
|
|
|
|
|
// 【关键修复】查询零部件信息,确保PDA端兼容性
|
|
|
|
|
List<DmsFaultComponentsPartsVo> partsVoList = baseMapper.selectParts(repairInstanceId);
|
|
|
|
|
if (partsVoList == null) {
|
|
|
|
|
partsVoList = new ArrayList<>(); // 确保不为null
|
|
|
|
|
}
|
|
|
|
|
// 转换为实体对象并设置到工单中
|
|
|
|
|
List<DmsFaultComponentsParts> partsList = MapstructUtils.convert(partsVoList, DmsFaultComponentsParts.class);
|
|
|
|
|
dmsBillsFaultInstance.setParts(partsList);
|
|
|
|
|
|
|
|
|
|
// 创建实例文件查询对象
|
|
|
|
|
DmsInstanceFileBo queryInstanceFile = new DmsInstanceFileBo();
|
|
|
|
|
// 设置目标类型为故障实例活动
|
|
|
|
|
queryInstanceFile.setTargetType(DmsConstants.DMS_INSTANCE_FILE_TARGET_TYPE_FAULT_INSTANCE_ACTIVITY);
|
|
|
|
|
// 设置目标ID为故障实例的活动ID
|
|
|
|
|
queryInstanceFile.setTargetId(dmsBillsFaultInstance.getInstanceActivityId());
|
|
|
|
|
// 查询实例文件列表
|
|
|
|
|
List<DmsInstanceFileVo> dmsInstanceFiles = DmsInstanceFileService.queryList(queryInstanceFile);
|
|
|
|
|
|
|
|
|
|
// 遍历实例文件列表FIXME
|
|
|
|
|
for (DmsInstanceFileVo dmsInstanceFile : dmsInstanceFiles){
|
|
|
|
|
// 获取文件路径
|
|
|
|
|
String filePath = dmsInstanceFile.getFilePath();
|
|
|
|
|
// 如果文件路径不包含"9005"
|
|
|
|
|
if(!filePath.contains("9005")){
|
|
|
|
|
// 如果文件路径包含"https",将其替换为"http"
|
|
|
|
|
if(filePath.contains("https")){
|
|
|
|
|
filePath.replaceFirst("https","http");
|
|
|
|
|
}
|
|
|
|
|
// 找到"/statics"的索引位置
|
|
|
|
|
int index= filePath.indexOf("/statics");
|
|
|
|
|
// 修改文件路径为新的地址
|
|
|
|
|
filePath = "http://118.25.106.99:9005"+filePath.substring(index);
|
|
|
|
|
// 设置新的URL和文件路径
|
|
|
|
|
dmsInstanceFile.setFilePath(filePath);
|
|
|
|
|
}else{
|
|
|
|
|
// 如果文件路径包含"9005",直接设置URL为文件路径
|
|
|
|
|
dmsInstanceFile.setFilePath(dmsInstanceFile.getFilePath());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
List<DmsInstanceFile> InstanceFiles = MapstructUtils.convert(dmsInstanceFiles, DmsInstanceFile.class);
|
|
|
|
|
// 将修改后的实例文件列表设置到故障实例中
|
|
|
|
|
dmsBillsFaultInstance.setDmsInstanceFiles(InstanceFiles);
|
|
|
|
|
|
|
|
|
|
// 返回故障实例对象
|
|
|
|
|
return dmsBillsFaultInstance;
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("查询工单详情异常,repairInstanceId: {}", repairInstanceId, e);
|
|
|
|
|
|
|
|
|
|
// 如果是查询返回多条记录的异常,尝试备用查询方案
|
|
|
|
|
if (e.getMessage() != null && e.getMessage().contains("Expected one result")) {
|
|
|
|
|
log.warn("检测到查询返回多条记录异常,尝试备用查询方案,repairInstanceId: {}", repairInstanceId);
|
|
|
|
|
|
|
|
|
|
// 备用方案:查询工单基本信息和最新的活动记录
|
|
|
|
|
DmsBillsFaultInstanceVo workOrder = baseMapper.selectVoById(repairInstanceId);
|
|
|
|
|
if (workOrder != null) {
|
|
|
|
|
// 查询最新的活动记录
|
|
|
|
|
MPJLambdaWrapper<DmsFaultInstanceActivity> wrapper = JoinWrappers.lambda(DmsFaultInstanceActivity.class)
|
|
|
|
|
.eq(DmsFaultInstanceActivity::getRepairInstanceId, repairInstanceId)
|
|
|
|
|
.orderByDesc(DmsFaultInstanceActivity::getProcessStepOrder)
|
|
|
|
|
.orderByDesc(DmsFaultInstanceActivity::getInstanceActivityId)
|
|
|
|
|
.last("LIMIT 1");
|
|
|
|
|
DmsFaultInstanceActivity latestActivity = dmsFaultInstanceActivityMapper.selectOne(wrapper);
|
|
|
|
|
|
|
|
|
|
if (latestActivity != null) {
|
|
|
|
|
// 设置活动相关信息
|
|
|
|
|
workOrder.setInstanceActivityId(latestActivity.getInstanceActivityId());
|
|
|
|
|
workOrder.setFaultType(latestActivity.getFaultType());
|
|
|
|
|
workOrder.setFaultDescription(latestActivity.getFaultDescription());
|
|
|
|
|
workOrder.setDesignOperations(latestActivity.getDesignOperations());
|
|
|
|
|
workOrder.setRepairType(latestActivity.getRepairType());
|
|
|
|
|
workOrder.setOutsourcingId(latestActivity.getOutsourcingId());
|
|
|
|
|
workOrder.setProcessHandleResolution(latestActivity.getProcessHandleResolution());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("备用查询方案成功,repairInstanceId: {}, instanceActivityId: {}",
|
|
|
|
|
repairInstanceId, workOrder.getInstanceActivityId());
|
|
|
|
|
return workOrder;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
throw new ServiceException("查询工单详情失败:" + e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|