fix(dms): 优化工作流确认逻辑并修复相关问题

- 添加缺失的字段映射
- 优化工单确认流程,支持确认通过和不通过
-修复 PDA 端兼容性问题
- 优化润滑保养相关数据映射
- 移除不必要的 cron 表达式查询
- 统一工作流任务完成逻辑
master
zangchenhao 2 weeks ago
parent ef81357ed0
commit f95724ba65

@ -636,6 +636,7 @@ public class DmsMobileController extends BaseController {
*/
@Log(title = "点巡检工单明细", businessType = BusinessType.INSERT)
@PostMapping("/saveInspectInstanceDetail")
@RepeatSubmit
public AjaxResult saveInspectInstanceDetail(@RequestBody DmsInspectInstanceDetailBo dmsInspectInstanceDetail) {
return AjaxResult.success(dmsBillsInspectInstanceService.updateDmsInspectInstanceDetail(dmsInspectInstanceDetail));
}
@ -837,11 +838,11 @@ public class DmsMobileController extends BaseController {
lubricationDetail.setDeviceCode(detailVo.getMachineCode());
lubricationDetail.setDeviceName(detailVo.getMachineName());
lubricationDetail.setTypeName(detailVo.getDeviceTypeName());
// 【关键修复】确保润滑部位和润滑标准字段正确映射
lubricationDetail.setLubeStationName(detailVo.getLubeStationName());
lubricationDetail.setLubeProtocol(detailVo.getLubeProtocol());
lubricationDetail.setLubeOperationDescription(detailVo.getLubeOperationDescription());
// 【新增】添加润滑标准编码字段的映射
lubricationDetail.setLubeStandardCode(detailVo.getLubeStandardCode());
// 【类型转换】处理维护状态字段的类型转换String -> Long

@ -30,7 +30,7 @@ public class DmsFaultInstanceActivity extends TenantEntity {
/**
* ID
*/
@TableId(value = "instance_activity_id", type = IdType.AUTO)
@TableId(value = "instance_activity_id")
private Long instanceActivityId;
/**

@ -248,7 +248,7 @@ public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceSe
RpcContext.getContext().setAttachment("tenantId", currentTenantId);
// 【关键】调用工作流推进
boolean completeResult = remoteWorkflowService.completeTaskIgnoreAuth(taskId, "检查工单启动,自动推进");
boolean completeResult = remoteWorkflowService.completeTask(completeTask);
if (completeResult) {
log.info("检查工单 {} 工作流推进成功", businessId);
} else {

@ -189,6 +189,8 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
add.setApproveStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_APPROVE_STATUS_PENDING);
// 设置实例类型为手动录入
add.setInstanceType(DmsConstants.DMS_BILLS_FAULT_INSTANCE_TYPE_MAUAL);
// 【修复】工单创建时确认状态应该为null不设置任何值
add.setRepairConfirm(null);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
@ -517,7 +519,7 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
*
*
* @param repairInstanceId ID
* @param confirmResult 1-
* @param confirmResult 1-2-
* @param confirmUser
* @return
*/
@ -539,35 +541,57 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
throw new ServiceException("工单已经确认过了");
}
// 更新确认状态
// 根据确认结果设置不同的业务状态
if ("1".equals(confirmResult)) {
// 确认通过:完成工单
workOrder.setRepairConfirm(confirmResult);
workOrder.setConfirmUser(confirmUser);
workOrder.setConfirmUser(confirmUser != null ? confirmUser : LoginHelper.getUsername());
workOrder.setConfirmTime(new Date());
} else {
// 确认不通过:返回到维修环节,重置相关状态
workOrder.setRepairConfirm(confirmResult);
workOrder.setConfirmUser(confirmUser != null ? confirmUser : LoginHelper.getUsername());
workOrder.setConfirmTime(new Date());
// 重置工单状态为待维修,让维修人员重新维修
workOrder.setBillsStatus(DmsConstants.DMS_BILLS_FAULT_INSTANCE_STATUS_TO_REPAIR);
// 清空实际结束时间,因为需要重新维修
workOrder.setRealEndTime(null);
}
// 推进工作流到最终完成状态
// 推进工作流:业务状态和工作流分支变量分离处理
if (workOrder.getWfDefinitionId() != null) {
Long currentTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(workOrder.getWfDefinitionId());
if (currentTaskId != null) {
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentTaskId);
remoteCompleteTask.setMessage("主管确认完成");
// 设置工作流变量 - 用于互斥网关判断分支走向
Map<String, Object> variables = new HashMap<>();
if ("1".equals(confirmResult)) {
// 确认通过:工作流分支变量=0走确认通过分支结束流程
remoteCompleteTask.setMessage("主管确认通过,工单完成");
variables.put("repairConfirm", "0");
} else {
// 确认不通过:工作流分支变量=1走确认不通过分支返回维修环节
remoteCompleteTask.setMessage("主管确认不通过,返回维修环节");
variables.put("repairConfirm", "1");
}
variables.put("businessId", repairInstanceId.toString());
remoteCompleteTask.setVariables(variables);
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");
boolean workflowResult = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!workflowResult) {
log.warn("工作流推进失败但业务状态已更新成功repairInstanceId: {}, confirmResult: {}",
repairInstanceId, confirmResult);
} else {
// 其他情况 -> 工作流变量设为1确认不通过
variables.put("repairConfirm", "1");
log.info("主管确认完成工作流推进成功repairInstanceId: {}, confirmResult: {}",
repairInstanceId, confirmResult);
}
remoteCompleteTask.setVariables(variables);
remoteWorkflowService.completeTask(remoteCompleteTask);
}
}
@ -713,6 +737,16 @@ public class DmsBillsFaultInstanceServiceImpl implements IDmsBillsFaultInstanceS
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();
// 设置目标类型为故障实例活动

