fix(dms): 修复保养工单相关问题

- 修复保养项目名称为空的问题
- 优化保养工单明细项目查询逻辑
- 修复工作流启动和推进相关问题
- 优化数据更新逻辑,使用最新查询到的数据进行更新
- 添加创建者、创建时间等字段到 DmsBillsMaintDetailProjectVo
master
zangchenhao 2 weeks ago
parent a09bc48429
commit c7b73fc540

@ -2,6 +2,8 @@ package org.dromara.dms.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.annotation.ExcelDictFormat;
@ -10,6 +12,7 @@ import org.dromara.dms.domain.DmsBillsMaintDetailProject;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
import java.util.List; import java.util.List;
@ -73,4 +76,29 @@ public class DmsBillsMaintDetailProjectVo implements Serializable {
/** 保养工单明细项目信息;检查每个项目的点巡检结果详情信息 */ /** 保养工单明细项目信息;检查每个项目的点巡检结果详情信息 */
/* private List<DmsBillsMaintDetailProject> dmsBillsMaintDetailProjectList;*/ /* private List<DmsBillsMaintDetailProject> dmsBillsMaintDetailProjectList;*/
/**
*
*/
private Long createDept;
/**
*
*/
private Long createBy;
/**
*
*/
private Date createTime;
/**
*
*/
private Long updateBy;
/**
*
*/
private Date updateTime;
} }

@ -4,6 +4,8 @@ import org.dromara.dms.domain.DmsBillsMaintDetailProject;
import org.dromara.dms.domain.vo.DmsBillsMaintDetailProjectVo; import org.dromara.dms.domain.vo.DmsBillsMaintDetailProjectVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/** /**
* ;Mapper * ;Mapper
* *
@ -12,4 +14,12 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*/ */
public interface DmsBillsMaintDetailProjectMapper extends BaseMapperPlus<DmsBillsMaintDetailProject, DmsBillsMaintDetailProjectVo> { public interface DmsBillsMaintDetailProjectMapper extends BaseMapperPlus<DmsBillsMaintDetailProject, DmsBillsMaintDetailProjectVo> {
/**
*
*
* @param dmsBillsMaintDetailProject
* @return
*/
List<DmsBillsMaintDetailProjectVo> selectDmsBillsMaintDetailProjectWithProjectName(DmsBillsMaintDetailProject dmsBillsMaintDetailProject);
} }

@ -65,6 +65,25 @@ public class DmsBillsMaintDetailProjectServiceImpl implements IDmsBillsMaintDeta
*/ */
@Override @Override
public List<DmsBillsMaintDetailProjectVo> queryList(DmsBillsMaintDetailProjectBo bo) { public List<DmsBillsMaintDetailProjectVo> queryList(DmsBillsMaintDetailProjectBo bo) {
// 【修复保养项目名称为空问题】优先使用关联查询方法获取完整项目信息
if (bo.getBillsMaintDetailId() != null) {
// 转换为实体对象用于查询
DmsBillsMaintDetailProject queryEntity = MapstructUtils.convert(bo, DmsBillsMaintDetailProject.class);
queryEntity.setBillsMaintDetailId(bo.getBillsMaintDetailId());
queryEntity.setMaintDetailProjectId(bo.getMaintDetailProjectId());
queryEntity.setMaintProjectId(bo.getMaintProjectId());
queryEntity.setMaintProjectStatus(bo.getMaintProjectStatus());
// 使用关联查询方法,确保获取到项目名称
List<DmsBillsMaintDetailProjectVo> result = baseMapper.selectDmsBillsMaintDetailProjectWithProjectName(queryEntity);
// 如果关联查询有结果,直接返回
if (result != null && !result.isEmpty()) {
return result;
}
}
// 降级到默认查询方法
MPJLambdaWrapper<DmsBillsMaintDetailProject> lqw = buildQueryWrapper(bo); MPJLambdaWrapper<DmsBillsMaintDetailProject> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw); return baseMapper.selectVoList(lqw);
} }
@ -132,6 +151,6 @@ public class DmsBillsMaintDetailProjectServiceImpl implements IDmsBillsMaintDeta
if(isValid){ if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验 //TODO 做一些业务上的校验,判断是否需要校验
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteBatchIds(ids) > 0;
} }
} }

