diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsCoaReviewController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsCoaReviewController.java index d89adc2d..4abc07c6 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsCoaReviewController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsCoaReviewController.java @@ -52,7 +52,7 @@ public class QmsCoaReviewController extends BaseController { } /** - * 修改COA审核记录 + * 修改COA内容 * 状态0时都可以改,状态3时只能改COA报告 */ @Transactional @@ -86,12 +86,23 @@ public class QmsCoaReviewController extends BaseController { } /** - * 分页查询(只返回当前账号的数据) - * 支持供应商编号/名称、采购单号、物料编码过滤,供应商名称模糊查询 + * 分页查询-供应商 + * 供应商查看自己创建的审核记录 + * 支持供应商编号/名称、采购单号、物料编码过滤 */ - @PostMapping("search") - public ApiResult> search(@Valid @RequestBody QmsCoaReviewSearchQO qo) { - return ApiResult.success(coaReviewService.search(qo)); + @PostMapping("searchForSupplier") + public ApiResult> searchForSupplier(@Valid @RequestBody QmsCoaReviewSearchQO qo) { + return ApiResult.success(coaReviewService.searchForSupplier(qo)); + } + + /** + * 分页查询-SQE + * SQE查看待审核的记录(基于task.user_id) + * 支持供应商编号/名称、采购单号、物料编码过滤 + */ + @PostMapping("searchForSqe") + public ApiResult> searchForSqe(@Valid @RequestBody QmsCoaReviewSearchQO qo) { + return ApiResult.success(coaReviewService.searchForSqe(qo)); } /** diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsCoaReviewAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsCoaReviewAddQO.java index e7c67b13..298a5baa 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsCoaReviewAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsCoaReviewAddQO.java @@ -1,6 +1,7 @@ package com.nflg.wms.common.pojo.qo; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; /** @@ -10,7 +11,13 @@ import lombok.Data; public class QmsCoaReviewAddQO { /** - * 物料编码(必传,用于查询 qms_qc_material.id) + * 任务ID(关联 qms_coa_task.id,必传) + */ + @NotNull(message = "任务ID不能为空") + private Long taskId; + + /** + * 物料编码(必传,用于与任务中的物料进行校验) */ @NotBlank(message = "物料编码不能为空") private String materialNo; @@ -21,6 +28,12 @@ public class QmsCoaReviewAddQO { @NotBlank(message = "采购单号不能为空") private String purchaseNo; + /** + * 批次号(必传) + */ + @NotBlank(message = "批次号不能为空") + private String batchNo; + /** * COA报告/文件地址(必传) */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewDetailVO.java index 19883a4a..dd74290b 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewDetailVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewDetailVO.java @@ -27,6 +27,11 @@ public class QmsCoaReviewDetailVO { */ private String purchaseNo; + /** + * 批次号 + */ + private String batchNo; + /** * 物料编码 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewVO.java index b4515599..20f822ca 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsCoaReviewVO.java @@ -27,6 +27,11 @@ public class QmsCoaReviewVO { */ private String purchaseNo; + /** + * 批次号 + */ + private String batchNo; + /** * 物料编码 */ diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsCoaReview.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsCoaReview.java index 4d00b094..4754ee26 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsCoaReview.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsCoaReview.java @@ -56,6 +56,11 @@ public class QmsCoaReview implements Serializable { */ private String purchaseNo; + /** + * 批次号 + */ + private String batchNo; + /** * COA审核状态:0=待提交,1=待审核,2=已通过,3=已驳回 */ diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsCoaReviewService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsCoaReviewService.java index a52ac5e5..54384cfb 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsCoaReviewService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsCoaReviewService.java @@ -45,9 +45,14 @@ public interface IQmsCoaReviewService extends IService { void audit(QmsCoaReviewAuditQO qo); /** - * 分页查询(只返回当前账号的数据) + * 分页查询-供应商(供应商查看自己创建的审核记录) */ - PageData search(QmsCoaReviewSearchQO qo); + PageData searchForSupplier(QmsCoaReviewSearchQO qo); + + /** + * 分页查询-SQE(SQE查看待审核的记录,基于task.user_id) + */ + PageData searchForSqe(QmsCoaReviewSearchQO qo); /** * 按ID查详情 diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsCoaReviewServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsCoaReviewServiceImpl.java index 3d01dfc4..a81725ed 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsCoaReviewServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsCoaReviewServiceImpl.java @@ -1,5 +1,6 @@ package com.nflg.wms.repository.service.impl; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -13,11 +14,13 @@ import com.nflg.wms.common.pojo.qo.QmsCoaReviewUpdateQO; import com.nflg.wms.common.pojo.vo.QmsCoaReviewDetailVO; import com.nflg.wms.common.pojo.vo.QmsCoaReviewVO; import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.repository.entity.QmsCoaTask; import com.nflg.wms.repository.entity.QmsCoaReview; import com.nflg.wms.repository.entity.QmsQcMaterial; import com.nflg.wms.repository.entity.User; import com.nflg.wms.repository.entity.UserSupplier; import com.nflg.wms.repository.mapper.QmsCoaReviewMapper; +import com.nflg.wms.repository.service.IQmsCoaTaskService; import com.nflg.wms.repository.service.IQmsCoaReviewService; import com.nflg.wms.repository.service.IQmsQcMaterialService; import com.nflg.wms.repository.service.IUserService; @@ -49,12 +52,34 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl reviews = lambdaQuery() .in(QmsCoaReview::getId, ids) .list(); + + Set taskIds = new java.util.HashSet<>(); for (QmsCoaReview r : reviews) { if (!Objects.equals(r.getStatus(), 0)) { throw new NflgException(STATE.BusinessError, "ID=" + r.getId() + " 的记录不是待提交状态,无法提交"); } + // 校验供应商权限 + validateSupplierPermission(r.getSupplierId()); + // 收集taskId + if (Objects.nonNull(r.getTaskId())) { + taskIds.add(r.getTaskId()); + } } String operator = UserUtil.getUserName(); LocalDateTime now = LocalDateTime.now(); + + // 更新审核记录状态为1(待审核) lambdaUpdate() .in(QmsCoaReview::getId, ids) .set(QmsCoaReview::getStatus, 1) .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(); + } } // ==================== 审核 ==================== @@ -195,6 +264,14 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl search(QmsCoaReviewSearchQO qo) { - // 当前账号只能看自己创建的数据 + public PageData searchForSupplier(QmsCoaReviewSearchQO qo) { Long currentUserId = UserUtil.getUserId(); - // 处理供应商过滤(名称模糊 or 编号精确) + // 获取当前用户关联的供应商ID + UserSupplier supplier = userSupplierService.lambdaQuery() + .eq(UserSupplier::getUserId, currentUserId) + .last("LIMIT 1") + .one(); + if (Objects.isNull(supplier)) { + throw new NflgException(STATE.BusinessError, "当前账号未关联供应商"); + } + Long currentSupplierId = supplier.getId(); + + // 处理供应商过滤:连接供应商表查询ID Set filteredSupplierIds = null; - boolean hasSupplierFilter = (Objects.nonNull(qo.getSupplierName()) && !qo.getSupplierName().isEmpty()) - || (Objects.nonNull(qo.getSupplierCode()) && !qo.getSupplierCode().isEmpty()); - if (hasSupplierFilter) { + boolean hasSupplierNameFilter = StrUtil.isNotBlank(qo.getSupplierName()); + boolean hasSupplierCodeFilter = StrUtil.isNotBlank(qo.getSupplierCode()); + + if (hasSupplierNameFilter || hasSupplierCodeFilter) { List suppliers = userSupplierService.lambdaQuery() - .like(Objects.nonNull(qo.getSupplierName()) && !qo.getSupplierName().isEmpty(), - UserSupplier::getSupplierName, qo.getSupplierName()) - .eq(Objects.nonNull(qo.getSupplierCode()) && !qo.getSupplierCode().isEmpty(), - UserSupplier::getSupplierCode, qo.getSupplierCode()) + .nested(i -> { + if (hasSupplierNameFilter) { + i.like(UserSupplier::getSupplierName, qo.getSupplierName()); + } + if (hasSupplierCodeFilter) { + if (hasSupplierNameFilter) { + i.or(); + } + i.eq(UserSupplier::getSupplierCode, qo.getSupplierCode()); + } + }) .list(); filteredSupplierIds = suppliers.stream().map(UserSupplier::getId).collect(Collectors.toSet()); if (filteredSupplierIds.isEmpty()) { @@ -253,7 +350,7 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl filteredMaterialIds = null; - if (Objects.nonNull(qo.getMaterialNo()) && !qo.getMaterialNo().isEmpty()) { + if (StrUtil.isNotBlank(qo.getMaterialNo())) { List materials = qcMaterialService.lambdaQuery() .eq(QmsQcMaterial::getMaterialNo, qo.getMaterialNo()) .list(); @@ -266,21 +363,122 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl finalSupplierIds = filteredSupplierIds; final Set finalMaterialIds = filteredMaterialIds; - IPage page = lambdaQuery() - .eq(QmsCoaReview::getUserId, currentUserId) + // 构建查询:只能查看当前供应商的数据 + var query = lambdaQuery() + .eq(QmsCoaReview::getSupplierId, currentSupplierId) .ne(QmsCoaReview::getDeleted, true) - .in(Objects.nonNull(finalSupplierIds), QmsCoaReview::getSupplierId, finalSupplierIds != null ? finalSupplierIds : List.of()) - .in(Objects.nonNull(finalMaterialIds), QmsCoaReview::getMaterialId, finalMaterialIds != null ? finalMaterialIds : List.of()) - .eq(Objects.nonNull(qo.getPurchaseNo()) && !qo.getPurchaseNo().isEmpty(), - QmsCoaReview::getPurchaseNo, qo.getPurchaseNo()) - .orderByDesc(QmsCoaReview::getCreateTime) - .page(new Page<>(qo.getPage(), qo.getPageSize())); + .eq(StrUtil.isNotBlank(qo.getPurchaseNo()), QmsCoaReview::getPurchaseNo, qo.getPurchaseNo()) + .orderByDesc(QmsCoaReview::getCreateTime); + + // 供应商ID过滤(只在有过滤条件时添加) + if (finalSupplierIds != null && !finalSupplierIds.isEmpty()) { + query.in(QmsCoaReview::getSupplierId, finalSupplierIds); + } + + // 物料ID过滤(只在有过滤条件时添加) + if (finalMaterialIds != null && !finalMaterialIds.isEmpty()) { + query.in(QmsCoaReview::getMaterialId, finalMaterialIds); + } + + IPage page = query.page(new Page<>(qo.getPage(), qo.getPageSize())); List records = page.getRecords(); if (records.isEmpty()) { return buildPageData(page, List.of()); } + // 批量查询关联数据 + return buildPageDataWithRelations(page, records); + } + + /** + * SQE分页查询:SQE查看待审核的记录(基于task.user_id) + */ + @Override + public PageData searchForSqe(QmsCoaReviewSearchQO qo) { + Long currentUserId = UserUtil.getUserId(); + + // 查询当前SQE用户关联的任务ID列表 + List tasks = coaTaskService.lambdaQuery() + .eq(QmsCoaTask::getUserId, currentUserId) + .ne(QmsCoaTask::getDeleted, true) + .list(); + if (tasks.isEmpty()) { + return emptyPage(qo.getPage(), qo.getPageSize()); + } + Set taskIds = tasks.stream().map(QmsCoaTask::getId).collect(Collectors.toSet()); + + // 处理供应商过滤 + Set filteredSupplierIds = null; + boolean hasSupplierNameFilter = StrUtil.isNotBlank(qo.getSupplierName()); + boolean hasSupplierCodeFilter = StrUtil.isNotBlank(qo.getSupplierCode()); + + if (hasSupplierNameFilter || hasSupplierCodeFilter) { + List suppliers = userSupplierService.lambdaQuery() + .nested(i -> { + if (hasSupplierNameFilter) { + i.like(UserSupplier::getSupplierName, qo.getSupplierName()); + } + if (hasSupplierCodeFilter) { + if (hasSupplierNameFilter) { + i.or(); + } + i.eq(UserSupplier::getSupplierCode, qo.getSupplierCode()); + } + }) + .list(); + filteredSupplierIds = suppliers.stream().map(UserSupplier::getId).collect(Collectors.toSet()); + if (filteredSupplierIds.isEmpty()) { + return emptyPage(qo.getPage(), qo.getPageSize()); + } + } + + // 处理物料编号过滤 + Set filteredMaterialIds = null; + if (StrUtil.isNotBlank(qo.getMaterialNo())) { + List materials = qcMaterialService.lambdaQuery() + .eq(QmsQcMaterial::getMaterialNo, qo.getMaterialNo()) + .list(); + filteredMaterialIds = materials.stream().map(QmsQcMaterial::getId).collect(Collectors.toSet()); + if (filteredMaterialIds.isEmpty()) { + return emptyPage(qo.getPage(), qo.getPageSize()); + } + } + + final Set finalSupplierIds = filteredSupplierIds; + final Set finalMaterialIds = filteredMaterialIds; + + // 构建查询:只能查看属于当前SQE任务的审核记录 + var query = lambdaQuery() + .in(QmsCoaReview::getTaskId, taskIds) + .ne(QmsCoaReview::getDeleted, true) + .eq(StrUtil.isNotBlank(qo.getPurchaseNo()), QmsCoaReview::getPurchaseNo, qo.getPurchaseNo()) + .orderByDesc(QmsCoaReview::getCreateTime); + + // 供应商ID过滤 + if (finalSupplierIds != null && !finalSupplierIds.isEmpty()) { + query.in(QmsCoaReview::getSupplierId, finalSupplierIds); + } + + // 物料ID过滤 + if (finalMaterialIds != null && !finalMaterialIds.isEmpty()) { + query.in(QmsCoaReview::getMaterialId, finalMaterialIds); + } + + IPage page = query.page(new Page<>(qo.getPage(), qo.getPageSize())); + + List records = page.getRecords(); + if (records.isEmpty()) { + return buildPageData(page, List.of()); + } + + return buildPageDataWithRelations(page, records); + } + + /** + * 构建分页结果并填充关联数据 + */ + private PageData buildPageDataWithRelations(IPage page, List records) { // 批量查询关联数据 Set supplierIds = records.stream().map(QmsCoaReview::getSupplierId).filter(Objects::nonNull).collect(Collectors.toSet()); Set materialIds = records.stream().map(QmsCoaReview::getMaterialId).filter(Objects::nonNull).collect(Collectors.toSet()); @@ -314,6 +512,7 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl