From 3aaf69cf8e5a3ba79ed76a4ef971933ffe960b01 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Wed, 24 Jun 2026 17:11:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E4=BB=93=E5=82=A8?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E7=9B=B8=E5=85=B3=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/product/ErpProductController.java | 5 +- .../admin/stock/ErpStockController.java | 153 ++++++++++++++++-- .../admin/stock/ErpStockInController.java | 31 +--- .../stock/vo/in/ErpStockInSaveReqVO.java | 6 + .../admin/stock/vo/stock/ErpStockRespVO.java | 32 ++++ .../dataobject/stock/ErpStockInItemDO.java | 8 + .../dal/mysql/product/ErpProductMapper.java | 6 +- .../erp/dal/mysql/stock/ErpStockInMapper.java | 28 +++- .../erp/dal/mysql/stock/ErpStockMapper.java | 30 +++- .../service/product/ErpProductService.java | 2 +- .../product/ErpProductServiceImpl.java | 15 +- .../service/stock/ErpStockInServiceImpl.java | 25 +++ 12 files changed, 284 insertions(+), 57 deletions(-) diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java index 7b0931318..3531d5b7b 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java @@ -118,8 +118,9 @@ public class ErpProductController { } @GetMapping("/simple-list-all") @Operation(summary = "获得所有精简列表", description = "只包含被开启的产品,主要用于前端的下拉选项") - public CommonResult> getAllSimpleList(@RequestParam(name = "categoryId", required = false) Integer categoryId) { - List list = productService.getProductVOListByStatus(CommonStatusEnum.ENABLE.getStatus(),categoryId); + public CommonResult> getAllSimpleList(@RequestParam(name = "categoryId", required = false) Integer categoryId, + @RequestParam(name = "categoryType", required = false) Integer categoryType) { + List list = productService.getProductVOListByStatus(CommonStatusEnum.ENABLE.getStatus(), categoryId, categoryType); return success(convertList(list, product -> new ErpProductRespVO().setId(product.getId()) .setName(product.getName()).setBarCode(product.getBarCode()) .setCategoryId(product.getCategoryId()).setCategoryName(product.getCategoryName()) diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java index 0139d80a9..a7b17f868 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockController.java @@ -38,11 +38,13 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.Collections; import java.util.HashMap; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; @@ -95,8 +97,10 @@ public class ErpStockController { @Operation(summary = "获得产品库存分页") @PreAuthorize("@ss.hasPermission('erp:stock:query')") public CommonResult> getStockPage(@Valid ErpStockPageReqVO pageReqVO) { - PageResult pageResult = stockService.getStockPage(pageReqVO); - return success(buildStockVOPageResult(pageResult)); + ErpStockPageReqVO queryReqVO = BeanUtils.toBean(pageReqVO, ErpStockPageReqVO.class); + queryReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult groupedResult = buildStockVOPageResult(stockService.getStockPage(queryReqVO)); + return success(new PageResult<>(paginateStockList(groupedResult.getList(), pageReqVO), groupedResult.getTotal())); } @GetMapping("/export-excel") @@ -121,7 +125,7 @@ public class ErpStockController { Map areaMap = warehouseAreaService.getWarehouseAreaMap( convertSet(pageResult.getList(), ErpStockDO::getAreaId)); Map palletCountMap = buildPalletCountMap(pageResult.getList()); - return BeanUtils.toBean(pageResult, ErpStockRespVO.class, stock -> { + PageResult respPageResult = BeanUtils.toBean(pageResult, ErpStockRespVO.class, stock -> { MapUtils.findAndThen(productMap, stock.getProductId(), product -> { stock.setProductName(product.getName()).setBarCode(product.getBarCode()) .setCategoryName(product.getCategoryName()).setUnitName(product.getUnitName()) @@ -138,6 +142,8 @@ public class ErpStockController { } fillRecentRecordTime(stock); }); + List mergedList = mergeStockByProductAndWarehouse(respPageResult.getList()); + return new PageResult<>(mergedList, (long) mergedList.size()); } private ErpStockRespVO buildStockRespVO(ErpStockDO stock) { @@ -177,6 +183,79 @@ public class ErpStockController { return respVO; } + private List mergeStockByProductAndWarehouse(List stockList) { + if (CollUtil.isEmpty(stockList)) { + return Collections.emptyList(); + } + Map mergedMap = new LinkedHashMap<>(); + stockList.forEach(stock -> { + String key = buildStockGroupKey(stock.getProductId(), stock.getWarehouseId()); + ErpStockRespVO merged = mergedMap.computeIfAbsent(key, item -> { + ErpStockRespVO target = BeanUtils.toBean(stock, ErpStockRespVO.class); + target.setId(null); + target.setAreaId(null); + target.setAreaName(null); + target.setCount(BigDecimal.ZERO); + target.setPalletCount(0L); + target.setAreaStocks(new ArrayList<>()); + return target; + }); + merged.setCount(defaultZero(merged.getCount()).add(defaultZero(stock.getCount()))); + merged.setPalletCount((merged.getPalletCount() == null ? 0L : merged.getPalletCount()) + + (stock.getPalletCount() == null ? 0L : stock.getPalletCount())); + merged.getAreaStocks().add(buildAreaStock(stock)); + if (merged.getRecentInTime() == null || stock.getRecentInTime() != null + && stock.getRecentInTime().isAfter(merged.getRecentInTime())) { + merged.setRecentInTime(stock.getRecentInTime()); + } + if (merged.getRecentOutTime() == null || stock.getRecentOutTime() != null + && stock.getRecentOutTime().isAfter(merged.getRecentOutTime())) { + merged.setRecentOutTime(stock.getRecentOutTime()); + } + }); + mergedMap.values().forEach(stock -> { + stock.setTotalBaseCount(stock.getCount()); + stock.setTotalPackageCount(calculatePackageCount(stock, stock.getCount())); + stock.setPackagingRule(buildPackagingRule(stock)); + stock.setStockDisplay(buildStockDisplay(stock)); + }); + return new ArrayList<>(mergedMap.values()); + } + + private List paginateStockList(List list, PageParam pageReqVO) { + if (CollUtil.isEmpty(list) || Objects.equals(pageReqVO.getPageSize(), PageParam.PAGE_SIZE_NONE)) { + return list; + } + int fromIndex = (pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(); + if (fromIndex >= list.size()) { + return Collections.emptyList(); + } + int toIndex = Math.min(fromIndex + pageReqVO.getPageSize(), list.size()); + return list.subList(fromIndex, toIndex); + } + + private ErpStockRespVO.AreaStock buildAreaStock(ErpStockRespVO stock) { + ErpStockRespVO.AreaStock areaStock = new ErpStockRespVO.AreaStock(); + areaStock.setAreaId(stock.getAreaId()); + areaStock.setAreaName(stock.getAreaName()); + areaStock.setCount(defaultZero(stock.getCount())); + areaStock.setPackageCount(calculatePackageCount(stock, stock.getCount())); + areaStock.setBaseCount(calculateBaseCount(stock, stock.getCount())); + areaStock.setStockDisplay(buildAreaStockDisplay(stock, areaStock)); + return areaStock; + } + + private String buildAreaStockDisplay(ErpStockRespVO stock, ErpStockRespVO.AreaStock areaStock) { + String prefix = areaStock.getAreaName() != null ? areaStock.getAreaName() + ":" : ""; + String countDisplay = "(" + formatNumber(areaStock.getCount()) + nullToEmpty(stock.getUnitName()) + ")"; + if (isProductType(stock.getCategoryType())) { + return prefix + formatNumber(areaStock.getPackageCount()) + "包" + + formatNumber(areaStock.getBaseCount()) + stock.getUnitName() + countDisplay; + } + return prefix + formatNumber(areaStock.getPackageCount()) + nullToEmpty(stock.getPurchaseUnitName()) + + formatNumber(areaStock.getBaseCount()) + nullToEmpty(stock.getUnitName()) + countDisplay; + } + private void fillRecentRecordTime(ErpStockRespVO stock) { stock.setRecentInTime(stockRecordService.getLatestRecordTime( stock.getProductId(), stock.getWarehouseId(), stock.getAreaId(), true)); @@ -188,24 +267,32 @@ public class ErpStockController { if (stock.getUnitId() == null) { stock.setUnitId(product.getUnitId()); } + stock.setUnitName(product.getUnitName()); if (stock.getPurchaseUnitId() == null) { stock.setPurchaseUnitId(product.getPurchaseUnitId()); } - if (stock.getPurchaseUnitName() == null) { - stock.setPurchaseUnitName(product.getPurchaseUnitName()); - } - if (stock.getPurchaseUnitConvertQuantity() == null) { - stock.setPurchaseUnitConvertQuantity(product.getPurchaseUnitConvertQuantity()); - } - if (stock.getDefaultPackagingSchemeId() == null) { - stock.setDefaultPackagingSchemeId(product.getDefaultPackagingSchemeId()); - } + stock.setPurchaseUnitName(product.getPurchaseUnitName()); + stock.setPurchaseUnitConvertQuantity(product.getPurchaseUnitConvertQuantity()); + stock.setDefaultPackagingSchemeId(product.getDefaultPackagingSchemeId()); if (stock.getDefaultPackagingScheme() == null) { stock.setDefaultPackagingScheme(findDefaultPackagingScheme(product)); } } private void fillPackagingSnapshot(ErpStockRespVO stock, ErpProductRespVO product) { + if (isProductType(stock.getCategoryType())) { + ProductPackagingSchemeRespVO defaultScheme = findDefaultPackagingScheme(product); + if (defaultScheme == null) { + return; + } + stock.setDefaultPackagingSchemeId(defaultScheme.getPackagingSchemeId()); + stock.setDefaultPackagingScheme(defaultScheme); + stock.setDefaultPackagingSchemeName(defaultScheme.getPackagingSchemeName()); + stock.setPackageQuantity(defaultScheme.getPackageQuantity()); + stock.setPalletPackageQuantity(defaultScheme.getPalletPackageQuantity()); + stock.setPalletTotalQuantity(defaultScheme.getPalletTotalQuantity()); + return; + } if (stock.getDefaultPackagingSchemeName() != null && stock.getPackageQuantity() != null && stock.getPalletPackageQuantity() != null @@ -273,9 +360,10 @@ public class ErpStockController { if (stock.getPackageQuantity() == null || stock.getPackageQuantity().compareTo(BigDecimal.ZERO) <= 0) { return formatNumber(stock.getCount()) + stock.getUnitName(); } - BigDecimal packageCount = stock.getCount().divide(stock.getPackageQuantity(), 0, RoundingMode.CEILING); + BigDecimal packageCount = calculatePackageCount(stock, stock.getCount()); + BigDecimal baseCount = calculateBaseCount(stock, stock.getCount()); return formatNumber(BigDecimal.valueOf(stock.getPalletCount() != null ? stock.getPalletCount() : 0L)) + "\u6258" - + formatNumber(packageCount) + "\u5305" + formatNumber(stock.getCount()) + stock.getUnitName(); + + formatNumber(packageCount) + "\u5305" + formatNumber(baseCount) + stock.getUnitName(); } if (stock.getPurchaseUnitConvertQuantity() == null || stock.getPurchaseUnitConvertQuantity().compareTo(BigDecimal.ZERO) <= 0 || stock.getPurchaseUnitName() == null || stock.getUnitName() == null) { @@ -306,6 +394,37 @@ public class ErpStockController { display.append(formatNumber(quantity)).append(unitName); } + private BigDecimal calculatePackageCount(ErpStockRespVO stock, BigDecimal count) { + BigDecimal convertQuantity = getDisplayConvertQuantity(stock); + if (convertQuantity == null || convertQuantity.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + return defaultZero(count).divideToIntegralValue(convertQuantity); + } + + private BigDecimal calculateBaseCount(ErpStockRespVO stock, BigDecimal count) { + BigDecimal convertQuantity = getDisplayConvertQuantity(stock); + if (convertQuantity == null || convertQuantity.compareTo(BigDecimal.ZERO) <= 0) { + return defaultZero(count); + } + return defaultZero(count).remainder(convertQuantity); + } + + private BigDecimal getDisplayConvertQuantity(ErpStockRespVO stock) { + if (isProductType(stock.getCategoryType())) { + return stock.getPackageQuantity(); + } + return stock.getPurchaseUnitConvertQuantity(); + } + + private BigDecimal defaultZero(BigDecimal value) { + return value != null ? value : BigDecimal.ZERO; + } + + private String nullToEmpty(String value) { + return value != null ? value : ""; + } + private boolean isProductType(Integer categoryType) { return Integer.valueOf(1).equals(categoryType); } @@ -332,6 +451,10 @@ public class ErpStockController { return String.valueOf(productId) + "_" + String.valueOf(warehouseId) + "_" + String.valueOf(areaId); } + private String buildStockGroupKey(Long productId, Long warehouseId) { + return String.valueOf(productId) + "_" + String.valueOf(warehouseId); + } + private String formatNumber(BigDecimal value) { return value == null ? "0" : value.stripTrailingZeros().toPlainString(); } 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 78be661fc..789bac398 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 @@ -179,7 +179,6 @@ 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))); } @@ -190,34 +189,11 @@ 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<>(); @@ -341,8 +317,11 @@ public class ErpStockInController { item.setProductBarCode(product.getBarCode()); item.setProductUnitName(product.getUnitName()); item.setCategoryType(product.getCategoryType()); - item.setSupplierId(product.getDefaultSupplierId()); - if (product.getDefaultSupplierId() != null && CollUtil.isNotEmpty(product.getSuppliers())) { + if (item.getSupplierId() == null) { + item.setSupplierId(product.getDefaultSupplierId()); + } + if (StringUtils.isBlank(item.getSupplierName()) + && product.getDefaultSupplierId() != null && CollUtil.isNotEmpty(product.getSuppliers())) { product.getSuppliers().stream() .filter(supplier -> Objects.equals(supplier.getSupplierId(), product.getDefaultSupplierId())) .findFirst() diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInSaveReqVO.java index 5e7786384..7453543ae 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInSaveReqVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/in/ErpStockInSaveReqVO.java @@ -66,6 +66,12 @@ public class ErpStockInSaveReqVO { @Schema(description = "产品编号", example = "3113") private Long productId; + @Schema(description = "供应商编号", example = "3113") + private Long supplierId; + + @Schema(description = "供应商名称", example = "供应商A") + private String supplierName; + @Schema(description = "产品单价", example = "100.00") private BigDecimal productPrice; diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockRespVO.java index 723135e6f..893779d4e 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockRespVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/stock/ErpStockRespVO.java @@ -9,6 +9,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; +import java.util.List; import static cn.iocoder.yudao.module.erp.enums.DictTypeConstants.PRODUCT_CATEGORY_TYPE; @@ -95,6 +96,15 @@ public class ErpStockRespVO { @ExcelProperty("库存展示") private String stockDisplay; + @Schema(description = "总包数", example = "10") + private BigDecimal totalPackageCount; + + @Schema(description = "总基本数量", example = "100") + private BigDecimal totalBaseCount; + + @Schema(description = "库区库存明细") + private List areaStocks; + @Schema(description = "托盘数量", example = "2") private Long palletCount; @@ -112,4 +122,26 @@ public class ErpStockRespVO { @ExcelProperty("最近出库时间") private java.time.LocalDateTime recentOutTime; + @Data + public static class AreaStock { + + @Schema(description = "库区编号", example = "1") + private Long areaId; + + @Schema(description = "库区名称", example = "A-01") + private String areaName; + + @Schema(description = "库存数量", example = "100") + private BigDecimal count; + + @Schema(description = "包数", example = "10") + private BigDecimal packageCount; + + @Schema(description = "基本数量", example = "0") + private BigDecimal baseCount; + + @Schema(description = "库存展示", example = "A-01:10包0个") + private String stockDisplay; + } + } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInItemDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInItemDO.java index c068a7e7b..32c59fbf4 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInItemDO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/stock/ErpStockInItemDO.java @@ -56,6 +56,14 @@ public class ErpStockInItemDO extends BaseDO { * 产品名称快照 */ private String productName; + /** + * 供应商编号 + */ + private Long supplierId; + /** + * 供应商名称快照 + */ + private String supplierName; /** * 产品单位编号 * diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java index f984ecd16..edce89a53 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java @@ -133,9 +133,13 @@ public interface ErpProductMapper extends BaseMapperX { } /**查询不同类型的产品**/ default List selectByCategorys(List categoryIds) { + return selectByCategorys(categoryIds, CommonStatusEnum.ENABLE.getStatus()); + } + + default List selectByCategorys(List categoryIds, Integer status) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(ErpProductDO::getStatus, 0); + wrapper.eq(status != null, ErpProductDO::getStatus, status); if (categoryIds!=null && !categoryIds.isEmpty() ) { wrapper.in(ErpProductDO::getCategoryId, categoryIds); 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 41cf7b406..195981031 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 @@ -2,10 +2,8 @@ package cn.iocoder.yudao.module.erp.dal.mysql.stock; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInDO; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -22,17 +20,20 @@ public interface ErpStockInMapper extends BaseMapperX { default PageResult selectPage(ErpStockInPageReqVO reqVO) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); - if(StringUtil.isNotBlank(reqVO.getNo())){ - if(reqVO.getNo().contains("PRODUCTMATERIAL-")){ - query.eq(ErpProductDO::getId, reqVO.getNo().replace("PRODUCTMATERIAL-","")); - }else{ + Long productId = reqVO.getProductId(); + if (StringUtil.isNotBlank(reqVO.getNo())) { + if (reqVO.getNo().contains("PRODUCTMATERIAL-")) { + productId = Long.valueOf(reqVO.getNo().replace("PRODUCTMATERIAL-", "")); + } else { query.likeIfPresent(ErpStockInDO::getNo, reqVO.getNo()); - } } + if (productId != null || reqVO.getWarehouseId() != null) { + query.inSql(ErpStockInDO::getId, buildItemFilterSql(productId, reqVO.getWarehouseId())); + } + query -// .likeIfPresent(ErpStockInDO::getNo, reqVO.getNo()) .eqIfPresent(ErpStockInDO::getSupplierId, reqVO.getSupplierId()) .betweenIfPresent(ErpStockInDO::getInTime, reqVO.getInTime()) .inIfPresent(ErpStockInDO::getStatus, reqVO.getStatusList()) @@ -52,6 +53,17 @@ public interface ErpStockInMapper extends BaseMapperX { return selectJoinPage(reqVO, ErpStockInDO.class, query); } + default String buildItemFilterSql(Long productId, Long warehouseId) { + StringBuilder itemFilterSql = new StringBuilder("select distinct in_id from erp_stock_in_item where deleted = 0"); + if (productId != null) { + itemFilterSql.append(" and product_id = ").append(productId); + } + if (warehouseId != null) { + itemFilterSql.append(" and warehouse_id = ").append(warehouseId); + } + return itemFilterSql.toString(); + } + default int updateByIdAndStatus(Long id, Integer status, ErpStockInDO updateObj) { return update(updateObj, new LambdaUpdateWrapper() .eq(ErpStockInDO::getId, id) 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 b353be054..0231088e8 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 @@ -5,6 +5,7 @@ import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.stock.ErpStockPageReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; @@ -31,8 +32,33 @@ public interface ErpStockMapper extends BaseMapperX { default PageResult selectPage(ErpStockPageReqVO reqVO) { - LambdaQueryWrapperX erpStockDOLambdaQueryWrapperX = new LambdaQueryWrapperX() - .eqIfPresent(ErpStockDO::getProductId, reqVO.getProductId()) + LambdaQueryWrapperX erpStockDOLambdaQueryWrapperX = new LambdaQueryWrapperX(); + +// if(StringUtils.isNotBlank(reqVO.getCode())&&StringUtils.isNotBlank(reqVO.getName())&&reqVO.getCode().equals(reqVO.getName())){ +// if(reqVO.getCode().contains("PRODUCTMATERIAL-")){ +// queryWrapper.eq(MoldBrandDO::getId, reqVO.getCode().replace("PRODUCTMATERIAL-","")); +// }else{ +// queryWrapper.and(w -> w +// .like(MoldBrandDO::getCode, reqVO.getCode()) +// .or() +// .like(MoldBrandDO::getName, reqVO.getName()) +// ); +// } +// }else{ +// queryWrapper.likeIfPresent(MoldBrandDO::getCode, reqVO.getCode()) +// .likeIfPresent(MoldBrandDO::getName, reqVO.getName()); +// } + + + + + + + + + + + erpStockDOLambdaQueryWrapperX.eqIfPresent(ErpStockDO::getProductId, reqVO.getProductId()) .eqIfPresent(ErpStockDO::getWarehouseId, reqVO.getWarehouseId()) .eqIfPresent(ErpStockDO::getAreaId, reqVO.getAreaId()) .eqIfPresent(ErpStockDO::getCategoryId, reqVO.getCategoryId()) 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 3c28c7723..39923fa0e 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 @@ -73,7 +73,7 @@ public interface ErpProductService { * @param status 状态 * @return 产品 VO 列表 */ - List getProductVOListByStatus(Integer status,Integer categoryId); + List getProductVOListByStatus(Integer status, Integer categoryId, Integer categoryType); List getProductVOListByCategory(Integer categoryId); List getProductVOListByCategory(Integer categoryId, Integer categoryType); List buildProductVOList(List list); 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 f8886981b..fb47ca113 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 @@ -521,13 +521,24 @@ public class ErpProductServiceImpl implements ErpProductService { @Override - public List getProductVOListByStatus(Integer status,Integer categoryId) { + public List getProductVOListByStatus(Integer status, Integer categoryId, Integer categoryType) { List categoryList = new ArrayList<>(); + if (categoryType != null) { + List categoryIds = productMapper.selectCategoryIdListByType(categoryType); + if (CollUtil.isEmpty(categoryIds)) { + return new ArrayList<>(); + } + if (categoryId != null && !categoryIds.contains(categoryId.longValue())) { + return new ArrayList<>(); + } + categoryIds.forEach(item -> categoryList.add(item.intValue())); + } if(categoryId != null ){ + categoryList.clear(); categoryList.add(categoryId); } - List list = productMapper.selectByCategorys(categoryList); + List list = productMapper.selectByCategorys(categoryList, status); return buildProductVOList(list); } @Override 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 f70c64c58..e2dce066f 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 @@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.in.StockInTypeEnum; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; import cn.iocoder.yudao.module.erp.dal.dataobject.pallet.ErpPalletDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInApproveRecordDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInItemDO; @@ -555,14 +556,38 @@ public class ErpStockInServiceImpl implements ErpStockInService { ErpWarehouseDO::getId); Map areaMap = warehouseAreaService.getWarehouseAreaMap( convertSet(list, ErpStockInSaveReqVO.Item::getAreaId)); + Map supplierMap = buildStockInItemSupplierMap(list, inType); return convertList(list, item -> BeanUtils.toBean(item, ErpStockInItemDO.class, target -> target .setWarehouseName(warehouseMap.containsKey(target.getWarehouseId()) ? warehouseMap.get(target.getWarehouseId()).getName() : null) .setAreaName(areaMap.containsKey(target.getAreaId()) ? areaMap.get(target.getAreaId()).getAreaName() : null) .setProductName(productMap.get(target.getProductId()).getName()) + .setSupplierName(resolveStockInItemSupplierName(item, supplierMap, inType)) .setProductUnitId(productMap.get(target.getProductId()).getUnitId()) .setTotalPrice(MoneyUtils.priceMultiply(target.getProductPrice(), target.getCount())))); } + private Map buildStockInItemSupplierMap(List list, String inType) { + if (!isSupplierItemStockIn(inType)) { + return Collections.emptyMap(); + } + return supplierService.getSupplierMap(convertSet(list, ErpStockInSaveReqVO.Item::getSupplierId)); + } + + private String resolveStockInItemSupplierName(ErpStockInSaveReqVO.Item item, Map supplierMap, + String inType) { + if (!isSupplierItemStockIn(inType) || item.getSupplierId() == null) { + return null; + } + ErpSupplierDO supplier = supplierMap.get(item.getSupplierId()); + return supplier != null ? supplier.getName() : item.getSupplierName(); + } + + private boolean isSupplierItemStockIn(String inType) { + return Objects.equals(inType, StockInTypeEnum.原料入库.getValue()) + || Objects.equals(inType, StockInTypeEnum.备件入库.getValue()) + || Objects.equals(inType, "物料入库"); + } + private void validatePallets(List list) { List palletIds = convertListByFlatMap(list, item -> item.getPallets() == null ? java.util.stream.Stream.empty() : item.getPallets().stream().map(ErpStockInSaveReqVO.Item.PalletItem::getPalletId));