Merge branch 'qms/yf' into qms/develop

This commit is contained in:
yf001217 2026-04-20 10:17:08 +08:00
commit 80b126ac6f
11 changed files with 239 additions and 72 deletions

View File

@ -86,23 +86,13 @@ public class QmsCoaReviewController extends BaseController {
}
/**
* 分页查询-供应商
* 供应商查看自己创建的审核记录
* 支持供应商编号/名称采购单号物料编码过滤
* 分页查询自动识别身份
* 供应商查看自己创建的审核记录
* 内部用户SQE查看负责的供应商物料的审核记录
*/
@PostMapping("searchForSupplier")
public ApiResult<PageData<QmsCoaReviewVO>> searchForSupplier(@Valid @RequestBody QmsCoaReviewSearchQO qo) {
return ApiResult.success(coaReviewService.searchForSupplier(qo));
}
/**
* 分页查询-SQE
* SQE查看待审核的记录基于task.user_id
* 支持供应商编号/名称采购单号物料编码过滤
*/
@PostMapping("searchForSqe")
public ApiResult<PageData<QmsCoaReviewVO>> searchForSqe(@Valid @RequestBody QmsCoaReviewSearchQO qo) {
return ApiResult.success(coaReviewService.searchForSqe(qo));
@PostMapping("search")
public ApiResult<PageData<QmsCoaReviewVO>> search(@Valid @RequestBody QmsCoaReviewSearchQO qo) {
return ApiResult.success(coaReviewService.search(qo));
}
/**

View File

@ -3,9 +3,11 @@ package com.nflg.qms.admin.controller;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskAddQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskMaterialSearchQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskSearchQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskUpdateQO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskDetailVO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskMaterialVO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskVO;
import com.nflg.wms.repository.service.IQmsCoaTaskService;
import com.nflg.wms.starter.BaseController;
@ -61,7 +63,7 @@ public class QmsCoaTaskController extends BaseController {
}
/**
* 直接发布COA通知任务状态直接变为1并填入发送时间
* 直接发布COA通知任务状态直接变为1已发送并填入发送时间
*/
@Transactional
@PostMapping("publish")
@ -71,7 +73,7 @@ public class QmsCoaTaskController extends BaseController {
}
/**
* 批量发送状态改为1填入发送时间
* 批量发送状态改为1已发送填入发送时间
*
* @param ids 任务ID列表
*/
@ -91,6 +93,16 @@ public class QmsCoaTaskController extends BaseController {
return ApiResult.success(coaTaskService.search(qo));
}
/**
* 分页查询当前登录供应商关联的物料列表
* 物料类别物料编号精确查询物料描述模糊查询均可选
* 返回物料编号图号物料描述物料类别
*/
@PostMapping("materialSearch")
public ApiResult<PageData<QmsCoaTaskMaterialVO>> materialSearch(@Valid @RequestBody QmsCoaTaskMaterialSearchQO qo) {
return ApiResult.success(coaTaskService.searchMaterial(qo));
}
/**
* 按ID查详情
* 返回供应商名称物料编号物料描述图纸版本号报告要求报告模板

View File

@ -1,7 +1,6 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
@ -11,13 +10,7 @@ import lombok.Data;
public class QmsCoaReviewAddQO {
/**
* 任务ID关联 qms_coa_task.id必传
*/
@NotNull(message = "任务ID不能为空")
private Long taskId;
/**
* 物料编码必传用于与任务中的物料进行校验
* 物料编码必传用于匹配任务
*/
@NotBlank(message = "物料编码不能为空")
private String materialNo;

View File

@ -0,0 +1,39 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.Min;
import lombok.Data;
/**
* 查询当前登录供应商关联的物料列表参数
* 物料类别物料编号为精确查询物料描述为模糊查询均可选
*/
@Data
public class QmsCoaTaskMaterialSearchQO {
/**
* 物料类别精确可选
*/
private String materialCategoryCode;
/**
* 物料编号精确可选
*/
private String materialNo;
/**
* 物料描述模糊可选
*/
private String materialDesc;
/**
* 当前页码默认第1页
*/
@Min(value = 1, message = "页码不能小于1")
private Integer page = 1;
/**
* 每页条数默认20
*/
@Min(value = 1, message = "每页条数不能小于1")
private Integer pageSize = 20;
}

View File

@ -0,0 +1,40 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
/**
* 供应商关联物料列表 VO
*/
@Data
public class QmsCoaTaskMaterialVO {
/**
* 物料编号
*/
private String materialNo;
/**
* 物料图号
*/
private String drawingNo;
/**
* 图号版本号
*/
private String drawingNoVer;
/**
* 物料描述
*/
private String materialDesc;
/**
* 物料类别编码
*/
private String materialCategoryCode;
/**
* 物料类别全路径名称
*/
private String materialCategoryCodePathName;
}

View File

@ -39,7 +39,7 @@ public class QmsCoaTaskVO {
private String materialNo;
/**
* COA任务状态0=待发送1=待上传2=已上传
* COA任务状态0=待发送1=已发送
*/
private Integer status;

View File

@ -48,7 +48,7 @@ public class QmsCoaTask implements Serializable {
private Long userId;
/**
* COA任务状态0=待发送1=待上传2=已上传
* COA任务状态0=待发送1=已发送
*/
private Integer status;

View File

@ -44,6 +44,13 @@ public interface IQmsCoaReviewService extends IService<QmsCoaReview> {
*/
void audit(QmsCoaReviewAuditQO qo);
/**
* 分页查询自动识别身份
* 供应商查看自己创建的审核记录
* 内部用户SQE查看负责供应商物料的审核记录基于task.user_id
*/
PageData<QmsCoaReviewVO> search(QmsCoaReviewSearchQO qo);
/**
* 分页查询-供应商供应商查看自己创建的审核记录
*/

View File

@ -1,12 +1,14 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskAddQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskMaterialSearchQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskSearchQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskUpdateQO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskDetailVO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskMaterialVO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskVO;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.repository.entity.QmsCoaTask;
import java.util.List;
@ -46,6 +48,13 @@ public interface IQmsCoaTaskService extends IService<QmsCoaTask> {
*/
PageData<QmsCoaTaskVO> search(QmsCoaTaskSearchQO qo);
/**
* 分页查询当前登录供应商关联的物料列表
* 物料类别物料编号精确查询物料描述模糊查询均可选
* 通过当前登录用户找到对应供应商过滤出该供应商在 coa_task 中绑定的物料
*/
PageData<QmsCoaTaskMaterialVO> searchMaterial(QmsCoaTaskMaterialSearchQO qo);
/**
* 按ID查详情
*/

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.constant.UserType;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsCoaReviewAddQO;
@ -61,25 +62,8 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl<QmsCoaReviewMapper, Qms
@Override
public void add(QmsCoaReviewAddQO qo) {
Long currentUserId = UserUtil.getUserId();
// 1. 查询COA任务
QmsCoaTask task = coaTaskService.getById(qo.getTaskId());
if (Objects.isNull(task) || Boolean.TRUE.equals(task.getDeleted())) {
throw new NflgException(STATE.BusinessError, "COA任务不存在");
}
// 2. 验证任务状态状态0待发送不能新建
if (Objects.equals(task.getStatus(), 0)) {
throw new NflgException(STATE.BusinessError, "任务状态为待发送无法新建COA审核");
}
// 3. 验证当前账号是否与任务中的供应商一致
UserSupplier supplier = userSupplierService.getById(task.getSupplierId());
if (Objects.isNull(supplier) || !Objects.equals(supplier.getUserId(), currentUserId)) {
throw new NflgException(STATE.BusinessError, "当前账号与任务中的供应商不匹配,无权操作此任务");
}
// 4. 根据物料编码查询 qms_qc_material 表获取物料ID
// 1. 根据物料编码查询物料ID
QmsQcMaterial material = qcMaterialService.lambdaQuery()
.eq(QmsQcMaterial::getMaterialNo, qo.getMaterialNo())
.last("LIMIT 1")
@ -87,15 +71,35 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl<QmsCoaReviewMapper, Qms
if (Objects.isNull(material)) {
throw new NflgException(STATE.BusinessError, "物料编码不存在:" + qo.getMaterialNo());
}
// 5. 验证物料ID是否与任务中的物料ID一致
if (!Objects.equals(task.getMaterialId(), material.getId())) {
throw new NflgException(STATE.BusinessError, "物料编码与任务中的物料不匹配");
// 2. 通过当前登录用户找到对应供应商
UserSupplier supplier = userSupplierService.lambdaQuery()
.eq(UserSupplier::getUserId, currentUserId)
.last("LIMIT 1")
.one();
if (Objects.isNull(supplier)) {
throw new NflgException(STATE.BusinessError, "当前账号未关联供应商");
}
// 6. 校验批次号唯一性同task_id + 同采购单号 + 同批次号 不能重复
// 3. 通过供应商ID + 物料ID coa_task 中查找对应任务
QmsCoaTask task = coaTaskService.lambdaQuery()
.eq(QmsCoaTask::getSupplierId, supplier.getId())
.eq(QmsCoaTask::getMaterialId, material.getId())
.ne(QmsCoaTask::getDeleted, true)
.last("LIMIT 1")
.one();
if (Objects.isNull(task)) {
throw new NflgException(STATE.BusinessError, "未找到该物料对应的COA通知任务");
}
// 4. 验证任务状态状悁0待发送不能新建
if (Objects.equals(task.getStatus(), 0)) {
throw new NflgException(STATE.BusinessError, "任务状态为待发送,无法新建 COA 审核");
}
// 5. 校验批次号唯一性同task_id + 同采购单号 + 同批次号 不能重复
boolean exists = lambdaQuery()
.eq(QmsCoaReview::getTaskId, qo.getTaskId())
.eq(QmsCoaReview::getTaskId, task.getId())
.eq(QmsCoaReview::getPurchaseNo, qo.getPurchaseNo())
.eq(QmsCoaReview::getBatchNo, qo.getBatchNo())
.ne(QmsCoaReview::getDeleted, true)
@ -103,12 +107,12 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl<QmsCoaReviewMapper, Qms
if (exists) {
throw new NflgException(STATE.BusinessError, "该采购单号下已存在相同批次号,无法重复新增");
}
String operator = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
QmsCoaReview review = new QmsCoaReview()
.setTaskId(qo.getTaskId())
.setTaskId(task.getId())
.setSupplierId(task.getSupplierId())
.setMaterialId(material.getId())
.setUserId(currentUserId)
@ -223,10 +227,6 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl<QmsCoaReviewMapper, Qms
}
// 校验供应商权限
validateSupplierPermission(r.getSupplierId());
// 收集taskId
if (Objects.nonNull(r.getTaskId())) {
taskIds.add(r.getTaskId());
}
}
String operator = UserUtil.getUserName();
@ -239,16 +239,6 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl<QmsCoaReviewMapper, Qms
.set(QmsCoaReview::getUpdateBy, operator)
.set(QmsCoaReview::getUpdateTime, now)
.update();
// 更新关联的任务状态为2已上传
if (!taskIds.isEmpty()) {
coaTaskService.lambdaUpdate()
.in(QmsCoaTask::getId, taskIds)
.set(QmsCoaTask::getStatus, 2)
.set(QmsCoaTask::getUpdateBy, operator)
.set(QmsCoaTask::getUpdateTime, now)
.update();
}
}
// ==================== 审核 ====================
@ -306,6 +296,19 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl<QmsCoaReviewMapper, Qms
// ==================== 分页查询 ====================
/**
* 自动识别身份分发查询供应商 searchForSupplier内部用户SQE searchForSqe
*/
@Override
public PageData<QmsCoaReviewVO> search(QmsCoaReviewSearchQO qo) {
UserType userType = UserUtil.getType();
if (UserType.Supplier.equals(userType)) {
return searchForSupplier(qo);
} else {
return searchForSqe(qo);
}
}
/**
* 供应商分页查询供应商查看自己创建的审核记录
*/

View File

@ -8,9 +8,11 @@ import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskAddQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskMaterialSearchQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskSearchQO;
import com.nflg.wms.common.pojo.qo.QmsCoaTaskUpdateQO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskDetailVO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskMaterialVO;
import com.nflg.wms.common.pojo.vo.QmsCoaTaskVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.QmsCoaTask;
@ -63,6 +65,16 @@ public class QmsCoaTaskServiceImpl extends ServiceImpl<QmsCoaTaskMapper, QmsCoaT
throw new NflgException(STATE.BusinessError, "物料编号不存在:" + qo.getMaterialNo());
}
// 校验同供应商+同物料是否已存在未删除的任务
boolean duplicate = lambdaQuery()
.eq(QmsCoaTask::getSupplierId, supplier.getId())
.eq(QmsCoaTask::getMaterialId, material.getId())
.ne(QmsCoaTask::getDeleted, true)
.exists();
if (duplicate) {
throw new NflgException(STATE.BusinessError, "该供应商已存在此物料的COA通知任务请勿重复新增如需修改请使用修改功能");
}
String operator = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
@ -151,6 +163,16 @@ public class QmsCoaTaskServiceImpl extends ServiceImpl<QmsCoaTaskMapper, QmsCoaT
throw new NflgException(STATE.BusinessError, "物料编号不存在:" + qo.getMaterialNo());
}
// 校验同供应商+同物料是否已存在未删除的任务
boolean duplicate = lambdaQuery()
.eq(QmsCoaTask::getSupplierId, supplier.getId())
.eq(QmsCoaTask::getMaterialId, material.getId())
.ne(QmsCoaTask::getDeleted, true)
.exists();
if (duplicate) {
throw new NflgException(STATE.BusinessError, "该供应商已存在此物料的COA通知任务请勿重复新增如需修改请使用修改功能");
}
String operator = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
@ -355,4 +377,56 @@ public class QmsCoaTaskServiceImpl extends ServiceImpl<QmsCoaTaskMapper, QmsCoaT
result.setTotal(0);
return result;
}
// ==================== 供应商物料列表 ====================
@Override
public PageData<QmsCoaTaskMaterialVO> searchMaterial(QmsCoaTaskMaterialSearchQO qo) {
Long currentUserId = UserUtil.getUserId();
// 通过当前登录用户找到对应供应商
UserSupplier supplier = userSupplierService.lambdaQuery()
.eq(UserSupplier::getUserId, currentUserId)
.last("LIMIT 1")
.one();
if (Objects.isNull(supplier)) {
throw new NflgException(STATE.BusinessError, "当前账号未关联供应商");
}
// 查询该供应商在 coa_task 中绑定的物料ID集合
List<QmsCoaTask> tasks = lambdaQuery()
.eq(QmsCoaTask::getSupplierId, supplier.getId())
.ne(QmsCoaTask::getDeleted, true)
.list();
if (tasks.isEmpty()) {
return emptyPage(qo.getPage(), qo.getPageSize());
}
Set<Long> materialIds = tasks.stream()
.map(QmsCoaTask::getMaterialId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 构建物料查询条件
var query = qcMaterialService.lambdaQuery()
.in(QmsQcMaterial::getId, materialIds)
.eq(StrUtil.isNotBlank(qo.getMaterialCategoryCode()), QmsQcMaterial::getMaterialCategoryCode, qo.getMaterialCategoryCode())
.eq(StrUtil.isNotBlank(qo.getMaterialNo()), QmsQcMaterial::getMaterialNo, qo.getMaterialNo())
.like(StrUtil.isNotBlank(qo.getMaterialDesc()), QmsQcMaterial::getMaterialDesc, qo.getMaterialDesc())
.orderByAsc(QmsQcMaterial::getMaterialNo);
IPage<QmsQcMaterial> page = query.page(new Page<>(qo.getPage(), qo.getPageSize()));
List<QmsCoaTaskMaterialVO> vos = page.getRecords().stream().map(m -> {
QmsCoaTaskMaterialVO vo = new QmsCoaTaskMaterialVO();
vo.setMaterialNo(m.getMaterialNo());
vo.setDrawingNo(m.getDrawingNo());
vo.setDrawingNoVer(m.getDrawingNoVer());
vo.setMaterialDesc(m.getMaterialDesc());
vo.setMaterialCategoryCode(m.getMaterialCategoryCode());
vo.setMaterialCategoryCodePathName(m.getMaterialCategoryCodePathName());
return vo;
}).collect(Collectors.toList());
return buildPageData(page, vos);
}
}