feat(wms):复核详情增加合计数;库存分配新增通宇专用可分配库存查询(物料+箱号/卡板+Sheet Ref匹配

1. 复核详情(getInfo/getInfoReviewOrderNumber)头表回填totalReviewedQty/totalPlanQty/materialKindCount,
   口径与列表queryList聚合一致(计划量=Σifnull(material_plan_qty,pending+reviewed))
2. 新增 GET /materialInventoryApi/assignableList,按通宇账号分流(TongyuOrgUtil:组织ID=2830或组织名含"通宇"):
   - 通宇:启用新匹配。双模式入参——传outOrderId+materialDetailId(须成对)则匹配值全部后端自取出库单/明细;
     不传则按平铺参数(materialBaseInfoId/materialCode+boxPalletNo+sheetRefNo,多值串自动拆token OR-LIKE)。
     固定条件:del_flag=1且可分配数量(allocation_quantity)>0,不分页全量返回,不套用用户组织数据权限
   - 非通宇:保持原/list行为,内部直调list();进原查询前清除materialDetailId(新接口专用参数,防泄入
     原查询的a.material_detail_id=上架单明细ID条件导致查空)
3. autoAssign自动分配同步分流:通宇走token匹配,非通宇保持原eq精确匹配不变
4. 新增util/BatchNoTokenUtil(批次属性多值拆分)、util/TongyuOrgUtil;库存批次属性回填抽为
   fillBatchAttributes供/list与可分配查询复用,原逻辑行为不变
This commit is contained in:
rcx
2026-08-26 09:30:01 +08:00
parent 7a5e124f98
commit 7d8e1c3872
9 changed files with 355 additions and 13 deletions
@@ -8,6 +8,7 @@ import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.core.web.page.TableDataInfo;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.UserServiceFeign;
import com.mhd.wms.application.service.materialInventory.MaterialInventoryApplicationService;
import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO;
@@ -17,6 +18,7 @@ import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryQue
import com.mhd.wms.interfaces.assember.materialInventory.MaterialInventoryAssembler;
import com.mhd.wms.interfaces.dto.materialInventory.MaterialInventoryDTO;
import com.mhd.wms.interfaces.dto.materialInventory.MaterialInventoryQueryListDTO;
import com.mhd.wms.util.TongyuOrgUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -138,6 +140,36 @@ public class MaterialInventoryApi extends BaseController {
return tableDataInfo;
}
/**
* 出库单明细可分配库存(库存分配弹窗专用)——按通宇账号分流:
* 通宇账号(组织ID=2830 或 组织名含「通宇」):启用需求三新逻辑,双模式入参——
* 模式A(推荐):传 outOrderId + materialDetailId,物料/箱号/卡板/Sheet Ref/货主/仓库 全部后端自取;
* 模式B(平铺参数,与旧 /list 传参风格一致):不传双 ID 时,按 materialBaseInfoId|materialCode
* + boxPalletNo + sheetRefNo(可选 batchRefNo、shipperId、warehouseId)查询,多值串后端自动拆分。
* 两种模式均:仅返回可分配数量>0 的匹配行;不分页。
* 非通宇账号:保持原行为,内部按原 /list 逻辑查询(分页、customerName 换算等与库存查询页完全一致)。
*/
@ApiOperation("出库单明细可分配库存列表(仅通宇账号启用新匹配逻辑,其他账号按原 /list 逻辑查询)")
@GetMapping("/assignableList")
public TableDataInfo assignableList(MaterialInventoryDTO materialInventoryDTO,
@RequestParam(value = "outOrderId", required = false) Long outOrderId,
@RequestParam(value = "materialDetailId", required = false) Long materialDetailId,
@RequestParam(value = "customerName", required = false) String customerName,
@RequestParam(value = "excludeZeroInventoryQuantity", required = false) Boolean excludeZeroInventoryQuantity,
@RequestParam(value = "expiryDateStart", required = false) String expiryDateStart,
@RequestParam(value = "expiryDateEnd", required = false) String expiryDateEnd,
@RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate) {
// 仅通宇账号启用需求三新逻辑(物料+箱号/卡板+Sheet Ref 匹配、可分配>0、不分页);其他账号保持原 /list 行为
if (TongyuOrgUtil.isTongyu(SecurityUtils.getLoginUser())) {
List<MaterialInventoryPO> list = materialInventoryApplicationService.queryAssignableList(outOrderId, materialDetailId, materialInventoryDTO);
return getDataTable(list);
}
// materialDetailId 是新接口专用参数(出库单明细ID),库存 DTO 的同名字段语义是「上架单明细ID」,
// 泄入原查询会生成错误的 a.material_detail_id 条件导致查空,进原查询前显式清除
materialInventoryDTO.setMaterialDetailId(null);
return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, expiryDateStart, expiryDateEnd, orderByExpiryDate);
}
@ApiOperation("查询物料库存列表不分页;queryRule=hz 时按货主+物料分组(同一物料在不同货主各占一行)")
@GetMapping("/listAll")
public TableDataInfo listAll(MaterialInventoryDTO materialInventoryDTO)