Эх сурвалжийг харах

分类、产品、物料 功能迁移到产品库模块

home 2 жил өмнө
parent
commit
4427baad1b
34 өөрчлөгдсөн 272 нэмэгдсэн , 1197 устгасан
  1. 0 18
      hx-api/iot-management-api/src/main/java/com/fjhx/constant/IotManagementLockConstant.java
  2. 0 54
      hx-api/iot-management-api/src/main/java/com/fjhx/entity/classif/Classif.java
  3. 0 88
      hx-api/iot-management-api/src/main/java/com/fjhx/entity/material/Material.java
  4. 0 65
      hx-api/iot-management-api/src/main/java/com/fjhx/entity/product/Product.java
  5. 0 20
      hx-api/iot-management-api/src/main/java/com/fjhx/enums/classify/ClassifTypeEnum.java
  6. 0 17
      hx-api/iot-management-api/src/main/java/com/fjhx/params/classif/ClassifVo.java
  7. 0 17
      hx-api/iot-management-api/src/main/java/com/fjhx/params/material/MaterialEx.java
  8. 0 17
      hx-api/iot-management-api/src/main/java/com/fjhx/params/material/MaterialVo.java
  9. 0 17
      hx-api/iot-management-api/src/main/java/com/fjhx/params/product/ProductVo.java
  10. 7 2
      hx-api/product-library-api/src/main/java/com/fjhx/constant/LockConstant.java
  11. 0 62
      hx-serve/iot-management/src/main/java/com/fjhx/classif/controller/ClassifController.java
  12. 0 16
      hx-serve/iot-management/src/main/java/com/fjhx/classif/mapper/ClassifMapper.java
  13. 0 5
      hx-serve/iot-management/src/main/java/com/fjhx/classif/mapper/ClassifMapper.xml
  14. 0 38
      hx-serve/iot-management/src/main/java/com/fjhx/classif/service/ClassifService.java
  15. 0 129
      hx-serve/iot-management/src/main/java/com/fjhx/classif/service/impl/ClassifServiceImpl.java
  16. 0 72
      hx-serve/iot-management/src/main/java/com/fjhx/material/controller/MaterialController.java
  17. 0 21
      hx-serve/iot-management/src/main/java/com/fjhx/material/mapper/MaterialMapper.java
  18. 0 10
      hx-serve/iot-management/src/main/java/com/fjhx/material/mapper/MaterialMapper.xml
  19. 0 36
      hx-serve/iot-management/src/main/java/com/fjhx/material/service/MaterialService.java
  20. 0 150
      hx-serve/iot-management/src/main/java/com/fjhx/material/service/impl/MaterialServiceImpl.java
  21. 0 72
      hx-serve/iot-management/src/main/java/com/fjhx/product/controller/ProductController.java
  22. 0 21
      hx-serve/iot-management/src/main/java/com/fjhx/product/mapper/ProductMapper.java
  23. 0 10
      hx-serve/iot-management/src/main/java/com/fjhx/product/mapper/ProductMapper.xml
  24. 0 33
      hx-serve/iot-management/src/main/java/com/fjhx/product/service/ProductService.java
  25. 0 120
      hx-serve/iot-management/src/main/java/com/fjhx/product/service/impl/ProductServiceImpl.java
  26. 9 16
      hx-serve/product-library/src/main/java/com/fjhx/classify/controller/ClassifyController.java
  27. 9 2
      hx-serve/product-library/src/main/java/com/fjhx/classify/service/ClassifyService.java
  28. 84 16
      hx-serve/product-library/src/main/java/com/fjhx/classify/service/impl/ClassifyServiceImpl.java
  29. 6 12
      hx-serve/product-library/src/main/java/com/fjhx/material/controller/MaterialController.java
  30. 1 3
      hx-serve/product-library/src/main/java/com/fjhx/material/service/MaterialService.java
  31. 92 13
      hx-serve/product-library/src/main/java/com/fjhx/material/service/impl/MaterialServiceImpl.java
  32. 5 11
      hx-serve/product-library/src/main/java/com/fjhx/product/controller/ProductController.java
  33. 0 2
      hx-serve/product-library/src/main/java/com/fjhx/product/service/ProductService.java
  34. 59 12
      hx-serve/product-library/src/main/java/com/fjhx/product/service/impl/ProductServiceImpl.java

+ 0 - 18
hx-api/iot-management-api/src/main/java/com/fjhx/constant/IotManagementLockConstant.java

@@ -1,18 +0,0 @@
-package com.fjhx.constant;
-
-/**
- * 锁常量
- */
-public interface IotManagementLockConstant {
-
-    /**
-     * 保证物料编码唯一
-     */
-    String MATERIAL_CODE_ONLY_LOCK = "materialCodeOnlyLock-";
-
-    /**
-     * 保证产品编码唯一
-     */
-    String PRODUCT_CODE_ONLY_LOCK = "productCodeOnlyLock-";
-
-}

+ 0 - 54
hx-api/iot-management-api/src/main/java/com/fjhx/entity/classif/Classif.java

