Merge branch 'qms/yf' into qms/develop

# Conflicts:
#	nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Department.java
This commit is contained in:
funny 2026-05-06 10:45:48 +08:00
commit 179322612b
10 changed files with 423 additions and 14 deletions

View File

@ -9,6 +9,7 @@ import com.nflg.wms.common.pojo.qo.QmsIssueTicketPdiAddQO;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTicketDetailVO;
import com.nflg.wms.repository.service.IQmsIssueTicketService;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
@ -64,6 +65,15 @@ public class QmsIssueTicketController extends BaseController {
return ApiResult.success();
}
/**
* 查询PDI工单详情
* 返回工单基本信息处理记录及措施列表
*/
@GetMapping("detail/pdi-ticket")
public ApiResult<QmsPdiTicketDetailVO> detailPdiTicket(@NotNull(message = "ID不能为空") Long id) {
return ApiResult.success(issueTicketControllerService.getPdiTicketDetail(id));
}
/**
* 查询来料检测任务质量问题工单详情
* 含来料检测任务详情及来料检验任务检验记录子项样本列表

View File

@ -34,7 +34,7 @@ public class QmsPdiDetectionRulesController extends BaseController {
/**
* 新增PDI检测规则
* 参数机型编号质检负责人id质检周期质检类型销售订单号全部必传
* 参数机型编号质检负责人id质检周期质检类型必传销售订单号可选
* 自动生成规则编号和版本号状态/发布状态/维护状态默认均为 false
*/
@Transactional

View File

@ -69,6 +69,18 @@ public class QmsIssueTicketControllerService {
@Resource
private WmsIncomingInspectionTaskCallbackService wmsIncomingInspectionTaskCallbackService;
@Resource
private IQmsIssueTicketProcessService issueTicketProcessService;
@Resource
private IQmsIssueTicketProcessMeasureService issueTicketProcessMeasureService;
@Resource
private IUserInteriorService userInteriorService;
@Resource
private IDepartmentService departmentService;
/**
* 审核质量问题工单
* 更新审批状态审批意见审批人信息事故类型并更新工单状态
@ -371,4 +383,109 @@ public class QmsIssueTicketControllerService {
return vo;
}
/**
* 查询PDI工单详情
* 返回工单基本信息及处理记录措施列表
*/
public QmsPdiTicketDetailVO getPdiTicketDetail(Long id) {
// 查询工单基本信息
QmsIssueTicket ticket = issueTicketService.getById(id);
QmsPdiTicketDetailVO vo = new QmsPdiTicketDetailVO();
vo.setTicketNo(ticket.getTicketNo());
vo.setTicketTitle(ticket.getTicketTitle());
vo.setStatus(ticket.getStatus());
// 查询处理记录列表
List<QmsIssueTicketProcess> processes = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, id)
.list();
// 收集所有不合格质检项
List<QmsPdiTicketDetailVO.UnqualifiedItemVO> unqualifiedItems = new ArrayList<>();
List<QmsPdiTicketDetailVO.ProcessVO> processVOList = processes.stream().map(process -> {
QmsPdiTicketDetailVO.ProcessVO processVO = new QmsPdiTicketDetailVO.ProcessVO();
processVO.setId(process.getId());
processVO.setHandlerUserId(process.getHandlerUserId());
processVO.setHandlerUserName(process.getHandlerUserName());
// 查询处理人所属部门
if (process.getHandlerUserId() != null) {
UserInterior userInterior = userInteriorService.lambdaQuery()
.eq(UserInterior::getUserId, process.getHandlerUserId())
.one();
if (userInterior != null && userInterior.getDeptId() != null) {
Department department = departmentService.getById(userInterior.getDeptId());
if (department != null) {
processVO.setHandlerDeptId(department.getId());
processVO.setHandlerDeptName(department.getName());
}
}
}
processVO.setRootCause(process.getRootCause());
processVO.setTaskResultIds(process.getTaskResultIds());
processVO.setApprovalStatus(process.getApprovalStatus());
processVO.setApprovalOpinion(process.getApprovalOpinion());
processVO.setApprovalUserId(process.getApprovalUserId());
processVO.setApprovalUserName(process.getApprovalUserName());
processVO.setApprovalTime(process.getApprovalTime());
processVO.setLeaderApprovalResult(process.getLeaderApprovalResult());
processVO.setLeaderApprovalOpinion(process.getLeaderApprovalOpinion());
processVO.setLeaderUserId(process.getLeaderUserId());
processVO.setLeaderUserName(process.getLeaderUserName());
processVO.setLeaderApprovalTime(process.getLeaderApprovalTime());
// 查询不合格质检项inspectionItemResults=false
if (StrUtil.isNotBlank(process.getTaskResultIds())) {
String[] taskIds = process.getTaskResultIds().split(",");
for (String taskId : taskIds) {
if (StrUtil.isNotBlank(taskId)) {
List<QmsPdiInspectionResults> unqualifiedResults = pdiInspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, Long.parseLong(taskId.trim()))
.eq(QmsPdiInspectionResults::getInspectionItemResults, false)
.list();
for (QmsPdiInspectionResults result : unqualifiedResults) {
QmsPdiTicketDetailVO.UnqualifiedItemVO itemVO = new QmsPdiTicketDetailVO.UnqualifiedItemVO();
itemVO.setId(result.getId());
itemVO.setInspectionItemId(result.getInspectionItemId());
itemVO.setInspectionItemType(result.getInspectionItemType());
itemVO.setInspectionItemImage(result.getInspectionItemImage());
itemVO.setRemark(result.getRemark());
itemVO.setInspectorId(result.getInspectorId());
itemVO.setInspectionTime(result.getInspectionTime());
itemVO.setInspectionBy(result.getInspectionBy());
unqualifiedItems.add(itemVO);
}
}
}
}
// 查询措施列表
List<QmsIssueTicketProcessMeasure> measures = issueTicketProcessMeasureService.lambdaQuery()
.eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, process.getId())
.list();
List<QmsPdiTicketDetailVO.MeasureVO> measureVOList = measures.stream().map(measure -> {
QmsPdiTicketDetailVO.MeasureVO measureVO = new QmsPdiTicketDetailVO.MeasureVO();
measureVO.setId(measure.getId());
measureVO.setMeasureTypeId(measure.getMeasureTypeId());
measureVO.setMeasureContent(measure.getMeasureContent());
measureVO.setChargeUser(measure.getChargeUser());
measureVO.setPlanDate(measure.getPlanDate());
measureVO.setConfirmDate(measure.getConfirmDate());
measureVO.setRemark(measure.getRemark());
return measureVO;
}).toList();
processVO.setMeasures(measureVOList);
return processVO;
}).toList();
vo.setProcesses(processVOList);
vo.setUnqualifiedItems(unqualifiedItems);
return vo;
}
}

