From 87733eb3623593da247c051593d64b8ff9e1d3a4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 06 十一月 2026 19:00:39 +0800
Subject: [PATCH] feat(crm,mes): 扩展客户字段与重构批次号生成逻辑
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java | 128 ++++++++++++++++++++++++++++++++++++++++--
1 files changed, 122 insertions(+), 6 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java
index 5e3c014..0f2a2b5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java
@@ -9,21 +9,30 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockAdjustReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockMoveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockRespVO;
-import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockBagPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockBagRespVO;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstockbag.MesWmMaterialStockBagMapper;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmStockSummaryRespVO;
+import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
+import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
+import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi;
+import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
-import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -56,9 +65,14 @@
public class MesWmMaterialStockController {
@Resource
+ private cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction.MesWmTransactionMapper transactionMapper;
+
+ @Resource
private MesWmMaterialStockService materialStockService;
@Resource
private MdmItemApi mdmItemApi;
+ @Resource
+ private MdmItemCategoryApi mdmItemCategoryApi;
@Resource
private MdmUnitMeasureApi mdmUnitMeasureApi;
@Resource
@@ -68,7 +82,23 @@
@Resource
private MesWmWarehouseAreaService areaService;
@Resource
- private MesMdVendorService vendorService;
+ private SrmSupplierApi srmSupplierApi;
+ @Resource
+ private MesWmMaterialStockBagMapper materialStockBagMapper;
+ @Resource
+ private cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService productSalesLineService;
+ @Resource private cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesDetailMapper salesDetailMapper;
+ @Resource private cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMapper salesMapper;
+ @Resource private cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesShipmentMapper shipmentMapper;
+
+ @GetMapping("/picking-list")
+ @Operation(summary = "鎸夐攢鍞嚭搴撳崟琛屾煡璇㈠悎鏍煎簱瀛�")
+ @PreAuthorize("@ss.hasPermission('mes:wm-product-sales:stock') and @ss.hasPermission('mes:wm-material-stock:query')")
+ public CommonResult<List<MesWmMaterialStockRespVO>> getPickingStocks(@RequestParam("lineId") Long lineId) {
+ var line = productSalesLineService.getProductSalesLine(lineId);
+ if (line == null) throw new IllegalArgumentException("鍑哄簱鍗曡涓嶅瓨鍦�");
+ return success(buildRespVOList(materialStockService.getQualifiedMaterialStockListByItemAndBatch(line.getItemId(), line.getBatchId())));
+ }
@GetMapping("/get")
@Operation(summary = "鑾峰緱搴撳瓨璁板綍")
@@ -89,6 +119,47 @@
@Valid MesWmMaterialStockPageReqVO pageReqVO) {
PageResult<MesWmMaterialStockDO> pageResult = materialStockService.getMaterialStockPage(pageReqVO);
return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
+ }
+
+ @GetMapping("/bag-details")
+ @Operation(summary = "鏌ヨ搴撳瓨琚嬬爜鏄庣粏")
+ @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:query')")
+ public CommonResult<PageResult<MesWmMaterialStockBagRespVO>> getMaterialStockBagDetails(
+ @Valid MesWmMaterialStockBagPageReqVO pageReqVO) {
+ PageResult<MesWmMaterialStockBagRespVO> result = new PageResult<>();
+ PageResult<cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO> page =
+ materialStockBagMapper.selectPage(pageReqVO);
+ var transactionIds = convertSet(page.getList(), cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO::getLastTransactionId);
+ Map<Long, cn.iocoder.yudao.module.mes.dal.dataobject.wm.transaction.MesWmTransactionDO> transactions = transactionIds.isEmpty()
+ ? Collections.emptyMap() : transactionMapper.selectBatchIds(transactionIds).stream()
+ .collect(Collectors.toMap(cn.iocoder.yudao.module.mes.dal.dataobject.wm.transaction.MesWmTransactionDO::getId, tx -> tx));
+ var rows = BeanUtils.toBean(page.getList(), MesWmMaterialStockBagRespVO.class);
+ var bagIds = convertSet(page.getList(), cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO::getBagCodeId);
+ var pickingDetails = salesDetailMapper.selectByBagIds(bagIds);
+ var saleIds = convertSet(pickingDetails, cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO::getSalesId);
+ var shipmentIds = convertSet(pickingDetails, cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO::getShipmentId);
+ var saleMap = saleIds.isEmpty() ? Collections.<Long, cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO>emptyMap()
+ : salesMapper.selectBatchIds(saleIds).stream().collect(Collectors.toMap(cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO::getId, s -> s));
+ var shipmentMap = shipmentIds.isEmpty() ? Collections.<Long, cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesShipmentDO>emptyMap()
+ : shipmentMapper.selectBatchIds(shipmentIds).stream().collect(Collectors.toMap(cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesShipmentDO::getId, s -> s));
+ Map<Long, String> pickingByBag = new java.util.HashMap<>();
+ for (var detail : pickingDetails) {
+ var sale = saleMap.get(detail.getSalesId());
+ var shipment = detail.getShipmentId() == null ? null : shipmentMap.get(detail.getShipmentId());
+ if (sale == null) continue;
+ if (detail.getShipmentId() == null && Integer.valueOf(2).equals(sale.getStatus())) pickingByBag.putIfAbsent(detail.getBagCodeId(), "PICKED");
+ else if ((detail.getShipmentId() == null && (Integer.valueOf(10).equals(sale.getStatus()) || Integer.valueOf(3).equals(sale.getStatus())))
+ || (shipment != null && (Integer.valueOf(10).equals(shipment.getStatus()) || Integer.valueOf(20).equals(shipment.getStatus())))) pickingByBag.put(detail.getBagCodeId(), "RESERVED");
+ }
+ for (int i = 0; i < rows.size(); i++) {
+ var bag = page.getList().get(i);
+ var tx = bag.getLastTransactionId() == null ? null : transactions.get(bag.getLastTransactionId());
+ if (Integer.valueOf(2).equals(bag.getStatus()) && tx != null && Integer.valueOf(2).equals(tx.getType())) {
+ rows.get(i).setOutboundBizType(tx.getBizType());
+ }
+ if (Integer.valueOf(1).equals(bag.getStatus())) rows.get(i).setPickingStatus(pickingByBag.get(bag.getBagCodeId()));
+ }
+ return success(new PageResult<>(rows, page.getTotal()));
}
@PutMapping("/update-frozen")
@@ -114,6 +185,38 @@
return success(materialStockService.adjustMaterialStockOut(reqVO));
}
+ @PostMapping("/move")
+ @Operation(summary = "搴撳瓨绉诲簱")
+ @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:update')")
+ public CommonResult<Boolean> moveMaterialStock(@Valid @RequestBody MesWmMaterialStockMoveReqVO reqVO) {
+ materialStockService.moveMaterialStock(reqVO);
+ return success(true);
+ }
+
+ @GetMapping("/summary-by-item")
+ @Operation(summary = "鎸夊搧绉嶆眹鎬诲簱瀛樻暟閲�")
+ @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:query')")
+ public CommonResult<List<MesWmStockSummaryRespVO>> getStockSummaryByItem(
+ MesWmMaterialStockListReqVO reqVO) {
+ return success(materialStockService.getStockSummaryByItem(reqVO));
+ }
+
+ @GetMapping("/summary-by-batch")
+ @Operation(summary = "鎸夋壒娆℃眹鎬诲簱瀛樻暟閲�")
+ @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:query')")
+ public CommonResult<List<MesWmStockSummaryRespVO>> getStockSummaryByBatch(
+ MesWmMaterialStockListReqVO reqVO) {
+ return success(materialStockService.getStockSummaryByBatch(reqVO));
+ }
+
+ @GetMapping("/summary-by-warehouse")
+ @Operation(summary = "鎸変粨搴撴眹鎬诲簱瀛樻暟閲�")
+ @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:query')")
+ public CommonResult<List<MesWmStockSummaryRespVO>> getStockSummaryByWarehouse(
+ MesWmMaterialStockListReqVO reqVO) {
+ return success(materialStockService.getStockSummaryByWarehouse(reqVO));
+ }
+
@GetMapping("/export-excel")
@Operation(summary = "瀵煎嚭搴撳瓨鍙拌处 Excel")
@PreAuthorize("@ss.hasPermission('mes:wm-material-stock:export')")
@@ -135,6 +238,9 @@
// 1. 鑾峰緱鍏宠仈鏁版嵁
Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
convertSet(list, MesWmMaterialStockDO::getItemId));
+ Map<Long, MdmItemCategoryRespDTO> itemCategoryMap = mdmItemCategoryApi.getItemCategoryList(
+ convertSet(itemMap.values(), MdmItemRespDTO::getCategoryId)).getCheckedData().stream()
+ .collect(Collectors.toMap(MdmItemCategoryRespDTO::getId, c -> c));
Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
.stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
@@ -144,12 +250,20 @@
convertSet(list, MesWmMaterialStockDO::getLocationId));
Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
convertSet(list, MesWmMaterialStockDO::getAreaId));
- Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap(
- convertSet(list, MesWmMaterialStockDO::getVendorId));
+ List<MesWmMaterialStockBagDO> bagHistory = materialStockBagMapper.selectHistoryByMaterialStockIds(
+ convertSet(list, MesWmMaterialStockDO::getId));
+ Map<Long, Long> bagCountMap = bagHistory.stream().filter(bag -> Integer.valueOf(1).equals(bag.getStatus()))
+ .collect(Collectors.groupingBy(MesWmMaterialStockBagDO::getMaterialStockId, Collectors.counting()));
+ var stockIdsWithBagHistory = convertSet(bagHistory, MesWmMaterialStockBagDO::getMaterialStockId);
+ Map<Long, SrmSupplierRespDTO> vendorMap = srmSupplierApi.getSupplierList(
+ convertSet(list, MesWmMaterialStockDO::getVendorId)).getCheckedData().stream()
+ .collect(Collectors.toMap(SrmSupplierRespDTO::getId, s -> s));
// 2. 鏋勫缓缁撴灉
return BeanUtils.toBean(list, MesWmMaterialStockRespVO.class, vo -> {
MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
+ MapUtils.findAndThen(itemCategoryMap, item.getCategoryId(),
+ category -> vo.setItemTypeName(category.getName()));
MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
});
@@ -161,6 +275,8 @@
area -> vo.setAreaName(area.getName()));
MapUtils.findAndThen(vendorMap, vo.getVendorId(),
vendor -> vo.setVendorName(vendor.getName()));
+ vo.setBagCount(bagCountMap.getOrDefault(vo.getId(), 0L));
+ vo.setBagDetailSupported(stockIdsWithBagHistory.contains(vo.getId()));
// 璁$畻鍙敤閲� = 鍦ㄥ簱鏁伴噺 - 鍐荤粨鏁伴噺 - 鍗犵敤閲�
BigDecimal quantity = vo.getQuantity() != null ? vo.getQuantity() : BigDecimal.ZERO;
BigDecimal frozenQty = vo.getFrozenQuantity() != null ? vo.getFrozenQuantity() : BigDecimal.ZERO;
--
Gitblit v1.9.3