home 2 gadi atpakaļ
vecāks
revīzija
30c4a8cf21
20 mainītis faili ar 343 papildinājumiem un 145 dzēšanām
  1. 17 2
      hx-common/common-tool/src/main/java/com/fjhx/utils/Assert.java
  2. 2 2
      hx-common/library-product/src/main/java/com/fjhx/constant/LibraryProductLockConstant.java
  3. 3 3
      hx-common/library-product/src/main/java/com/fjhx/service/impl/MaterialServiceImpl.java
  4. 3 3
      hx-common/library-product/src/main/java/com/fjhx/service/impl/ProductServiceImpl.java
  5. 19 0
      hx-common/library-storage/src/main/java/com/fjhx/constant/LibraryStorageLockConstant.java
  6. 18 0
      hx-common/library-storage/src/main/java/com/fjhx/constant/StockJournalTypeConstant.java
  7. 38 0
      hx-common/library-storage/src/main/java/com/fjhx/constant/WarehouseTypeConstant.java
  8. 38 13
      hx-common/library-storage/src/main/java/com/fjhx/entity/Stock.java
  9. 0 55
      hx-common/library-storage/src/main/java/com/fjhx/entity/StockDetails.java
  10. 8 10
      hx-common/library-storage/src/main/java/com/fjhx/entity/StockJournal.java
  11. 0 16
      hx-common/library-storage/src/main/java/com/fjhx/mapper/StockDetailsMapper.java
  12. 0 5
      hx-common/library-storage/src/main/java/com/fjhx/mapper/StockDetailsMapper.xml
  13. 0 16
      hx-common/library-storage/src/main/java/com/fjhx/service/StockDetailsService.java
  14. 29 0
      hx-common/library-storage/src/main/java/com/fjhx/service/StockJournalService.java
  15. 42 0
      hx-common/library-storage/src/main/java/com/fjhx/service/StockService.java
  16. 5 0
      hx-common/library-storage/src/main/java/com/fjhx/service/WarehouseService.java
  17. 0 20
      hx-common/library-storage/src/main/java/com/fjhx/service/impl/StockDetailsServiceImpl.java
  18. 14 0
      hx-common/library-storage/src/main/java/com/fjhx/service/impl/StockJournalServiceImpl.java
  19. 74 0
      hx-common/library-storage/src/main/java/com/fjhx/service/impl/StockServiceImpl.java
  20. 33 0
      hx-common/library-storage/src/main/java/com/fjhx/service/impl/WarehouseServiceImpl.java

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

@@ -3,6 +3,8 @@ package com.fjhx.utils;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.tool.utils.ObjectUtil;
 