@@ -1,54 +0,0 @@
-package com.fjhx.entity.classif;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * <p>
- * 分类
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class Classif extends BaseEntity {
-
-
-    /**
-     * 类型 (1产品分类 2物料分类)
-     */
-    private Integer type;
-
-    /**
-     * 父级分类id
-     */
-    private Long parentId;
-
-    /**
-     * 父级分类id集合,用,拼接
-     */
-    private String parentIdSet;
-
-    /**
-     * 分类名称
-     */
-    private String name;
-
-    /**
-     * 逻辑删除 0未删除 1已删除
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @TableLogic
-    private Integer delFlag;
-
-
-}

+ 0 - 88
hx-api/iot-management-api/src/main/java/com/fjhx/entity/material/Material.java

@@ -1,88 +0,0 @@
-package com.fjhx.entity.material;
-
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.fjhx.base.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.math.BigDecimal;
-
-/**
- * <p>
- * 物料
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class Material extends BaseEntity {
-
-
-    /**
-     * 分类id
-     */
-    private Long classifId;
-
-    /**
-     * 编码
-     */
-    private String code;
-
-    /**
-     * 名称
-     */
-    private String name;
-
-    /**
-     * 规格
-     */
-    private String spec;
-
-    /**
-     * 安全库存
-     */
-    private BigDecimal safetyStock;
-
-    /**
-     * 单位
-     */
-    private String unit;
-
-    /**
-     * 采购周期/天
-     */
-    private Integer cycle;
-
-    /**
-     * 质检比例
-     */
-    private BigDecimal qualityTestingRate;
-
-    /**
-     * 是否卷材
-     */
-    private Integer coiled;
-
-    /**
-     * 头尾损耗
-     */
-    private BigDecimal loss;
-
-    /**
-     * 备注
-     */
-    private String remarks;
-
-    /**
-     * 逻辑删除 0未删除 1已删除
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @TableLogic
-    private Integer delFlag;
-
-
-}

+ 0 - 65
hx-api/iot-management-api/src/main/java/com/fjhx/entity/product/Product.java

@@ -1,65 +0,0 @@
-package com.fjhx.entity.product;
-
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.fjhx.base.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * <p>
- * 产品
- * </p>
- *
- * @author ${author}
- * @since 2022-06-30
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class Product extends BaseEntity {
-    
-    /**
-     * 产品分类id
-     */
-    private Long classifId;
-
-    /**
-     * 产品编号
-     */
-    private String code;
-
-    /**
-     * 产品名称
-     */
-    private String name;
-
-    /**
-     * 型号
-     */
-    private String model;
-
-    /**
-     * 单位
-     */
-    private String unit;
-
-    /**
-     * 产品说明
-     */
-    private String introduce;
-
-    /**
-     * 备注
-     */
-    private String remarks;
-
-    /**
-     * 逻辑删除 0未删除 1已删除
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @TableLogic
-    private Integer delFlag;
-
-
-}

+ 0 - 20
hx-api/iot-management-api/src/main/java/com/fjhx/enums/classify/ClassifTypeEnum.java

@@ -1,20 +0,0 @@
-package com.fjhx.enums.classify;
-
-import lombok.Getter;
-
-@Getter
-public enum ClassifTypeEnum {
-
-    PRODUCT_TYPE(1, "产品分类"),
-    MATERIAL_TYPE(2, "物料分类");
-
-    private final Integer code;
-
-    private final String message;
-
-    ClassifTypeEnum(Integer code, String message) {
-        this.code = code;
-        this.message = message;
-    }
-
-}

+ 0 - 17
hx-api/iot-management-api/src/main/java/com/fjhx/params/classif/ClassifVo.java

@@ -1,17 +0,0 @@
-package com.fjhx.params.classif;
-
-import com.fjhx.entity.classif.Classif;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 分类
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class ClassifVo extends Classif {
-
-}

+ 0 - 17
hx-api/iot-management-api/src/main/java/com/fjhx/params/material/MaterialEx.java

@@ -1,17 +0,0 @@
-package com.fjhx.params.material;
-
-import com.fjhx.entity.material.Material;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 物料
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class MaterialEx extends Material {
-
-}

+ 0 - 17
hx-api/iot-management-api/src/main/java/com/fjhx/params/material/MaterialVo.java

@@ -1,17 +0,0 @@
-package com.fjhx.params.material;
-
-import com.fjhx.entity.material.Material;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 物料
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class MaterialVo extends Material {
-
-}

+ 0 - 17
hx-api/iot-management-api/src/main/java/com/fjhx/params/product/ProductVo.java

@@ -1,17 +0,0 @@
-package com.fjhx.params.product;
-
-import com.fjhx.entity.product.Product;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 产品
- *
- * @author ${author}
- * @since 2022-06-30
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class ProductVo extends Product {
-
-}

+ 7 - 2
hx-api/product-library-api/src/main/java/com/fjhx/constant/LockConstant.java

@@ -6,13 +6,18 @@ package com.fjhx.constant;
 public interface LockConstant {
 
     /**
+     * 添加前缀,防止其他模块出现公用一把锁的情况
+     */
+    String PREFIX = "productLibrary-";
+
+    /**
      * 保证物料编码唯一
      */
-    String MATERIAL_CODE_ONLY_LOCK = "materialCodeOnlyLock-";
+    String MATERIAL_CODE_ONLY_LOCK = PREFIX + "materialCodeOnlyLock-";
 
     /**
      * 保证产品编码唯一
      */
-    String PRODUCT_CODE_ONLY_LOCK = "productCodeOnlyLock-";
+    String PRODUCT_CODE_ONLY_LOCK = PREFIX + "productCodeOnlyLock-";
 
 }

+ 0 - 62
hx-serve/iot-management/src/main/java/com/fjhx/classif/controller/ClassifController.java

@@ -1,62 +0,0 @@
-package com.fjhx.classif.controller;
-
-import com.fjhx.entity.classif.Classif;
-import com.fjhx.classif.service.ClassifService;
-import com.fjhx.params.classif.ClassifVo;
-import org.springblade.core.tool.api.R;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 分类 前端控制器
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@RestController
-@RequestMapping("/classif")
-public class ClassifController {
-
-    @Autowired
-    private ClassifService classifService;
-
-    @PostMapping("/tree")
-    public R page(@RequestBody Map<String, String> condition) {
-        List<Map<String,Object>> result = classifService.getTree(condition);
-        return R.success(result);
-    }
-
-    @PostMapping("/add")
-    public R add(@RequestBody ClassifVo classifVo) {
-        classifService.add(classifVo);
-        return R.success();
-    }
-
-    @PostMapping("/edit")
-    public R edit(@RequestBody ClassifVo classifVo) {
-        classifService.edit(classifVo);
-        return R.success();
-    }
-
-    @PostMapping("/delete")
-    public R delete(@RequestBody ClassifVo classifVo) {
-        classifService.delete(classifVo);
-        return R.success();
-    }
-
-    @PostMapping("/detail")
-    public R detail(@RequestBody ClassifVo classifVo) {
-        Classif result = classifService.detail(classifVo);
-        return R.success(result);
-    }
-
-}
-

+ 0 - 16
hx-serve/iot-management/src/main/java/com/fjhx/classif/mapper/ClassifMapper.java

@@ -1,16 +0,0 @@
-package com.fjhx.classif.mapper;
-
-import com.fjhx.entity.classif.Classif;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- * <p>
- * 分类 Mapper 接口
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-public interface ClassifMapper extends BaseMapper<Classif> {
-
-}

+ 0 - 5
hx-serve/iot-management/src/main/java/com/fjhx/classif/mapper/ClassifMapper.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.fjhx.classif.mapper.ClassifMapper">
-
-</mapper>

+ 0 - 38
hx-serve/iot-management/src/main/java/com/fjhx/classif/service/ClassifService.java

