From aaf5c84ee52bd79c214d0cf108d0461317a231c0 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Tue, 16 Jun 2026 16:33:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E4=BB=93=E5=82=A8?= =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E5=8D=95=E6=8D=AE=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/stock/ErpStockInController.java | 109 +++++++++++++++--- .../admin/stock/ErpStockOutController.java | 97 ++++++++++++++-- .../dal/mysql/stock/ErpStockInItemMapper.java | 5 +- .../erp/dal/mysql/stock/ErpStockInMapper.java | 7 -- .../erp/dal/mysql/stock/ErpStockMapper.java | 10 ++ .../mysql/stock/ErpStockOutItemMapper.java | 5 +- .../dal/mysql/stock/ErpStockOutMapper.java | 7 -- .../service/product/ErpProductService.java | 3 + .../product/ErpProductServiceImpl.java | 52 +++++++++ .../erp/service/stock/ErpStockInService.java | 2 + .../service/stock/ErpStockInServiceImpl.java | 8 ++ .../erp/service/stock/ErpStockOutService.java | 2 + .../service/stock/ErpStockOutServiceImpl.java | 8 ++ .../erp/service/stock/ErpStockService.java | 3 + .../service/stock/ErpStockServiceImpl.java | 7 ++ .../mapper/autocode/ErpStockInItemMapper.xml | 18 +++ .../mapper/autocode/ErpStockOutItemMapper.xml | 18 +++ 17 files changed, 322 insertions(+), 39 deletions(-) create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockInItemMapper.xml create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockOutItemMapper.xml diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java index a66f03d27..2120c9b96 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockInController.java @@ -52,11 +52,15 @@ import javax.validation.Valid; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; @@ -169,6 +173,7 @@ public class ErpStockInController { @PreAuthorize("@ss.hasPermission('erp:stock-in:query')") public CommonResult> getStockInPage(@Valid ErpStockInPageReqVO pageReqVO) { fillPageReqDefault(pageReqVO); + applyItemFilter(pageReqVO); return success(buildStockInVOPageResult(stockInService.getStockInPage(pageReqVO))); } @@ -179,11 +184,34 @@ public class ErpStockInController { public void exportStockInExcel(@Valid ErpStockInPageReqVO pageReqVO, HttpServletResponse response) throws IOException { fillPageReqDefault(pageReqVO); + applyItemFilter(pageReqVO); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = buildStockInVOPageResult(stockInService.getStockInPage(pageReqVO)).getList(); ExcelUtils.write(response, "其它入库单.xls", "数据", ErpStockInRespVO.class, list); } + private void applyItemFilter(ErpStockInPageReqVO pageReqVO) { + if (pageReqVO.getProductId() == null && pageReqVO.getWarehouseId() == null) { + return; + } + List ids = stockInService.getStockInIdsByItemFilter(pageReqVO.getProductId(), pageReqVO.getWarehouseId()); + if (StringUtils.isNotBlank(pageReqVO.getIds())) { + List reqIds = Stream.of(pageReqVO.getIds().split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .collect(Collectors.toList()); + ids = ids.stream().filter(reqIds::contains).collect(Collectors.toList()); + } + if (CollUtil.isEmpty(ids)) { + pageReqVO.setIds("-1"); + return; + } + pageReqVO.setIds(CollUtil.join(ids, ",")); + pageReqVO.setProductId(null); + pageReqVO.setWarehouseId(null); + } + private void fillPageReqDefault(ErpStockInPageReqVO pageReqVO) { if (StringUtils.isEmpty(pageReqVO.getInType())) { List list = new ArrayList<>(); @@ -199,20 +227,55 @@ public class ErpStockInController { if (CollUtil.isEmpty(pageResult.getList())) { return PageResult.empty(pageResult.getTotal()); } - List list = convertList(pageResult.getList(), stockIn -> buildStockInRespVO( - stockIn, stockInService.getStockInItemListByInId(stockIn.getId()), Collections.emptyList())); + List stockIns = pageResult.getList(); + Map> itemMap = stockInService.getStockInItemListByInIds( + convertSet(stockIns, ErpStockInDO::getId)).stream() + .collect(Collectors.groupingBy(ErpStockInItemDO::getInId)); + Map userMap = adminUserApi.getUserMap(convertListByFlatMap(stockIns, + item -> Stream.of(NumberUtils.parseLong(item.getCreator()), item.getStockUserId(), item.getAuditUserId()))); + Map supplierMap = supplierService.getSupplierMap( + convertSet(stockIns, ErpStockInDO::getSupplierId)); + List allItems = convertListByFlatMap(itemMap.values(), Collection::stream); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(allItems, ErpStockInItemDO::getWarehouseId)); + Map areaMap = warehouseAreaService.getWarehouseAreaMap( + convertSet(allItems, ErpStockInItemDO::getAreaId)); + Map productMap = productService.getProductSimpleVOMap( + convertSet(allItems, ErpStockInItemDO::getProductId)); + Map moldMap = moldBrandService.getMoldVOMap( + convertSet(allItems, ErpStockInItemDO::getMoldSetId)); + Map> moldListMap = moldService.getMoldListMapByBrandIds( + convertSet(allItems, ErpStockInItemDO::getMoldSetId)); + Map stockMap = buildStockMap(allItems); + List list = convertList(stockIns, stockIn -> buildStockInRespVO( + stockIn, itemMap.getOrDefault(stockIn.getId(), Collections.emptyList()), Collections.emptyList(), + userMap, supplierMap, stockMap, warehouseMap, areaMap, productMap, moldMap, moldListMap)); return new PageResult<>(list, pageResult.getTotal()); } private ErpStockInRespVO buildStockInRespVO(ErpStockInDO stockIn, List stockInItemList, List approveRecords) { + return buildStockInRespVO(stockIn, stockInItemList, approveRecords, + null, null, null, null, null, null, null, null); + } + + private ErpStockInRespVO buildStockInRespVO(ErpStockInDO stockIn, List stockInItemList, + List approveRecords, + Map pageUserMap, + Map pageSupplierMap, + Map pageStockMap, + Map pageWarehouseMap, + Map pageAreaMap, + Map pageProductMap, + Map pageMoldMap, + Map> pageMoldListMap) { ErpStockInRespVO stockInVO = BeanUtils.toBean(stockIn, ErpStockInRespVO.class); stockInVO.setStatusName(getStockInStatusName(stockIn.getStatus())); - Map warehouseMap = warehouseService.getWarehouseMap( + Map warehouseMap = pageWarehouseMap != null ? pageWarehouseMap : warehouseService.getWarehouseMap( convertSet(stockInItemList, ErpStockInItemDO::getWarehouseId)); - Map areaMap = warehouseAreaService.getWarehouseAreaMap( + Map areaMap = pageAreaMap != null ? pageAreaMap : warehouseAreaService.getWarehouseAreaMap( convertSet(stockInItemList, ErpStockInItemDO::getAreaId)); - Map userMap = adminUserApi.getUserMap(convertListByFlatMap( + Map userMap = pageUserMap != null ? pageUserMap : adminUserApi.getUserMap(convertListByFlatMap( Collections.singletonList(stockIn), item -> Stream.of(NumberUtils.parseLong(item.getCreator()), item.getStockUserId(), item.getAuditUserId()))); MapUtils.findAndThen(userMap, NumberUtils.parseLong(stockIn.getCreator()), user -> stockInVO.setCreatorName(user.getNickname())); @@ -220,13 +283,14 @@ public class ErpStockInController { MapUtils.findAndThen(userMap, stockIn.getAuditUserId(), user -> stockInVO.setAuditUserName(user.getNickname())); if (Objects.equals(stockIn.getInType(), "模具入库")) { - Map moldMap = moldBrandService.getMoldVOMap( - convertSet(stockInItemList, ErpStockInItemDO::getMoldSetId)); - Map> moldListMap = moldService.getMoldListMapByBrandIds( + Map moldMap = pageMoldMap != null ? pageMoldMap : moldBrandService.getMoldVOMap( convertSet(stockInItemList, ErpStockInItemDO::getMoldSetId)); + Map> moldListMap = pageMoldListMap != null ? pageMoldListMap + : moldService.getMoldListMapByBrandIds(convertSet(stockInItemList, ErpStockInItemDO::getMoldSetId)); stockInVO.setItems(convertList(stockInItemList, source -> { ErpStockInRespVO.Item item = BeanUtils.toBean(source, ErpStockInRespVO.Item.class); - ErpStockDO stock = stockService.getStock(source.getMoldSetId(), source.getWarehouseId(), source.getAreaId()); + ErpStockDO stock = pageStockMap != null ? pageStockMap.get(buildStockKey(source.getMoldSetId(), source.getWarehouseId(), source.getAreaId())) + : stockService.getStock(source.getMoldSetId(), source.getWarehouseId(), source.getAreaId()); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); item.setMoldList(moldListMap.getOrDefault(source.getMoldSetId(), new ArrayList<>())); fillWarehouseInfo(item, source, warehouseMap, areaMap); @@ -240,10 +304,11 @@ public class ErpStockInController { stockInVO.setMoldSetNames(CollUtil.join(stockInVO.getItems(), ",", ErpStockInRespVO.Item::getMoldSetName)); stockInVO.setProductNames(stockInVO.getMoldSetNames()); } else { - Map productMap = productService.getProductVOMap( + Map productMap = pageProductMap != null ? pageProductMap : productService.getProductSimpleVOMap( convertSet(stockInItemList, ErpStockInItemDO::getProductId)); stockInVO.setItems(BeanUtils.toBean(stockInItemList, ErpStockInRespVO.Item.class, item -> { - ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId(), item.getAreaId()); + ErpStockDO stock = pageStockMap != null ? pageStockMap.get(buildStockKey(item.getProductId(), item.getWarehouseId(), item.getAreaId())) + : stockService.getStock(item.getProductId(), item.getWarehouseId(), item.getAreaId()); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); if (StringUtils.isBlank(item.getWarehouseName())) { MapUtils.findAndThen(warehouseMap, item.getWarehouseId(), warehouse -> item.setWarehouseName(warehouse.getName())); @@ -269,13 +334,31 @@ public class ErpStockInController { } if (stockIn.getSupplierId() != null) { - Map supplierMap = supplierService.getSupplierMap(Collections.singleton(stockIn.getSupplierId())); + Map supplierMap = pageSupplierMap != null ? pageSupplierMap + : supplierService.getSupplierMap(Collections.singleton(stockIn.getSupplierId())); MapUtils.findAndThen(supplierMap, stockIn.getSupplierId(), supplier -> stockInVO.setSupplierName(supplier.getName())); } stockInVO.setApproveRecords(buildApproveRecordRespList(approveRecords)); return stockInVO; } + private Map buildStockMap(List items) { + if (CollUtil.isEmpty(items)) { + return Collections.emptyMap(); + } + boolean containsNullArea = items.stream().anyMatch(item -> item.getAreaId() == null); + return stockService.getStockList( + convertSet(convertListByFlatMap(items, item -> Stream.of(item.getProductId(), item.getMoldSetId())), Function.identity()), + convertSet(items, ErpStockInItemDO::getWarehouseId), + containsNullArea ? null : convertSet(items, ErpStockInItemDO::getAreaId)).stream() + .collect(Collectors.toMap(stock -> buildStockKey(stock.getProductId(), stock.getWarehouseId(), stock.getAreaId()), + Function.identity(), (left, right) -> left, HashMap::new)); + } + + private String buildStockKey(Long productId, Long warehouseId, Long areaId) { + return String.valueOf(productId) + "_" + String.valueOf(warehouseId) + "_" + String.valueOf(areaId); + } + private List buildApproveRecordRespList(List records) { if (CollUtil.isEmpty(records)) { return new ArrayList<>(); @@ -342,4 +425,4 @@ public class ErpStockInController { private String getStockInStatusName(Integer status) { return ErpStockInStatusEnum.IN_STOCK.getStatus().equals(status) ? "已入库" : "待入库"; } -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java index f7cfae1d7..761579b93 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockOutController.java @@ -55,11 +55,15 @@ import javax.validation.Valid; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; @@ -178,6 +182,7 @@ public class ErpStockOutController { @PreAuthorize("@ss.hasPermission('erp:stock-out:query')") public CommonResult> getStockOutPage(@Valid ErpStockOutPageReqVO pageReqVO) { fillPageReqDefault(pageReqVO); + applyItemFilter(pageReqVO); return success(buildStockOutVOPageResult(stockOutService.getStockOutPage(pageReqVO))); } @@ -188,11 +193,34 @@ public class ErpStockOutController { public void exportStockOutExcel(@Valid ErpStockOutPageReqVO pageReqVO, HttpServletResponse response) throws IOException { fillPageReqDefault(pageReqVO); + applyItemFilter(pageReqVO); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = buildStockOutVOPageResult(stockOutService.getStockOutPage(pageReqVO)).getList(); ExcelUtils.write(response, "其它出库单.xls", "数据", ErpStockOutRespVO.class, list); } + private void applyItemFilter(ErpStockOutPageReqVO pageReqVO) { + if (pageReqVO.getProductId() == null && pageReqVO.getWarehouseId() == null) { + return; + } + List ids = stockOutService.getStockOutIdsByItemFilter(pageReqVO.getProductId(), pageReqVO.getWarehouseId()); + if (StringUtils.isNotBlank(pageReqVO.getIds())) { + List reqIds = Stream.of(pageReqVO.getIds().split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .collect(Collectors.toList()); + ids = ids.stream().filter(reqIds::contains).collect(Collectors.toList()); + } + if (CollUtil.isEmpty(ids)) { + pageReqVO.setIds("-1"); + return; + } + pageReqVO.setIds(CollUtil.join(ids, ",")); + pageReqVO.setProductId(null); + pageReqVO.setWarehouseId(null); + } + private void fillPageReqDefault(ErpStockOutPageReqVO pageReqVO) { if (StringUtils.isEmpty(pageReqVO.getOutType())) { List list = new ArrayList<>(); @@ -208,17 +236,46 @@ public class ErpStockOutController { if (CollUtil.isEmpty(pageResult.getList())) { return PageResult.empty(pageResult.getTotal()); } - List list = convertList(pageResult.getList(), stockOut -> buildStockOutRespVO( - stockOut, stockOutService.getStockOutItemListByOutId(stockOut.getId()), Collections.emptyList())); + List stockOuts = pageResult.getList(); + Map> itemMap = stockOutService.getStockOutItemListByOutIds( + convertSet(stockOuts, ErpStockOutDO::getId)).stream() + .collect(Collectors.groupingBy(ErpStockOutItemDO::getOutId)); + Map userMap = adminUserApi.getUserMap(convertListByFlatMap(stockOuts, + item -> Stream.of(NumberUtils.parseLong(item.getCreator()), item.getResponserId(), item.getAuditUserId()))); + Map customerMap = customerService.getCustomerMap( + convertSet(stockOuts, ErpStockOutDO::getCustomerId)); + List allItems = convertListByFlatMap(itemMap.values(), Collection::stream); + Map productMap = productService.getProductSimpleVOMap( + convertSet(allItems, ErpStockOutItemDO::getProductId)); + Map moldMap = moldBrandService.getMoldVOMap( + convertSet(allItems, ErpStockOutItemDO::getMoldSetId)); + Map> moldListMap = moldService.getMoldListMapByBrandIds( + convertSet(allItems, ErpStockOutItemDO::getMoldSetId)); + Map stockMap = buildStockMap(allItems); + List list = convertList(stockOuts, stockOut -> buildStockOutRespVO( + stockOut, itemMap.getOrDefault(stockOut.getId(), Collections.emptyList()), Collections.emptyList(), + userMap, customerMap, stockMap, productMap, moldMap, moldListMap)); return new PageResult<>(list, pageResult.getTotal()); } private ErpStockOutRespVO buildStockOutRespVO(ErpStockOutDO stockOut, List stockOutItemList, List approveRecords) { + return buildStockOutRespVO(stockOut, stockOutItemList, approveRecords, + null, null, null, null, null, null); + } + + private ErpStockOutRespVO buildStockOutRespVO(ErpStockOutDO stockOut, List stockOutItemList, + List approveRecords, + Map pageUserMap, + Map pageCustomerMap, + Map pageStockMap, + Map pageProductMap, + Map pageMoldMap, + Map> pageMoldListMap) { ErpStockOutRespVO stockOutVO = BeanUtils.toBean(stockOut, ErpStockOutRespVO.class); stockOutVO.setStatusName(getStockOutStatusName(stockOut.getStatus())); stockOutVO.setOutUsageTypeName(ErpStockOutUsageTypeEnum.getNameByType(stockOut.getOutUsageType())); - Map userMap = adminUserApi.getUserMap(convertListByFlatMap( + Map userMap = pageUserMap != null ? pageUserMap : adminUserApi.getUserMap(convertListByFlatMap( Collections.singletonList(stockOut), item -> Stream.of(NumberUtils.parseLong(item.getCreator()), item.getResponserId(), item.getAuditUserId()))); MapUtils.findAndThen(userMap, NumberUtils.parseLong(stockOut.getCreator()), user -> stockOutVO.setCreatorName(user.getNickname())); @@ -226,13 +283,14 @@ public class ErpStockOutController { MapUtils.findAndThen(userMap, stockOut.getAuditUserId(), user -> stockOutVO.setAuditUserName(user.getNickname())); if (Objects.equals(stockOut.getOutType(), "模具出库")) { - Map moldMap = moldBrandService.getMoldVOMap( - convertSet(stockOutItemList, ErpStockOutItemDO::getMoldSetId)); - Map> moldListMap = moldService.getMoldListMapByBrandIds( + Map moldMap = pageMoldMap != null ? pageMoldMap : moldBrandService.getMoldVOMap( convertSet(stockOutItemList, ErpStockOutItemDO::getMoldSetId)); + Map> moldListMap = pageMoldListMap != null ? pageMoldListMap + : moldService.getMoldListMapByBrandIds(convertSet(stockOutItemList, ErpStockOutItemDO::getMoldSetId)); stockOutVO.setItems(convertList(stockOutItemList, source -> { ErpStockOutRespVO.Item item = BeanUtils.toBean(source, ErpStockOutRespVO.Item.class); - ErpStockDO stock = stockService.getStock(source.getMoldSetId(), source.getWarehouseId(), source.getAreaId()); + ErpStockDO stock = pageStockMap != null ? pageStockMap.get(buildStockKey(source.getMoldSetId(), source.getWarehouseId(), source.getAreaId())) + : stockService.getStock(source.getMoldSetId(), source.getWarehouseId(), source.getAreaId()); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); item.setMoldList(moldListMap.getOrDefault(source.getMoldSetId(), new ArrayList<>())); MapUtils.findAndThen(moldMap, source.getMoldSetId(), mold -> { @@ -245,10 +303,11 @@ public class ErpStockOutController { stockOutVO.setMoldSetNames(CollUtil.join(stockOutVO.getItems(), ",", ErpStockOutRespVO.Item::getMoldSetName)); stockOutVO.setProductNames(stockOutVO.getMoldSetNames()); } else { - Map productMap = productService.getProductVOMap( + Map productMap = pageProductMap != null ? pageProductMap : productService.getProductSimpleVOMap( convertSet(stockOutItemList, ErpStockOutItemDO::getProductId)); stockOutVO.setItems(BeanUtils.toBean(stockOutItemList, ErpStockOutRespVO.Item.class, item -> { - ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId(), item.getAreaId()); + ErpStockDO stock = pageStockMap != null ? pageStockMap.get(buildStockKey(item.getProductId(), item.getWarehouseId(), item.getAreaId())) + : stockService.getStock(item.getProductId(), item.getWarehouseId(), item.getAreaId()); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); MapUtils.findAndThen(productMap, item.getProductId(), product -> { item.setProductName(product.getName()); @@ -267,13 +326,31 @@ public class ErpStockOutController { stockOutVO.setProductNames(CollUtil.join(stockOutVO.getItems(), ",", ErpStockOutRespVO.Item::getProductName)); } if (stockOut.getCustomerId() != null) { - Map customerMap = customerService.getCustomerMap(Collections.singleton(stockOut.getCustomerId())); + Map customerMap = pageCustomerMap != null ? pageCustomerMap + : customerService.getCustomerMap(Collections.singleton(stockOut.getCustomerId())); MapUtils.findAndThen(customerMap, stockOut.getCustomerId(), customer -> stockOutVO.setCustomerName(customer.getName())); } stockOutVO.setApproveRecords(buildApproveRecordRespList(approveRecords)); return stockOutVO; } + private Map buildStockMap(List items) { + if (CollUtil.isEmpty(items)) { + return Collections.emptyMap(); + } + boolean containsNullArea = items.stream().anyMatch(item -> item.getAreaId() == null); + return stockService.getStockList( + convertSet(convertListByFlatMap(items, item -> Stream.of(item.getProductId(), item.getMoldSetId())), Function.identity()), + convertSet(items, ErpStockOutItemDO::getWarehouseId), + containsNullArea ? null : convertSet(items, ErpStockOutItemDO::getAreaId)).stream() + .collect(Collectors.toMap(stock -> buildStockKey(stock.getProductId(), stock.getWarehouseId(), stock.getAreaId()), + Function.identity(), (left, right) -> left, HashMap::new)); + } + + private String buildStockKey(Long productId, Long warehouseId, Long areaId) { + return String.valueOf(productId) + "_" + String.valueOf(warehouseId) + "_" + String.valueOf(areaId); + } + private List buildApproveRecordRespList(List records) { if (CollUtil.isEmpty(records)) { return new ArrayList<>(); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInItemMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInItemMapper.java index 2731aa7bb..074c220ea 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInItemMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInItemMapper.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.erp.dal.mysql.stock; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInItemDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.Collection; import java.util.List; @@ -27,4 +28,6 @@ public interface ErpStockInItemMapper extends BaseMapperX { return delete(ErpStockInItemDO::getInId, inId); } -} \ No newline at end of file + List selectInIds(@Param("productId") Long productId, @Param("warehouseId") Long warehouseId); + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInMapper.java index 5bed57af4..1834603e3 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockInMapper.java @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.in.ErpStockInPageReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInItemDO; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; @@ -29,12 +28,6 @@ public interface ErpStockInMapper extends BaseMapperX { .eqIfPresent(ErpStockInDO::getCreator, reqVO.getCreator()) .eqIfPresent(ErpStockInDO::getAuditUserId, reqVO.getAuditUserId()) .orderByDesc(ErpStockInDO::getId); - if (reqVO.getWarehouseId() != null || reqVO.getProductId() != null) { - query.leftJoin(ErpStockInItemDO.class, ErpStockInItemDO::getInId, ErpStockInDO::getId) - .eq(reqVO.getWarehouseId() != null, ErpStockInItemDO::getWarehouseId, reqVO.getWarehouseId()) - .eq(reqVO.getProductId() != null, ErpStockInItemDO::getProductId, reqVO.getProductId()) - .groupBy(ErpStockInDO::getId); - } if (StringUtils.isNotBlank(reqVO.getIds())) { List idList = Arrays.stream(reqVO.getIds().split(",")) .map(String::trim) diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMapper.java index ad62c6b85..f16283cf4 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockMapper.java @@ -15,6 +15,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.util.Collection; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -87,6 +88,15 @@ public interface ErpStockMapper extends BaseMapperX { .inIfPresent(ErpStockDO::getProductId, productIds)); } + default List selectListByProductIdsAndWarehouseIdsAndAreaIds(Collection productIds, + Collection warehouseIds, + Collection areaIds) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(ErpStockDO::getProductId, productIds) + .inIfPresent(ErpStockDO::getWarehouseId, warehouseIds) + .inIfPresent(ErpStockDO::getAreaId, areaIds)); + } + default int updateCountIncrement(Long id, BigDecimal count, boolean negativeEnable) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() .eq(ErpStockDO::getId, id); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutItemMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutItemMapper.java index 3b27cd3dc..f14a848d4 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutItemMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutItemMapper.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.erp.dal.mysql.stock; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutItemDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.Collection; import java.util.List; @@ -27,4 +28,6 @@ public interface ErpStockOutItemMapper extends BaseMapperX { return delete(ErpStockOutItemDO::getOutId, outId); } -} \ No newline at end of file + List selectOutIds(@Param("productId") Long productId, @Param("warehouseId") Long warehouseId); + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutMapper.java index 1b4ecadfa..c653b773a 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockOutMapper.java @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.out.ErpStockOutPageReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutDO; -import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutItemDO; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -31,12 +30,6 @@ public interface ErpStockOutMapper extends BaseMapperX { .eqIfPresent(ErpStockOutDO::getCreator, reqVO.getCreator()) .eqIfPresent(ErpStockOutDO::getAuditUserId, reqVO.getAuditUserId()) .orderByDesc(ErpStockOutDO::getId); - if (reqVO.getWarehouseId() != null || reqVO.getProductId() != null) { - query.leftJoin(ErpStockOutItemDO.class, ErpStockOutItemDO::getOutId, ErpStockOutDO::getId) - .eq(reqVO.getWarehouseId() != null, ErpStockOutItemDO::getWarehouseId, reqVO.getWarehouseId()) - .eq(reqVO.getProductId() != null, ErpStockOutItemDO::getProductId, reqVO.getProductId()) - .groupBy(ErpStockOutDO::getId); - } if (StringUtils.isNotBlank(reqVO.getIds())) { List idList = Arrays.stream(reqVO.getIds().split(",")) .map(String::trim) diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java index 365d8f270..3c28c7723 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProduc import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductListReqVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; +import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSupplierRespVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSaveReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; @@ -95,6 +96,8 @@ public interface ErpProductService { return convertMap(getProductVOList(ids), ErpProductRespVO::getId); } + Map getProductSimpleVOMap(Collection ids); + /** * 获得产品 VO 分页 * diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java index 3b9f70a72..f8886981b 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java @@ -554,6 +554,58 @@ public class ErpProductServiceImpl implements ErpProductService { return buildProductVOList(list); } + @Override + public Map getProductSimpleVOMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = productMapper.selectListByIdsWithDeleted(ids); + if (CollUtil.isEmpty(list)) { + return Collections.emptyMap(); + } + List supplierRels = productSupplierRelMapper.selectListByProductIds(convertSet(list, ErpProductDO::getId)); + Map defaultSupplierMap = supplierRels.stream() + .filter(item -> Integer.valueOf(1).equals(item.getDefaultStatus())) + .collect(Collectors.toMap(ProductSupplierRelDO::getProductId, item -> item, (left, right) -> left)); + Map categoryMap = productCategoryService.getProductCategoryMap( + convertSet(list, ErpProductDO::getCategoryId)); + Map subCategoryMap = productCategoryService.getProductCategoryMap( + convertSet(list, ErpProductDO::getSubCategoryId)); + Map unitMap = productUnitService.getProductUnitMap( + convertSet(list, ErpProductDO::getUnitId)); + Map purchaseUnitMap = productUnitService.getProductUnitMap( + convertSet(list, ErpProductDO::getPurchaseUnitId)); + return convertMap(BeanUtils.toBean(list, ErpProductRespVO.class, product -> { + MapUtils.findAndThen(categoryMap, product.getCategoryId(), category -> { + product.setCategoryName(category.getName()); + if (product.getCategoryType() == null) { + product.setCategoryType(category.getType()); + } + }); + MapUtils.findAndThen(subCategoryMap, product.getSubCategoryId(), subCategory -> { + product.setSubCategoryName(subCategory.getName()); + product.setCategoryType(subCategory.getType()); + }); + MapUtils.findAndThen(unitMap, product.getUnitId(), unit -> product.setUnitName(unit.getName())); + MapUtils.findAndThen(purchaseUnitMap, product.getPurchaseUnitId(), unit -> product.setPurchaseUnitName(unit.getName())); + ProductSupplierRelDO defaultSupplier = defaultSupplierMap.get(product.getId()); + if (defaultSupplier != null) { + product.setDefaultSupplierId(defaultSupplier.getSupplierId()); + ProductSupplierRespVO supplier = new ProductSupplierRespVO(); + supplier.setId(defaultSupplier.getId()); + supplier.setSupplierId(defaultSupplier.getSupplierId()); + supplier.setSupplierName(defaultSupplier.getSupplierName()); + supplier.setDefaultStatus(defaultSupplier.getDefaultStatus()); + product.setSuppliers(Collections.singletonList(supplier)); + } else { + product.setSuppliers(Collections.emptyList()); + } + if (Boolean.TRUE.equals(product.getDeleted())) { + product.setName(product.getName() + "(已被删除)"); + } + }), ErpProductRespVO::getId); + } + @Override public PageResult getProductVOPage(ErpProductPageReqVO pageReqVO) { PageResult pageResult = productMapper.selectPage(pageReqVO); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInService.java index a045fd403..b040af898 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInService.java @@ -31,6 +31,8 @@ public interface ErpStockInService { PageResult getStockInPage(ErpStockInPageReqVO pageReqVO); + List getStockInIdsByItemFilter(Long productId, Long warehouseId); + List getStockInItemListByInId(Long inId); List getStockInItemListByInIds(Collection inIds); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java index 0c783a2be..f17cec123 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java @@ -319,6 +319,14 @@ public class ErpStockInServiceImpl implements ErpStockInService { return stockInMapper.selectPage(pageReqVO); } + @Override + public List getStockInIdsByItemFilter(Long productId, Long warehouseId) { + if (productId == null && warehouseId == null) { + return Collections.emptyList(); + } + return stockInItemMapper.selectInIds(productId, warehouseId); + } + @Override public List getStockInItemListByInId(Long inId) { return stockInItemMapper.selectListByInId(inId); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutService.java index bb9d593d0..da07fd9ad 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutService.java @@ -70,6 +70,8 @@ public interface ErpStockOutService { */ PageResult getStockOutPage(ErpStockOutPageReqVO pageReqVO); + List getStockOutIdsByItemFilter(Long productId, Long warehouseId); + // ==================== 出库项 ==================== /** diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutServiceImpl.java index e836824d2..ad33c1ddc 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockOutServiceImpl.java @@ -320,6 +320,14 @@ public class ErpStockOutServiceImpl implements ErpStockOutService { return stockOutMapper.selectPage(pageReqVO); } + @Override + public List getStockOutIdsByItemFilter(Long productId, Long warehouseId) { + if (productId == null && warehouseId == null) { + return Collections.emptyList(); + } + return stockOutItemMapper.selectOutIds(productId, warehouseId); + } + @Override public List getStockOutItemListByOutId(Long outId) { return stockOutItemMapper.selectListByOutId(outId); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockService.java index 7cf205975..90c91f2b6 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockService.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.stock.ErpStockPageR import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockDO; import java.math.BigDecimal; +import java.util.Collection; import java.util.List; /** @@ -41,6 +42,8 @@ public interface ErpStockService { ErpStockDO getStock(Long productId, Long warehouseId, Long areaId); + List getStockList(Collection productIds, Collection warehouseIds, Collection areaIds); + /** * 获得产品库存数量 * 如果不存在库存记录,则返回 0 diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockServiceImpl.java index 25d6a680a..370fca223 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockServiceImpl.java @@ -13,6 +13,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; +import java.util.Collection; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -70,6 +71,12 @@ public class ErpStockServiceImpl implements ErpStockService { } return stock; } + + @Override + public List getStockList(Collection productIds, Collection warehouseIds, Collection areaIds) { + return stockMapper.selectListByProductIdsAndWarehouseIdsAndAreaIds(productIds, warehouseIds, areaIds); + } + @Override public List getStockByProductId(Long productId) { return stockMapper.selectByProductId(productId); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockInItemMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockInItemMapper.xml new file mode 100644 index 000000000..b143dcf1b --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockInItemMapper.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockOutItemMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockOutItemMapper.xml new file mode 100644 index 000000000..b324081ad --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/ErpStockOutItemMapper.xml @@ -0,0 +1,18 @@ + + + + + + +