View File

@ -5,15 +5,20 @@ import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessAddQO;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessLeaderDraftQO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.Department;
import com.nflg.wms.repository.entity.QmsIssueTicket;
import com.nflg.wms.repository.entity.QmsIssueTicketProcess;
import com.nflg.wms.repository.entity.QmsTodoItem;
import com.nflg.wms.repository.entity.User;
import com.nflg.wms.repository.entity.UserInterior;
import com.nflg.wms.repository.service.IDepartmentService;
import com.nflg.wms.repository.service.IDictionaryItemService;
import com.nflg.wms.repository.service.IQmsIssueTicketProcessService;
import com.nflg.wms.repository.service.IQmsIssueTicketService;
import com.nflg.wms.repository.service.IQmsTodoItemService;
import com.nflg.wms.repository.service.IUserInteriorService;
import com.nflg.wms.repository.service.IUserService;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
@ -38,6 +43,9 @@ public class QmsIssueTicketProcessControllerService {
@Resource
private IUserService userService;
@Resource
private IUserInteriorService userInteriorService;
@Resource
private QmsIssueTicketProcessMeasureControllerService issueTicketProcessMeasureControllerService;
@ -50,6 +58,9 @@ public class QmsIssueTicketProcessControllerService {
@Resource
private IDictionaryItemService dictionaryItemService;
@Resource
private IDepartmentService departmentService;
/**
* 新增工单处理同步 Controller 直接调用
*/
@ -112,7 +123,13 @@ public class QmsIssueTicketProcessControllerService {
// 2. 保存数据
issueTicketProcessMeasureControllerService.draft(request);
// 3. 查询工单处理记录获取关联的工单
// 3. 写入审批时间
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.set(QmsIssueTicketProcess::getApprovalTime, LocalDateTime.now())
.update();
// 4. 查询工单处理记录获取关联的工单
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("关联的质量问题工单不存在");
@ -134,7 +151,24 @@ public class QmsIssueTicketProcessControllerService {
todoItemService.save(todoItem);
} else if (request.getApprovalStatus() == 0) {
// 通过推送给当前用户所在部门负责人
// TODO: Department 表暂无负责人字段后续补充
Long currentUserId = UserUtil.getUserId();
UserInterior userInterior = userInteriorService.lambdaQuery()
.eq(UserInterior::getUserId, currentUserId)
.one();
if (userInterior != null && userInterior.getDeptId() != null) {
Department department = departmentService.getById(userInterior.getDeptId());
if (department != null && department.getHeadUserId() != null) {
QmsTodoItem todoItem = new QmsTodoItem()
.setCode(ticket.getTicketNo())
.setIsRead(false)
.setSourceTypeId(sourceTypeId)
.setSourceId(process.getId())
.setCreateUserId(department.getHeadUserId())
.setCreateUserName(department.getHeadUserName())
.setCreateTime(now);
todoItemService.save(todoItem);
}
}
}
}
@ -151,15 +185,10 @@ public class QmsIssueTicketProcessControllerService {
VUtil.trueThrowBusinessError(Objects.isNull(request.getLeaderApprovalResult()))
.throwMessage("提交时领导审批结果不能为空");
// 2. 保存数据
// 2. 保存数据leaderDraft 已写入领导信息 + 审批时间
issueTicketProcessMeasureControllerService.leaderDraft(request);
// 3. 写入领导审批时间
LocalDateTime now = LocalDateTime.now();
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.set(QmsIssueTicketProcess::getLeaderApprovalTime, now)
.update();
if (request.getLeaderApprovalResult() == 0) {
// 驳回推送待办给处理人

View File

@ -14,6 +14,7 @@ import jakarta.validation.Valid;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Objects;
/**
@ -43,13 +44,20 @@ public class QmsIssueTicketProcessMeasureControllerService {
.set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, request.getRootCause())
.set(request.getApprovalStatus() != null, QmsIssueTicketProcess::getApprovalStatus, request.getApprovalStatus())
.set(request.getApprovalOpinion() != null, QmsIssueTicketProcess::getApprovalOpinion, request.getApprovalOpinion())
.set(QmsIssueTicketProcess::getApprovalUserId, UserUtil.getUserId())
.set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName())
.update();
// 有措施内容则新增一条措施记录
if (StrUtil.isNotBlank(request.getMeasureContent())) {
QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure()
.setIssueTicketProcessId(request.getId())
.setMeasureContent(request.getMeasureContent());
.setMeasureContent(request.getMeasureContent())
.setMeasureTypeId(request.getMeasureTypeId())
.setChargeUser(request.getChargeUser())
.setPlanDate(request.getPlanDate())
.setConfirmDate(request.getConfirmDate())
.setRemark(request.getRemark());
issueTicketProcessMeasureService.save(measure);
}
}
@ -70,6 +78,7 @@ public class QmsIssueTicketProcessMeasureControllerService {
QmsIssueTicketProcess::getLeaderApprovalResult, request.getLeaderApprovalResult())
.set(QmsIssueTicketProcess::getLeaderUserId, UserUtil.getUserId())
.set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName())
.set(QmsIssueTicketProcess::getLeaderApprovalTime, LocalDateTime.now())
.update();
}
}

View File

@ -3,6 +3,8 @@ package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDate;
/**
* 质量问题工单处理 暂存/提交参数
*/
@ -34,4 +36,29 @@ public class QmsIssueTicketProcessDraftQO {
* 措施内容可选有值则新增一条 QmsIssueTicketProcessMeasure 记录
*/
private String measureContent;
/**
* 措施类型ID可选关联字典项表
*/
private Long measureTypeId;
/**
* 负责人可选
*/
private String chargeUser;
/**
* 计划日期可选
*/
private LocalDate planDate;
/**
* 确认日期可选
*/
private LocalDate confirmDate;
/**
* 备注可选
*/
private String remark;
}

View File

@ -35,8 +35,7 @@ public class QmsPdiDetectionRulesAddQO {
private Integer inspectionType;
/**
* 销售订单号必传
* 销售订单号可选
*/
@NotBlank(message = "销售订单号不能为空")
private String orderNo;
}

View File

@ -0,0 +1,216 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* PDI工单详情
*/
@Data
public class QmsPdiTicketDetailVO {
/**
* 工单编号
*/
private String ticketNo;
/**
* 工单标题
*/
private String ticketTitle;
/**
* 工单状态0=待流转1=处理中2=已完成
*/
private Short status;
/**
* 不合格质检项列表
*/
private List<UnqualifiedItemVO> unqualifiedItems;
/**
* 处理记录列表
*/
private List<ProcessVO> processes;
@Data
public static class UnqualifiedItemVO {
/**
* 质检结果记录ID
*/
private Long id;
/**
* 检验项ID
*/
private Long inspectionItemId;
/**
* 检验项类型0=静态检测项1=动态检测项2=装车前检测项3=特殊检测项
*/
private Integer inspectionItemType;
/**
* 检验现场图片
*/
private String inspectionItemImage;
/**
* 备注
*/
private String remark;
/**
* 质检人ID
*/
private String inspectorId;
/**
* 质检时间
*/
private LocalDateTime inspectionTime;
/**
* 质检人
*/
private String inspectionBy;
}
@Data
public static class ProcessVO {
/**
* 处理记录ID
*/
private Long id;
/**
* 处理人ID
*/
private Long handlerUserId;
/**
* 处理人姓名
*/
private String handlerUserName;
/**
* 处理人所属部门ID
*/
private Long handlerDeptId;
/**
* 处理人所属部门名称
*/
private String handlerDeptName;
/**
* 根本原因
*/
private String rootCause;
/**
* 任务结果ID多个用逗号分隔
*/
private String taskResultIds;
/**
* 审批状态0=通过1=驳回
*/
private Short approvalStatus;
/**
* 审批意见
*/
private String approvalOpinion;
/**
* 审批人ID
*/
private Long approvalUserId;
/**
* 审批人姓名
*/
private String approvalUserName;
/**
* 审批时间
*/
private LocalDateTime approvalTime;
/**
* 上级领导审批结果0=驳回1=同意
*/
private Short leaderApprovalResult;
/**
* 上级领导审批意见
*/
private String leaderApprovalOpinion;
/**
* 上级领导ID
*/
private Long leaderUserId;
/**
* 上级领导姓名
*/
private String leaderUserName;
/**
* 上级领导审批时间
*/
private LocalDateTime leaderApprovalTime;
/**
* 措施列表
*/
private List<MeasureVO> measures;
}
@Data
public static class MeasureVO {
/**
* 措施ID
*/
private Long id;
/**
* 措施类型ID关联字典项表
*/
private Long measureTypeId;
/**
* 措施内容
*/
private String measureContent;
/**
* 负责人
*/
private String chargeUser;
/**
* 计划日期
*/
private LocalDate planDate;
/**
* 确认日期
*/
private LocalDate confirmDate;
/**
* 备注
*/
private String remark;
}
}

View File

@ -53,7 +53,7 @@ public class Department implements Serializable {
private Boolean enable;
/**
* 部门负责人id
* 部门负责人ID
*/
private Long headUserId;

View File

@ -339,12 +339,14 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl<QmsQualityInspec
// 查部门名称
String deptName = null;
String deptLeaderName = null;
String positionName = null;
if (Objects.nonNull(userInterior)) {
if (Objects.nonNull(userInterior.getDeptId())) {
Department department = departmentService.getById(userInterior.getDeptId());
if (Objects.nonNull(department)) {
deptName = department.getName();
deptLeaderName = department.getHeadUserName();
}
}
if (Objects.nonNull(userInterior.getPositionId())) {
@ -364,7 +366,7 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl<QmsQualityInspec
detail.setUserName(user.getUserName());
}
detail.setDeptName(deptName);
detail.setDeptLeaderName(null);
detail.setDeptLeaderName(deptLeaderName);
detail.setPositionName(positionName);
// 用主表 id 查明细表