@@ -1,38 +0,0 @@
-package com.fjhx.classif.service;
-
-import com.fjhx.base.BaseService;
-import com.fjhx.entity.classif.Classif;
-import com.fjhx.params.classif.ClassifVo;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 分类 服务类
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-public interface ClassifService extends BaseService<Classif> {
-
-    void add(ClassifVo classifVo);
-
-    void edit(ClassifVo classifVo);
-
-    void delete(ClassifVo classifVo);
-
-    Classif detail(ClassifVo classifVo);
-
-    List<Map<String, Object>> getTree(Map<String, String> condition);
-
-    /**
-     * 获取 分类id 和 分类子级id 数组
-     *
-     * @param classifId 分类id
-     * @return 分类id 和 分类子级id 数组
-     */
-    List<Long> getChildrenIdList(Long classifId);
-
-}

+ 0 - 129
hx-serve/iot-management/src/main/java/com/fjhx/classif/service/impl/ClassifServiceImpl.java

@@ -1,129 +0,0 @@
-package com.fjhx.classif.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.base.BaseEntity;
-import com.fjhx.entity.classif.Classif;
-import com.fjhx.enums.classify.ClassifTypeEnum;
-import com.fjhx.classif.mapper.ClassifMapper;
-import com.fjhx.classif.service.ClassifService;
-import com.fjhx.params.classif.ClassifVo;
-import com.fjhx.entity.material.Material;
-import com.fjhx.material.service.MaterialService;
-import com.fjhx.entity.product.Product;
-import com.fjhx.product.service.ProductService;
-import com.fjhx.utils.Assert;
-import com.fjhx.utils.TreeUtil;
-import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.core.tool.utils.ObjectUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- * 分类 服务实现类
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@Service
-public class ClassifServiceImpl extends ServiceImpl<ClassifMapper, Classif> implements ClassifService {
-
-    @Autowired
-    private ProductService productService;
-
-    @Autowired
-    private MaterialService materialService;
-
-    @Override
-    public void add(ClassifVo classifVo) {
-
-        Long parentId = classifVo.getParentId();
-        if (parentId == null) {
-            classifVo.setParentId(0L);
-            classifVo.setParentIdSet(null);
-        } else if (parentId != 0L) {
-            // 查询父级分类
-            Classif parentClassif = getById(parentId);
-            Assert.notEmpty(parentClassif, "父级分类为空");
-
-            // 赋值父级id集合
-            String parentIdSet = parentClassif.getParentIdSet();
-            classifVo.setParentIdSet(
-                    (ObjectUtil.isEmpty(parentIdSet) ? "" : parentIdSet + ",") + parentId);
-        }
-
-        save(classifVo);
-    }
-
-    @Override
-    public void edit(ClassifVo classifVo) {
-        updateById(classifVo);
-    }
-
-    @Override
-    public void delete(ClassifVo classifVo) {
-        Long id = classifVo.getId();
-        Integer type = classifVo.getType();
-
-        Assert.notEmpty(id, "分类id不能为空");
-        Assert.notEmpty(type, "分类类型不能为空");
-
-        Integer childrenCount = lambdaQuery().eq(Classif::getParentId, id).count();
-        Assert.eqZero(childrenCount, "该分类下存在子级分类,无法删除");
-
-        if (type.equals(ClassifTypeEnum.PRODUCT_TYPE.getCode())) {
-            Integer relationCount = productService.lambdaQuery().eq(Product::getClassifId, id).count();
-            Assert.eqZero(relationCount, "该分类下存在产品,无法删除");
-        } else {
-            Integer relationCount = materialService.lambdaQuery().eq(Material::getClassifId, id).count();
-            Assert.eqZero(relationCount, "该分类下存在物料,无法删除");
-        }
-
-        removeById(classifVo.getId());
-    }
-
-    @Override
-    public Classif detail(ClassifVo classifVo) {
-        Classif result = getById(classifVo.getId());
-        return result;
-    }
-
-    @Override
-    public List<Map<String, Object>> getTree(Map<String, String> condition) {
-
-        Object type = condition.get("type");
-        Assert.notEmpty(type, "分类类型不能为空");
-
-        List<Classif> list = lambdaQuery()
-                .eq(Classif::getType, type)
-                .select(Classif::getId, Classif::getName, Classif::getParentId)
-                .list();
-
-        // 构建树形
-        List<Map<String, Object>> result = TreeUtil.buildTree("name", list);
-
-        return result;
-    }
-
-    @Override
-    public List<Long> getChildrenIdList(Long classifId) {
-
-        List<Classif> list = lambdaQuery()
-                .select(BaseEntity::getId)
-                .eq(BaseEntity::getTenantId, AuthUtil.getTenantId())
-                .like(Classif::getParentIdSet, classifId)
-                .list();
-
-        List<Long> result = list.stream().map(BaseEntity::getId).collect(Collectors.toList());
-
-        result.add(0, classifId);
-
-        return result;
-    }
-
-}

+ 0 - 72
hx-serve/iot-management/src/main/java/com/fjhx/material/controller/MaterialController.java

@@ -1,72 +0,0 @@
-package com.fjhx.material.controller;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.entity.material.Material;
-import com.fjhx.material.service.MaterialService;
-import com.fjhx.params.material.MaterialVo;
-import org.springblade.core.tool.api.R;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 物料 前端控制器
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@RestController
-@RequestMapping("/material")
-public class MaterialController {
-
-    @Autowired
-    private MaterialService materialService;
-
-    @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition) {
-        Page<Material> result = materialService.getPage(condition);
-        return R.success(result);
-    }
-
-    @PostMapping("/add")
-    public R add(@RequestBody MaterialVo materialVo) {
-        materialService.add(materialVo);
-        return R.success();
-    }
-
-    @PostMapping("/edit")
-    public R edit(@RequestBody MaterialVo materialVo) {
-        materialService.edit(materialVo);
-        return R.success();
-    }
-
-    @PostMapping("/delete")
-    public R delete(@RequestBody MaterialVo materialVo) {
-        materialService.delete(materialVo);
-        return R.success();
-    }
-
-    @PostMapping("/detail")
-    public R detail(@RequestBody MaterialVo materialVo) {
-        Material result = materialService.detail(materialVo);
-        return R.success(result);
-    }
-
-    /**
-     * 获取租户添加过的物料单位
-     */
-    @PostMapping("/getUnitList")
-    public R getUnitList() {
-        List<String> unitList = materialService.getUnitList();
-        return R.success(unitList);
-    }
-
-}
-

+ 0 - 21
hx-serve/iot-management/src/main/java/com/fjhx/material/mapper/MaterialMapper.java

@@ -1,21 +0,0 @@
-package com.fjhx.material.mapper;
-
-import com.fjhx.entity.material.Material;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * <p>
- * 物料 Mapper 接口
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-public interface MaterialMapper extends BaseMapper<Material> {
-
-    List<String> getUnitList(@Param("tenantId") String tenantId);
-
-}

