home vor 2 Jahren
Ursprung
Commit
e03867c5d8

+ 5 - 0
hx-common/hx-tool/src/main/java/com/fjhx/constants/lock/IotManagementLockConstant.java

@@ -10,4 +10,9 @@ public interface IotManagementLockConstant {
      */
     String MATERIAL_CODE_ONLY_LOCK = "materialCodeOnlyLock-";
 
+    /**
+     * 保证产品编码唯一
+     */
+    String PRODUCT_CODE_ONLY_LOCK = "productCodeOnlyLock-";
+
 }

+ 1 - 1
hx-common/hx-tool/src/main/java/com/fjhx/utils/Assert.java

@@ -35,7 +35,7 @@ public class Assert {
      * @param flag 参数
      * @param errStr  异常提示
      */
-    public static void ture(Boolean flag, String errStr) {
+    public static void eqTrue(Boolean flag, String errStr) {
         if (flag == null || flag.equals(false)) {
             throw new ServiceException(errStr);
         }

+ 6 - 5
hx-entity/iot-management-entity/src/main/java/com/fjhx/product/entity/Product.java

@@ -1,12 +1,9 @@
 package com.fjhx.product.entity;
 
-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.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -21,7 +18,11 @@ import lombok.EqualsAndHashCode;
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class Product extends BaseEntity {
-
+    
+    /**
+     * 产品分类id
+     */
+    private Long classifId;
 
     /**
      * 产品编号

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

@@ -16,9 +16,9 @@ import com.fjhx.material.service.MaterialService;
 import com.fjhx.material.vo.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.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -35,25 +35,29 @@ import java.util.Map;
  * @since 2022-06-29
  */
 @Service
+@RequiredArgsConstructor
 public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {
 
-    @Autowired
-    private ClassifService classifService;
-
-    @Autowired
-    private RedisLockClient redisLockClient;
+    private final ClassifService classifService;
 
+    private final RedisLockClient redisLockClient;
 
     @Override
     public Page<Material> getPage(Map<String, Object> condition) {
 
         QueryWrapper<Material> wrapper = Wrappers.query();
 
-        WrapperUtil.init(condition, wrapper).keyword("code", "name").eqTenantId();
+        WrapperUtil.init(condition, wrapper)
+                .keyword("code", "name")
+                .eqTenantId();
+
+        // 编码正序
+        wrapper.orderByAsc("code");
 
         // 如果传入分类id,查询分类已经分类下级
-        if (ObjectUtil.isNotEmpty(condition.get("classifId"))) {
-            List<Long> childrenIdList = classifService.getChildrenIdList(Long.valueOf(condition.get("classifId").toString()));
+        Object classifId = condition.get("classifId");
+        if (ObjectUtil.isNotEmpty(classifId)) {
+            List<Long> childrenIdList = classifService.getChildrenIdList(Long.valueOf(classifId.toString()));
             wrapper.in("classifId", childrenIdList);
         }
 
@@ -66,6 +70,8 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
     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);
@@ -79,8 +85,6 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
             materialVo.setQualityTestingRate(BigDecimal.ZERO);
         }
 
-        Integer coiled = materialVo.getCoiled();
-        Assert.notEmpty(coiled, "是否卷材判断字段不能为空");
         if (ObjectUtil.isEmpty(materialVo.getLoss()) || coiled.equals(CommonConstant.No)) {
             materialVo.setLoss(BigDecimal.ZERO);
         }
@@ -95,7 +99,7 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
             return true;
         });
 
-        Assert.ture(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
     }
 
     @Override
@@ -108,7 +112,7 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
             updateById(materialVo);
             return true;
         });
-        Assert.ture(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
     }
 
     @Override
@@ -135,7 +139,11 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
      * @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();
+        Integer count = lambdaQuery()
+                .eq(BaseEntity::getTenantId, tenantId)
+                .eq(Material::getCode, materialCode)
+                .ne(ObjectUtil.isNotEmpty(excludeId), BaseEntity::getId, excludeId)
+                .count();
         Assert.eqZero(count, "物料编码重复,添加失败");
     }
 

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

@@ -11,6 +11,7 @@ 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;
 
 /**
@@ -58,5 +59,14 @@ public class ProductController {
         return R.success(result);
     }
 
+    /**
+     * 获取租户添加过的产品单位
+     */
+    @PostMapping("/getUnitList")
+    public R getUnitList() {
+        List<String> unitList = productService.getUnitList();
+        return R.success(unitList);
+    }
+
 }
 

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

@@ -2,6 +2,9 @@ package com.fjhx.product.mapper;
 
 import com.fjhx.product.entity.Product;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ProductMapper extends BaseMapper<Product> {
 
+    List<String> getUnitList(@Param("tenantId") String tenantId);
+
 }

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

@@ -2,4 +2,9 @@
 <!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>

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

@@ -5,6 +5,7 @@ import com.fjhx.product.entity.Product;
 import com.fjhx.product.vo.ProductVo;
 import com.fjhx.base.BaseService;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -27,4 +28,6 @@ public interface ProductService extends BaseService<Product> {
 
     Product detail(ProductVo productVo);
 
+    List<String> getUnitList();
+
 }

+ 66 - 7
hx-serve/iot-management/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.classif.service.ClassifService;
+import com.fjhx.constants.ErrorMsgConstant;
+import com.fjhx.constants.lock.IotManagementLockConstant;
 import com.fjhx.product.entity.Product;
-import com.fjhx.product.vo.ProductVo;
 import com.fjhx.product.mapper.ProductMapper;
 import com.fjhx.product.service.ProductService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.product.vo.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;
 
 /**
@@ -22,16 +32,28 @@ import java.util.Map;
  * @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, Object> condition) {
 
         QueryWrapper<Product> wrapper = Wrappers.query();
 
         WrapperUtil.init(condition, wrapper)
-                .eqTenantId()
-                .createTimeDesc();
+                .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("classifId", childrenIdList);
+        }
 
         Page<Product> page = page(condition, wrapper);
         return page;
@@ -39,12 +61,28 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
     @Override
     public void add(ProductVo productVo) {
-        save(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) {
-        updateById(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
@@ -58,4 +96,25 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         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, "产品编码重复,添加失败");
+    }
+
 }