20260409修改内容

This commit is contained in:
秦鸿展
2026-04-10 09:29:26 +08:00
parent fd5e81e5ff
commit bfb3c92678
11 changed files with 249 additions and 14 deletions
@@ -83,16 +83,73 @@ public class ReviewOrderApplicationService {
private OutMaterialDetailMapper outMaterialDetailMapper;
public List<ReviewOrderPO> 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<ReviewOrderPO> 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不能为空");
@@ -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<ReceiptMaterialDetailPO> receiptMaterialDetailPOList) {
if (CollectionUtils.isEmpty(receiptMaterialDetailPOList)) {
return;
}
for (ReceiptMaterialDetailPO detail : receiptMaterialDetailPOList) {
if (StringUtils.isBlank(detail.getBatchNumber()) && StringUtils.isNotBlank(detail.getSheetRefNo())) {
detail.setBatchNumber(detail.getSheetRefNo());
}
List<ReceiptMaterialDetailPO> children = detail.getChildren();
if (!CollectionUtils.isEmpty(children)) {
fillBatchNumberFromSheetRefNoRecursively(children);
}
}
}
/**
* 递归计算并填充待收货数量:待收货数量 = 计划数量 - 已收货数量
*/
@@ -63,4 +63,10 @@ public class ReviewOrderDO extends BaseVOEntity {
@ApiModelProperty("复核明细列表(用于批量复核/取消复核)")
private List<ReviewMaterialDetailPO> details;
@ApiModelProperty("PDA 列表 Tab:2=历史(已复核),其它=待办(待复核/复核中)")
private Integer tabType;
@ApiModelProperty("复核状态小于该值(查询用,如待办 review_status < 3")
private Integer ltReviewStatus;
}
@@ -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;
@@ -54,6 +54,7 @@ public class ReviewOrderDTO extends BaseVOEntity {
private String receiveTimeEnd;
@ApiModelProperty("复核单ID集合")
@JsonAlias({"outOrderIds"})
private List<Long> reviewOrderIds;
@ApiModelProperty("复核作业人用户ID(复核下发可选,未传则默认当前登录人)")
@@ -65,4 +66,7 @@ public class ReviewOrderDTO extends BaseVOEntity {
@ApiModelProperty("复核明细列表(用于批量复核/取消复核)")
@JsonAlias({"materialDetailList"})
private List<ReviewMaterialDetailPO> details;
@ApiModelProperty("PDA 列表 Tab:2=历史(已复核),其它=待办(待复核/复核中)")
private Integer tabType;
}
@@ -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;
@@ -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;
/**
* 分页查询复核单列表仅已下发任务按当前用户仓库过滤
* <ul>
* <li>{@code tabType=2}历史{@code review_status=3} 已复核</li>
* <li>其它待办{@code review_status &lt; 3}待复核/复核中</li>
* </ul>
*/
@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<ReviewOrderPO> 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));
}
}
@@ -116,6 +116,9 @@
<if test="reviewStatus != null">
and a.review_status = #{reviewStatus}
</if>
<if test="ltReviewStatus != null">
and a.review_status &lt; #{ltReviewStatus}
</if>
<if test="issuedFlag != null and issuedFlag != ''">
and a.issued_flag = #{issuedFlag}
</if>
@@ -178,6 +178,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="batchNumber != null and batchNumber != ''">
and batch_number = #{batchNumber}
</if>
<if test="lotNumber != null and lotNumber != ''">
and lot_number = #{lotNumber}
</if>
<if test="materialStatusCode != null and materialStatusCode != ''">
and material_status_code = #{materialStatusCode}
</if>
@@ -82,19 +82,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="orderDate" column="ORDER_DATE" />
</resultMap>
<!-- 计划入库数量:入库明细主行 quantity 汇总(列表 quantity / plan_in_quantity 均以此为准展示) -->
<sql id="sumPlanInMaterialQuantity">
(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))
</sql>
<sql id="selectStockInOrderPo">
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,
<include refid="sumPlanInMaterialQuantity"/> as quantity,
<include refid="sumPlanInMaterialQuantity"/> as plan_in_quantity,
-- 收货数量:收货单表 stock_receipt_order 的 receipt_quantity 汇总
(select ifnull(sum(sro.receipt_quantity), 0)
from stock_receipt_order sro
+16
View File
@@ -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;
/