@ -17,6 +17,7 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.uuid.Seq; import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.dms.domain.*; import org.dromara.dms.domain.*;
import org.dromara.dms.domain.bo.DmsBillsMaintDetailBo; import org.dromara.dms.domain.bo.DmsBillsMaintDetailBo;
import org.dromara.dms.domain.bo.DmsBillsMaintDetailProjectBo; import org.dromara.dms.domain.bo.DmsBillsMaintDetailProjectBo;
@ -322,11 +323,11 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
dmsBillsMaintInstance.setMaintStatus(DmsConstants.DMS_BILLS_MAINT_INSTANCE_STATUS_MAINTING); dmsBillsMaintInstance.setMaintStatus(DmsConstants.DMS_BILLS_MAINT_INSTANCE_STATUS_MAINTING);
// 设置实际开始保养时间为当前时间 // 设置实际开始保养时间为当前时间
dmsBillsMaintInstance.setRealBeginTime(currentDate); dmsBillsMaintInstance.setRealBeginTime(currentDate);
// 【关键修复】检查工作流是否已经启动 - 先重新查询最新数据 // 【关键修复】检查工作流是否已经启动 - 先重新查询最新数据
// 重新查询保养实例确保获取到最新的工作流ID避免使用缓存中的旧数据 // 重新查询保养实例确保获取到最新的工作流ID避免使用缓存中的旧数据
DmsBillsMaintInstance latestInstance = baseMapper.selectById(dmsBillsMaintInstance.getMaintInstanceId()); DmsBillsMaintInstance latestInstance = baseMapper.selectById(dmsBillsMaintInstance.getMaintInstanceId());
if (latestInstance != null && latestInstance.getWfDefinitionId() == null) { if (latestInstance != null && latestInstance.getWfDefinitionId() == null) {
// 【工作流启动】创建远程启动流程对象 // 【工作流启动】创建远程启动流程对象
RemoteStartProcess startProcess = new RemoteStartProcess(); RemoteStartProcess startProcess = new RemoteStartProcess();
@ -336,22 +337,22 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
String businessId = dmsBillsMaintInstance.getMaintInstanceId().toString(); String businessId = dmsBillsMaintInstance.getMaintInstanceId().toString();
// 设置业务ID // 设置业务ID
startProcess.setBusinessId(businessId); startProcess.setBusinessId(businessId);
try { try {
// 启动工作流程 // 启动工作流程
RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess); RemoteStartProcessReturn remoteStartProcessReturn = remoteWorkflowService.startWorkFlow(startProcess);
// 【关键修复】获取流程实例ID和任务ID // 【关键修复】获取流程实例ID和任务ID
Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId(); Long processInstanceId = remoteStartProcessReturn.getProcessInstanceId();
Long taskId = remoteStartProcessReturn.getTaskId(); Long taskId = remoteStartProcessReturn.getTaskId();
// 如果流程实例ID为空抛出流程启动失败异常 // 如果流程实例ID为空抛出流程启动失败异常
if (processInstanceId == null) { if (processInstanceId == null) {
throw new ServiceException("保养工作流启动失败"); throw new ServiceException("保养工作流启动失败");
} else { } else {
// 【关键修复】存储流程实例ID到wfDefinitionId // 【关键修复】存储流程实例ID到wfDefinitionId
dmsBillsMaintInstance.setWfDefinitionId(processInstanceId); dmsBillsMaintInstance.setWfDefinitionId(processInstanceId);
// ** 异步线程上下文传递【核心问题】 ** // ** 异步线程上下文传递【核心问题】 **
// 1. 【捕获Token】: 在主线程里,我们先用 StpUtil.getTokenValue() 把Token拿出来存好。 // 1. 【捕获Token】: 在主线程里,我们先用 StpUtil.getTokenValue() 把Token拿出来存好。
final String tokenValue = StpUtil.getTokenValue(); final String tokenValue = StpUtil.getTokenValue();
@ -385,21 +386,22 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
} }
} }
} else if (latestInstance != null) { } else if (latestInstance != null) {
// 【关键修复】工作流已启动根据流程实例ID查询当前活跃任务 // 【关键修复】工作流已启动根据流程实例ID查询当前活跃任务
// 使用最新查询到的工作流ID // 使用最新查询到的工作流ID
Long processInstanceId = latestInstance.getWfDefinitionId(); Long processInstanceId = latestInstance.getWfDefinitionId();
dmsBillsMaintInstance.setWfDefinitionId(processInstanceId); // 同步更新到当前对象 dmsBillsMaintInstance.setWfDefinitionId(processInstanceId); // 同步更新到当前对象
log.info("保养工单 {} 工作流已启动流程实例ID: {},查询当前活跃任务", log.info("保养工单 {} 工作流已启动流程实例ID: {},查询当前活跃任务",
dmsBillsMaintInstance.getMaintInstanceId(), processInstanceId); dmsBillsMaintInstance.getMaintInstanceId(), processInstanceId);
// 根据流程实例ID获取当前活跃任务ID // 根据流程实例ID获取当前活跃任务ID
Long currentActiveTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(processInstanceId); Long currentActiveTaskId = remoteWorkflowService.getCurrentTaskIdByInstanceId(processInstanceId);
if (currentActiveTaskId != null) { if (currentActiveTaskId != null) {
log.info("保养工单 {} 找到当前活跃任务ID: {}", log.info("保养工单 {} 找到当前活跃任务ID: {}",
dmsBillsMaintInstance.getMaintInstanceId(), currentActiveTaskId); dmsBillsMaintInstance.getMaintInstanceId(), currentActiveTaskId);
// 直接推进工作流 // 直接推进工作流
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentActiveTaskId); remoteCompleteTask.setTaskId(currentActiveTaskId);
@ -408,7 +410,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
List<String> messageTypes = new ArrayList<>(); List<String> messageTypes = new ArrayList<>();
messageTypes.add("user"); // 用户操作 messageTypes.add("user"); // 用户操作
remoteCompleteTask.setMessageType(messageTypes); remoteCompleteTask.setMessageType(messageTypes);
boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask); boolean taskCompleted = remoteWorkflowService.completeTask(remoteCompleteTask);
if (!taskCompleted) { if (!taskCompleted) {
log.error("保养工作流推进失败任务ID: {}", currentActiveTaskId); log.error("保养工作流推进失败任务ID: {}", currentActiveTaskId);
@ -429,13 +431,15 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
// 更新保养明细信息 // 更新保养明细信息
dmsBillsMaintDetailMapper.updateById(dmsBillsMaintDetail); dmsBillsMaintDetailMapper.updateById(dmsBillsMaintDetail);
// 更新保养工单信息
baseMapper.updateById(dmsBillsMaintInstance);
} }
// else {//保养中 else {//保养中
// // 更新人不为空,则设置更新人为当前用户,更新时间为当前时间 // 更新人不为空,则设置更新人为当前用户,更新时间为当前时间
// dmsBillsMaintDetail.setUpdateBy(userName); dmsBillsMaintDetail.setUpdateBy(LoginHelper.getUserId());
// dmsBillsMaintDetail.setUpdateTime(currentDate); dmsBillsMaintDetail.setUpdateTime(currentDate);
// dmsBillsMaintDetailMapper.updateDmsBillsMaintDetail(dmsBillsMaintDetail); dmsBillsMaintDetailMapper.updateById(dmsBillsMaintDetail);
// } }
// 创建查询保养明细项目的对象 // 创建查询保养明细项目的对象
DmsBillsMaintDetailProjectBo queryBillsMaintDetailProject = new DmsBillsMaintDetailProjectBo(); DmsBillsMaintDetailProjectBo queryBillsMaintDetailProject = new DmsBillsMaintDetailProjectBo();
@ -445,13 +449,13 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
List<DmsBillsMaintDetailProjectVo> dmsBillsMaintDetailProjects = dmsBillsMaintInstanceProjectService.queryList(queryBillsMaintDetailProject); List<DmsBillsMaintDetailProjectVo> dmsBillsMaintDetailProjects = dmsBillsMaintInstanceProjectService.queryList(queryBillsMaintDetailProject);
// 设置保养明细的项目列表 // 设置保养明细的项目列表
dmsBillsMaintDetail.setDmsBillsMaintDetailProjectList(dmsBillsMaintDetailProjects); dmsBillsMaintDetail.setDmsBillsMaintDetailProjectList(dmsBillsMaintDetailProjects);
// 【关键修复】重新查询完整的保养明细信息,包含关联字段 // 【关键修复】重新查询完整的保养明细信息,包含关联字段
// 使用关联查询方法获取完整的保养明细信息,包括设备名称、保养部位名称等 // 使用关联查询方法获取完整的保养明细信息,包括设备名称、保养部位名称等
DmsBillsMaintDetail queryDetail = new DmsBillsMaintDetail(); DmsBillsMaintDetail queryDetail = new DmsBillsMaintDetail();
queryDetail.setBillsMaintDetailId(dmsBillsMaintDetail.getBillsMaintDetailId()); queryDetail.setBillsMaintDetailId(dmsBillsMaintDetail.getBillsMaintDetailId());
List<DmsBillsMaintDetailVo> detailVoList = dmsBillsMaintDetailMapper.selectDmsBillsMaintDetailJoinList(queryDetail); List<DmsBillsMaintDetailVo> detailVoList = dmsBillsMaintDetailMapper.selectDmsBillsMaintDetailJoinList(queryDetail);
if (!detailVoList.isEmpty()) { if (!detailVoList.isEmpty()) {
DmsBillsMaintDetailVo detailVo = detailVoList.get(0); DmsBillsMaintDetailVo detailVo = detailVoList.get(0);
// 将关联查询到的字段赋值给返回对象 // 将关联查询到的字段赋值给返回对象
@ -462,7 +466,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
dmsBillsMaintDetail.setMaintProtocol(detailVo.getMaintProtocol()); dmsBillsMaintDetail.setMaintProtocol(detailVo.getMaintProtocol());
dmsBillsMaintDetail.setMaintOperationDescription(detailVo.getMaintOperationDescription()); dmsBillsMaintDetail.setMaintOperationDescription(detailVo.getMaintOperationDescription());
} }
// 返回更新后的保养明细对象 // 返回更新后的保养明细对象
return dmsBillsMaintDetail; return dmsBillsMaintDetail;
} }
@ -483,7 +487,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
log.error("保养工单工作流信息更新失败maintInstanceId: {}", dmsBillsMaintInstance.getMaintInstanceId()); log.error("保养工单工作流信息更新失败maintInstanceId: {}", dmsBillsMaintInstance.getMaintInstanceId());
return false; return false;
} }
// 【自动推进工作流】完成第一步任务,推进到下一步 // 【自动推进工作流】完成第一步任务,推进到下一步
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
// 设置任务ID // 设置任务ID
@ -500,7 +504,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
if (!b){ if (!b){
return false; return false;
}else{ }else{
// 更新保养实例信息 // 更新保养工单信息
int i = baseMapper.updateById(dmsBillsMaintInstance); int i = baseMapper.updateById(dmsBillsMaintInstance);
return i > 0; return i > 0;
} }
@ -564,7 +568,7 @@ public class DmsBillsMaintInstanceServiceImpl implements IDmsBillsMaintInstanceS
// 而是根据业务ID动态获取当前活跃的任务ID // 而是根据业务ID动态获取当前活跃的任务ID
String businessId = maintInstanceId.toString(); String businessId = maintInstanceId.toString();
Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId); Long currentActiveTaskId = remoteWorkflowService.getCurrentActiveTaskId(businessId);
if (currentActiveTaskId != null) { if (currentActiveTaskId != null) {
RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask(); RemoteCompleteTask remoteCompleteTask = new RemoteCompleteTask();
remoteCompleteTask.setTaskId(currentActiveTaskId); // 使用当前活跃任务ID remoteCompleteTask.setTaskId(currentActiveTaskId); // 使用当前活跃任务ID

@ -129,7 +129,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
dfia.repair_content repair_content, dfia.repair_content repair_content,
dfia.protected_method protected_method, dfia.protected_method protected_method,
dfia.repairer repairer, dfia.repairer repairer,
dfia.repair_confirm repair_confirm, dbfi.repair_confirm repair_confirm,
dfia.confirm_time confirm_time,dfia.components_parts_id components_parts_id dfia.confirm_time confirm_time,dfia.components_parts_id components_parts_id
from dms_bills_fault_instance dbfi from dms_bills_fault_instance dbfi
left join prod_base_machine_info dbdl on dbfi.machine_id=dbdl.machine_id left join prod_base_machine_info dbdl on dbfi.machine_id=dbdl.machine_id

@ -4,4 +4,41 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.dms.mapper.DmsBillsMaintDetailProjectMapper"> <mapper namespace="org.dromara.dms.mapper.DmsBillsMaintDetailProjectMapper">
<resultMap type="DmsBillsMaintDetailProjectVo" id="DmsBillsMaintDetailProjectResult">
<result property="maintDetailProjectId" column="maint_detail_project_id" />
<result property="billsMaintDetailId" column="bills_maint_detail_id" />
<result property="maintProjectId" column="maint_project_id" />
<result property="maintProjectName" column="maint_project_name" />
<result property="maintProjectDesc" column="maint_project_desc" />
<result property="maintProjectStatus" column="maint_project_status" />
<result property="remark" column="remark" />
<result property="createTime" column="create_time" />
</resultMap>
<sql id="selectDmsBillsMaintDetailProjectVo">
select
dbmdp.maint_detail_project_id,
dbmdp.bills_maint_detail_id,
dbmdp.maint_project_id,
COALESCE(dbmdp.maint_project_name, dbmp.maint_project_name) as maint_project_name,
COALESCE(dbmdp.maint_project_desc, dbmp.maint_project_desc) as maint_project_desc,
dbmdp.maint_project_status,
dbmdp.remark,
dbmdp.create_time
from
dms_bills_maint_detail_project dbmdp
left join dms_base_maint_project dbmp on dbmdp.maint_project_id = dbmp.maint_project_id
</sql>
<select id="selectDmsBillsMaintDetailProjectWithProjectName" parameterType="DmsBillsMaintDetailProject" resultMap="DmsBillsMaintDetailProjectResult">
<include refid="selectDmsBillsMaintDetailProjectVo"/>
<where>
<if test="maintDetailProjectId != null"> and dbmdp.maint_detail_project_id = #{maintDetailProjectId}</if>
<if test="billsMaintDetailId != null"> and dbmdp.bills_maint_detail_id = #{billsMaintDetailId}</if>
<if test="maintProjectId != null"> and dbmdp.maint_project_id = #{maintProjectId}</if>
<if test="maintProjectStatus != null and maintProjectStatus != ''"> and dbmdp.maint_project_status = #{maintProjectStatus}</if>
</where>
order by dbmdp.create_time desc
</select>
</mapper> </mapper>

Loading…
Cancel
Save