diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java index 3fb7b31f0..68cc3b0f7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java @@ -83,16 +83,73 @@ public class ReviewOrderApplicationService { private OutMaterialDetailMapper outMaterialDetailMapper; public List queryList(ReviewOrderDO query) { - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null && loginUser.getUserPo() != null) { - Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); - if (topOrganizationId != null && topOrganizationId != 1L) { - query.setTopOrganizationId(topOrganizationId); - } + if (query == null) { + query = new ReviewOrderDO(); + } + applyReviewOrderDataPermission(query); + return reviewOrderMapper.queryList(query); + } + + /** + * PDA 复核任务列表:数据来自 REVIEW_ORDER,仅展示已下发任务;与出库单 PDA 列表的 tab 语义对齐。 + */ + public List queryListForPda(ReviewOrderDO query) { + if (query == null) { + query = new ReviewOrderDO(); + } + applyReviewOrderDataPermission(query); + query.setLtReviewStatus(null); + query.setReviewStatus(null); + if (Integer.valueOf(2).equals(query.getTabType())) { + query.setReviewStatus(3); + } else { + query.setLtReviewStatus(3); + } + query.setIssuedFlag("1"); + if (query.getDelFlag() == null) { + query.setDelFlag(1); } return reviewOrderMapper.queryList(query); } + /** + * 复核单数据权限(对齐出库单列表): + * 1) organizationId=2827 可跨组织查询(前端传 organizationId 则按其过滤,不传则全组织) + * 2) 其他组织仅可查询本组织数据,防止越权。 + */ + private void applyReviewOrderDataPermission(ReviewOrderDO query) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + return; + } + Long userOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long frontendOrganizationId = query.getOrganizationId(); + if (userOrganizationId != null && userOrganizationId == 2827L) { + if (frontendOrganizationId != null) { + query.setOrganizationId(frontendOrganizationId); + query.setTopOrganizationId(null); + } else { + query.setOrganizationId(null); + query.setTopOrganizationId(null); + } + return; + } + if (userOrganizationId != null) { + if (frontendOrganizationId == null || !userOrganizationId.equals(frontendOrganizationId)) { + query.setOrganizationId(userOrganizationId); + } else { + query.setOrganizationId(frontendOrganizationId); + } + // 非 2827 组织下,限定在同一顶级组织,避免跨集团越权 + query.setTopOrganizationId(2827L); + return; + } + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1L) { + query.setTopOrganizationId(topOrganizationId); + } + } + public ReviewOrderPO getDetailByReviewOrderId(Long reviewOrderId) { if (reviewOrderId == null) { throw new ServiceException("复核单ID不能为空"); diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java index e7190ac8f..cdd68428c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java @@ -299,6 +299,7 @@ public class StockReceiptOrderApplicationService { // 计算待收货数量 = 计划数量 - 已收货数量 fillPendingReceiptQuantityRecursively(receiptMaterialDetailPOList); fillPlanAndPendingMetricsRecursively(receiptMaterialDetailPOList); + fillBatchNumberFromSheetRefNoRecursively(receiptMaterialDetailPOList); stockReceiptOrderPO.setMaterialDetailList(receiptMaterialDetailPOList); log.info("返回收货单信息,receiptOrderId={}, materialDetailList大小={}, totalNetWeight={}, totalGrossWeight={}, totalVolume={}, totalArea={}", stockReceiptOrderPO.getReceiptOrderId(), @@ -467,6 +468,24 @@ public class StockReceiptOrderApplicationService { } } + /** + * 详情接口展示:批次号为空时默认用料单号(sheetRefNo)展示 + */ + private void fillBatchNumberFromSheetRefNoRecursively(List receiptMaterialDetailPOList) { + if (CollectionUtils.isEmpty(receiptMaterialDetailPOList)) { + return; + } + for (ReceiptMaterialDetailPO detail : receiptMaterialDetailPOList) { + if (StringUtils.isBlank(detail.getBatchNumber()) && StringUtils.isNotBlank(detail.getSheetRefNo())) { + detail.setBatchNumber(detail.getSheetRefNo()); + } + List children = detail.getChildren(); + if (!CollectionUtils.isEmpty(children)) { + fillBatchNumberFromSheetRefNoRecursively(children); + } + } + } + /** * 递归计算并填充待收货数量:待收货数量 = 计划数量 - 已收货数量 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java index c19c9c884..de24266a5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java @@ -63,4 +63,10 @@ public class ReviewOrderDO extends BaseVOEntity { @ApiModelProperty("复核明细列表(用于批量复核/取消复核)") private List details; + + @ApiModelProperty("PDA 列表 Tab:2=历史(已复核),其它=待办(待复核/复核中)") + private Integer tabType; + + @ApiModelProperty("复核状态小于该值(查询用,如待办 review_status < 3)") + private Integer ltReviewStatus; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/todo/ShelfMaterialDetailDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/todo/ShelfMaterialDetailDO.java index aec695188..63f581a6f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/todo/ShelfMaterialDetailDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shelfMaterialDetail/repository/todo/ShelfMaterialDetailDO.java @@ -158,6 +158,10 @@ public class ShelfMaterialDetailDO extends BaseVOEntity { @Excel(name = "批次号") private String batchNumber; + @ApiModelProperty("LOT编号") + @Excel(name = "LOT编号") + private String lotNumber; + @ApiModelProperty("物料状态编码") @Excel(name = "物料状态编码") private String materialStatusCode; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java index 39406b200..f1d2d01ee 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java @@ -54,6 +54,7 @@ public class ReviewOrderDTO extends BaseVOEntity { private String receiveTimeEnd; @ApiModelProperty("复核单ID集合") + @JsonAlias({"outOrderIds"}) private List reviewOrderIds; @ApiModelProperty("复核作业人用户ID(复核下发可选,未传则默认当前登录人)") @@ -65,4 +66,7 @@ public class ReviewOrderDTO extends BaseVOEntity { @ApiModelProperty("复核明细列表(用于批量复核/取消复核)") @JsonAlias({"materialDetailList"}) private List details; + + @ApiModelProperty("PDA 列表 Tab:2=历史(已复核),其它=待办(待复核/复核中)") + private Integer tabType; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java index d7a01e36b..2742b03aa 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/shelfMaterialDetail/ShelfMaterialDetailDTO.java @@ -158,6 +158,10 @@ public class ShelfMaterialDetailDTO extends BaseVOEntity { @Excel(name = "批次号") private String batchNumber; + @ApiModelProperty("LOT编号") + @Excel(name = "LOT编号") + private String lotNumber; + @ApiModelProperty("物料状态编码") @Excel(name = "物料状态编码") private String materialStatusCode; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/reviewOrder/ReviewOrderAppApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/reviewOrder/ReviewOrderAppApi.java new file mode 100644 index 000000000..906718e70 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/reviewOrder/ReviewOrderAppApi.java @@ -0,0 +1,116 @@ +package com.mhd.wms.interfaces.facadeApp.reviewOrder; + +import cn.hutool.json.JSONUtil; +import com.mhd.common.core.domain.po.UserPo; +import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.core.web.page.TableDataInfoApi; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; +import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; +import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.application.service.reviewOrder.ReviewOrderApplicationService; +import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO; +import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO; +import com.mhd.wms.interfaces.assember.reviewOrder.ReviewOrderAssembler; +import com.mhd.wms.interfaces.dto.reviewOrder.ReviewOrderDTO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +/** + * PDA 复核单接口:列表、详情、提交复核、取消复核、完成复核。 + * 数据口径以 {@code REVIEW_ORDER}、{@code REVIEW_MATERIAL_DETAIL} 为准(与 PC {@code ReviewOrderApi} 同源服务)。 + * + * @see com.mhd.wms.interfaces.facadeApi.reviewOrder.ReviewOrderApi + * @see com.mhd.wms.interfaces.facadeApp.stockOutOrder.StockOutOrderAppApi + */ +@Api(tags = "PDA复核单") +@RestController +@RequestMapping("/reviewOrderAppApi") +public class ReviewOrderAppApi extends BaseController { + + @Autowired + private ReviewOrderApplicationService reviewOrderApplicationService; + + @Resource + private ReviewOrderAssembler reviewOrderAssembler; + + /** + * 分页查询复核单列表(仅已下发任务,按当前用户仓库过滤) + *
    + *
  • {@code tabType=2}:历史({@code review_status=3} 已复核)
  • + *
  • 其它:待办({@code review_status < 3},待复核/复核中)
  • + *
+ */ + @ApiOperation("PDA 复核单列表(REVIEW_ORDER)") + @GetMapping("/list") + public TableDataInfoApi list(ReviewOrderDTO reviewOrderDTO) { + ReviewOrderDO query = reviewOrderAssembler.toDO(reviewOrderDTO); + startPage(); + LoginUser loginUser = SecurityUtils.getLoginUser(); + UserPo userPo = loginUser.getUserPo(); + query.setOrganizationId(userPo.getOrganizationId()); + query.setTopOrganizationId(userPo.getTopOrganizationId()); + AssociationWarehouseCacheDO wh = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (wh != null) { + query.setWarehouseId(wh.getWarehouseId()); + } + List list = reviewOrderApplicationService.queryListForPda(query); + return getDataTableApi(list); + } + + /** + * 复核单详情(头 + REVIEW_MATERIAL_DETAIL 明细,含批次展示字段) + */ + @ApiOperation("PDA 复核单详情") + @GetMapping("/getInfo") + public AjaxResult getInfo(@RequestParam("reviewOrderId") Long reviewOrderId) { + return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId)); + } + + @ApiOperation("PDA 按复核单号查详情") + @GetMapping("/getInfoByNumber") + public AjaxResult getInfoByNumber(@RequestParam("reviewOrderNumber") String reviewOrderNumber) { + return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderNumber(reviewOrderNumber)); + } + + /** + * 提交复核(更新 REVIEW_MATERIAL_DETAIL 已复核/待复核数量等,与 PC batchCheck 一致) + */ + @ApiOperation("PDA 提交复核") + @PostMapping("/check") + public AjaxResult check(@RequestBody ReviewOrderDTO reviewOrderDTO) { + ReviewOrderDO cmd = JSONUtil.toBean(JSONUtil.toJsonStr(reviewOrderDTO), ReviewOrderDO.class); + return toAjax(reviewOrderApplicationService.batchCheck(cmd)); + } + + /** + * 取消复核(与 PC batchCancelCheck 一致) + */ + @ApiOperation("PDA 取消复核") + @PostMapping("/cancelCheck") + public AjaxResult cancelCheck(@RequestBody ReviewOrderDTO reviewOrderDTO) { + ReviewOrderDO cmd = reviewOrderAssembler.toDO(reviewOrderDTO); + return toAjax(reviewOrderApplicationService.batchCancelCheck(cmd)); + } + + /** + * 完成复核确认(无待复核数量时可确认,同步出库明细并生成交接等,与 PC checkConfirm 一致) + */ + @ApiOperation("PDA 完成复核") + @PostMapping("/completeCheck") + public AjaxResult completeCheck(@RequestBody ReviewOrderDTO reviewOrderDTO) { + ReviewOrderDO cmd = JSONUtil.toBean(JSONUtil.toJsonStr(reviewOrderDTO), ReviewOrderDO.class); + return toAjax(reviewOrderApplicationService.checkConfirm(cmd)); + } +} diff --git a/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml b/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml index a45fe1215..4c3727d08 100644 --- a/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/reviewOrder/ReviewOrderMapper.xml @@ -116,6 +116,9 @@ and a.review_status = #{reviewStatus} + + and a.review_status < #{ltReviewStatus} + and a.issued_flag = #{issuedFlag} diff --git a/mhd_wms/src/main/resources/mapper/shelfMaterialDetail/ShelfMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/shelfMaterialDetail/ShelfMaterialDetailMapper.xml index f92c9be63..56bb6d87c 100644 --- a/mhd_wms/src/main/resources/mapper/shelfMaterialDetail/ShelfMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/shelfMaterialDetail/ShelfMaterialDetailMapper.xml @@ -178,6 +178,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and batch_number = #{batchNumber} + + and lot_number = #{lotNumber} + and material_status_code = #{materialStatusCode} diff --git a/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml index 52620173c..578f9cf0e 100644 --- a/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml @@ -82,19 +82,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + (select ifnull(sum(imd.quantity), 0) + from in_material_detail imd + where imd.in_order_number = a.in_order_number + and imd.del_flag = 1 + and (imd.level is null or imd.level = 1)) + a.in_order_id, a.organization_id, a.organization_name, a.top_organization_id, a.notice_number, a.in_order_number, a.status, a.audit_status, a.audit_remark, a.audit_by, a.audit_by_name, a.audit_time, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.shipper_code, a.shipper_name, a.order_type_code, a.order_type_name, a.supplier_id, a.supplier_code, a.supplier_name, a.expect_time, a.supply_chain_number, - a.priority_level_code, a.priority_level_name, a.direct_warehouse, a.annex_url, a.material_quantity, a.quantity, - -- 计划入库数量:入库明细表 in_material_detail 的 quantity 汇总 - (select ifnull(sum(imd.quantity), 0) - from in_material_detail imd - where imd.in_order_number = a.in_order_number - and imd.del_flag = 1 - and (imd.level is null or imd.level = 1) - ) as plan_in_quantity, + a.priority_level_code, a.priority_level_name, a.direct_warehouse, a.annex_url, a.material_quantity, + as quantity, + as plan_in_quantity, -- 收货数量:收货单表 stock_receipt_order 的 receipt_quantity 汇总 (select ifnull(sum(sro.receipt_quantity), 0) from stock_receipt_order sro diff --git a/sql/Qhz.sql b/sql/Qhz.sql new file mode 100644 index 000000000..3c7f8fa1f --- /dev/null +++ b/sql/Qhz.sql @@ -0,0 +1,16 @@ +-- 收货单明细新增 lot 编号(达梦) +DECLARE +v_count INT; +BEGIN +SELECT COUNT(1) +INTO v_count +FROM USER_TAB_COLUMNS +WHERE TABLE_NAME = 'RECEIPT_MATERIAL_DETAIL' + AND COLUMN_NAME = 'LOT_NO'; + +IF v_count = 0 THEN + EXECUTE IMMEDIATE 'ALTER TABLE RECEIPT_MATERIAL_DETAIL ADD (LOT_NO VARCHAR2(255))'; +EXECUTE IMMEDIATE 'COMMENT ON COLUMN RECEIPT_MATERIAL_DETAIL.LOT_NO IS ''lot编号'''; +END IF; +END; +/ \ No newline at end of file