+ 0 - 10
hx-serve/iot-management/src/main/java/com/fjhx/material/mapper/MaterialMapper.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.fjhx.material.mapper.MaterialMapper">
-
-    <select id="getUnitList" resultType="java.lang.String">
-        select distinct m.unit
-        from material m
-        where m.tenant_id = #{tenantId}
-    </select>
-</mapper>

+ 0 - 36
hx-serve/iot-management/src/main/java/com/fjhx/material/service/MaterialService.java

@@ -1,36 +0,0 @@
-package com.fjhx.material.service;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.entity.material.Material;
-import com.fjhx.params.material.MaterialVo;
-import com.fjhx.base.BaseService;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 物料 服务类
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-public interface MaterialService extends BaseService<Material> {
-
-    Page<Material> getPage(Map<String, String> condition);
-
-    void add(MaterialVo materialVo);
-
-    void edit(MaterialVo materialVo);
-
-    void delete(MaterialVo materialVo);
-
-    Material detail(MaterialVo materialVo);
-
-    /**
-     * 获取租户添加过的物料单位
-     */
-    List<String> getUnitList();
-
-}

+ 0 - 150
hx-serve/iot-management/src/main/java/com/fjhx/material/service/impl/MaterialServiceImpl.java

@@ -1,150 +0,0 @@
-package com.fjhx.material.service.impl;
-
-import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.base.BaseEntity;
-import com.fjhx.classif.service.ClassifService;
-import com.fjhx.constants.StatusConstant;
-import com.fjhx.constants.ErrorMsgConstant;
-import com.fjhx.constant.IotManagementLockConstant;
-import com.fjhx.entity.material.Material;
-import com.fjhx.material.mapper.MaterialMapper;
-import com.fjhx.material.service.MaterialService;
-import com.fjhx.params.material.MaterialVo;
-import com.fjhx.utils.Assert;
-import com.fjhx.utils.WrapperUtil;
-import lombok.RequiredArgsConstructor;
-import org.springblade.core.redis.lock.RedisLockClient;
-import org.springblade.core.secure.utils.AuthUtil;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 物料 服务实现类
- * </p>
- *
- * @author ${author}
- * @since 2022-06-29
- */
-@Service
-@RequiredArgsConstructor
-public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {
-
-    private final ClassifService classifService;
-
-    private final RedisLockClient redisLockClient;
-
-    @Override
-    public Page<Material> getPage(Map<String, String> condition) {
-
-        QueryWrapper<Material> wrapper = Wrappers.query();
-
-        WrapperUtil.init(condition, wrapper)
-                .keyword("code", "name")
-                .eqTenantId();
-
-        // 编码正序
-        wrapper.orderByAsc("code");
-
-        // 如果传入分类id,查询分类已经分类下级
-        Object classifId = condition.get("classifId");
-        if (ObjectUtil.isNotEmpty(classifId)) {
-            List<Long> childrenIdList = classifService.getChildrenIdList(Long.valueOf(classifId.toString()));
-            wrapper.in("classif_id", childrenIdList);
-        }
-
-        Page<Material> page = page(condition, wrapper);
-        return page;
-    }
-
-    @Transactional
-    @Override
-    public void add(MaterialVo materialVo) {
-        Assert.notEmpty(materialVo.getName(), "物料名称不能为空");
-        Assert.notEmpty(materialVo.getCode(), "物料编码不能为空");
-        Integer coiled = materialVo.getCoiled();
-        Assert.notEmpty(coiled, "是否卷材判断字段不能为空");
-
-        if (ObjectUtil.isEmpty(materialVo.getSafetyStock())) {
-            materialVo.setSafetyStock(BigDecimal.ZERO);
-        }
-
-        if (ObjectUtil.isEmpty(materialVo.getCycle())) {
-            materialVo.setCycle(0);
-        }
-
-        if (ObjectUtil.isEmpty(materialVo.getQualityTestingRate())) {
-            materialVo.setQualityTestingRate(BigDecimal.ZERO);
-        }
-
-        if (ObjectUtil.isEmpty(materialVo.getLoss()) || coiled.equals(StatusConstant.No)) {
-            materialVo.setLoss(BigDecimal.ZERO);
-        }
-
-        String tenantId = AuthUtil.getTenantId();
-
-        // 保证每个租户物料编码唯一,锁粒度为租户
-        Boolean flag = redisLockClient.lockFair(IotManagementLockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId, () -> {
-            // 判断物料编码不是唯一的
-            materialCodeOnly(tenantId, materialVo.getCode(), null);
-            save(materialVo);
-            return true;
-        });
-
-        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
-    }
-
-    @Override
-    public void edit(MaterialVo materialVo) {
-        String tenantId = AuthUtil.getTenantId();
-        // 保证每个租户物料编码唯一,锁粒度为租户
-        Boolean flag = redisLockClient.lockFair(IotManagementLockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId, () -> {
-            // 判断物料编码不是唯一的
-            materialCodeOnly(tenantId, materialVo.getCode(), materialVo.getId());
-            updateById(materialVo);
-            return true;
-        });
-        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
-    }
-
-    @Override
-    public void delete(MaterialVo materialVo) {
-        removeById(materialVo.getId());
-    }
-
-    @Override
-    public Material detail(MaterialVo materialVo) {
-        Material result = getById(materialVo.getId());
-        return result;
-    }
-
-    @Override
-    public List<String> getUnitList() {
-        return baseMapper.getUnitList(AuthUtil.getTenantId());
-    }
-
-    /**
-     * 检查物料编码是否唯一
-     *
-     * @param tenantId     租户id
-     * @param materialCode 物料编码
-     * @param excludeId    排除物料id(编辑时不判断自己)
-     */
-    private void materialCodeOnly(String tenantId, String materialCode, Long excludeId) {
-        Integer count = lambdaQuery()
-                .eq(BaseEntity::getTenantId, tenantId)
-                .eq(Material::getCode, materialCode)
-                .ne(ObjectUtil.isNotEmpty(excludeId), BaseEntity::getId, excludeId)
-                .count();
-        Assert.eqZero(count, "物料编码重复,添加失败");
-    }
-
-}

+ 0 - 72
hx-serve/iot-management/src/main/java/com/fjhx/product/controller/ProductController.java