+import java.math.BigDecimal;
+
 public class Assert {
 
     /**
@@ -32,8 +34,8 @@ public class Assert {
     /**
      * 断言为真
      *
-     * @param flag 参数
-     * @param errStr  异常提示
+     * @param flag   参数
+     * @param errStr 异常提示
      */
     public static void eqTrue(Boolean flag, String errStr) {
         if (flag == null || flag.equals(false)) {
@@ -41,4 +43,17 @@ public class Assert {
         }
     }
 
+    /**
+     * 断言大于0
+     *
+     * @param bigDecimal 参数
+     * @param errStr     异常提示
+     */
+    public static void gtZero(BigDecimal bigDecimal, String errStr) {
+        if (bigDecimal == null || BigDecimal.ZERO.compareTo(bigDecimal) > 0) {
+            throw new ServiceException(errStr);
+        }
+    }
+
+
 }

+ 2 - 2
hx-common/library-product/src/main/java/com/fjhx/constant/ProductLibraryLockConstant.java → hx-common/library-product/src/main/java/com/fjhx/constant/LibraryProductLockConstant.java

@@ -3,12 +3,12 @@ package com.fjhx.constant;
 /**
  * 锁常量
  */
-public interface ProductLibraryLockConstant {
+public interface LibraryProductLockConstant {
 
     /**
      * 添加前缀,防止其他模块出现共用一把锁的情况
      */
-    String PREFIX = "productLibrary-";
+    String PREFIX = "library-product-";
 
     /**
      * 保证物料编码唯一

+ 3 - 3
hx-common/library-product/src/main/java/com/fjhx/service/impl/MaterialServiceImpl.java

@@ -3,7 +3,7 @@ package com.fjhx.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.base.BaseEntity;
-import com.fjhx.constant.ProductLibraryLockConstant;
+import com.fjhx.constant.LibraryProductLockConstant;
 import com.fjhx.constants.ErrorMsgConstant;
 import com.fjhx.entity.Material;
 import com.fjhx.mapper.MaterialMapper;
@@ -39,7 +39,7 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
         String tenantId = AuthUtil.getTenantId();
 
         // 保证每个租户物料编码唯一
-        Boolean flag = redisLockClient.lockFair(ProductLibraryLockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId,
+        Boolean flag = redisLockClient.lockFair(LibraryProductLockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId,
                 () -> {
                     // 判断物料编码不是唯一的
                     materialCodeOnly(tenantId, material.getCode(), null);
@@ -55,7 +55,7 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
         String tenantId = AuthUtil.getTenantId();
 
         // 保证每个租户物料编码唯一
-        Boolean flag = redisLockClient.lockFair(ProductLibraryLockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId,
+        Boolean flag = redisLockClient.lockFair(LibraryProductLockConstant.MATERIAL_CODE_ONLY_LOCK + tenantId,
                 () -> {
                     // 判断物料编码不是唯一的
                     materialCodeOnly(tenantId, material.getCode(), material.getId());

+ 3 - 3
hx-common/library-product/src/main/java/com/fjhx/service/impl/ProductServiceImpl.java

@@ -3,7 +3,7 @@ package com.fjhx.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.base.BaseEntity;
-import com.fjhx.constant.ProductLibraryLockConstant;
+import com.fjhx.constant.LibraryProductLockConstant;
 import com.fjhx.constants.ErrorMsgConstant;
 import com.fjhx.entity.Product;
 import com.fjhx.mapper.ProductMapper;
@@ -36,7 +36,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         Assert.notEmpty(product.getCode(), "产品编码不能为空");
 
         String tenantId = AuthUtil.getTenantId();
-        Boolean flag = redisLockClient.lockFair(ProductLibraryLockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
+        Boolean flag = redisLockClient.lockFair(LibraryProductLockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
             productCodeOnly(tenantId, product.getCode(), null);
             save(product);
             return true;
@@ -48,7 +48,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     public void edit(Product product) {
         Assert.notEmpty(product.getId(), "产品id不能为空");
         String tenantId = AuthUtil.getTenantId();
-        Boolean flag = redisLockClient.lockFair(ProductLibraryLockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
+        Boolean flag = redisLockClient.lockFair(LibraryProductLockConstant.PRODUCT_CODE_ONLY_LOCK + tenantId, () -> {
             productCodeOnly(tenantId, product.getCode(), product.getId());
             updateById(product);
             return true;

+ 19 - 0
hx-common/library-storage/src/main/java/com/fjhx/constant/LibraryStorageLockConstant.java

@@ -0,0 +1,19 @@
+package com.fjhx.constant;
+
+/**
+ * 锁常量
+ */
+public interface LibraryStorageLockConstant {
+
+    /**
+     * 添加前缀,防止其他模块出现共用一把锁的情况
+     */
+    String PREFIX = "library-storage-";
+
+    /**
+     * 保证库存物品数量准确
+     */
+    String STOCK_LOCK = PREFIX + "stock-lock-";
+
+
+}

+ 18 - 0
hx-common/library-storage/src/main/java/com/fjhx/constant/StockJournalTypeConstant.java

@@ -0,0 +1,18 @@
+package com.fjhx.constant;
+
+/**
+ * 出入库类型
+ */
+public interface StockJournalTypeConstant {
+
+    /**
+     * 出库
+     */
+    Integer OUT = 0;
+
+    /**
+     * 入库
+     */
+    Integer IN = 1;
+
+}

+ 38 - 0
hx-common/library-storage/src/main/java/com/fjhx/constant/WarehouseTypeConstant.java

@@ -0,0 +1,38 @@
+package com.fjhx.constant;
+
+/**
+ * 仓库类型
+ */
+public interface WarehouseTypeConstant {
+
+    /**
+     * 普通仓库
+     */
+    Integer ORDINARY = 1;
+
+    /**
+     * 成品仓库
+     */
+    Integer FINISHED_PRODUCT = 2;
+
+    /**
+     * 原料仓库
+     */
+    Integer RAW_MATERIAL = 3;
+
+    /**
+     * 辅助料仓库
+     */
+    Integer ACCESSORIES = 4;
+
+    /**
+     * 配件仓库
+     */
+    Integer PARTS = 5;
+
+    /**
+     * 处置仓库
+     */
+    Integer MANAGEMENT = 6;
+
+}

+ 38 - 13
hx-common/library-storage/src/main/java/com/fjhx/entity/Stock.java

@@ -1,15 +1,12 @@
 package com.fjhx.entity;
 
-import java.math.BigDecimal;
 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;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * <p>
@@ -20,9 +17,15 @@ import lombok.EqualsAndHashCode;
  * @since 2022-08-10
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class Stock extends BaseEntity {
+public class Stock implements Serializable {
+
+    private static final long serialVersionUID = 1L;
 
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
 
     /**
      * 物品id
@@ -35,11 +38,33 @@ public class Stock extends BaseEntity {
     private BigDecimal quantity;
 
     /**
-     * 逻辑删除 0未删除 1已删除
+     * 仓库id
+     */
+    private Long warehouseId;
+
+    /**
+     * 租户id
+     */
+    private String tenantId;
+
+    /**
+     * 创建时间
      */
-    @TableField(fill = FieldFill.INSERT)
-    @TableLogic
-    private Integer delFlag;
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    public void setTime() {
+        Date date = new Date();
+        setCreateTime(date);
+        setUpdateTime(date);
+    }
 
+    public void setUpdateTime() {
+        setUpdateTime(new Date());
+    }
 
 }

+ 0 - 55
hx-common/library-storage/src/main/java/com/fjhx/entity/StockDetails.java

@@ -1,55 +0,0 @@
-package com.fjhx.entity;
-
-import java.math.BigDecimal;
-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-08-10
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class StockDetails extends BaseEntity {
-
-
-    /**
-     * 物品id
-     */
-    private Long goodsId;
-
-    /**
-     * 数量
-     */
-    private BigDecimal quantity;
-
-    /**
-     * 仓库id
-     */
-    private Long warehouseId;
-
-    /**
-     * 是否在库
-     */
-    private Integer inLibrary;
-
-    /**
-     * 逻辑删除 0未删除 1已删除
-     */
-    @TableField(fill = FieldFill.INSERT)
-    @TableLogic
-    private Integer delFlag;
-
-
-}

+ 8 - 10
hx-common/library-storage/src/main/java/com/fjhx/entity/StockJournal.java

@@ -1,13 +1,11 @@
 package com.fjhx.entity;
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.fjhx.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 出入库流水记录
@@ -22,7 +20,7 @@ public class StockJournal extends BaseEntity {
 
 
     /**
-     * 出入库类型 0出 1入库
+     * 出入库类型 0出 1入库
      */
     private Integer type;
 
@@ -37,11 +35,6 @@ public class StockJournal extends BaseEntity {
     private Long goodsId;
 
     /**
-     * 库存明细表id
-     */
-    private Long stockDetailsId;
-
-    /**
      * 仓库id
      */
     private Long warehouseId;
@@ -51,5 +44,10 @@ public class StockJournal extends BaseEntity {
      */
     private BigDecimal changeQuantity;
 
+    /**
+     * 备注
+     */
+    private String remarks;
+
 
 }

+ 0 - 16
hx-common/library-storage/src/main/java/com/fjhx/mapper/StockDetailsMapper.java

@@ -1,16 +0,0 @@
-package com.fjhx.mapper;
-
-import com.fjhx.entity.StockDetails;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- * <p>
- * 库存明细 Mapper 接口
- * </p>
- *
- * @author ${author}
- * @since 2022-08-10
- */
-public interface StockDetailsMapper extends BaseMapper<StockDetails> {
-
-}

+ 0 - 5
hx-common/library-storage/src/main/java/com/fjhx/mapper/StockDetailsMapper.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.mapper.StockDetailsMapper">
-
-</mapper>

+ 0 - 16
hx-common/library-storage/src/main/java/com/fjhx/service/StockDetailsService.java

@@ -1,16 +0,0 @@
-package com.fjhx.service;
-
-import com.fjhx.base.BaseService;
-import com.fjhx.entity.StockDetails;
-
-/**
- * <p>
- * 库存明细 服务类
- * </p>
- *
- * @author ${author}
- * @since 2022-08-10
- */
-public interface StockDetailsService extends BaseService<StockDetails> {
-
-}

+ 29 - 0
hx-common/library-storage/src/main/java/com/fjhx/service/StockJournalService.java

@@ -1,8 +1,11 @@
 package com.fjhx.service;
 
 import com.fjhx.base.BaseService;
+import com.fjhx.constant.StockJournalTypeConstant;
 import com.fjhx.entity.StockJournal;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 出入库流水记录 服务类
@@ -13,4 +16,30 @@ import com.fjhx.entity.StockJournal;
  */
 public interface StockJournalService extends BaseService<StockJournal> {
 
+    /**
+     * 添加流水记录
+     *
+     * @param type           出入库类型 0出库 1入库
+     * @param detailsType    详细类型
+     * @param goodsId        物品id
+     * @param warehouseId    仓库id
+     * @param changeQuantity 变更数量
+     * @param remarks        备注
+     */
+    void add(Integer type, Integer detailsType, Long goodsId, Long warehouseId, BigDecimal changeQuantity, String remarks);
+
+    /**
+     * 添加入库流水记录
+     */
+    default void addIn(Integer detailsType, Long goodsId, Long warehouseId, BigDecimal changeQuantity, String remarks) {
+        add(StockJournalTypeConstant.IN, detailsType, goodsId, warehouseId, changeQuantity, remarks);
+    }
+
+    /**
+     * 添加出库流水记录
+     */
+    default void addOut(Integer detailsType, Long goodsId, Long warehouseId, BigDecimal changeQuantity, String remarks) {
+        add(StockJournalTypeConstant.OUT, detailsType, goodsId, warehouseId, changeQuantity, remarks);
+    }
+
 }

+ 42 - 0
hx-common/library-storage/src/main/java/com/fjhx/service/StockService.java

@@ -3,6 +3,8 @@ package com.fjhx.service;
 import com.fjhx.base.BaseService;
 import com.fjhx.entity.Stock;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 库存 服务类
@@ -13,4 +15,44 @@ import com.fjhx.entity.Stock;
  */
 public interface StockService extends BaseService<Stock> {
 
+    /**
+     * 变更数量
+     * 入库正数,出库负数
+     *
+     * @param goodsId     物品id
+     * @param warehouseId 仓库id
+     * @param quantity    数量
+     * @param detailsType 出入库详细类型
+     * @param remarks     备注
+     */
+    void changeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType, String remarks);
+
+    /**
+     * 入库变更数量
+     */
+    default void inChangeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType, String remarks) {
+        changeQuantity(goodsId, warehouseId, quantity, detailsType, remarks);
+    }
+
+    /**
+     * 入库变更数量(无备注)
+     */
+    default void inChangeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType) {
+        changeQuantity(goodsId, warehouseId, quantity, detailsType, null);
+    }
+
+    /**
+     * 出库变更数量,quantity传入出库数量即可(无需传入负数)
+     */
+    default void outChangeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType, String remarks) {
+        changeQuantity(goodsId, warehouseId, BigDecimal.ZERO.subtract(quantity), detailsType, remarks);
+    }
+
+    /**
+     * 出库变更数量(无备注)
+     */
+    default void outChangeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType) {
+        changeQuantity(goodsId, warehouseId, BigDecimal.ZERO.subtract(quantity), detailsType, null);
+    }
+
 }

+ 5 - 0
hx-common/library-storage/src/main/java/com/fjhx/service/WarehouseService.java

@@ -13,4 +13,9 @@ import com.fjhx.entity.Warehouse;
  */
 public interface WarehouseService extends BaseService<Warehouse> {
 
+    /**
+     * 新增或编辑仓库
+     */
+    void addOrUpdate(Warehouse warehouse);
+
 }

+ 0 - 20
hx-common/library-storage/src/main/java/com/fjhx/service/impl/StockDetailsServiceImpl.java

@@ -1,20 +0,0 @@
-package com.fjhx.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.entity.StockDetails;
-import com.fjhx.mapper.StockDetailsMapper;
-import com.fjhx.service.StockDetailsService;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 库存明细 服务实现类
- * </p>
- *
- * @author ${author}
- * @since 2022-08-10
- */
-@Service
-public class StockDetailsServiceImpl extends ServiceImpl<StockDetailsMapper, StockDetails> implements StockDetailsService {
-
-}

+ 14 - 0
hx-common/library-storage/src/main/java/com/fjhx/service/impl/StockJournalServiceImpl.java

@@ -6,6 +6,8 @@ import com.fjhx.mapper.StockJournalMapper;
 import com.fjhx.service.StockJournalService;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 出入库流水记录 服务实现类
@@ -17,4 +19,16 @@ import org.springframework.stereotype.Service;
 @Service
 public class StockJournalServiceImpl extends ServiceImpl<StockJournalMapper, StockJournal> implements StockJournalService {
 
+    @Override
+    public void add(Integer type, Integer detailsType, Long goodsId, Long warehouseId, BigDecimal changeQuantity, String remarks) {
+        StockJournal stockJournal = new StockJournal();
+        stockJournal.setType(type);
+        stockJournal.setDetailsType(detailsType);
+        stockJournal.setGoodsId(goodsId);
+        stockJournal.setWarehouseId(warehouseId);
+        stockJournal.setChangeQuantity(changeQuantity);
+        stockJournal.setRemarks(remarks);
+        save(stockJournal);
+    }
+
 }

+ 74 - 0
hx-common/library-storage/src/main/java/com/fjhx/service/impl/StockServiceImpl.java

@@ -1,11 +1,21 @@
 package com.fjhx.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.constant.LibraryStorageLockConstant;
+import com.fjhx.constant.StockJournalTypeConstant;
+import com.fjhx.constants.ErrorMsgConstant;
 import com.fjhx.entity.Stock;
 import com.fjhx.mapper.StockMapper;
 import com.fjhx.service.StockService;
+import com.fjhx.utils.Assert;
+import org.springblade.core.log.exception.ServiceException;
+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 java.math.BigDecimal;
+
 /**
  * <p>
  * 库存 服务实现类
@@ -17,4 +27,68 @@ import org.springframework.stereotype.Service;
 @Service
 public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements StockService {
 
+    @Autowired
+    private RedisLockClient redisLockClient;
+
+    @Autowired
+    private StockJournalServiceImpl stockJournalService;
+
+    @Override
+    public void changeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType, String remarks) {
+
+        // 分布式锁,粒度为物品id + 仓库id
+        Boolean flag = redisLockClient.lockFair(LibraryStorageLockConstant.STOCK_LOCK + goodsId + warehouseId,
+                () -> {
+
+                    Stock stock = getOne(Stock::getGoodsId, goodsId);
+
+                    // 没有物料存储记录,则创建物料
+                    if (stock == null) {
+                        stock = new Stock();
+                        stock.setGoodsId(goodsId);
+                        stock.setQuantity(quantity);
+                        stock.setWarehouseId(warehouseId);
+                        stock.setTime();
+                        stock.setTenantId(AuthUtil.getTenantId());
+                        save(stock);
+                        return true;
+                    }
+
+                    BigDecimal oldQuantity = stock.getQuantity();
+                    BigDecimal newQuantity = oldQuantity.add(quantity);
+
+                    int compareTo = newQuantity.compareTo(BigDecimal.ZERO);
+
+                    if (compareTo < 0) {
+                        throw new ServiceException("库存不足,出库失败");
+                    }
+
+                    // 如果出库之后等于0,删除记录
+                    if (compareTo == 0) {
+                        remove(Stock::getGoodsId, goodsId);
+                        return true;
+                    }
+
+                    stock.setUpdateTime();
+                    stock.setQuantity(newQuantity);
+                    updateById(stock);
+
+                    return true;
+                });
+
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+
+
+        // 添加出入库明细
+        stockJournalService.add(
+                quantity.compareTo(BigDecimal.ZERO) > 0 ? StockJournalTypeConstant.IN : StockJournalTypeConstant.OUT,
+                detailsType,
+                goodsId,
+                warehouseId,
+                quantity.compareTo(BigDecimal.ZERO) > 0 ? quantity : BigDecimal.ZERO.subtract(quantity),
+                remarks
+        );
+
+    }
+
 }

+ 33 - 0
hx-common/library-storage/src/main/java/com/fjhx/service/impl/WarehouseServiceImpl.java

@@ -1,9 +1,15 @@
 package com.fjhx.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseEntity;
+import com.fjhx.constant.WarehouseTypeConstant;
 import com.fjhx.entity.Warehouse;
 import com.fjhx.mapper.WarehouseMapper;
 import com.fjhx.service.WarehouseService;
+import com.fjhx.utils.Assert;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +23,31 @@ import org.springframework.stereotype.Service;
 @Service
 public class WarehouseServiceImpl extends ServiceImpl<WarehouseMapper, Warehouse> implements WarehouseService {
 
+    @Override
+    public void addOrUpdate(Warehouse warehouse) {
+
+        // 验证仓库名称是否为空
+        String name = warehouse.getName();
+        Assert.notEmpty(name, "仓库名称不能为空");
+
+        Long id = warehouse.getId();
+
+        // 验证仓库名称是否重复
+        int count = count(Wrappers.<Warehouse>lambdaQuery()
+                .eq(Warehouse::getName, name)
+                .eq(BaseEntity::getTenantId, AuthUtil.getTenantId())
+                .ne(ObjectUtil.isNotEmpty(id), BaseEntity::getId, id)
+        );
+        Assert.eqZero(count, "仓库名称重复");
+
+        // 如果是添加,且未选仓库类型,默认赋值普通仓库
+        Integer type = warehouse.getType();
+        if (ObjectUtil.isAllEmpty(id, type)) {
+            warehouse.setType(WarehouseTypeConstant.ORDINARY);
+        }
+
+        saveOrUpdate(warehouse);
+
+    }
+
 }