@ -203,7 +203,7 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService {
.setExecutorInfo("stanceInspect")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长
@ -297,7 +297,7 @@ public class DmsPlanInspectServiceImpl implements IDmsPlanInspectService {
.setExecutorInfo("stanceInspect")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长

@ -188,7 +188,7 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService {
.setExecutorInfo("stanceLube")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长
@ -251,7 +251,7 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService {
.setExecutorInfo("stanceLube")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长
@ -274,7 +274,7 @@ public class DmsPlanLubeServiceImpl implements IDmsPlanLubeService {
.setExecutorInfo("stanceLube")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长

@ -214,7 +214,7 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
.setExecutorInfo("stanceMaint")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长
@ -303,7 +303,7 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
.setExecutorInfo("stanceMaint")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长
@ -323,7 +323,7 @@ public class DmsPlanMaintServiceImpl implements IDmsPlanMaintService {
.setExecutorInfo("stanceMaint")//执行器名称
.setExecutorTimeout(30)//执行超时时间
.setBlockStrategy(JobBlockStrategyEnum.DISCARD)//阻塞策略:丢弃后续任务,避免重复执行
.setMaxRetryTimes(2)//最大重试次数
.setMaxRetryTimes(0)//最大重试次数
.setTriggerType(TriggerTypeEnum.CRON)//触发器类型cron
.setTriggerInterval(bo.getCronExpression())//间隔时长: cron表达式
.setRetryInterval(10)//重试间隔时长

@ -222,7 +222,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectParts" resultType="org.dromara.dms.domain.vo.DmsFaultComponentsPartsVo"
parameterType="java.lang.Long">
SELECT x.* FROM dms_fault_compents_parts x where x.fault_id = #{repairInstanceId}
SELECT x.* FROM dms_fault_components_parts x where x.repair_instance_id = #{repairInstanceId}
</select>
<select id="selectDmsBillsFaultInstanceCompletedList" resultType="org.dromara.dms.domain.vo.DmsBillsFaultInstanceVo"

@ -45,6 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="lubeStationName" column="lube_station_name" />
<result property="lubeProtocol" column="lube_protocol" />
<result property="lubeOperationDescription" column="lube_operation_description" />
<result property="lubeStandardCode" column="lube_standard_code" />
</resultMap>

@ -61,7 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<insert id="insertParts" parameterType="java.util.List">
insert into dms_fault_compents_parts(fault_id,part_name,part_specifications,amount)
insert into dms_fault_components_parts(repair_instance_id,part_name,part_specifications,amount)
values
<foreach collection="list" item="item" index="index" open="" close="" separator=",">
(#{item.faultId},#{item.partName},#{item.partSpecifications},#{item.amount})

@ -30,9 +30,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select a.plan_inspect_id, a.plan_inspect_code, a.plan_inspect_name, a.inspect_type,
a.inspect_route_id, a.device_amount, a.plan_time, a.cycle_period,a.time_limit,a.job_id,
a.performer, a.remark, a.create_by, a.create_time, a.update_by, a.update_time,
b.cron_expression
-- '' as cron_expression
from dms_plan_inspect a
left join sys_job b on a.job_id = b.job_id
where a.plan_inspect_id = #{planInspectId}
</select>
@ -42,7 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.inspect_route_id, a.device_amount, a.plan_time, a.cycle_period,a.time_limit,a.job_id,
a.performer, a.remark, a.create_by, a.create_time, a.update_by,
a.update_time
from dms_plan_inspect a left join sys_job b on a.job_id = b.job_id
from dms_plan_inspect a
where a.plan_inspect_code = #{planInspectCode}
</select>

@ -72,10 +72,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectPlanLubeJoinJobByPlanLubeId" parameterType="Long" resultMap="DmsPlanLubeResult">
select a.plan_lube_id, a.plan_lube_code, a.lube_level, a.lube_group, a.lube_supervisor, a.lube_time, a.time_limit, a.job_id, a.cycle_period, a.create_method, a.remark, a.create_by, a.create_time,
sj.cron_expression
select a.plan_lube_id, a.plan_lube_code, a.lube_level, a.lube_group, a.lube_supervisor, a.lube_time, a.time_limit, a.job_id,
a.cycle_period, a.create_method, a.remark,
a.create_by,
a.create_time,
-- '' as cron_expression
from dms_plan_lube a
left join hwmom-job.sys_job sj on a.job_id = sj.job_id
where a.plan_lube_id = #{planLubeId}
</select>
</mapper>

Loading…
Cancel
Save