@@ -1,72 +0,0 @@
-package com.fjhx.product.controller;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.springblade.core.tool.api.R;
-import com.fjhx.entity.product.Product;
-import com.fjhx.params.product.ProductVo;
-import com.fjhx.product.service.ProductService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 产品 前端控制器
- * </p>
- *
- * @author ${author}
- * @since 2022-06-30
- */
-@RestController
-@RequestMapping("/product")
-public class ProductController {
-
-    @Autowired
-    private ProductService productService;
-
-    @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition){
-        Page<Product> result = productService.getPage(condition);
-        return R.success(result);
-    }
-
-    @PostMapping("/add")
-    public R add(@RequestBody ProductVo productVo){
-        productService.add(productVo);
-        return R.success();
-    }
-
-    @PostMapping("/edit")
-    public R edit(@RequestBody ProductVo productVo){
-        productService.edit(productVo);
-        return R.success();
-    }
-
-    @PostMapping("/delete")
-    public R delete(@RequestBody ProductVo productVo){
-        productService.delete(productVo);
-        return R.success();
-    }
-
-    @PostMapping("/detail")
-    public R detail(@RequestBody ProductVo productVo){
-        Product result = productService.detail(productVo);
-        return R.success(result);
-    }
-
-    /**
-     * 获取租户添加过的产品单位
-     */
-    @PostMapping("/getUnitList")
-    public R getUnitList() {
-        List<String> unitList = productService.getUnitList();
-        return R.success(unitList);
-    }
-
-}
-

+ 0 - 21
hx-serve/iot-management/src/main/java/com/fjhx/product/mapper/ProductMapper.java

@@ -1,21 +0,0 @@
-package com.fjhx.product.mapper;
-
-import com.fjhx.entity.product.Product;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * <p>
- * 产品 Mapper 接口
- * </p>
- *
- * @author ${author}
- * @since 2022-06-30
- */
-public interface ProductMapper extends BaseMapper<Product> {
-
-    List<String> getUnitList(@Param("tenantId") String tenantId);
-
-}

+ 0 - 10
hx-serve/iot-management/src/main/java/com/fjhx/product/mapper/ProductMapper.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.fjhx.product.mapper.ProductMapper">
-
-    <select id="getUnitList" resultType="java.lang.String">
-        select distinct unit
-        from product
-        where tenant_id = #{tenantId}
-    </select>
-</mapper>

+ 0 - 33
hx-serve/iot-management/src/main/java/com/fjhx/product/service/ProductService.java

@@ -1,33 +0,0 @@
-package com.fjhx.product.service;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.entity.product.Product;
-import com.fjhx.params.product.ProductVo;
-import com.fjhx.base.BaseService;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 产品 服务类
- * </p>
- *
- * @author ${author}
- * @since 2022-06-30
- */
-public interface ProductService extends BaseService<Product> {
-
-    Page<Product> getPage(Map<String, String> condition);
-
-    void add(ProductVo productVo);
-
-    void edit(ProductVo productVo);
-
-    void delete(ProductVo productVo);
-
-    Product detail(ProductVo productVo);
-
-    List<String> getUnitList();
-
-}

+ 0 - 120
hx-serve/iot-management/src/main/java/com/fjhx/product/service/impl/ProductServiceImpl.java

@@ -1,120 +0,0 @@
-package com.fjhx.product.service.impl;
-
-import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.base.BaseEntity;
-import com.fjhx.classif.service.ClassifService;
-import com.fjhx.constants.ErrorMsgConstant;
-import com.fjhx.constant.IotManagementLockConstant;
-import com.fjhx.entity.product.Product;
-import com.fjhx.product.mapper.ProductMapper;
-import com.fjhx.product.service.ProductService;
-import com.fjhx.params.product.ProductVo;
-import com.fjhx.utils.Assert;
-import com.fjhx.utils.WrapperUtil;
-import lombok.RequiredArgsConstructor;
-import org.springblade.core.redis.lock.RedisLockClient;
-import org.springblade.core.secure.utils.AuthUtil;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 产品 服务实现类
- * </p>
- *
- * @author ${author}
- * @since 2022-06-30
- */
-@Service
-@RequiredArgsConstructor
-public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
-
-    private final ClassifService classifService;
-
-    private final RedisLockClient redisLockClient;
-
-    @Override
-    public Page<Product> getPage(Map<String, String> condition) {
-
-        QueryWrapper<Product> wrapper = Wrappers.query();
-
-        WrapperUtil.init(condition, wrapper)
-                .keyword("code", "name")
-                .eqTenantId();
-
-        // 如果传入分类id,查询分类已经分类下级
-        Object classifId = condition.get("classifId");
-        if (ObjectUtil.isNotEmpty(classifId)) {
-            List<Long> childrenIdList = classifService.getChildrenIdList(Long.valueOf(classifId.toString()));
-            wrapper.in("classif_id", childrenIdList);
-        }
-
-        Page<Product> page = page(condition, wrapper);
-        return page;
-    }
-
-    @Override
-    public void add(ProductVo productVo) {
-        Assert.notEmpty(productVo.getName(), "产品名称不能为空");
-        Assert.notEmpty(productVo.getCode(), "产品编码不能为空");
-
-        String tenantId = AuthUtil.getTenantId();
-        Boolean flag = redisLockClient.lockFair(IotManagementLockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
-            productCodeOnly(tenantId, productVo.getCode(), null);
-            save(productVo);
-            return true;
-        });
-        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
-    }
-
-    @Override
-    public void edit(ProductVo productVo) {
-        Assert.notEmpty(productVo.getId(), "产品id不能为空");
-        String tenantId = AuthUtil.getTenantId();
-        Boolean flag = redisLockClient.lockFair(IotManagementLockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
-            productCodeOnly(tenantId, productVo.getCode(), productVo.getId());
-            updateById(productVo);
-            return true;
-        });
-        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
-    }
-
-    @Override
-    public void delete(ProductVo productVo) {
-        removeById(productVo.getId());
-    }
-
-    @Override
-    public Product detail(ProductVo productVo) {
-        Product result = getById(productVo.getId());
-        return result;
-    }
-
-    @Override
-    public List<String> getUnitList() {
-        return baseMapper.getUnitList(AuthUtil.getTenantId());
-    }
-
-    /**
-     * 检查产品编码是否唯一
-     *
-     * @param tenantId    租户id
-     * @param productCode 产品编码
-     * @param excludeId   排除产品id(编辑时不判断自己)
-     */
-    private void productCodeOnly(String tenantId, String productCode, Long excludeId) {
-        Integer count = lambdaQuery()
-                .eq(BaseEntity::getTenantId, tenantId)
-                .eq(Product::getCode, productCode)
-                .ne(ObjectUtil.isNotEmpty(excludeId), BaseEntity::getId, excludeId)
-                .count();
-        Assert.eqZero(count, "产品编码重复,添加失败");
-    }
-
-}

