Commit a36ae0c469f9ab634c7fcc80e370fd3194d1a98c

Authored by YunaiV
1 parent e66ded28

✨ ERP:完成 product 信息、分类、单位的实现

Showing 18 changed files with 255 additions and 54 deletions
yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/ErrorCodeConstants.java
... ... @@ -19,8 +19,11 @@ public interface ErrorCodeConstants {
19 19 ErrorCode PRODUCT_CATEGORY_PARENT_ERROR = new ErrorCode(1_030_501_003, "不能设置自己为父产品分类");
20 20 ErrorCode PRODUCT_CATEGORY_NAME_DUPLICATE = new ErrorCode(1_030_501_004, "已经存在该分类名称的产品分类");
21 21 ErrorCode PRODUCT_CATEGORY_PARENT_IS_CHILD = new ErrorCode(1_030_501_005, "不能设置自己的子分类为父分类");
  22 + ErrorCode PRODUCT_CATEGORY_EXITS_PRODUCT = new ErrorCode(1_030_502_002, "存在产品使用该分类,无法删除");
22 23  
23 24 // ========== ERP 产品单位 1-030-502-000 ==========
24 25 ErrorCode PRODUCT_UNIT_NOT_EXISTS = new ErrorCode(1_030_502_000, "产品单位不存在");
  26 + ErrorCode PRODUCT_UNIT_NAME_DUPLICATE = new ErrorCode(1_030_502_001, "已存在该名字的产品单位");
  27 + ErrorCode PRODUCT_UNIT_EXITS_PRODUCT = new ErrorCode(1_030_502_002, "存在产品使用该单位,无法删除");
25 28  
26 29 }
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductCategoryController.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.product;
2 2  
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
... ... @@ -23,6 +24,7 @@ import java.io.IOException;
23 24 import java.util.List;
24 25  
25 26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
26 28 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
27 29  
28 30 @Tag(name = "管理后台 - ERP 产品分类")
... ... @@ -35,14 +37,14 @@ public class ErpProductCategoryController {
35 37 private ErpProductCategoryService productCategoryService;
36 38  
37 39 @PostMapping("/create")
38   - @Operation(summary = "创建ERP 产品分类")
  40 + @Operation(summary = "创建产品分类")
39 41 @PreAuthorize("@ss.hasPermission('erp:product-category:create')")
40 42 public CommonResult<Long> createProductCategory(@Valid @RequestBody ErpProductCategorySaveReqVO createReqVO) {
41 43 return success(productCategoryService.createProductCategory(createReqVO));
42 44 }
43 45  
44 46 @PutMapping("/update")
45   - @Operation(summary = "更新ERP 产品分类")
  47 + @Operation(summary = "更新产品分类")
46 48 @PreAuthorize("@ss.hasPermission('erp:product-category:update')")
47 49 public CommonResult<Boolean> updateProductCategory(@Valid @RequestBody ErpProductCategorySaveReqVO updateReqVO) {
48 50 productCategoryService.updateProductCategory(updateReqVO);
... ... @@ -50,7 +52,7 @@ public class ErpProductCategoryController {
50 52 }
51 53  
52 54 @DeleteMapping("/delete")
53   - @Operation(summary = "删除ERP 产品分类")
  55 + @Operation(summary = "删除产品分类")
54 56 @Parameter(name = "id", description = "编号", required = true)
55 57 @PreAuthorize("@ss.hasPermission('erp:product-category:delete')")
56 58 public CommonResult<Boolean> deleteProductCategory(@RequestParam("id") Long id) {
... ... @@ -59,31 +61,40 @@ public class ErpProductCategoryController {
59 61 }
60 62  
61 63 @GetMapping("/get")
62   - @Operation(summary = "获得ERP 产品分类")
  64 + @Operation(summary = "获得产品分类")
63 65 @Parameter(name = "id", description = "编号", required = true, example = "1024")
64 66 @PreAuthorize("@ss.hasPermission('erp:product-category:query')")
65 67 public CommonResult<ErpProductCategoryRespVO> getProductCategory(@RequestParam("id") Long id) {
66   - ErpProductCategoryDO productCategory = productCategoryService.getProductCategory(id);
67   - return success(BeanUtils.toBean(productCategory, ErpProductCategoryRespVO.class));
  68 + ErpProductCategoryDO category = productCategoryService.getProductCategory(id);
  69 + return success(BeanUtils.toBean(category, ErpProductCategoryRespVO.class));
68 70 }
69 71  
70 72 @GetMapping("/list")
71   - @Operation(summary = "获得ERP 产品分类列表")
  73 + @Operation(summary = "获得产品分类列表")
72 74 @PreAuthorize("@ss.hasPermission('erp:product-category:query')")
73 75 public CommonResult<List<ErpProductCategoryRespVO>> getProductCategoryList(@Valid ErpProductCategoryListReqVO listReqVO) {
74 76 List<ErpProductCategoryDO> list = productCategoryService.getProductCategoryList(listReqVO);
75 77 return success(BeanUtils.toBean(list, ErpProductCategoryRespVO.class));
76 78 }
77 79  
  80 + @GetMapping("/simple-list")
  81 + @Operation(summary = "获得产品分类精简列表", description = "只包含被开启的分类,主要用于前端的下拉选项")
  82 + public CommonResult<List<ErpProductCategoryRespVO>> getProductCategorySimpleList() {
  83 + List<ErpProductCategoryDO> list = productCategoryService.getProductCategoryList(
  84 + new ErpProductCategoryListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
  85 + return success(convertList(list, category -> new ErpProductCategoryRespVO()
  86 + .setId(category.getId()).setName(category.getName()).setParentId(category.getParentId())));
  87 + }
  88 +
78 89 @GetMapping("/export-excel")
79   - @Operation(summary = "导出ERP 产品分类 Excel")
  90 + @Operation(summary = "导出产品分类 Excel")
80 91 @PreAuthorize("@ss.hasPermission('erp:product-category:export')")
81 92 @OperateLog(type = EXPORT)
82 93 public void exportProductCategoryExcel(@Valid ErpProductCategoryListReqVO listReqVO,
83 94 HttpServletResponse response) throws IOException {
84 95 List<ErpProductCategoryDO> list = productCategoryService.getProductCategoryList(listReqVO);
85 96 // 导出 Excel
86   - ExcelUtils.write(response, "ERP 产品分类.xls", "数据", ErpProductCategoryRespVO.class,
  97 + ExcelUtils.write(response, "产品分类.xls", "数据", ErpProductCategoryRespVO.class,
87 98 BeanUtils.toBean(list, ErpProductCategoryRespVO.class));
88 99 }
89 100  
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductController.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.product;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
6 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 9 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
8 10 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
9 11 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductPageReqVO;
10 12 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductRespVO;
11 13 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSaveReqVO;
  14 +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO;
12 15 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
  16 +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
  17 +import cn.iocoder.yudao.module.erp.service.product.ErpProductCategoryService;
13 18 import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
  19 +import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService;
14 20 import io.swagger.v3.oas.annotations.Operation;
15 21 import io.swagger.v3.oas.annotations.Parameter;
16 22 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -22,9 +28,10 @@ import org.springframework.validation.annotation.Validated;
22 28 import org.springframework.web.bind.annotation.*;
23 29  
24 30 import java.io.IOException;
25   -import java.util.List;
  31 +import java.util.Map;
26 32  
27 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
28 35 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
29 36  
30 37 @Tag(name = "管理后台 - ERP 产品")
... ... @@ -35,6 +42,10 @@ public class ErpProductController {
35 42  
36 43 @Resource
37 44 private ErpProductService productService;
  45 + @Resource
  46 + private ErpProductCategoryService productCategoryService;
  47 + @Resource
  48 + private ErpProductUnitService productUnitService;
38 49  
39 50 @PostMapping("/create")
40 51 @Operation(summary = "创建产品")
... ... @@ -74,7 +85,7 @@ public class ErpProductController {
74 85 @PreAuthorize("@ss.hasPermission('erp:product:query')")
75 86 public CommonResult<PageResult<ProductRespVO>> getProductPage(@Valid ProductPageReqVO pageReqVO) {
76 87 PageResult<ErpProductDO> pageResult = productService.getProductPage(pageReqVO);
77   - return success(BeanUtils.toBean(pageResult, ProductRespVO.class));
  88 + return success(buildProductDetailPage(pageResult));
78 89 }
79 90  
80 91 @GetMapping("/export-excel")
... ... @@ -84,10 +95,26 @@ public class ErpProductController {
84 95 public void exportProductExcel(@Valid ProductPageReqVO pageReqVO,
85 96 HttpServletResponse response) throws IOException {
86 97 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
87   - List<ErpProductDO> list = productService.getProductPage(pageReqVO).getList();
  98 + PageResult<ErpProductDO> pageResult = productService.getProductPage(pageReqVO);
88 99 // 导出 Excel
89 100 ExcelUtils.write(response, "产品.xls", "数据", ProductRespVO.class,
90   - BeanUtils.toBean(list, ProductRespVO.class));
  101 + buildProductDetailPage(pageResult).getList());
  102 + }
  103 +
  104 + private PageResult<ProductRespVO> buildProductDetailPage(PageResult<ErpProductDO> pageResult) {
  105 + if (CollUtil.isEmpty(pageResult.getList())) {
  106 + return PageResult.empty(pageResult.getTotal());
  107 + }
  108 + Map<Long, ErpProductCategoryDO> categoryMap = productCategoryService.getProductCategoryMap(
  109 + convertSet(pageResult.getList(), ErpProductDO::getCategoryId));
  110 + Map<Long, ErpProductUnitDO> unitMap = productUnitService.getProductUnitMap(
  111 + convertSet(pageResult.getList(), ErpProductDO::getUnitId));
  112 + return BeanUtils.toBean(pageResult, ProductRespVO.class, product -> {
  113 + MapUtils.findAndThen(categoryMap, product.getCategoryId(),
  114 + category -> product.setCategoryName(category.getName()));
  115 + MapUtils.findAndThen(unitMap, product.getUnitId(),
  116 + unit -> product.setUnitName(unit.getName()));
  117 + });
91 118 }
92 119  
93 120 }
94 121 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/ErpProductUnitController.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.product;
2 2  
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -25,6 +26,7 @@ import java.io.IOException;
25 26 import java.util.List;
26 27  
27 28 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  29 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
28 30 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
29 31  
30 32 @Tag(name = "管理后台 - ERP 产品单位")
... ... @@ -77,6 +79,13 @@ public class ErpProductUnitController {
77 79 return success(BeanUtils.toBean(pageResult, ErpProductUnitRespVO.class));
78 80 }
79 81  
  82 + @GetMapping("/simple-list")
  83 + @Operation(summary = "获得产品单位精简列表", description = "只包含被开启的单位,主要用于前端的下拉选项")
  84 + public CommonResult<List<ErpProductUnitRespVO>> getProductUnitSimpleList() {
  85 + List<ErpProductUnitDO> list = productUnitService.getProductUnitListByStatus(CommonStatusEnum.ENABLE.getStatus());
  86 + return success(convertList(list, unit -> new ErpProductUnitRespVO().setId(unit.getId()).setName(unit.getName())));
  87 + }
  88 +
80 89 @GetMapping("/export-excel")
81 90 @Operation(summary = "导出产品单位 Excel")
82 91 @PreAuthorize("@ss.hasPermission('erp:product-unit:export')")
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductRespVO.java
... ... @@ -26,12 +26,16 @@ public class ProductRespVO {
26 26 private String barCode;
27 27  
28 28 @Schema(description = "产品分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11161")
29   - @ExcelProperty("产品分类编号")
30 29 private Long categoryId;
  30 + @Schema(description = "产品分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "水果")
  31 + @ExcelProperty("产品分类")
  32 + private String categoryName;
31 33  
32 34 @Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8869")
33   - @ExcelProperty("单位编号")
34   - private Integer unitId;
  35 + private Long unitId;
  36 + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "个")
  37 + @ExcelProperty("单位")
  38 + private String unitName;
35 39  
36 40 @Schema(description = "产品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
37 41 @ExcelProperty("产品状态")
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/product/ProductSaveReqVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.product.vo.product;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.*;
5   -import java.util.*;
6   -import jakarta.validation.constraints.*;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
7 8 import java.math.BigDecimal;
8 9  
9 10 @Schema(description = "管理后台 - ERP 产品新增/修改 Request VO")
... ... @@ -27,7 +28,7 @@ public class ProductSaveReqVO {
27 28  
28 29 @Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8869")
29 30 @NotNull(message = "单位编号不能为空")
30   - private Integer unitId;
  31 + private Long unitId;
31 32  
32 33 @Schema(description = "产品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
33 34 @NotNull(message = "产品状态不能为空")
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitPageReqVO.java
... ... @@ -5,11 +5,6 @@ import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 7 import lombok.ToString;
8   -import org.springframework.format.annotation.DateTimeFormat;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 8  
14 9 @Schema(description = "管理后台 - ERP 产品单位分页 Request VO")
15 10 @Data
... ... @@ -23,8 +18,4 @@ public class ErpProductUnitPageReqVO extends PageParam {
23 18 @Schema(description = "单位状态", example = "1")
24 19 private Integer status;
25 20  
26   - @Schema(description = "创建时间")
27   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
28   - private LocalDateTime[] createTime;
29   -
30 21 }
31 22 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitRespVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit;
2 2  
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
3 5 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4 6 import com.alibaba.excel.annotation.ExcelProperty;
5 7 import io.swagger.v3.oas.annotations.media.Schema;
6   -import jakarta.validation.constraints.NotNull;
7 8 import lombok.Data;
8 9  
9 10 import java.time.LocalDateTime;
... ... @@ -23,7 +24,7 @@ public class ErpProductUnitRespVO {
23 24  
24 25 @Schema(description = "单位状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
25 26 @ExcelProperty("单位状态")
26   - @NotNull(message = "分类排序不能为空")
  27 + @DictFormat(DictTypeConstants.COMMON_STATUS)
27 28 private Integer status;
28 29  
29 30 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/product/vo/unit/ErpProductUnitSaveReqVO.java
1 1 package cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit;
2 2  
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 5 import io.swagger.v3.oas.annotations.media.Schema;
4 6 import jakarta.validation.constraints.NotEmpty;
5 7 import jakarta.validation.constraints.NotNull;
... ... @@ -18,6 +20,7 @@ public class ErpProductUnitSaveReqVO {
18 20  
19 21 @Schema(description = "单位状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
20 22 @NotNull(message = "单位状态不能为空")
  23 + @InEnum(CommonStatusEnum.class)
21 24 private Integer status;
22 25  
23 26 }
24 27 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/product/ErpProductDO.java
... ... @@ -45,9 +45,9 @@ public class ErpProductDO extends BaseDO {
45 45 /**
46 46 * 单位编号
47 47 *
48   - * TODO 芋艿,关联
  48 + * 关联 {@link ErpProductUnitDO#getId()}
49 49 */
50   - private Integer unitId;
  50 + private Long unitId;
51 51 /**
52 52 * 产品状态
53 53 *
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductMapper.java
... ... @@ -23,4 +23,12 @@ public interface ErpProductMapper extends BaseMapperX&lt;ErpProductDO&gt; {
23 23 .orderByDesc(ErpProductDO::getId));
24 24 }
25 25  
  26 + default Long selectCountByCategoryId(Long categoryId) {
  27 + return selectCount(ErpProductDO::getCategoryId, categoryId);
  28 + }
  29 +
  30 + default Long selectCountByUnitId(Long unitId) {
  31 + return selectCount(ErpProductDO::getUnitId, unitId);
  32 + }
  33 +
26 34 }
27 35 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/product/ErpProductUnitMapper.java
... ... @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUn
7 7 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
  10 +import java.util.List;
  11 +
10 12 /**
11 13 * ERP 产品单位 Mapper
12 14 *
... ... @@ -19,8 +21,15 @@ public interface ErpProductUnitMapper extends BaseMapperX&lt;ErpProductUnitDO&gt; {
19 21 return selectPage(reqVO, new LambdaQueryWrapperX<ErpProductUnitDO>()
20 22 .likeIfPresent(ErpProductUnitDO::getName, reqVO.getName())
21 23 .eqIfPresent(ErpProductUnitDO::getStatus, reqVO.getStatus())
22   - .betweenIfPresent(ErpProductUnitDO::getCreateTime, reqVO.getCreateTime())
23 24 .orderByDesc(ErpProductUnitDO::getId));
24 25 }
25 26  
  27 + default ErpProductUnitDO selectByName(String name) {
  28 + return selectOne(ErpProductUnitDO::getName, name);
  29 + }
  30 +
  31 + default List<ErpProductUnitDO> selectListByStatus(Integer status) {
  32 + return selectList(ErpProductUnitDO::getStatus, status);
  33 + }
  34 +
26 35 }
27 36 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductCategoryService.java
... ... @@ -5,7 +5,11 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.category.ErpProdu
5 5 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO;
6 6 import jakarta.validation.Valid;
7 7  
  8 +import java.util.Collection;
8 9 import java.util.List;
  10 +import java.util.Map;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
9 13  
10 14 /**
11 15 * ERP 产品分类 Service 接口
... ... @@ -40,7 +44,7 @@ public interface ErpProductCategoryService {
40 44 * 获得产品分类
41 45 *
42 46 * @param id 编号
43   - * @return ERP 产品分类
  47 + * @return 产品分类
44 48 */
45 49 ErpProductCategoryDO getProductCategory(Long id);
46 50  
... ... @@ -48,8 +52,26 @@ public interface ErpProductCategoryService {
48 52 * 获得产品分类列表
49 53 *
50 54 * @param listReqVO 查询条件
51   - * @return ERP 产品分类列表
  55 + * @return 产品分类列表
52 56 */
53 57 List<ErpProductCategoryDO> getProductCategoryList(ErpProductCategoryListReqVO listReqVO);
54 58  
  59 + /**
  60 + * 获得产品分类列表
  61 + *
  62 + * @param ids 编号数组
  63 + * @return 产品分类列表
  64 + */
  65 + List<ErpProductCategoryDO> getProductCategoryList(Collection<Long> ids);
  66 +
  67 + /**
  68 + * 获得产品分类 Map
  69 + *
  70 + * @param ids 编号数组
  71 + * @return 产品分类 Map
  72 + */
  73 + default Map<Long, ErpProductCategoryDO> getProductCategoryMap(Collection<Long> ids) {
  74 + return convertMap(getProductCategoryList(ids), ErpProductCategoryDO::getId);
  75 + }
  76 +
55 77 }
56 78 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductCategoryServiceImpl.java
... ... @@ -6,9 +6,11 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.category.ErpProdu
6 6 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO;
7 7 import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductCategoryMapper;
8 8 import jakarta.annotation.Resource;
  9 +import org.springframework.context.annotation.Lazy;
9 10 import org.springframework.stereotype.Service;
10 11 import org.springframework.validation.annotation.Validated;
11 12  
  13 +import java.util.Collection;
12 14 import java.util.List;
13 15 import java.util.Objects;
14 16  
... ... @@ -27,6 +29,10 @@ public class ErpProductCategoryServiceImpl implements ErpProductCategoryService
27 29 @Resource
28 30 private ErpProductCategoryMapper productCategoryMapper;
29 31  
  32 + @Resource
  33 + @Lazy // 延迟加载,避免循环依赖
  34 + private ErpProductService productService;
  35 +
30 36 @Override
31 37 public Long createProductCategory(ErpProductCategorySaveReqVO createReqVO) {
32 38 // 校验父分类编号的有效性
... ... @@ -57,13 +63,17 @@ public class ErpProductCategoryServiceImpl implements ErpProductCategoryService
57 63  
58 64 @Override
59 65 public void deleteProductCategory(Long id) {
60   - // 校验存在
  66 + // 1.1 校验存在
61 67 validateProductCategoryExists(id);
62   - // 校验是否有子产品分类
  68 + // 1.2 校验是否有子产品分类
63 69 if (productCategoryMapper.selectCountByParentId(id) > 0) {
64 70 throw exception(PRODUCT_CATEGORY_EXITS_CHILDREN);
65 71 }
66   - // 删除
  72 + // 1.3 校验是否有产品
  73 + if (productService.getProductCountByCategoryId(id) > 0) {
  74 + throw exception(PRODUCT_CATEGORY_EXITS_PRODUCT);
  75 + }
  76 + // 2. 删除
67 77 productCategoryMapper.deleteById(id);
68 78 }
69 79  
... ... @@ -131,4 +141,9 @@ public class ErpProductCategoryServiceImpl implements ErpProductCategoryService
131 141 return productCategoryMapper.selectList(listReqVO);
132 142 }
133 143  
  144 + @Override
  145 + public List<ErpProductCategoryDO> getProductCategoryList(Collection<Long> ids) {
  146 + return productCategoryMapper.selectBatchIds(ids);
  147 + }
  148 +
134 149 }
135 150 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductService.java
... ... @@ -51,4 +51,20 @@ public interface ErpProductService {
51 51 */
52 52 PageResult<ErpProductDO> getProductPage(ProductPageReqVO pageReqVO);
53 53  
  54 + /**
  55 + * 基于产品分类编号,获得产品数量
  56 + *
  57 + * @param categoryId 产品分类编号
  58 + * @return 产品数量
  59 + */
  60 + Long getProductCountByCategoryId(Long categoryId);
  61 +
  62 + /**
  63 + * 基于产品单位编号,获得产品数量
  64 + *
  65 + * @param unitId 产品单位编号
  66 + * @return 产品数量
  67 + */
  68 + Long getProductCountByUnitId(Long unitId);
  69 +
54 70 }
55 71 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java
... ... @@ -69,4 +69,14 @@ public class ErpProductServiceImpl implements ErpProductService {
69 69 return productMapper.selectPage(pageReqVO);
70 70 }
71 71  
  72 + @Override
  73 + public Long getProductCountByCategoryId(Long categoryId) {
  74 + return productMapper.selectCountByCategoryId(categoryId);
  75 + }
  76 +
  77 + @Override
  78 + public Long getProductCountByUnitId(Long unitId) {
  79 + return productMapper.selectCountByUnitId(unitId);
  80 + }
  81 +
72 82 }
73 83 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitService.java
1 1 package cn.iocoder.yudao.module.erp.service.product;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 4 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitPageReqVO;
4 5 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitSaveReqVO;
5   -import jakarta.validation.*;
6 6 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
7   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.Collection;
  10 +import java.util.List;
  11 +import java.util.Map;
  12 +
  13 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
8 14  
9 15 /**
10 16 * ERP 产品单位 Service 接口
... ... @@ -51,4 +57,30 @@ public interface ErpProductUnitService {
51 57 */
52 58 PageResult<ErpProductUnitDO> getProductUnitPage(ErpProductUnitPageReqVO pageReqVO);
53 59  
  60 + /**
  61 + * 获得指定状态的产品单位列表
  62 + *
  63 + * @param status 状态
  64 + * @return 产品单位列表
  65 + */
  66 + List<ErpProductUnitDO> getProductUnitListByStatus(Integer status);
  67 +
  68 + /**
  69 + * 获得产品单位列表
  70 + *
  71 + * @param ids 编号数组
  72 + * @return 产品单位列表
  73 + */
  74 + List<ErpProductUnitDO> getProductUnitList(Collection<Long> ids);
  75 +
  76 + /**
  77 + * 获得产品单位 Map
  78 + *
  79 + * @param ids 编号数组
  80 + * @return 产品单位 Map
  81 + */
  82 + default Map<Long, ErpProductUnitDO> getProductUnitMap(Collection<Long> ids) {
  83 + return convertMap(getProductUnitList(ids), ErpProductUnitDO::getId);
  84 + }
  85 +
54 86 }
55 87 \ No newline at end of file
... ...
yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductUnitServiceImpl.java
1 1 package cn.iocoder.yudao.module.erp.service.product;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
3 5 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitPageReqVO;
4 6 import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitSaveReqVO;
5   -import org.springframework.stereotype.Service;
  7 +import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
  8 +import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductUnitMapper;
  9 +import com.google.common.annotations.VisibleForTesting;
6 10 import jakarta.annotation.Resource;
  11 +import org.springframework.context.annotation.Lazy;
  12 +import org.springframework.stereotype.Service;
7 13 import org.springframework.validation.annotation.Validated;
8 14  
9   -import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
10   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
11   -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
12   -
13   -import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductUnitMapper;
  15 +import java.util.Collection;
  16 +import java.util.List;
14 17  
15 18 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
16   -import static cn.iocoder.yudao.module.erp.ErrorCodeConstants.PRODUCT_UNIT_NOT_EXISTS;
  19 +import static cn.iocoder.yudao.module.erp.ErrorCodeConstants.*;
17 20  
18 21 /**
19 22 * ERP 产品单位 Service 实现类
... ... @@ -27,29 +30,55 @@ public class ErpProductUnitServiceImpl implements ErpProductUnitService {
27 30 @Resource
28 31 private ErpProductUnitMapper productUnitMapper;
29 32  
  33 + @Resource
  34 + @Lazy // 延迟加载,避免循环依赖
  35 + private ErpProductService productService;
  36 +
30 37 @Override
31 38 public Long createProductUnit(ErpProductUnitSaveReqVO createReqVO) {
32   - // 插入
  39 + // 1. 校验名字唯一
  40 + validateProductUnitNameUnique(null, createReqVO.getName());
  41 + // 2. 插入
33 42 ErpProductUnitDO unit = BeanUtils.toBean(createReqVO, ErpProductUnitDO.class);
34 43 productUnitMapper.insert(unit);
35   - // 返回
36 44 return unit.getId();
37 45 }
38 46  
39 47 @Override
40 48 public void updateProductUnit(ErpProductUnitSaveReqVO updateReqVO) {
41   - // 校验存在
  49 + // 1.1 校验存在
42 50 validateProductUnitExists(updateReqVO.getId());
43   - // 更新
  51 + // 1.2 校验名字唯一
  52 + validateProductUnitNameUnique(updateReqVO.getId(), updateReqVO.getName());
  53 + // 2. 更新
44 54 ErpProductUnitDO updateObj = BeanUtils.toBean(updateReqVO, ErpProductUnitDO.class);
45 55 productUnitMapper.updateById(updateObj);
46 56 }
47 57  
  58 + @VisibleForTesting
  59 + void validateProductUnitNameUnique(Long id, String name) {
  60 + ErpProductUnitDO unit = productUnitMapper.selectByName(name);
  61 + if (unit == null) {
  62 + return;
  63 + }
  64 + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型
  65 + if (id == null) {
  66 + throw exception(PRODUCT_UNIT_NAME_DUPLICATE);
  67 + }
  68 + if (!unit.getId().equals(id)) {
  69 + throw exception(PRODUCT_UNIT_NAME_DUPLICATE);
  70 + }
  71 + }
  72 +
48 73 @Override
49 74 public void deleteProductUnit(Long id) {
50   - // 校验存在
  75 + // 1.1 校验存在
51 76 validateProductUnitExists(id);
52   - // 删除
  77 + // 1.2 校验商品是否使用
  78 + if (productService.getProductCountByUnitId(id) > 0) {
  79 + throw exception(PRODUCT_UNIT_EXITS_PRODUCT);
  80 + }
  81 + // 2. 删除
53 82 productUnitMapper.deleteById(id);
54 83 }
55 84  
... ... @@ -69,4 +98,14 @@ public class ErpProductUnitServiceImpl implements ErpProductUnitService {
69 98 return productUnitMapper.selectPage(pageReqVO);
70 99 }
71 100  
  101 + @Override
  102 + public List<ErpProductUnitDO> getProductUnitListByStatus(Integer status) {
  103 + return productUnitMapper.selectListByStatus(status);
  104 + }
  105 +
  106 + @Override
  107 + public List<ErpProductUnitDO> getProductUnitList(Collection<Long> ids) {
  108 + return productUnitMapper.selectBatchIds(ids);
  109 + }
  110 +
72 111 }
73 112 \ No newline at end of file
... ...