From 36fdf46263017cbc49c1b7c2af06ca9c33841bb6 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Tue, 9 Jun 2026 10:14:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=8C=85=E8=A3=85=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ErpPackagingSchemePageReqVO.java | 2 +- .../product/vo/product/ErpProductRespVO.java | 6 +++ .../product/ProductPackagingSchemeRespVO.java | 33 +++++++++++++ .../ProductPackagingSchemeSaveReqVO.java | 19 ++++++++ .../product/vo/product/ProductSaveReqVO.java | 10 +++- .../ProductPackagingSchemeRelDO.java | 47 +++++++++++++++++++ .../ProductPackagingSchemeRelMapper.java | 16 +++++++ .../product/ErpPackagingSchemeService.java | 3 ++ .../ErpPackagingSchemeServiceImpl.java | 19 ++++++++ .../product/ErpProductServiceImpl.java | 46 ++++++++++++++++++ 10 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeRespVO.java create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeSaveReqVO.java create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/productpackagingschemerel/ProductPackagingSchemeRelDO.java create mode 100644 yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/productpackagingschemerel/ProductPackagingSchemeRelMapper.java diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/packagingscheme/ErpPackagingSchemePageReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/packagingscheme/ErpPackagingSchemePageReqVO.java index 0e2e987f2..7b868c98e 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/packagingscheme/ErpPackagingSchemePageReqVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/packagingscheme/ErpPackagingSchemePageReqVO.java @@ -29,6 +29,6 @@ public class ErpPackagingSchemePageReqVO extends PageParam { @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private List createTime; + private LocalDateTime[] createTime; } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java index db1bbeeb7..d3cfe5baf 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ErpProductRespVO.java @@ -110,4 +110,10 @@ public class ErpProductRespVO extends ErpProductDO { @Schema(description = "关联模具列表") private List molds; + + @Schema(description = "可用包装方案列表") + private List packagingSchemes; + + @Schema(description = "默认包装方案 ID", example = "1") + private Long defaultPackagingSchemeId; } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeRespVO.java new file mode 100644 index 000000000..6345176c1 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeRespVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.erp.controller.admin.product.vo.product; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 产品关联包装方案 Response VO") +@Data +public class ProductPackagingSchemeRespVO { + + @Schema(description = "关联记录 ID", example = "1") + private Long id; + + @Schema(description = "包装方案 ID", example = "1") + private Long packagingSchemeId; + + @Schema(description = "包装方案名称", example = "标准包装方案") + private String packagingSchemeName; + + @Schema(description = "每包数量(件)", example = "100") + private BigDecimal packageQuantity; + + @Schema(description = "每托包数(包)", example = "20") + private BigDecimal palletPackageQuantity; + + @Schema(description = "每托总数量(件)", example = "2000") + private BigDecimal palletTotalQuantity; + + @Schema(description = "是否默认方案", example = "1") + private Integer defaultStatus; + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeSaveReqVO.java new file mode 100644 index 000000000..03afff32d --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductPackagingSchemeSaveReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.erp.controller.admin.product.vo.product; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 产品关联包装方案 Request VO") +@Data +public class ProductPackagingSchemeSaveReqVO { + + @Schema(description = "包装方案 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "包装方案 ID 不能为空") + private Long packagingSchemeId; + + @Schema(description = "是否默认方案", example = "1") + private Integer defaultStatus; + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductSaveReqVO.java index 9083cecbc..7b23e2676 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductSaveReqVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductSaveReqVO.java @@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import javax.validation.Valid; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.math.BigDecimal; @@ -68,4 +69,11 @@ public class ProductSaveReqVO { @Schema(description = "关联模具D列表", example = "[11,15,23]") private List moldIds; -} \ No newline at end of file + + @Schema(description = "可用包装方案列表") + @Valid + private List packagingSchemes; + + @Schema(description = "默认包装方案 ID", example = "1") + private Long defaultPackagingSchemeId; +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/productpackagingschemerel/ProductPackagingSchemeRelDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/productpackagingschemerel/ProductPackagingSchemeRelDO.java new file mode 100644 index 000000000..3f15614f0 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/productpackagingschemerel/ProductPackagingSchemeRelDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.erp.dal.dataobject.productpackagingschemerel; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.math.BigDecimal; + +@TableName("erp_product_packaging_scheme_rel") +@KeySequence("erp_product_packaging_scheme_rel_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProductPackagingSchemeRelDO extends BaseDO { + + @TableId + private Long id; + + private Long productId; + + private Long packagingSchemeId; + + private String packagingSchemeName; + + private BigDecimal packageQuantity; + + private BigDecimal palletPackageQuantity; + + private BigDecimal palletTotalQuantity; + + private Integer defaultStatus; + + private Integer sort; + + private String remark; + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/productpackagingschemerel/ProductPackagingSchemeRelMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/productpackagingschemerel/ProductPackagingSchemeRelMapper.java new file mode 100644 index 000000000..89ef5ad68 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/productpackagingschemerel/ProductPackagingSchemeRelMapper.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.erp.dal.mysql.productpackagingschemerel; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.erp.dal.dataobject.productpackagingschemerel.ProductPackagingSchemeRelDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ProductPackagingSchemeRelMapper extends BaseMapperX { + + default List selectListByProductId(Long productId) { + return selectList(ProductPackagingSchemeRelDO::getProductId, productId); + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeService.java index 03e3acacf..735eb9340 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.packagingscheme.E import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpPackagingSchemeDO; import javax.validation.Valid; +import java.util.Collection; import java.util.List; public interface ErpPackagingSchemeService { @@ -22,4 +23,6 @@ public interface ErpPackagingSchemeService { List getPackagingSchemeListByStatus(Integer status); + List validatePackagingSchemeList(Collection ids); + } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeServiceImpl.java index 67d016355..34bde297e 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpPackagingSchemeServiceImpl.java @@ -14,9 +14,13 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.PACKAGING_SCHEME_CODE_DUPLICATE; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.PACKAGING_SCHEME_NAME_DUPLICATE; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.PACKAGING_SCHEME_NOT_EXISTS; @@ -127,4 +131,19 @@ public class ErpPackagingSchemeServiceImpl implements ErpPackagingSchemeService return packagingSchemeMapper.selectListByStatus(status); } + @Override + public List validatePackagingSchemeList(Collection ids) { + if (ids == null || ids.isEmpty()) { + return Collections.emptyList(); + } + List list = packagingSchemeMapper.selectBatchIds(ids); + Map schemeMap = convertMap(list, ErpPackagingSchemeDO::getId); + for (Long id : ids) { + if (!schemeMap.containsKey(id)) { + throw exception(PACKAGING_SCHEME_NOT_EXISTS); + } + } + return 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 f9d843744..e229d83d5 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 @@ -15,15 +15,18 @@ import cn.iocoder.yudao.module.common.enums.QrcodeBizTypeEnum; import cn.iocoder.yudao.module.common.service.qrcordrecord.QrcodeRecordService; import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpPackagingSchemeDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO; 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.dal.dataobject.productdevicerel.ProductDeviceRelDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.productpackagingschemerel.ProductPackagingSchemeRelDO; import cn.iocoder.yudao.module.erp.dal.dataobject.productmoldrel.ProductMoldRelDO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockDO; import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductCategoryMapper; import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; import cn.iocoder.yudao.module.erp.dal.mysql.productdevicerel.ProductDeviceRelMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.productpackagingschemerel.ProductPackagingSchemeRelMapper; import cn.iocoder.yudao.module.erp.dal.mysql.productmoldrel.ProductMoldRelMapper; import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockMapper; import cn.iocoder.yudao.module.erp.service.stock.ErpStockService; @@ -82,11 +85,17 @@ public class ErpProductServiceImpl implements ErpProductService { @Resource private ProductMoldRelMapper productMoldRelMapper; + @Resource + private ProductPackagingSchemeRelMapper productPackagingSchemeRelMapper; + @Resource @Lazy // 延迟注入 private ErpStockService erpStockService; + @Resource + private ErpPackagingSchemeService packagingSchemeService; + @Resource private QrcodeRecordService qrcodeService; @@ -180,6 +189,8 @@ public class ErpProductServiceImpl implements ErpProductService { productMoldRelMapper.insertBatch(relList); } + saveProductPackagingSchemes(product.getId(), createReqVO.getPackagingSchemes(), createReqVO.getDefaultPackagingSchemeId()); + // 生成二维码 CodeTypeEnum codeType = autoCodeUtil.queryCodeType("PRODUCT_CODE_GENERATE"); if (codeType==null){ @@ -262,6 +273,10 @@ public class ErpProductServiceImpl implements ErpProductService { productMoldRelMapper.insertBatch(relList); } + productPackagingSchemeRelMapper.delete(Wrappers.lambdaQuery() + .eq(ProductPackagingSchemeRelDO::getProductId, updateObj.getId())); + saveProductPackagingSchemes(updateObj.getId(), updateReqVO.getPackagingSchemes(), updateReqVO.getDefaultPackagingSchemeId()); + } @Override @@ -323,6 +338,10 @@ public class ErpProductServiceImpl implements ErpProductService { ErpProductRespVO respVO = BeanUtils.toBean(product, ErpProductRespVO.class); respVO.setDevices(productMapper.selectDevicesByProductId(id)); respVO.setMolds(productMapper.selectMoldsByProductId(id)); + List packagingSchemeRels = productPackagingSchemeRelMapper.selectListByProductId(id); + respVO.setPackagingSchemes(BeanUtils.toBean(packagingSchemeRels, ProductPackagingSchemeRespVO.class)); + packagingSchemeRels.stream().filter(item -> Integer.valueOf(1).equals(item.getDefaultStatus())).findFirst() + .ifPresent(item -> respVO.setDefaultPackagingSchemeId(item.getPackagingSchemeId())); if (erpProductCategoryDO !=null ){ respVO.setCategoryType(erpProductCategoryDO.getType()); } @@ -337,6 +356,33 @@ public class ErpProductServiceImpl implements ErpProductService { return respVO; } + private void saveProductPackagingSchemes(Long productId, List packagingSchemes, + Long defaultPackagingSchemeId) { + if (CollUtil.isEmpty(packagingSchemes)) { + return; + } + List schemeIds = packagingSchemes.stream().map(ProductPackagingSchemeSaveReqVO::getPackagingSchemeId) + .distinct().collect(Collectors.toList()); + if (defaultPackagingSchemeId != null && !schemeIds.contains(defaultPackagingSchemeId)) { + throw exception(PACKAGING_SCHEME_NOT_EXISTS); + } + List schemeList = packagingSchemeService.validatePackagingSchemeList(schemeIds); + Map schemeMap = convertMap(schemeList, ErpPackagingSchemeDO::getId); + List relList = schemeIds.stream().map(schemeId -> { + ErpPackagingSchemeDO scheme = schemeMap.get(schemeId); + ProductPackagingSchemeRelDO rel = new ProductPackagingSchemeRelDO(); + rel.setProductId(productId); + rel.setPackagingSchemeId(schemeId); + rel.setPackagingSchemeName(scheme.getName()); + rel.setPackageQuantity(scheme.getPackageQuantity()); + rel.setPalletPackageQuantity(scheme.getPalletPackageQuantity()); + rel.setPalletTotalQuantity(scheme.getPalletTotalQuantity()); + rel.setDefaultStatus(defaultPackagingSchemeId != null && defaultPackagingSchemeId.equals(schemeId) ? 1 : 0); + return rel; + }).collect(Collectors.toList()); + productPackagingSchemeRelMapper.insertBatch(relList); + } + @Override public ErpProductRespVO getProduct(Long id, String code) { if (id != null) {