+ 9 - 16
hx-serve/product-library/src/main/java/com/fjhx/classify/controller/ClassifyController.java

@@ -1,16 +1,15 @@
 package com.fjhx.classify.controller;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.springblade.core.tool.api.R;
-import com.fjhx.entity.classify.Classify;
-import com.fjhx.params.classify.ClassifyVo;
 import com.fjhx.classify.service.ClassifyService;
+import com.fjhx.params.classify.ClassifyVo;
+import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,35 +27,29 @@ public class ClassifyController {
     @Autowired
     private ClassifyService classifyService;
 
-    @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition){
-        Page<Classify> result = classifyService.getPage(condition);
+    @PostMapping("/tree")
+    public R page(@RequestBody Map<String, String> condition) {
+        List<Map<String, Object>> result = classifyService.getTree(condition);
         return R.success(result);
     }
 
     @PostMapping("/add")
-    public R add(@RequestBody ClassifyVo classifyVo){
+    public R add(@RequestBody ClassifyVo classifyVo) {
         classifyService.add(classifyVo);
         return R.success();
     }
 
     @PostMapping("/edit")
-    public R edit(@RequestBody ClassifyVo classifyVo){
+    public R edit(@RequestBody ClassifyVo classifyVo) {
         classifyService.edit(classifyVo);
         return R.success();
     }
 
     @PostMapping("/delete")
-    public R delete(@RequestBody ClassifyVo classifyVo){
+    public R delete(@RequestBody ClassifyVo classifyVo) {
         classifyService.delete(classifyVo);
         return R.success();
     }
 
-    @PostMapping("/detail")
-    public R detail(@RequestBody ClassifyVo classifyVo){
-        Classify result = classifyService.detail(classifyVo);
-        return R.success(result);
-    }
-
 }
 

+ 9 - 2
hx-serve/product-library/src/main/java/com/fjhx/classify/service/ClassifyService.java

@@ -5,6 +5,7 @@ import com.fjhx.entity.classify.Classify;
 import com.fjhx.params.classify.ClassifyVo;
 import com.fjhx.base.BaseService;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -17,7 +18,7 @@ import java.util.Map;
  */
 public interface ClassifyService extends BaseService<Classify> {
 
-    Page<Classify> getPage(Map<String, String> condition);
+    List<Map<String, Object>> getTree(Map<String, String> condition);
 
     void add(ClassifyVo classifyVo);
 
@@ -25,6 +26,12 @@ public interface ClassifyService extends BaseService<Classify> {
 
     void delete(ClassifyVo classifyVo);
 
-    Classify detail(ClassifyVo classifyVo);
+    /**
+     * 获取 分类id 和 分类子级id 数组
+     *
+     * @param classifyId 分类id
+     * @return 分类id 和 分类子级id 数组
+     */
+    List<Long> getChildrenIdList(Long classifyId);
 
 }

+ 84 - 16
hx-serve/product-library/src/main/java/com/fjhx/classify/service/impl/ClassifyServiceImpl.java

@@ -1,17 +1,26 @@
 package com.fjhx.classify.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.utils.WrapperUtil;
-import com.fjhx.entity.classify.Classify;
-import com.fjhx.params.classify.ClassifyVo;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseEntity;
 import com.fjhx.classify.mapper.ClassifyMapper;
 import com.fjhx.classify.service.ClassifyService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.entity.classify.Classify;
+import com.fjhx.entity.material.Material;
+import com.fjhx.entity.product.Product;
+import com.fjhx.enums.classify.ClassifyTypeEnum;
+import com.fjhx.material.service.MaterialService;
+import com.fjhx.params.classify.ClassifyVo;
+import com.fjhx.product.service.ProductService;
+import com.fjhx.utils.Assert;
+import com.fjhx.utils.TreeUtil;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -24,37 +33,96 @@ import java.util.Map;
 @Service
 public class ClassifyServiceImpl extends ServiceImpl<ClassifyMapper, Classify> implements ClassifyService {
 
+    @Autowired
+    private ProductService productService;
+
+    @Autowired
+    private MaterialService materialService;
+
     @Override
-    public Page<Classify> getPage(Map<String, String> condition) {
+    public List<Map<String, Object>> getTree(Map<String, String> condition) {
 
-        QueryWrapper<Classify> wrapper = Wrappers.query();
+        String type = condition.get("type");
+        Assert.notEmpty(type, "分类类型不能为空");
 
-        WrapperUtil.init(condition, wrapper)
-                .eqTenantId()
-                .createTimeDesc();
+        List<Classify> list = lambdaQuery()
+                .eq(Classify::getType, type)
+                .select(Classify::getId, Classify::getName, Classify::getParentId)
+                .list();
 
-        Page<Classify> page = page(condition, wrapper);
-        return page;
+        // 构建树形
+        return TreeUtil.buildTree("name", list);
     }
 
     @Override
     public void add(ClassifyVo classifyVo) {
+
+        Assert.notEmpty(classifyVo.getType(), "分类类型不能为空");
+        Assert.notEmpty(classifyVo.getType(), "分类名称不能为空");
+
+        Long parentId = classifyVo.getParentId();
+        if (parentId == null) {
+            classifyVo.setParentId(0L);
+            classifyVo.setParentIdSet(null);
+        } else if (parentId == 0L) {
+            classifyVo.setParentIdSet(null);
+        } else {
+            // 查询父级分类
+            Classify parentClassify = getById(parentId);
+            Assert.notEmpty(parentClassify, "没有找到父级分类");
+
+            // 赋值父级id集合
+            String parentIdSet = parentClassify.getParentIdSet();
+            classifyVo.setParentIdSet(
+                    (ObjectUtil.isEmpty(parentIdSet) ? "" : parentIdSet + ",") + parentId);
+        }
+
         save(classifyVo);
     }
 
     @Override
     public void edit(ClassifyVo classifyVo) {
+        Assert.notEmpty(classifyVo.getId(), "分类Id不能为空");
+        classifyVo.setParentId(null);
+        classifyVo.setParentIdSet(null);
         updateById(classifyVo);
     }
 
     @Override
     public void delete(ClassifyVo classifyVo) {
+        Long id = classifyVo.getId();
+        Integer type = classifyVo.getType();
+
+        Assert.notEmpty(id, "分类id不能为空");
+        Assert.notEmpty(type, "分类类型不能为空");
+
+        Integer childrenCount = lambdaQuery().eq(Classify::getParentId, id).count();
+        Assert.eqZero(childrenCount, "该分类下存在子级分类,无法删除");
+
+        if (type.equals(ClassifyTypeEnum.PRODUCT_TYPE.getCode())) {
+            Integer relationCount = productService.lambdaQuery().eq(Product::getClassifyId, id).count();
+            Assert.eqZero(relationCount, "该分类下存在产品,无法删除");
+        } else {
+            Integer relationCount = materialService.lambdaQuery().eq(Material::getClassifyId, id).count();
+            Assert.eqZero(relationCount, "该分类下存在物料,无法删除");
+        }
+
         removeById(classifyVo.getId());
     }
 
     @Override
-    public Classify detail(ClassifyVo classifyVo) {
-        Classify result = getById(classifyVo.getId());
+    public List<Long> getChildrenIdList(Long classifyId) {
+
+        List<Classify> list = lambdaQuery()
+                .select(BaseEntity::getId)
+                .eq(BaseEntity::getTenantId, AuthUtil.getTenantId())
+                .like(Classify::getParentIdSet, classifyId)
+                .list();
+
+        List<Long> result = list.stream().map(BaseEntity::getId).collect(Collectors.toList());
+
+        result.add(0, classifyId);
+
         return result;
     }
 

+ 6 - 12
hx-serve/product-library/src/main/java/com/fjhx/material/controller/MaterialController.java

@@ -1,10 +1,10 @@
 package com.fjhx.material.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.springblade.core.tool.api.R;
 import com.fjhx.entity.material.Material;
-import com.fjhx.params.material.MaterialVo;
 import com.fjhx.material.service.MaterialService;
+import com.fjhx.params.material.MaterialVo;
+import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -29,34 +29,28 @@ public class MaterialController {
     private MaterialService materialService;
 
     @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition){
+    public R page(@RequestBody Map<String, String> condition) {
         Page<Material> result = materialService.getPage(condition);
         return R.success(result);
     }
 
     @PostMapping("/add")
-    public R add(@RequestBody MaterialVo materialVo){
+    public R add(@RequestBody MaterialVo materialVo) {
         materialService.add(materialVo);
         return R.success();
     }
 
     @PostMapping("/edit")
-    public R edit(@RequestBody MaterialVo materialVo){
+    public R edit(@RequestBody MaterialVo materialVo) {
         materialService.edit(materialVo);
         return R.success();
     }
 
     @PostMapping("/delete")
-    public R delete(@RequestBody MaterialVo materialVo){
+    public R delete(@RequestBody MaterialVo materialVo) {
         materialService.delete(materialVo);
         return R.success();
     }
 
-    @PostMapping("/detail")
-    public R detail(@RequestBody MaterialVo materialVo){
-        Material result = materialService.detail(materialVo);
-        return R.success(result);
-    }
-
 }
 

+ 1 - 3
hx-serve/product-library/src/main/java/com/fjhx/material/service/MaterialService.java

@@ -1,9 +1,9 @@
 package com.fjhx.material.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.base.BaseService;
 import com.fjhx.entity.material.Material;
 import com.fjhx.params.material.MaterialVo;
-import com.fjhx.base.BaseService;
 
 import java.util.Map;
 
@@ -25,6 +25,4 @@ public interface MaterialService extends BaseService<Material> {
 
     void delete(MaterialVo materialVo);
 
-    Material detail(MaterialVo materialVo);
-
 }

+ 92 - 13
hx-serve/product-library/src/main/java/com/fjhx/material/service/impl/MaterialServiceImpl.java

@@ -1,16 +1,28 @@
 package com.fjhx.material.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.utils.WrapperUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseEntity;
+import com.fjhx.classify.service.ClassifyService;
+import com.fjhx.constant.LockConstant;
+import com.fjhx.constants.ErrorMsgConstant;
+import com.fjhx.constants.StatusConstant;
 import com.fjhx.entity.material.Material;
-import com.fjhx.params.material.MaterialVo;
 import com.fjhx.material.mapper.MaterialMapper;
 import com.fjhx.material.service.MaterialService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.params.material.MaterialVo;
+import com.fjhx.utils.Assert;
+import com.fjhx.utils.WrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.redis.lock.RedisLockClient;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -22,29 +34,86 @@ import java.util.Map;
  * @since 2022-07-06
  */
 @Service
+@RequiredArgsConstructor
 public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {
 
+    private final ClassifyService classifyService;
+
+    private final RedisLockClient redisLockClient;
+
     @Override
     public Page<Material> getPage(Map<String, String> condition) {
 
         QueryWrapper<Material> wrapper = Wrappers.query();
 
         WrapperUtil.init(condition, wrapper)
-                .eqTenantId()
-                .createTimeDesc();
+                .keyword("code", "name")
+                .eqTenantId();
+
+        // 编码正序
+        wrapper.orderByAsc("code");
+
+        // 如果传入分类id,查询分类已经分类下级
+        String classifyId = condition.get("classifyId");
+        if (ObjectUtil.isNotEmpty(classifyId)) {
+            List<Long> childrenIdList = classifyService.getChildrenIdList(Long.valueOf(classifyId));
+            wrapper.in("classify_id", childrenIdList);
+        }
 
-        Page<Material> page = page(condition, wrapper);
-        return page;
+        return page(condition, wrapper);
     }
 
     @Override
     public void add(MaterialVo materialVo) {
-        save(materialVo);
+        Assert.notEmpty(materialVo.getName(), "物料名称不能为空");
+        Assert.notEmpty(materialVo.getCode(), "物料编码不能为空");
+        Integer coiled = materialVo.getCoiled();
+        Assert.notEmpty(coiled, "是否卷材判断字段不能为空");
+
+        if (ObjectUtil.isEmpty(materialVo.getSafetyStock())) {
+            materialVo.setSafetyStock(BigDecimal.ZERO);
+        }
+
+        if (ObjectUtil.isEmpty(materialVo.getCycle())) {
+            materialVo.setCycle(0);
+        }
+
+        if (ObjectUtil.isEmpty(materialVo.getQualityTestingRate())) {
+            materialVo.setQualityTestingRate(BigDecimal.ZERO);
+        }
+
+        if (ObjectUtil.isEmpty(materialVo.getLoss()) || coiled.equals(StatusConstant.No)) {
+            materialVo.setLoss(BigDecimal.ZERO);
+        }
+
+        String tenantId = AuthUtil.getTenantId();
+
+        // 保证每个租户物料编码唯一
+        Boolean flag = redisLockClient.lockFair(LockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId,
+                () -> {
+                    // 判断物料编码不是唯一的
+                    materialCodeOnly(tenantId, materialVo.getCode(), null);
+                    save(materialVo);
+                    return true;
+                });
+
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
     }
 
     @Override
     public void edit(MaterialVo materialVo) {
-        updateById(materialVo);
+        String tenantId = AuthUtil.getTenantId();
+
+        // 保证每个租户物料编码唯一
+        Boolean flag = redisLockClient.lockFair(LockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId,
+                () -> {
+                    // 判断物料编码不是唯一的
+                    materialCodeOnly(tenantId, materialVo.getCode(), materialVo.getId());
+                    updateById(materialVo);
+                    return true;
+                });
+
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
     }
 
     @Override
@@ -52,10 +121,20 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
         removeById(materialVo.getId());
     }
 
-    @Override
-    public Material detail(MaterialVo materialVo) {
-        Material result = getById(materialVo.getId());
-        return result;
+    /**
+     * 检查物料编码是否唯一
+     *
+     * @param tenantId     租户id
+     * @param materialCode 物料编码
+     * @param excludeId    排除物料id(编辑时不判断自己)
+     */
+    private void materialCodeOnly(String tenantId, String materialCode, Long excludeId) {
+        Integer count = lambdaQuery()
+                .eq(BaseEntity::getTenantId, tenantId)
+                .eq(Material::getCode, materialCode)
+                .ne(ObjectUtil.isNotEmpty(excludeId), BaseEntity::getId, excludeId)
+                .count();
+        Assert.eqZero(count, "物料编码重复,添加失败");
     }
 
 }

+ 5 - 11
hx-serve/product-library/src/main/java/com/fjhx/product/controller/ProductController.java

@@ -1,10 +1,10 @@
 package com.fjhx.product.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.springblade.core.tool.api.R;
 import com.fjhx.entity.product.Product;
 import com.fjhx.params.product.ProductVo;
 import com.fjhx.product.service.ProductService;
+import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -29,34 +29,28 @@ public class ProductController {
     private ProductService productService;
 
     @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition){
+    public R page(@RequestBody Map<String, String> condition) {
         Page<Product> result = productService.getPage(condition);
         return R.success(result);
     }
 
     @PostMapping("/add")
-    public R add(@RequestBody ProductVo productVo){
+    public R add(@RequestBody ProductVo productVo) {
         productService.add(productVo);
         return R.success();
     }
 
     @PostMapping("/edit")
-    public R edit(@RequestBody ProductVo productVo){
+    public R edit(@RequestBody ProductVo productVo) {
         productService.edit(productVo);
         return R.success();
     }
 
     @PostMapping("/delete")
-    public R delete(@RequestBody ProductVo productVo){
+    public R delete(@RequestBody ProductVo productVo) {
         productService.delete(productVo);
         return R.success();
     }
 
-    @PostMapping("/detail")
-    public R detail(@RequestBody ProductVo productVo){
-        Product result = productService.detail(productVo);
-        return R.success(result);
-    }
-
 }
 

+ 0 - 2
hx-serve/product-library/src/main/java/com/fjhx/product/service/ProductService.java

@@ -25,6 +25,4 @@ public interface ProductService extends BaseService<Product> {
 
     void delete(ProductVo productVo);
 
-    Product detail(ProductVo productVo);
-
 }

+ 59 - 12
hx-serve/product-library/src/main/java/com/fjhx/product/service/impl/ProductServiceImpl.java

@@ -1,16 +1,26 @@
 package com.fjhx.product.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.utils.WrapperUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseEntity;
+import com.fjhx.classify.service.ClassifyService;
+import com.fjhx.constant.LockConstant;
+import com.fjhx.constants.ErrorMsgConstant;
 import com.fjhx.entity.product.Product;
 import com.fjhx.params.product.ProductVo;
 import com.fjhx.product.mapper.ProductMapper;
 import com.fjhx.product.service.ProductService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.utils.Assert;
+import com.fjhx.utils.WrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.redis.lock.RedisLockClient;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -22,29 +32,56 @@ import java.util.Map;
  * @since 2022-07-06
  */
 @Service
+@RequiredArgsConstructor
 public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
 
+    private final ClassifyService classifyService;
+
+    private final RedisLockClient redisLockClient;
+
     @Override
     public Page<Product> getPage(Map<String, String> condition) {
 
         QueryWrapper<Product> wrapper = Wrappers.query();
 
         WrapperUtil.init(condition, wrapper)
-                .eqTenantId()
-                .createTimeDesc();
+                .keyword("code", "name")
+                .eqTenantId();
+
+        // 如果传入分类id,查询分类已经分类下级
+        Object classifyId = condition.get("classifyId");
+        if (ObjectUtil.isNotEmpty(classifyId)) {
+            List<Long> childrenIdList = classifyService.getChildrenIdList(Long.valueOf(classifyId.toString()));
+            wrapper.in("classify_id", childrenIdList);
+        }
 
-        Page<Product> page = page(condition, wrapper);
-        return page;
+        return page(condition, wrapper);
     }
 
     @Override
     public void add(ProductVo productVo) {
-        save(productVo);
+        Assert.notEmpty(productVo.getName(), "产品名称不能为空");
+        Assert.notEmpty(productVo.getCode(), "产品编码不能为空");
+
+        String tenantId = AuthUtil.getTenantId();
+        Boolean flag = redisLockClient.lockFair(LockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
+            productCodeOnly(tenantId, productVo.getCode(), null);
+            save(productVo);
+            return true;
+        });
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
     }
 
     @Override
     public void edit(ProductVo productVo) {
-        updateById(productVo);
+        Assert.notEmpty(productVo.getId(), "产品id不能为空");
+        String tenantId = AuthUtil.getTenantId();
+        Boolean flag = redisLockClient.lockFair(LockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
+            productCodeOnly(tenantId, productVo.getCode(), productVo.getId());
+            updateById(productVo);
+            return true;
+        });
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
     }
 
     @Override
@@ -52,10 +89,20 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         removeById(productVo.getId());
     }
 
-    @Override
-    public Product detail(ProductVo productVo) {
-        Product result = getById(productVo.getId());
-        return result;
+    /**
+     * 检查产品编码是否唯一
+     *
+     * @param tenantId    租户id
+     * @param productCode 产品编码
+     * @param excludeId   排除产品id(编辑时不判断自己)
+     */
+    private void productCodeOnly(String tenantId, String productCode, Long excludeId) {
+        Integer count = lambdaQuery()
+                .eq(BaseEntity::getTenantId, tenantId)
+                .eq(Product::getCode, productCode)
+                .ne(ObjectUtil.isNotEmpty(excludeId), BaseEntity::getId, excludeId)
+                .count();
+        Assert.eqZero(count, "产品编码重复,添加失败");
     }
 
 }