|
|
@ -65,7 +65,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
|
|
|
|
|
|
|
|
private final IDmsInstanceFileService DmsInstanceFileService;
|
|
|
|
private final IDmsInstanceFileService DmsInstanceFileService;
|
|
|
|
|
|
|
|
|
|
|
|
@DubboReference(timeout = 15000, retries = 1)
|
|
|
|
@DubboReference(timeout = 30000, retries = 2)
|
|
|
|
private final RemoteWorkflowService remoteWorkflowService;
|
|
|
|
private final RemoteWorkflowService remoteWorkflowService;
|
|
|
|
|
|
|
|
|
|
|
|
private final DmsFaultInstanceActivityMapper dmsFaultInstanceActivityMapper;
|
|
|
|
private final DmsFaultInstanceActivityMapper dmsFaultInstanceActivityMapper;
|
|
|
@ -185,6 +185,8 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
add.setBillsFaultCode(Seq.getId(Seq.dmsBillsFaultInstanceSeqType, Seq.dmsBillsFaultInstanceSeqCode));
|
|
|
|
add.setBillsFaultCode(Seq.getId(Seq.dmsBillsFaultInstanceSeqType, Seq.dmsBillsFaultInstanceSeqCode));
|
|
|
|
// 设置报修状态为待维修
|
|
|
|
// 设置报修状态为待维修
|
|
|
|
add.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR);
|
|
|
|
add.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR);
|
|
|
|
|
|
|
|
// 设置审批状态为待审批(按照PDA标准)
|
|
|
|
|
|
|
|
add.setApproveStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_PENDING);
|
|
|
|
// 设置实例类型为手动录入
|
|
|
|
// 设置实例类型为手动录入
|
|
|
|
add.setInstanceType(DmsConstants.DMS_BILLS_FAULT_INSTANCE_TYPE_MAUAL);
|
|
|
|
add.setInstanceType(DmsConstants.DMS_BILLS_FAULT_INSTANCE_TYPE_MAUAL);
|
|
|
|
|
|
|
|
|
|
|
@ -193,12 +195,16 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
bo.setRepairInstanceId(add.getRepairInstanceId());
|
|
|
|
bo.setRepairInstanceId(add.getRepairInstanceId());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//FIXME:工作流相关
|
|
|
|
//工作流相关:自动启动工作流
|
|
|
|
RemoteStartProcess remoteStartProcess = new RemoteStartProcess();
|
|
|
|
RemoteStartProcess remoteStartProcess = new RemoteStartProcess();
|
|
|
|
remoteStartProcess.setFlowCode(DmsConstants.DMS_BILLS_FAULT_INSTANCE_WF_CODE);
|
|
|
|
remoteStartProcess.setFlowCode(DmsConstants.DMS_BILLS_FAULT_INSTANCE_WF_CODE);
|
|
|
|
remoteStartProcess.setBusinessId(add.getRepairInstanceId().toString());
|
|
|
|
remoteStartProcess.setBusinessId(add.getRepairInstanceId().toString());
|
|
|
|
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(remoteStartProcess);
|
|
|
|
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(remoteStartProcess);
|
|
|
|
Long taskId = remoteStartProcessReturn.getTaskId();
|
|
|
|
Long taskId = remoteStartProcessReturn.getTaskId();
|
|
|
|
|
|
|
|
Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // 更新工作流实例ID
|
|
|
|
|
|
|
|
// add.setWfDefinitionId(processInstanceId);
|
|
|
|
|
|
|
|
|
|
|
|
// ** 异步线程上下文传递【核心问题】 **
|
|
|
|
// ** 异步线程上下文传递【核心问题】 **
|
|
|
|
// 在主线程中,用户的登录信息(Token)是存放在一个叫 ThreadLocal 的"线程口袋"里的。
|
|
|
|
// 在主线程中,用户的登录信息(Token)是存放在一个叫 ThreadLocal 的"线程口袋"里的。
|
|
|
@ -214,14 +220,37 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
|
|
|
|
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
|
|
|
|
StpUtil.setTokenValue(tokenValue);
|
|
|
|
StpUtil.setTokenValue(tokenValue);
|
|
|
|
// 4. 【执行业务】: 现在子线程就像登录过一样,可以带着Token去调用其他需要权限的服务了。
|
|
|
|
|
|
|
|
updateWorkFlow(add, taskId);
|
|
|
|
// 4. 【延迟执行】: 稍微延迟,确保主事务完全提交
|
|
|
|
|
|
|
|
Thread.sleep(100);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 5. 【重试机制】: 最多重试3次,每次间隔递增
|
|
|
|
|
|
|
|
int maxRetries = 3;
|
|
|
|
|
|
|
|
for (int i = 0; i < maxRetries; i++) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 执行业务:现在子线程就像登录过一样,可以带着Token去调用其他需要权限的服务了
|
|
|
|
|
|
|
|
updateWorkFlow(add, taskId, processInstanceId);
|
|
|
|
|
|
|
|
log.info("异步工作流推进成功,repairInstanceId: {}, 重试次数: {}", add.getRepairInstanceId(), i);
|
|
|
|
|
|
|
|
break; // 成功则退出重试循环
|
|
|
|
|
|
|
|
} catch (Exception retryException) {
|
|
|
|
|
|
|
|
log.warn("异步工作流推进失败,repairInstanceId: {}, 重试次数: {}/{}, 错误: {}",
|
|
|
|
|
|
|
|
add.getRepairInstanceId(), i + 1, maxRetries, retryException.getMessage());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (i == maxRetries - 1) {
|
|
|
|
|
|
|
|
// 最后一次重试失败,记录错误
|
|
|
|
|
|
|
|
log.error("异步工作流推进最终失败,repairInstanceId: {}, 请手动处理", add.getRepairInstanceId(), retryException);
|
|
|
|
|
|
|
|
// TODO: 可以考虑记录到失败表,后续补偿处理
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 等待后重试,递增延迟时间
|
|
|
|
|
|
|
|
Thread.sleep((i + 1) * 1000);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
} catch (Exception e) {
|
|
|
|
// 简单记录错误,不影响主流程
|
|
|
|
log.error("异步更新工作流异常,repairInstanceId: {}", add.getRepairInstanceId(), e);
|
|
|
|
System.err.println("异步更新工作流失败,repairInstanceId: " + add.getRepairInstanceId() + ", 错误: " + e.getMessage());
|
|
|
|
|
|
|
|
// 可以考虑记录到失败表,后续补偿处理
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
// 创建故障实例活动对象
|
|
|
|
// 创建故障实例活动对象
|
|
|
|
DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity();
|
|
|
|
DmsFaultInstanceActivity dmsFaultInstanceActivity = new DmsFaultInstanceActivity();
|
|
|
|
// 设置维修实例ID
|
|
|
|
// 设置维修实例ID
|
|
|
@ -242,7 +271,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
if (add.getOutsourcingId() != null) {
|
|
|
|
if (add.getOutsourcingId() != null) {
|
|
|
|
dmsFaultInstanceActivity.setOutsourcingId(add.getOutsourcingId());
|
|
|
|
dmsFaultInstanceActivity.setOutsourcingId(add.getOutsourcingId());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 设置处理状态为待领取
|
|
|
|
// 设置处理状态为待审批
|
|
|
|
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_TO_PICK);
|
|
|
|
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_TO_PICK);
|
|
|
|
// 设置流程步骤顺序
|
|
|
|
// 设置流程步骤顺序
|
|
|
|
dmsFaultInstanceActivity.setProcessStepOrder(1l);
|
|
|
|
dmsFaultInstanceActivity.setProcessStepOrder(1l);
|
|
|
@ -256,29 +285,326 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
return flag;
|
|
|
|
return flag;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 审批故障报修工单
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param repairInstanceId 工单ID
|
|
|
|
|
|
|
|
* @param approveStatus 审批状态(2-审批成功,3-审批失败)
|
|
|
|
|
|
|
|
* @param message 审批意见
|
|
|
|
|
|
|
|
* @return 是否审批成功
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
|
|
|
public Boolean approveWorkOrder(Long repairInstanceId, String approveStatus, String message) {
|
|
|
|
|
|
|
|
// 查询工单信息
|
|
|
|
|
|
|
|
DmsBillsFaultInstance workOrder = baseMapper.selectById(repairInstanceId);
|
|
|
|
|
|
|
|
if (workOrder == null) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单不存在");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查当前状态是否可以审批(必须是待审批状态)
|
|
|
|
|
|
|
|
if (!DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_PENDING.equals(workOrder.getApproveStatus())) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单当前状态不允许审批");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新审批状态
|
|
|
|
|
|
|
|
workOrder.setApproveStatus(approveStatus);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(approveStatus)) {
|
|
|
|
|
|
|
|
// 审批通过:保持待维修状态
|
|
|
|
|
|
|
|
workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR);
|
|
|
|
|
|
|
|
} else if (DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_REJECTED.equals(approveStatus)) {
|
|
|
|
|
|
|
|
// 审批拒绝:设置为维修完成状态(终止工单)
|
|
|
|
|
|
|
|
workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新工单状态
|
|
|
|
|
|
|
|
boolean updateResult = baseMapper.updateById(workOrder) > 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (updateResult && workOrder.getWfDefinitionId() != null) {
|
|
|
|
|
|
|
|
// 推进工作流
|
|
|
|
|
|
|
|
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(workOrder.getWfDefinitionId());
|
|
|
|
|
|
|
|
if (currentTaskId != null) {
|
|
|
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
|
|
|
remoteCompleteTask.setTaskId(currentTaskId);
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessage(message);
|
|
|
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
|
|
|
messageTypes.add("system");
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置工作流变量 - approveStatus用于互斥网关判断
|
|
|
|
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
|
|
|
|
|
|
variables.put("approveStatus", approveStatus);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
remoteCompleteTask.setVariables(variables);
|
|
|
|
|
|
|
|
remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return updateResult;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 开始维修
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param dmsFaultInstanceActivity 报修工单实例节点
|
|
|
|
|
|
|
|
* @return 结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
|
|
|
public int startRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
|
|
|
|
|
|
|
|
// 根据维修实例ID查询故障实例信息
|
|
|
|
|
|
|
|
DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
|
|
|
if (dmsBillsFaultInstance == null) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单不存在");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查审批状态(按照PDA标准,只有状态为"2"审批成功才可以开始维修)
|
|
|
|
|
|
|
|
if (!DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_APPROVED.equals(dmsBillsFaultInstance.getApproveStatus())) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单未审批通过,无法开始维修");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查工单状态
|
|
|
|
|
|
|
|
String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus();
|
|
|
|
|
|
|
|
if (!dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR)) {
|
|
|
|
|
|
|
|
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_REPAIRING);
|
|
|
|
|
|
|
|
// 设置实际开始时间
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.setRealBeginTime(currentDate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 推进工作流
|
|
|
|
|
|
|
|
if (dmsBillsFaultInstance.getWfDefinitionId() != null) {
|
|
|
|
|
|
|
|
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(dmsBillsFaultInstance.getWfDefinitionId());
|
|
|
|
|
|
|
|
if (currentTaskId != null) {
|
|
|
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
|
|
|
remoteCompleteTask.setTaskId(currentTaskId);
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessage("开始维修");
|
|
|
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
|
|
|
messageTypes.add("system");
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
|
|
|
if (!b) {
|
|
|
|
|
|
|
|
throw new ServiceException("工作流推进失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新工单状态
|
|
|
|
|
|
|
|
baseMapper.updateById(dmsBillsFaultInstance);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置维修实例活动记录
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setRepairInstanceId(dmsBillsFaultInstance.getRepairInstanceId());
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setMachineId(dmsBillsFaultInstance.getMachineId());
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_EXECUTING);
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setProcessStepOrder(2L);
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setStartTime(currentDate);
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setHandleUserId(LoginHelper.getUserId());
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setHandleBy(userName);
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setHandleTime(currentDate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 插入新的故障实例活动记录
|
|
|
|
|
|
|
|
boolean result = dmsFaultInstanceActivityService.insertByBo(dmsFaultInstanceActivity);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return result ? 1 : 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 完成维修
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param dmsFaultInstanceActivity 报修工单实例节点
|
|
|
|
|
|
|
|
* @return 结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
|
|
|
public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
|
|
|
|
|
|
|
|
// 批量插入实例的附件文件信息
|
|
|
|
|
|
|
|
batchInsertInstanceAfterFiles(dmsFaultInstanceActivity.getFileUrls(), dmsFaultInstanceActivity.getInstanceActivityId());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取需要插入的备件列表
|
|
|
|
|
|
|
|
List<DmsFaultComponentsParts> parts = dmsFaultInstanceActivity.getParts();
|
|
|
|
|
|
|
|
if (!CollectionUtils.isEmpty(parts)) {
|
|
|
|
|
|
|
|
for (DmsFaultComponentsParts part : parts) {
|
|
|
|
|
|
|
|
part.setFaultId(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
dmsFaultInstanceActivityMapper.insertParts(parts);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 根据维修实例ID查询对应的工单实例
|
|
|
|
|
|
|
|
DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper.selectById(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
|
|
|
if (dmsBillsFaultInstance == null) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单不存在");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查工单状态
|
|
|
|
|
|
|
|
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"); // 设置为待确认状态
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 推进工作流
|
|
|
|
|
|
|
|
if (dmsBillsFaultInstance.getWfDefinitionId() != null) {
|
|
|
|
|
|
|
|
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(dmsBillsFaultInstance.getWfDefinitionId());
|
|
|
|
|
|
|
|
if (currentTaskId != null) {
|
|
|
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
|
|
|
remoteCompleteTask.setTaskId(currentTaskId);
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessage("完成维修");
|
|
|
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
|
|
|
messageTypes.add("system");
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
|
|
|
if (!b) {
|
|
|
|
|
|
|
|
throw new ServiceException("工作流推进失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新工单状态
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 主管确认维修结果
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param repairInstanceId 工单ID
|
|
|
|
|
|
|
|
* @param confirmResult 确认结果(1-确认完成)
|
|
|
|
|
|
|
|
* @param confirmUser 确认人
|
|
|
|
|
|
|
|
* @return 是否确认成功
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
|
|
|
public Boolean confirmRepairResult(Long repairInstanceId, String confirmResult, String confirmUser) {
|
|
|
|
|
|
|
|
// 查询工单信息
|
|
|
|
|
|
|
|
DmsBillsFaultInstance workOrder = baseMapper.selectById(repairInstanceId);
|
|
|
|
|
|
|
|
if (workOrder == null) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单不存在");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查当前状态是否可以确认
|
|
|
|
|
|
|
|
if (!DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH.equals(workOrder.getBillsStatus())) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单尚未完成维修,无法确认");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!"0".equals(workOrder.getRepairConfirm())) {
|
|
|
|
|
|
|
|
throw new ServiceException("工单已经确认过了");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新确认状态
|
|
|
|
|
|
|
|
workOrder.setRepairConfirm(confirmResult);
|
|
|
|
|
|
|
|
workOrder.setConfirmUser(confirmUser);
|
|
|
|
|
|
|
|
workOrder.setConfirmTime(new Date());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 推进工作流到最终完成状态
|
|
|
|
|
|
|
|
if (workOrder.getWfDefinitionId() != null) {
|
|
|
|
|
|
|
|
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(workOrder.getWfDefinitionId());
|
|
|
|
|
|
|
|
if (currentTaskId != null) {
|
|
|
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
|
|
|
remoteCompleteTask.setTaskId(currentTaskId);
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessage("主管确认完成");
|
|
|
|
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
|
|
|
|
messageTypes.add("system");
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置工作流变量 - repairConfirm用于互斥网关判断
|
|
|
|
|
|
|
|
// 确认通过传0,确认不通过传1
|
|
|
|
|
|
|
|
Map<String, Object> variables = new HashMap<>();
|
|
|
|
|
|
|
|
if ("1".equals(confirmResult)) {
|
|
|
|
|
|
|
|
// 确认完成 -> 工作流变量设为0(确认通过)
|
|
|
|
|
|
|
|
variables.put("repairConfirm", "0");
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 其他情况 -> 工作流变量设为1(确认不通过)
|
|
|
|
|
|
|
|
variables.put("repairConfirm", "1");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
remoteCompleteTask.setVariables(variables);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return baseMapper.updateById(workOrder) > 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 更新工作流
|
|
|
|
* 更新工作流
|
|
|
|
* @param dmsBillsFaultInstance
|
|
|
|
* @param dmsBillsFaultInstance 工单实例
|
|
|
|
* @param taskId 任务ID
|
|
|
|
* @param taskId 任务ID
|
|
|
|
|
|
|
|
* @param processInstanceId 流程实例ID
|
|
|
|
* @return 是否更新成功
|
|
|
|
* @return 是否更新成功
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private Boolean updateWorkFlow(DmsBillsFaultInstance dmsBillsFaultInstance, Long taskId){
|
|
|
|
private Boolean updateWorkFlow(DmsBillsFaultInstance dmsBillsFaultInstance, Long taskId, Long processInstanceId){
|
|
|
|
dmsBillsFaultInstance.setWfDefinitionId(taskId);
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 1. 首先更新工单的工作流实例ID,确保关联关系建立
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.setWfDefinitionId(processInstanceId);
|
|
|
|
|
|
|
|
boolean updateResult = baseMapper.updateById(dmsBillsFaultInstance) > 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!updateResult) {
|
|
|
|
|
|
|
|
log.error("更新工单工作流实例ID失败,repairInstanceId: {}, processInstanceId: {}",
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("成功更新工单工作流实例ID,repairInstanceId: {}, processInstanceId: {}",
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), processInstanceId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 然后推进工作流(工单创建后自动推进到审批节点)
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
// 必填字段
|
|
|
|
|
|
|
|
remoteCompleteTask.setTaskId(taskId);
|
|
|
|
remoteCompleteTask.setTaskId(taskId);
|
|
|
|
remoteCompleteTask.setMessage("自动推进");
|
|
|
|
remoteCompleteTask.setMessage("工单创建完成,自动推进到审批节点");
|
|
|
|
// 关键:设置messageType为非null的List(解决原始错误)
|
|
|
|
|
|
|
|
|
|
|
|
// 设置消息类型
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
List<String> messageTypes = new ArrayList<>();
|
|
|
|
messageTypes.add("system"); // 系统消息
|
|
|
|
messageTypes.add("system");
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
remoteCompleteTask.setMessageType(messageTypes);
|
|
|
|
boolean b = remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
|
|
|
if (!b) {
|
|
|
|
// 设置工作流变量(如果需要)
|
|
|
|
|
|
|
|
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: {}",
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), taskId);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("工作流推进成功,repairInstanceId: {}, taskId: {}",
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), taskId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
log.error("更新工作流异常,repairInstanceId: {}, taskId: {}, processInstanceId: {}",
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.getRepairInstanceId(), taskId, processInstanceId, e);
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}else {
|
|
|
|
|
|
|
|
return baseMapper.updateById(dmsBillsFaultInstance) > 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -481,201 +807,6 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 开始维修
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param dmsFaultInstanceActivity 报修工单实例节点
|
|
|
|
|
|
|
|
* @return 结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
|
|
|
public int startRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
|
|
|
|
|
|
|
|
// 定义一个布尔变量b,用于存储更新结果
|
|
|
|
|
|
|
|
Boolean b = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 根据维修实例ID查询故障实例信息
|
|
|
|
|
|
|
|
DmsBillsFaultInstance dmsBillsFaultInstance = baseMapper
|
|
|
|
|
|
|
|
.selectFaultInstanceJoinFirstById(dmsFaultInstanceActivity.getRepairInstanceId());//join 第一步activity
|
|
|
|
|
|
|
|
// 获取工单状态
|
|
|
|
|
|
|
|
String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus();
|
|
|
|
|
|
|
|
// 如果工单状态为已完成,抛出异常
|
|
|
|
|
|
|
|
if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH)) {//维修完成
|
|
|
|
|
|
|
|
throw new ServiceException("已经维修完成");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取当前日期和登录用户名
|
|
|
|
|
|
|
|
Date currentDate = new Date();
|
|
|
|
|
|
|
|
String userName = LoginHelper.getLoginUser()==null ? LoginHelper.getUsername() :LoginHelper.getLoginUser().getNickname();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果工单状态为待维修
|
|
|
|
|
|
|
|
if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR)) {//待维修
|
|
|
|
|
|
|
|
// 设置工单状态为维修中
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_REPAIRING);
|
|
|
|
|
|
|
|
// 设置实际开始时间
|
|
|
|
|
|
|
|
dmsBillsFaultInstance.setRealBeginTime(currentDate);
|
|
|
|
|
|
|
|
//启动工作流
|
|
|
|
|
|
|
|
Long taskId = getOrCreateTaskId(dmsBillsFaultInstance);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ** 异步线程上下文传递【核心问题】 **
|
|
|
|
|
|
|
|
// 在主线程中,用户的登录信息(Token)是存放在一个叫 ThreadLocal 的"线程口袋"里的。
|
|
|
|
|
|
|
|
// 当我们使用 CompletableFuture.runAsync() 开启一个异步线程(子线程)时,
|
|
|
|
|
|
|
|
// 这个"口袋"里的东西默认是不会被带到子线程去的。
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// ** 【解决方案】 **
|
|
|
|
|
|
|
|
// 1. 【捕获Token】: 在主线程里,我们先用 StpUtil.getTokenValue() 把Token拿出来,存好。
|
|
|
|
|
|
|
|
final String tokenValue = StpUtil.getTokenValue();
|
|
|
|
|
|
|
|
// 2. 【传递与恢复】: 使用 TtlRunnable (TransmittableThreadLocal Runnable) 包装我们的异步任务。
|
|
|
|
|
|
|
|
// 它就像一个特殊的"接力棒",能在线程切换时把主线程"口袋"里的东西(包括Token)传递给子线程。
|
|
|
|
|
|
|
|
CompletableFuture.runAsync(TtlRunnable.get(() -> {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 3. 【设置上下文】: 在子线程任务开始时,立刻用 StpUtil.setTokenValue() 把传递过来的Token放进子线程自己的"口袋"。
|
|
|
|
|
|
|
|
StpUtil.setTokenValue(tokenValue);
|
|
|
|
|
|
|
|
// 4. 【执行业务】: 现在子线程就像登录过一样,可以带着Token去调用其他需要权限的服务了。
|
|
|
|
|
|
|
|
updateWorkFlow(dmsBillsFaultInstance, taskId);
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
// 简单记录错误,不影响主流程
|
|
|
|
|
|
|
|
System.err.println("异步更新工作流失败,repairInstanceId: " + dmsBillsFaultInstance.getRepairInstanceId() + ", 错误: " + e.getMessage());
|
|
|
|
|
|
|
|
// 可以考虑记录到失败表,后续补偿处理
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置维修实例ID
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setRepairInstanceId(dmsBillsFaultInstance.getRepairInstanceId());
|
|
|
|
|
|
|
|
// FIXME: 工作流相关代码(暂时注释掉)
|
|
|
|
|
|
|
|
// dmsFaultInstanceActivity.setProcessActivityId(WfConstants.WF_BILLS_FAULT_INSTANCE_PROCESS_ACTIVITY_SECOND_ID);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置机器ID
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setMachineId(dmsBillsFaultInstance.getMachineId());
|
|
|
|
|
|
|
|
// 设置处理状态为执行中
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_EXECUTING);
|
|
|
|
|
|
|
|
// 设置步骤顺序
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setProcessStepOrder(2L);
|
|
|
|
|
|
|
|
// 设置开始时间
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setStartTime(currentDate);
|
|
|
|
|
|
|
|
// 设置处理用户ID
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setHandleUserId(LoginHelper.getUserId());
|
|
|
|
|
|
|
|
// 设置处理人名称
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setHandleBy(userName);
|
|
|
|
|
|
|
|
// 设置处理时间
|
|
|
|
|
|
|
|
dmsFaultInstanceActivity.setHandleTime(currentDate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 插入新的故障实例活动记录
|
|
|
|
|
|
|
|
b = dmsFaultInstanceActivityService.insertByBo(dmsFaultInstanceActivity);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建第一个实例活动对象并设置其属性
|
|
|
|
|
|
|
|
DmsFaultInstanceActivityBo firstInstanceActivity = new DmsFaultInstanceActivityBo();
|
|
|
|
|
|
|
|
firstInstanceActivity.setInstanceActivityId(dmsBillsFaultInstance.getInstanceActivityId());
|
|
|
|
|
|
|
|
// 设置处理状态为已完成
|
|
|
|
|
|
|
|
firstInstanceActivity.setProcessHandleStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_ACTIVITY_HANDLE_STATUS_FINISH);
|
|
|
|
|
|
|
|
// 设置结束时间
|
|
|
|
|
|
|
|
firstInstanceActivity.setEndTime(currentDate);
|
|
|
|
|
|
|
|
// FIXME: 需重新梳理代码dmsFaultInstanceActivityService
|
|
|
|
|
|
|
|
// 更新第一个实例活动记录
|
|
|
|
|
|
|
|
dmsFaultInstanceActivityService.updateByBo(firstInstanceActivity);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} else {// 如果工单状态为维修中
|
|
|
|
|
|
|
|
// 更新故障实例活动记录
|
|
|
|
|
|
|
|
b = dmsFaultInstanceActivityService.updateByBo(dmsFaultInstanceActivity);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 返回结果1表示成功
|
|
|
|
|
|
|
|
return b ? 1 : 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// startRepair方法内提取的获取或创建taskId的方法
|
|
|
|
|
|
|
|
private Long getOrCreateTaskId(DmsBillsFaultInstance dmsBillsFaultInstance) {
|
|
|
|
|
|
|
|
Long taskId = dmsBillsFaultInstance.getWfDefinitionId();
|
|
|
|
|
|
|
|
if (StringUtils.isNull(taskId)) {
|
|
|
|
|
|
|
|
// 启动工作流
|
|
|
|
|
|
|
|
RemoteStartProcess startProcess = new RemoteStartProcess();
|
|
|
|
|
|
|
|
startProcess.setFlowCode(DmsConstants.DMS_BILLS_FAULT_INSTANCE_WF_CODE);
|
|
|
|
|
|
|
|
String businessId = dmsBillsFaultInstance.getRepairInstanceId().toString();
|
|
|
|
|
|
|
|
startProcess.setBusinessId(businessId);
|
|
|
|
|
|
|
|
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
|
|
|
|
|
|
|
|
taskId = remoteStartProcessReturn.getTaskId();
|
|
|
|
|
|
|
|
if (StringUtils.isNull(taskId)) {
|
|
|
|
|
|
|
|
throw new ServiceException("流程启动失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return taskId;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 完成维修
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param dmsFaultInstanceActivity 报修工单实例节点
|
|
|
|
|
|
|
|
* @return 结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@GlobalTransactional(rollbackFor = Exception.class)
|
|
|
|
|
|
|
|
public int completeRepair(DmsFaultInstanceActivityBo dmsFaultInstanceActivity) {
|
|
|
|
|
|
|
|
// 批量插入实例的附件文件信息
|
|
|
|
|
|
|
|
batchInsertInstanceAfterFiles(dmsFaultInstanceActivity.getFileUrls(),dmsFaultInstanceActivity.getInstanceActivityId());
|
|
|
|
|
|
|
|
// 获取需要插入的备件列表
|
|
|
|
|
|
|
|
List<DmsFaultComponentsParts> parts = dmsFaultInstanceActivity.getParts();
|
|
|
|
|
|
|
|
// 如果备件列表不为空,则设置每个备件的故障ID并插入数据库
|
|
|
|
|
|
|
|
if (!CollectionUtils.isEmpty(parts)){
|
|
|
|
|
|
|
|
for (DmsFaultComponentsParts part : parts) {
|
|
|
|
|
|
|
|
part.setFaultId(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
dmsFaultInstanceActivityMapper.insertParts(parts);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 根据维修实例ID查询对应的工单实例
|
|
|
|
|
|
|
|
DmsBillsFaultInstanceVo dmsBillsFaultInstance = this.
|
|
|
|
|
|
|
|
queryById(dmsFaultInstanceActivity.getRepairInstanceId());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取当前工单的状态
|
|
|
|
|
|
|
|
String dmsBillsStatus = dmsBillsFaultInstance.getBillsStatus();
|
|
|
|
|
|
|
|
// 如果状态为已完成,抛出异常提示已经维修完成
|
|
|
|
|
|
|
|
if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_FINISH)) {//维修完成
|
|
|
|
|
|
|
|
throw new ServiceException("已经维修完成");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果状态为待维修,抛出异常提示请先开始维修
|
|
|
|
|
|
|
|
if (dmsBillsStatus.equals(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR)) {//待维修
|
|
|
|
|
|
|
|
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 faultInstance = MapstructUtils.convert(dmsBillsFaultInstance, DmsBillsFaultInstance.class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(StringUtils.isNull(dmsBillsFaultInstance.getWfDefinitionId())){
|
|
|
|
|
|
|
|
throw new ServiceException("流程未启动");
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
//FIXME:完成第一步,待测试待完善
|
|
|
|
|
|
|
|
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
|
|
|
|
|
|
|
|
remoteCompleteTask.setTaskId(dmsBillsFaultInstance.getWfDefinitionId());
|
|
|
|
|
|
|
|
remoteCompleteTask.setMessage("同意");
|
|
|
|
|
|
|
|
remoteWorkflowService.completeTask(remoteCompleteTask);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baseMapper.updateById(faultInstance);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 设置工单活动状态为已完成,并记录结束时间和维修人员
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void batchInsertInstanceAfterFiles(List<String> fileUrls, Long instanceActivityId) {
|
|
|
|
public void batchInsertInstanceAfterFiles(List<String> fileUrls, Long instanceActivityId) {
|
|
|
|
// 判断文件URL列表是否不为空且非空集合
|
|
|
|
// 判断文件URL列表是否不为空且非空集合
|
|
|
|
if (fileUrls != null && !fileUrls.isEmpty()) {
|
|
|
|
if (fileUrls != null && !fileUrls.isEmpty()) {
|
|
|
|