From 3aaf69cf8e5a3ba79ed76a4ef971933ffe960b01 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Wed, 24 Jun 2026 17:11:33 +0800 Subject: [PATCH 01/11] =?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)); From bd02378ab78502b2df3220557b00abb162347f3d Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Thu, 25 Jun 2026 10:16:29 +0800 Subject: [PATCH 02/11] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E7=9B=98=E7=82=B9?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=8F=8A=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/stock/ErpStockCheckController.java | 68 ++++++++-- .../check/ErpStockCheckRecordPageReqVO.java | 54 ++++++++ .../vo/check/ErpStockCheckRecordRespVO.java | 124 ++++++++++++++++++ .../mysql/stock/ErpStockCheckItemMapper.java | 59 ++++++++- .../service/stock/ErpStockCheckService.java | 12 ++ .../stock/ErpStockCheckServiceImpl.java | 34 ++--- .../vo/DeviceLedgerPageReqVO.java | 3 +- .../deviceledger/DeviceLedgerMapper.java | 1 + 8 files changed, 328 insertions(+), 27 deletions(-) create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordPageReqVO.java create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordRespVO.java diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java index f14d657af..41ca08aab 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/ErpStockCheckController.java @@ -10,16 +10,10 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.ratelimiter.core.annotation.RateLimiter; +import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckApproveRecordRespVO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckAuditReqVO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByLocationReqVO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByProductReqVO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckPageReqVO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckRespVO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckSaveReqVO; -import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckSubmitReqVO; +import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.*; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockCheckApproveRecordDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockCheckDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockCheckItemDO; @@ -186,6 +180,64 @@ public class ErpStockCheckController { ExcelUtils.write(response, "库存盘点单.xls", "数据", ErpStockCheckRespVO.class, list); } + @GetMapping("/record-page") + @Operation(summary = "获得库存盘点记录分页") + @PreAuthorize("@ss.hasPermission('erp:stock-check:query')") + public CommonResult> getStockCheckRecordPage( + @Valid ErpStockCheckRecordPageReqVO pageReqVO) { + return success(buildStockCheckRecordVOPageResult(stockCheckService.getStockCheckRecordPage(pageReqVO))); + } + + @GetMapping("/record-export-excel") + @Operation(summary = "导出库存盘点记录 Excel") + @PreAuthorize("@ss.hasPermission('erp:stock-check:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportStockCheckRecordExcel(@Valid ErpStockCheckRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = buildStockCheckRecordVOPageResult( + stockCheckService.getStockCheckRecordPage(pageReqVO)).getList(); + ExcelUtils.write(response, "库存盘点记录.xls", "数据", ErpStockCheckRecordRespVO.class, list); + } + + private PageResult buildStockCheckRecordVOPageResult(PageResult pageResult) { + if (CollUtil.isEmpty(pageResult.getList())) { + return PageResult.empty(pageResult.getTotal()); + } + Map stockCheckMap = stockCheckService.getStockCheckMap( + convertSet(pageResult.getList(), ErpStockCheckItemDO::getCheckId)); + Map productMap = productService.getProductVOMap( + convertSet(pageResult.getList(), ErpStockCheckItemDO::getProductId)); + Map unitMap = productUnitService.getProductUnitMap(convertSet(productMap.values(), ErpProductRespVO::getUnitId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(pageResult.getList(), ErpStockCheckItemDO::getWarehouseId)); + Map areaMap = warehouseAreaService.getWarehouseAreaMap( + convertSet(pageResult.getList(), ErpStockCheckItemDO::getAreaId)); + Map userMap = adminUserApi.getUserMap(convertListByFlatMap(stockCheckMap.values(), + stockCheck -> Stream.of(NumberUtils.parseLong(stockCheck.getCreator())))); + return BeanUtils.toBean(pageResult, ErpStockCheckRecordRespVO.class, record -> { + MapUtils.findAndThen(stockCheckMap, record.getCheckId(), stockCheck -> { + record.setNo(stockCheck.getNo()) + .setCheckTime(stockCheck.getCheckTime()) + .setSourceType(stockCheck.getSourceType()) + .setCategoryType(stockCheck.getCategoryType()) + .setCheckStatus(stockCheck.getCheckStatus()) + .setStatus(stockCheck.getStatus()) + .setCreator(stockCheck.getCreator()) + .setCreateTime(stockCheck.getCreateTime()); + MapUtils.findAndThen(userMap, NumberUtils.parseLong(stockCheck.getCreator()), user -> record.setCreatorName(user.getNickname())); + }); + MapUtils.findAndThen(productMap, record.getProductId(), product -> record.setProductName(product.getName()) + .setProductBarCode(product.getBarCode()).setCategoryName(product.getCategoryName())); + MapUtils.findAndThen(productMap, record.getProductId(), product -> + MapUtils.findAndThen(unitMap, product.getUnitId(), unit -> record.setProductUnitName(unit.getName()))); + MapUtils.findAndThen(warehouseMap, record.getWarehouseId(), warehouse -> record.setWarehouseName(warehouse.getName())); + if (record.getAreaName() == null) { + MapUtils.findAndThen(areaMap, record.getAreaId(), area -> record.setAreaName(area.getAreaName())); + } + }); + } + private PageResult buildStockCheckVOPageResult(PageResult pageResult) { if (CollUtil.isEmpty(pageResult.getList())) { return PageResult.empty(pageResult.getTotal()); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordPageReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordPageReqVO.java new file mode 100644 index 000000000..f5d2a1fbd --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordPageReqVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - ERP 库存盘点记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErpStockCheckRecordPageReqVO extends PageParam { + + @Schema(description = "盘点单号", example = "QCPD20260623001") + private String no; + + @Schema(description = "盘点时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] checkTime; + + @Schema(description = "生成来源类型:1-按库存,2-按产品", example = "1") + private Integer sourceType; + + @Schema(description = "产品分类类型", example = "1") + private Integer categoryType; + + @Schema(description = "盘点状态:0-未盘点,1-已盘点", example = "1") + private Integer checkStatus; + + @Schema(description = "审核状态", example = "20") + private Integer status; + + @Schema(description = "产品编号", example = "1") + private Long productId; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "库区编号", example = "1") + private Long areaId; + + @Schema(description = "创建人") + private String creator; + + @Schema(description = "盘点记录项 id 集合,导出使用") + private String ids; + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordRespVO.java new file mode 100644 index 000000000..870558151 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/stock/vo/check/ErpStockCheckRecordRespVO.java @@ -0,0 +1,124 @@ +package cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.erp.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.module.erp.enums.DictTypeConstants.AUDIT_STATUS; +import static cn.iocoder.yudao.module.erp.enums.DictTypeConstants.PRODUCT_CATEGORY_TYPE; + +@Schema(description = "管理后台 - ERP 库存盘点记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ErpStockCheckRecordRespVO { + + @Schema(description = "盘点记录项编号", example = "11756") + @ExcelProperty("盘点记录项编号") + private Long id; + + @Schema(description = "盘点单编号", example = "11756") + private Long checkId; + + @Schema(description = "盘点单号", example = "QCPD20260623001") + @ExcelProperty("盘点单号") + private String no; + + @Schema(description = "盘点时间") + @ExcelProperty("盘点时间") + private LocalDateTime checkTime; + + @Schema(description = "生成来源类型:1-按库存,2-按产品", example = "1") + @ExcelProperty(value = "生成来源类型", converter = DictConvert.class) + @DictFormat("erp_stock_check_source_type") + private Integer sourceType; + + @Schema(description = "产品分类类型", example = "1") + @ExcelProperty(value = "产品分类类型", converter = DictConvert.class) + @DictFormat(PRODUCT_CATEGORY_TYPE) + private Integer categoryType; + + @Schema(description = "盘点状态:0-未盘点,1-已盘点", example = "1") + @ExcelProperty("盘点状态") + private Integer checkStatus; + + @Schema(description = "审核状态", example = "20") + @ExcelProperty(value = "审核状态", converter = DictConvert.class) + @DictFormat(AUDIT_STATUS) + private Integer status; + + @Schema(description = "产品编号", example = "3113") + private Long productId; + + @Schema(description = "产品名称", example = "苹果") + @ExcelProperty("产品名称") + private String productName; + + @Schema(description = "产品条码", example = "A9985") + @ExcelProperty("产品条码") + private String productBarCode; + + @Schema(description = "产品分类", example = "水果") + @ExcelProperty("产品分类") + private String categoryName; + + @Schema(description = "产品单位名称", example = "个") + @ExcelProperty("单位") + private String productUnitName; + + @Schema(description = "仓库编号", example = "3113") + private Long warehouseId; + + @Schema(description = "仓库名称", example = "成品仓") + @ExcelProperty("仓库名称") + private String warehouseName; + + @Schema(description = "库区编号", example = "1") + private Long areaId; + + @Schema(description = "库区名称", example = "A区") + @ExcelProperty("库区名称") + private String areaName; + + @Schema(description = "产品单价", example = "100.00") + @ExcelProperty("产品单价") + private BigDecimal productPrice; + + @Schema(description = "账面数量", example = "100.00") + @ExcelProperty("账面数量") + private BigDecimal stockCount; + + @Schema(description = "实际数量", example = "95.00") + @ExcelProperty("实际数量") + private BigDecimal actualCount; + + @Schema(description = "盈亏数量", example = "-5.00") + @ExcelProperty("盈亏数量") + private BigDecimal count; + + @Schema(description = "合计金额", example = "500.00") + @ExcelProperty("合计金额") + private BigDecimal totalPrice; + + @Schema(description = "备注", example = "随便") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建人", example = "1") + private String creator; + + @Schema(description = "创建人名称", example = "张三") + @ExcelProperty("创建人") + private String creatorName; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java index ae13f9f96..f1eb4c7f2 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java @@ -1,11 +1,18 @@ 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.module.erp.controller.admin.stock.vo.check.ErpStockCheckRecordPageReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockCheckItemDO; +import com.alibaba.excel.util.StringUtils; import org.apache.ibatis.annotations.Mapper; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; /** * ERP 库存盘点单项 Mapper @@ -15,6 +22,56 @@ import java.util.List; @Mapper public interface ErpStockCheckItemMapper extends BaseMapperX { + DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + default PageResult selectRecordPage(ErpStockCheckRecordPageReqVO reqVO) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .eqIfPresent(ErpStockCheckItemDO::getProductId, reqVO.getProductId()) + .eqIfPresent(ErpStockCheckItemDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(ErpStockCheckItemDO::getAreaId, reqVO.getAreaId()) + .orderByDesc(ErpStockCheckItemDO::getId); + query.inSql(ErpStockCheckItemDO::getCheckId, buildCheckFilterSql(reqVO)); + if (StringUtils.isNotBlank(reqVO.getIds())) { + List idList = Arrays.stream(reqVO.getIds().split(",")) + .map(String::trim) + .map(Long::valueOf) + .collect(Collectors.toList()); + query.in(ErpStockCheckItemDO::getId, idList); + } + return selectPage(reqVO, query); + } + + default String buildCheckFilterSql(ErpStockCheckRecordPageReqVO reqVO) { + StringBuilder checkFilterSql = new StringBuilder("select id from erp_stock_check where deleted = 0"); + if (StringUtils.isNotBlank(reqVO.getNo())) { + checkFilterSql.append(" and no like '%").append(reqVO.getNo().replace("'", "''")).append("%'"); + } + if (reqVO.getCheckTime() != null && reqVO.getCheckTime().length == 2) { + if (reqVO.getCheckTime()[0] != null) { + checkFilterSql.append(" and check_time >= '").append(DATE_TIME_FORMATTER.format(reqVO.getCheckTime()[0])).append("'"); + } + if (reqVO.getCheckTime()[1] != null) { + checkFilterSql.append(" and check_time <= '").append(DATE_TIME_FORMATTER.format(reqVO.getCheckTime()[1])).append("'"); + } + } + if (reqVO.getSourceType() != null) { + checkFilterSql.append(" and source_type = ").append(reqVO.getSourceType()); + } + if (reqVO.getCategoryType() != null) { + checkFilterSql.append(" and category_type = ").append(reqVO.getCategoryType()); + } + if (reqVO.getCheckStatus() != null) { + checkFilterSql.append(" and check_status = ").append(reqVO.getCheckStatus()); + } + if (reqVO.getStatus() != null) { + checkFilterSql.append(" and status = ").append(reqVO.getStatus()); + } + if (StringUtils.isNotBlank(reqVO.getCreator())) { + checkFilterSql.append(" and creator = '").append(reqVO.getCreator().replace("'", "''")).append("'"); + } + return checkFilterSql.toString(); + } + default List selectListByCheckId(Long checkId) { return selectList(ErpStockCheckItemDO::getCheckId, checkId); } @@ -27,4 +84,4 @@ public interface ErpStockCheckItemMapper extends BaseMapperX getStockCheckMap(Collection ids) { + return convertMap(getStockCheckList(ids), ErpStockCheckDO::getId); + } + + List getStockCheckList(Collection ids); + /** * 获得库存盘点单分页 * @@ -73,6 +83,8 @@ public interface ErpStockCheckService { */ PageResult getStockCheckPage(ErpStockCheckPageReqVO pageReqVO); + PageResult getStockCheckRecordPage(ErpStockCheckRecordPageReqVO pageReqVO); + // ==================== 盘点项 ==================== /** diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckServiceImpl.java index 4d70b6ba6..6e59e9b01 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockCheckServiceImpl.java @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheck import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByLocationReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckGenerateByProductReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckPageReqVO; +import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckRecordPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckRespVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckSaveReqVO; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckSubmitReqVO; @@ -30,9 +31,7 @@ import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; import cn.iocoder.yudao.module.erp.enums.stock.ErpStockCheckApproveActionEnum; import cn.iocoder.yudao.module.erp.enums.stock.ErpStockCheckSourceTypeEnum; -import cn.iocoder.yudao.module.erp.enums.stock.ErpStockRecordBizTypeEnum; import cn.iocoder.yudao.module.erp.service.product.ErpProductService; -import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO; import cn.iocoder.yudao.module.erp.service.warehousearea.WarehouseAreaService; import cn.iocoder.yudao.module.infra.api.config.ConfigApi; import cn.iocoder.yudao.module.system.api.permission.PermissionApi; @@ -83,7 +82,7 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService { @Resource private WarehouseAreaService warehouseAreaService; @Resource - private ErpStockRecordService stockRecordService; + private ErpStockService stockService; @Resource private AdminUserApi adminUserApi; @Resource @@ -286,11 +285,24 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService { return stockCheckMapper.selectById(id); } + @Override + public List getStockCheckList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return stockCheckMapper.selectBatchIds(ids); + } + @Override public PageResult getStockCheckPage(ErpStockCheckPageReqVO pageReqVO) { return stockCheckMapper.selectPage(pageReqVO); } + @Override + public PageResult getStockCheckRecordPage(ErpStockCheckRecordPageReqVO pageReqVO) { + return stockCheckItemMapper.selectRecordPage(pageReqVO); + } + @Override public List getStockCheckItemListByCheckId(Long checkId) { return stockCheckItemMapper.selectListByCheckId(checkId); @@ -404,25 +416,13 @@ public class ErpStockCheckServiceImpl implements ErpStockCheckService { return; } BigDecimal count = approve ? stockCheckItem.getCount() : stockCheckItem.getCount().negate(); - Integer bizType; - if (approve) { - bizType = stockCheckItem.getCount().compareTo(BigDecimal.ZERO) > 0 - ? ErpStockRecordBizTypeEnum.CHECK_MORE_IN.getType() - : ErpStockRecordBizTypeEnum.CHECK_LESS_OUT.getType(); - } else { - bizType = stockCheckItem.getCount().compareTo(BigDecimal.ZERO) > 0 - ? ErpStockRecordBizTypeEnum.CHECK_MORE_IN_CANCEL.getType() - : ErpStockRecordBizTypeEnum.CHECK_LESS_OUT_CANCEL.getType(); - } ErpProductDO productDO = productService.validProductList(Collections.singleton(stockCheckItem.getProductId())) .stream().findFirst().orElse(null); if (productDO == null) { return; } - stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( - stockCheckItem.getProductId(), productDO.getCategoryId(), null, - stockCheckItem.getWarehouseId(), stockCheckItem.getAreaId(), stockCheckItem.getAreaName(), - count, bizType, stockCheckItem.getCheckId(), stockCheckItem.getId(), stockCheck.getNo(), stockCheck.getCheckTime())); + stockService.updateStockCountIncrement(productDO.getCategoryId(), stockCheckItem.getProductId(), + stockCheckItem.getWarehouseId(), stockCheckItem.getAreaId(), stockCheckItem.getAreaName(), count); }); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java index cc23a1871..5a6eafd28 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java @@ -100,7 +100,8 @@ public class DeviceLedgerPageReqVO extends PageParam { private Long productId; @Schema(description = "出厂日期") - private LocalDateTime outgoingTime; + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime[] outgoingTime; @Schema(description = "序列号") private String sn; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java index 9a78c77c7..2cb512255 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/deviceledger/DeviceLedgerMapper.java @@ -56,6 +56,7 @@ public interface DeviceLedgerMapper extends BaseMapperX { .eqIfPresent(DeviceLedgerDO::getSort, reqVO.getSort()) .eqIfPresent(DeviceLedgerDO::getIsScheduled, reqVO.getIsScheduled()) .betweenIfPresent(DeviceLedgerDO::getCreateTime, reqVO.getCreateTime()) + .betweenIfPresent(DeviceLedgerDO::getOutgoingTime, reqVO.getOutgoingTime()) .orderByDesc(DeviceLedgerDO::getCreateTime); if (reqVO.getDeviceLineIds() != null && !reqVO.getDeviceLineIds().isEmpty()) { From a098a86acc0050c7bcaaf7d0cea723b759b7732a Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Thu, 25 Jun 2026 14:18:04 +0800 Subject: [PATCH 03/11] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E7=BB=B4=E4=BF=AE?= =?UTF-8?q?=E5=8D=95=E5=8F=8A=E7=9B=98=E7=82=B9=E6=89=A7=E8=A1=8C=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/dal/mysql/stock/ErpStockCheckItemMapper.java | 10 ++++------ .../admin/deviceledger/vo/DeviceLedgerPageReqVO.java | 2 +- .../admin/dvrepair/vo/DvRepairPageReqVO.java | 3 +++ .../module/mes/dal/mysql/dvrepair/DvRepairMapper.java | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java index f1eb4c7f2..80c8a72d6 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/stock/ErpStockCheckItemMapper.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.check.ErpStockCheckRecordPageReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockCheckItemDO; +import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; import com.alibaba.excel.util.StringUtils; import org.apache.ibatis.annotations.Mapper; @@ -23,6 +24,7 @@ import java.util.stream.Collectors; public interface ErpStockCheckItemMapper extends BaseMapperX { DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + Integer STOCK_CHECK_STATUS_CHECKED = 1; default PageResult selectRecordPage(ErpStockCheckRecordPageReqVO reqVO) { LambdaQueryWrapperX query = new LambdaQueryWrapperX() @@ -43,6 +45,8 @@ public interface ErpStockCheckItemMapper extends BaseMapperX { dvRepairDOLambdaQueryWrapperX.in(DvRepairDO::getMachineryId,reqVO.getMachineryIds()); }*/ dvRepairDOLambdaQueryWrapperX - .likeIfPresent(DvRepairDO::getRepairName, reqVO.getRepairName()) .eqIfPresent(DvRepairDO::getMachineryId, reqVO.getMachineryId()) @@ -61,6 +60,7 @@ public interface DvRepairMapper extends BaseMapperX { .eqIfPresent(DvRepairDO::getAcceptedBy, reqVO.getAcceptedBy()) .eqIfPresent(DvRepairDO::getConfirmBy, reqVO.getConfirmBy()) .eqIfPresent(DvRepairDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DvRepairDO::getRepairStatus, reqVO.getRepairStatus()) .eqIfPresent(DvRepairDO::getRemark, reqVO.getRemark()) .betweenIfPresent(DvRepairDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(DvRepairDO::getCreateTime); @@ -78,4 +78,4 @@ public interface DvRepairMapper extends BaseMapperX { } void selectDeviceRepair(EventStatisticsVO eventStatisticsVO); -} \ No newline at end of file +} From 57fd807a123f9e55bbe1db9cf3d3b57665e3e867 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Thu, 25 Jun 2026 15:18:44 +0800 Subject: [PATCH 04/11] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E7=BB=B4=E4=BF=AE?= =?UTF-8?q?=E5=8D=95=E6=9F=A5=E8=AF=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/dvrepair/vo/DvRepairPageReqVO.java | 6 ++++ .../dal/mysql/dvrepair/DvRepairMapper.java | 29 +++++++------------ .../service/dvrepair/DvRepairServiceImpl.java | 22 +++++++++++--- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairPageReqVO.java index 43a2c53cc..f50147393 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairPageReqVO.java @@ -18,6 +18,9 @@ public class DvRepairPageReqVO extends PageParam { @Schema(description = "维修单编号") private String repairCode; + @Schema(description = "关键词,匹配维修单号/设备编号/设备名称") + private String keyword; + @Schema(description = "维修单名称", example = "王五") private String repairName; @@ -83,6 +86,9 @@ public class DvRepairPageReqVO extends PageParam { @Schema(description = "设备ID集合", example = "6979") private List machineryIds; + @Schema(hidden = true) + private List keywordMachineryIds; + @Schema(description = "产线") private String deviceLine; } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java index 143403488..af7eec9d7 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java @@ -27,29 +27,22 @@ public interface DvRepairMapper extends BaseMapperX { LambdaQueryWrapperX dvRepairDOLambdaQueryWrapperX = new LambdaQueryWrapperX<>(); - if(StringUtils.isNotBlank(reqVO.getRepairCode())&&StringUtils.isNotBlank(reqVO.getMachineryCode())&&reqVO.getRepairCode().equals(reqVO.getMachineryCode())){ - dvRepairDOLambdaQueryWrapperX.and(w -> w - .like(DvRepairDO::getRepairCode, reqVO.getRepairCode()) - .or() - .like(DvRepairDO::getMachineryCode, reqVO.getMachineryCode()) - .or() - .in(DvRepairDO::getMachineryId,reqVO.getMachineryIds()) - ); - }else if(CollUtil.isNotEmpty(reqVO.getMachineryIds())){ - dvRepairDOLambdaQueryWrapperX.in(DvRepairDO::getMachineryId,reqVO.getMachineryIds()); + if(CollUtil.isNotEmpty(reqVO.getMachineryIds())){ + dvRepairDOLambdaQueryWrapperX.in(DvRepairDO::getMachineryId, reqVO.getMachineryIds()); } - else{ - dvRepairDOLambdaQueryWrapperX.eqIfPresent(DvRepairDO::getRepairCode, reqVO.getRepairCode()) - .eqIfPresent(DvRepairDO::getMachineryCode, reqVO.getMachineryCode()); + if (StringUtils.isNotBlank(reqVO.getKeyword())) { + dvRepairDOLambdaQueryWrapperX.and(w -> { + w.like(DvRepairDO::getRepairCode, reqVO.getKeyword()); + if (CollUtil.isNotEmpty(reqVO.getKeywordMachineryIds())) { + w.or().in(DvRepairDO::getMachineryId, reqVO.getKeywordMachineryIds()); + } + }); } - /* if(CollUtil.isNotEmpty(reqVO.getMachineryIds())){ - dvRepairDOLambdaQueryWrapperX.in(DvRepairDO::getMachineryId,reqVO.getMachineryIds()); - }*/ dvRepairDOLambdaQueryWrapperX + .likeIfPresent(DvRepairDO::getRepairCode, reqVO.getRepairCode()) .likeIfPresent(DvRepairDO::getRepairName, reqVO.getRepairName()) .eqIfPresent(DvRepairDO::getMachineryId, reqVO.getMachineryId()) - - .likeIfPresent(DvRepairDO::getMachineryName, reqVO.getMachineryName()) + .likeIfPresent(DvRepairDO::getMachineryCode, reqVO.getMachineryCode()) .eqIfPresent(DvRepairDO::getMachineryBrand, reqVO.getMachineryBrand()) .eqIfPresent(DvRepairDO::getMachinerySpec, reqVO.getMachinerySpec()) .eqIfPresent(DvRepairDO::getMachineryTypeId, reqVO.getMachineryTypeId()) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java index b2d48e6f0..bd97d1519 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java @@ -136,15 +136,15 @@ public class DvRepairServiceImpl implements DvRepairService { @Override public PageResult getDvRepairPage(DvRepairPageReqVO pageReqVO) { - if(StringUtils.isNotBlank(pageReqVO.getDeviceLine())|| StringUtils.isNotBlank(pageReqVO.getRepairCode())) { + if(StringUtils.isNotBlank(pageReqVO.getDeviceLine()) || StringUtils.isNotBlank(pageReqVO.getMachineryName())) { LambdaQueryWrapperX deviceLedgerDOLambdaQueryWrapperX = new LambdaQueryWrapperX<>(); if(StringUtils.isNotBlank(pageReqVO.getDeviceLine())) deviceLedgerDOLambdaQueryWrapperX.eqIfPresent(DeviceLedgerDO::getDeviceLine, pageReqVO.getDeviceLine()); - if(StringUtils.isNotBlank(pageReqVO.getRepairCode())){ + if(StringUtils.isNotBlank(pageReqVO.getMachineryName())){ deviceLedgerDOLambdaQueryWrapperX.and(w -> w - .like(DeviceLedgerDO::getDeviceCode, pageReqVO.getRepairCode()) + .like(DeviceLedgerDO::getDeviceCode, pageReqVO.getMachineryName()) .or() - .like(DeviceLedgerDO::getDeviceName, pageReqVO.getRepairCode()) + .like(DeviceLedgerDO::getDeviceName, pageReqVO.getMachineryName()) ); } List deviceLedgerDOS = deviceLedgerMapper.selectList(deviceLedgerDOLambdaQueryWrapperX); @@ -158,6 +158,20 @@ public class DvRepairServiceImpl implements DvRepairService { } } + if (StringUtils.isNotBlank(pageReqVO.getKeyword())) { + LambdaQueryWrapperX keywordDeviceQuery = new LambdaQueryWrapperX<>(); + keywordDeviceQuery.and(w -> w + .like(DeviceLedgerDO::getDeviceCode, pageReqVO.getKeyword()) + .or() + .like(DeviceLedgerDO::getDeviceName, pageReqVO.getKeyword()) + ); + List deviceLedgerDOS = deviceLedgerMapper.selectList(keywordDeviceQuery); + pageReqVO.setKeywordMachineryIds(deviceLedgerDOS.stream() + .map(DeviceLedgerDO::getId) + .distinct() + .collect(Collectors.toList())); + } + return dvRepairMapper.selectPage(pageReqVO); } From d2d8e62a7d1ebda035783c592f5c95cd031744b4 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Thu, 25 Jun 2026 15:50:13 +0800 Subject: [PATCH 05/11] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E6=A8=A1=E5=85=B7?= =?UTF-8?q?=E7=BB=84=E8=AE=BE=E5=A4=87=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/mold/vo/MoldBrandPageReqVO.java | 3 +++ .../module/erp/service/mold/MoldBrandServiceImpl.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/controller/admin/mold/vo/MoldBrandPageReqVO.java b/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/controller/admin/mold/vo/MoldBrandPageReqVO.java index a2e2c28ff..684ada1b1 100644 --- a/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/controller/admin/mold/vo/MoldBrandPageReqVO.java +++ b/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/controller/admin/mold/vo/MoldBrandPageReqVO.java @@ -50,6 +50,9 @@ public class MoldBrandPageReqVO extends PageParam { @Schema(description = "设备名称", example = "注塑机") private String deviceName; + @Schema(description = "当前设备,模糊匹配设备名称", example = "注塑机") + private String currentDevice; + @Schema(description = "预期寿命(小时)") private BigDecimal useTime; diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/mold/MoldBrandServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/mold/MoldBrandServiceImpl.java index cbd725a4e..92290552b 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/mold/MoldBrandServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/mold/MoldBrandServiceImpl.java @@ -215,6 +215,7 @@ public class MoldBrandServiceImpl implements MoldBrandService { @Override public PageResult getMoldBrandPage(MoldBrandPageReqVO pageReqVO) { + applyCurrentDeviceFilter(pageReqVO); if (StrUtil.isNotBlank(pageReqVO.getDeviceName())) { List filteredList = selectByDeviceName(pageReqVO); List pageList = paginateList(filteredList, pageReqVO); @@ -241,6 +242,7 @@ public class MoldBrandServiceImpl implements MoldBrandService { @Override public MoldBrandStatusStatisticsRespVO getMoldBrandStatusStatistics(MoldBrandPageReqVO pageReqVO) { MoldBrandPageReqVO statisticsReqVO = BeanUtils.toBean(pageReqVO, MoldBrandPageReqVO.class); + applyCurrentDeviceFilter(statisticsReqVO); statisticsReqVO.setStatus(null); List list = StrUtil.isNotBlank(statisticsReqVO.getDeviceName()) ? selectByDeviceName(statisticsReqVO) @@ -363,6 +365,12 @@ public class MoldBrandServiceImpl implements MoldBrandService { return latestOperateMap; } + private void applyCurrentDeviceFilter(MoldBrandPageReqVO reqVO) { + if (reqVO != null && StrUtil.isBlank(reqVO.getDeviceName()) && StrUtil.isNotBlank(reqVO.getCurrentDevice())) { + reqVO.setDeviceName(reqVO.getCurrentDevice()); + } + } + private void fillCurrentDeviceNameByLatestOperate(MoldBrandRespVO item, MoldOperateSimpleDO latestOperate) { if (latestOperate == null) { item.setDeviceName(null); From 1340c6ff0460ccd783b4cf794d00ca7227de93e4 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 26 Jun 2026 10:04:01 +0800 Subject: [PATCH 06/11] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=97=B6=E5=BA=93=E5=AD=98=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=E5=90=8D=E5=90=8D=E7=A7=B0=E5=9B=9E=E6=98=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dal/dataobject/product/ErpProductDO.java | 5 +++++ .../product/ErpProductServiceImpl.java | 22 +++++++++++++++---- .../mapper/product/ErpProductMapper.xml | 2 +- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductDO.java index b375b7bf7..0b9e2c4fe 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductDO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductDO.java @@ -66,6 +66,11 @@ public class ErpProductDO extends BaseDO { */ private Long unitId; + /** + * 单位名称 + */ + private String unitName; + /** * 采购单位编号 * 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 fb47ca113..257974ff4 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 @@ -370,6 +370,15 @@ public class ErpProductServiceImpl implements ErpProductService { } private void fillProductUnitName(ErpProductDO product) { + if (product.getUnitId() == null) { + product.setUnitName(null); + } else { + ErpProductUnitDO unit = productUnitService.getProductUnit(product.getUnitId()); + if (unit == null) { + throw exception(PRODUCT_UNIT_NOT_EXISTS); + } + product.setUnitName(unit.getName()); + } if (product.getPurchaseUnitId() == null) { product.setPurchaseUnitName(null); return; @@ -662,10 +671,14 @@ public class ErpProductServiceImpl implements ErpProductService { 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())); + if (StrUtil.isBlank(product.getUnitName())) { + MapUtils.findAndThen(unitMap, product.getUnitId(), + unit -> product.setUnitName(unit.getName())); + } + if (StrUtil.isBlank(product.getPurchaseUnitName())) { + MapUtils.findAndThen(purchaseUnitMap, product.getPurchaseUnitId(), + unit -> product.setPurchaseUnitName(unit.getName())); + } product.setPackagingSchemes(packagingSchemeMap.getOrDefault(product.getId(), Collections.emptyList())); product.setSuppliers(supplierMap.getOrDefault(product.getId(), Collections.emptyList())); product.setDefaultSupplierId(defaultSupplierMap.get(product.getId())); @@ -836,6 +849,7 @@ public class ErpProductServiceImpl implements ErpProductService { ErpProductUnitDO unitDO = productUnitService.getProductUnitByName(importProduct.getUnitName()); if (unitDO != null) { productDO.setUnitId(unitDO.getId()); + productDO.setUnitName(unitDO.getName()); } } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/product/ErpProductMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/product/ErpProductMapper.xml index 74b3362c4..68d1605cf 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/product/ErpProductMapper.xml +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/product/ErpProductMapper.xml @@ -9,7 +9,7 @@ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ --> + select template_json + from mes_print_template + where deleted = 0 + and template_type = #{templateType} + and template_biz_type = 1 + + +