home 2 vuotta sitten
vanhempi
commit
547d3c7b6a
23 muutettua tiedostoa jossa 533 lisäystä ja 78 poistoa
  1. 6 1
      hx-common/common-client-util/src/main/java/com/fjhx/utils/FileClientUtil.java
  2. 71 0
      hx-common/common-tool/src/main/java/com/fjhx/utils/LockUtil.java
  3. 16 5
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/order/OrderSalesDetails.java
  4. 11 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/Stock.java
  5. 5 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/StockJournal.java
  6. 56 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/InTypeEnum.java
  7. 56 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/OutTypeEnum.java
  8. 2 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/order/OrderSalesDetailsEx.java
  9. 37 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/order/OrderSalesIssueVo.java
  10. 62 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockChangeVo.java
  11. 1 1
      hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockWaterServiceImpl.java
  12. 10 0
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/order/OrderSalesDetailsController.java
  13. 9 0
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/StockController.java
  14. 1 0
      hx-service/victoriatourist/src/main/java/com/fjhx/mapper/order/OrderSalesDetailsMapper.xml
  15. 5 5
      hx-service/victoriatourist/src/main/java/com/fjhx/mapper/supplier/SupplierPriceMapper.xml
  16. 6 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/order/OrderSalesDetailsService.java
  17. 15 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/order/impl/OrderSalesDetailsServiceImpl.java
  18. 1 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/order/impl/OrderSalesServiceImpl.java
  19. 9 7
      hx-service/victoriatourist/src/main/java/com/fjhx/service/product/impl/ProductInfoServiceImpl.java
  20. 2 11
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockService.java
  21. 142 40
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockServiceImpl.java
  22. 6 6
      hx-service/victoriatourist/src/main/java/com/fjhx/service/supplier/impl/SupplierPriceServiceImpl.java
  23. 4 2
      hx-service/victoriatourist/src/main/java/com/fjhx/uitl/code/CodeEnum.java

+ 6 - 1
hx-common/common-client-util/src/main/java/com/fjhx/utils/FileClientUtil.java

@@ -133,7 +133,12 @@ public class FileClientUtil {
         Map<Long, List<FileInfo>> fileInfoListMap = getFileInfoListMap(businessIdList);
 
         for (Map<String, Object> stringMap : list) {
-            stringMap.put(fileInfoListName, fileInfoListMap.get(Convert.toLong(stringMap.get(businessIdName))));
+            List<FileInfo> fileInfoList = fileInfoListMap.get(Convert.toLong(stringMap.get(businessIdName)));
+            if (ObjectUtil.isNotEmpty(fileInfoList)) {
+                stringMap.put(fileInfoListName, fileInfoList);
+            } else {
+                stringMap.put(fileInfoListName, new ArrayList<>());
+            }
         }
     }
 

+ 71 - 0
hx-common/common-tool/src/main/java/com/fjhx/utils/LockUtil.java

@@ -0,0 +1,71 @@
+package com.fjhx.utils;
+
+import cn.hutool.core.thread.ThreadUtil;
+import com.fjhx.constants.ErrorMsgConstant;
+import org.springblade.core.log.exception.ServiceException;
+
+import java.util.function.BooleanSupplier;
+
+/**
+ * 锁工具类
+ */
+@SuppressWarnings({"unused"})
+public class LockUtil {
+
+    /**
+     * 乐观锁
+     *
+     * @param maxRetryCount   最大重试次数
+     * @param millis          再次执行等待时长
+     * @param booleanSupplier 执行方法
+     */
+    public static void optimisticLock(int maxRetryCount, long millis, BooleanSupplier booleanSupplier) {
+
+        int retryCount = 0;
+
+        while (retryCount < maxRetryCount) {
+            if (booleanSupplier.getAsBoolean()) return;
+            retryCount++;
+            ThreadUtil.sleep(millis);
+        }
+
+        throw new ServiceException(ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+    }
+
+    /**
+     * 乐观锁
+     * <p>默认最多执行3次,每次失败等待300毫秒</p>
+     *
+     * @param booleanSupplier 执行方法
+     */
+    public static void optimisticLock(BooleanSupplier booleanSupplier) {
+        optimisticLock(3, 300, booleanSupplier);
+    }
+
+//    /**
+//     * 加锁获取缓存,防止缓存击穿
+//     *
+//     * @param cacheKey 缓存key
+//     * @param lock     锁对象
+//     * @param supplier 执行获取缓存方法
+//     * @param <T>      缓存值
+//     * @return 缓存值
+//     */
+//    public static <T> T cacheLock(String cacheKey, Lock lock, Supplier<T> supplier) {
+//        T change = RedisCache.get(cacheKey);
+//        if (ObjectUtil.isNull(change)) {
+//            try {
+//                lock.lock();
+//                change = RedisCache.get(cacheKey);
+//                if (ObjectUtil.isNull(change)) {
+//                    change = supplier.get();
+//                    RedisCache.set(cacheKey, change);
+//                }
+//            } finally {
+//                lock.unlock();
+//            }
+//        }
+//        return change;
+//    }
+
+}

+ 16 - 5
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/order/OrderSalesDetails.java

@@ -1,16 +1,15 @@
 package com.fjhx.entity.order;
 
-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.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.Version;
 import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 销售订单明细表
@@ -45,11 +44,23 @@ public class OrderSalesDetails extends BaseEntity {
     private BigDecimal price;
 
     /**
+     * 未出库数量
+     */
+    private BigDecimal notIssuedQuantity;
+
+    /**
      * 备注
      */
     private String remark;
 
     /**
+     * 乐观锁
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @Version
+    private Integer version;
+
+    /**
      * 逻辑删除 0未删除 1已删除
      */
     @TableField(fill = FieldFill.INSERT)

+ 11 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/Stock.java

@@ -1,5 +1,9 @@
 package com.fjhx.entity.stock;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.Version;
 import com.fjhx.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -38,4 +42,11 @@ public class Stock extends BaseEntity {
      */
     private Long warehouseId;
 
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer delFlag;
+
 }

+ 5 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/StockJournal.java

@@ -30,6 +30,11 @@ public class StockJournal extends BaseEntity {
     private Integer detailsType;
 
     /**
+     * 业务id
+     */
+    private Long businessId;
+
+    /**
      * 物品id
      */
     private Long goodsId;

+ 56 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/InTypeEnum.java

@@ -0,0 +1,56 @@
+package com.fjhx.enums.stock;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.Getter;
+import org.springblade.core.tool.utils.StringPool;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 入库类型枚举
+ */
+@Getter
+public enum InTypeEnum {
+    PURCHASE(1, "采购入库"),
+    MANUAL(2, "手动入库"),
+    ;
+
+    private final int key;
+
+    private final String value;
+
+    InTypeEnum(int key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    private static final Map<Integer, InTypeEnum> classMap = new HashMap<>();
+
+    static {
+        for (InTypeEnum value : InTypeEnum.values()) {
+            classMap.put(value.getKey(), value);
+        }
+    }
+
+    /**
+     * 根据key获取枚举
+     */
+    public static InTypeEnum getEnumByKey(Integer type) {
+        return classMap.get(type);
+    }
+
+    /**
+     * 通过key获取名称
+     */
+    public static String getValueByKey(Integer key) {
+        InTypeEnum inTypeEnum = classMap.get(key);
+
+        if (ObjectUtil.isEmpty(inTypeEnum)) {
+            return StringPool.EMPTY;
+        }
+
+        return inTypeEnum.getValue();
+    }
+
+}

+ 56 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/OutTypeEnum.java

@@ -0,0 +1,56 @@
+package com.fjhx.enums.stock;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.Getter;
+import org.springblade.core.tool.utils.StringPool;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 入库类型枚举
+ */
+@Getter
+public enum OutTypeEnum {
+    PURCHASE(1, "采购出库"),
+    MANUAL(2, "手动出库"),
+    ;
+
+    private final int key;
+
+    private final String value;
+
+    OutTypeEnum(int key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    private static final Map<Integer, OutTypeEnum> classMap = new HashMap<>();
+
+    static {
+        for (OutTypeEnum value : OutTypeEnum.values()) {
+            classMap.put(value.getKey(), value);
+        }
+    }
+
+    /**
+     * 根据key获取枚举
+     */
+    public static OutTypeEnum getEnumByKey(Integer type) {
+        return classMap.get(type);
+    }
+
+    /**
+     * 通过key获取名称
+     */
+    public static String getValueByKey(Integer key) {
+        OutTypeEnum outTypeEnum = classMap.get(key);
+
+        if (ObjectUtil.isEmpty(outTypeEnum)) {
+            return StringPool.EMPTY;
+        }
+
+        return outTypeEnum.getValue();
+    }
+
+}

+ 2 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/order/OrderSalesDetailsEx.java

@@ -4,6 +4,8 @@ import com.fjhx.entity.order.OrderSalesDetails;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * 销售订单明细表
  *

+ 37 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/order/OrderSalesIssueVo.java

@@ -0,0 +1,37 @@
+package com.fjhx.params.order;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class OrderSalesIssueVo {
+
+    /**
+     * 仓库id
+     */
+    private Long warehouseId;
+
+    /**
+     * 出库明细
+     */
+    private List<IssueDetails> issueDetailsList;
+
+
+    @Data
+    public static class IssueDetails {
+
+        /**
+         * 明细id
+         */
+        private Long detailsId;
+
+        /**
+         * 出库数量
+         */
+        private BigDecimal issueQuantity;
+
+    }
+
+}

+ 62 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockChangeVo.java

@@ -0,0 +1,62 @@
+package com.fjhx.params.stock;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class StockChangeVo {
+
+    /**
+     * 默认出库或入库的仓库id
+     * 未指定仓库id时,会使用此仓库id
+     */
+    private Long defaultWarehouseId;
+
+    /**
+     * 默认备注
+     * 未指定备注时,会使用此备注
+     */
+    private String defaultRemarks;
+
+    /**
+     * 业务id
+     */
+    private Long businessId;
+
+    /**
+     * InTypeEnum or OutTypeEnum
+     */
+    private Enum<?> typeEnum;
+
+    /**
+     * 变更明细
+     */
+    private List<? extends ChangeDetails> changeDetailsList;
+
+    public interface ChangeDetails {
+
+        /**
+         * 物品id
+         */
+        Long getGoodsId();
+
+        /**
+         * 仓库id
+         */
+        Long getWarehouseId();
+
+        /**
+         * 变更数量
+         */
+        BigDecimal getChangeQuantity();
+
+        /**
+         * 备注
+         */
+        String getRemarks();
+
+    }
+
+}

+ 1 - 1
hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockWaterServiceImpl.java

@@ -494,7 +494,7 @@ public class StockWaterServiceImpl extends ServiceImpl<StockWaterMapper, StockWa
 
         QueryWrapper<Object> wrapper = Wrappers.query();
         wrapper.eq("sd.MaterialCode", materialCode);
-        wrapper.eq("st.IsDelete", 0);
+//        wrapper.eq("st.IsDelete", 0);
         wrapper.orderByAsc("sd.CreatedTime");
 
 

+ 10 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/controller/order/OrderSalesDetailsController.java

@@ -1,6 +1,7 @@
 package com.fjhx.controller.order;
 
 import com.fjhx.params.order.OrderSalesDetailsEx;
+import com.fjhx.params.order.OrderSalesIssueVo;
 import com.fjhx.service.order.OrderSalesDetailsService;
 import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,5 +59,14 @@ public class OrderSalesDetailsController {
         return R.success(result);
     }
 
+    /**
+     * 出库
+     */
+    @PostMapping("/issue")
+    public R issue(@RequestBody OrderSalesIssueVo orderSalesIssueVo) {
+        orderSalesDetailsService.issue(orderSalesIssueVo);
+        return R.success();
+    }
+
 }
 

+ 9 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/StockController.java

@@ -2,6 +2,8 @@ package com.fjhx.controller.stock;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.entity.stock.Stock;
+import com.fjhx.enums.stock.InTypeEnum;
+import com.fjhx.params.stock.StockChangeVo;
 import com.fjhx.params.stock.StockVo;
 import com.fjhx.service.stock.StockService;
 import org.springblade.core.tool.api.R;
@@ -52,5 +54,12 @@ public class StockController {
         return R.success();
     }
 
+    @PostMapping("/test")
+    public R test(@RequestBody StockChangeVo stockVo) {
+        stockVo.setTypeEnum(InTypeEnum.MANUAL);
+        stockService.changeQuantity(stockVo);
+        return R.success();
+    }
+
 }
 

+ 1 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/mapper/order/OrderSalesDetailsMapper.xml

@@ -7,6 +7,7 @@
                osd.order_sales_id,
                osd.product_id,
                osd.quantity,
+               osd.not_issued_quantity,
                osd.price,
                osd.remark,
                pi.name  productName,

+ 5 - 5
hx-service/victoriatourist/src/main/java/com/fjhx/mapper/supplier/SupplierPriceMapper.xml

@@ -7,13 +7,13 @@
                sp.price,
                sp.material_id,
                sp.supplier_id,
-               s.`name` supplierName,
-               m.`name` materialName,
-               m.`code` materialCode,
-               m.type   materialType
+               s.`name`  supplierName,
+               pi.`name` materialName,
+               pi.`code` materialCode,
+               pi.type   materialType
         FROM supplier_price sp
                  INNER JOIN supplier s ON sp.supplier_id = s.id
-                 INNER JOIN material m ON sp.material_id = m.id
+                 INNER JOIN product_info pi ON sp.material_id = pi.id
             ${ew.customSqlSegment}
     </select>
 

+ 6 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/order/OrderSalesDetailsService.java

@@ -5,6 +5,7 @@ import com.fjhx.entity.order.OrderSalesDetails;
 import com.fjhx.params.order.OrderSalesDetailsEx;
 import com.fjhx.params.order.OrderSalesDetailsVo;
 import com.fjhx.base.BaseService;
+import com.fjhx.params.order.OrderSalesIssueVo;
 
 import java.util.List;
 import java.util.Map;
@@ -29,4 +30,9 @@ public interface OrderSalesDetailsService extends BaseService<OrderSalesDetails>
 
     List<OrderSalesDetailsEx> listByOrderSalesId(Map<String, Object> condition);
 
+    /**
+     * 出库
+     */
+    void issue(OrderSalesIssueVo orderSalesDetailsList);
+
 }

+ 15 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/order/impl/OrderSalesDetailsServiceImpl.java

@@ -6,6 +6,7 @@ import com.fjhx.entity.order.OrderSalesDetails;
 import com.fjhx.mapper.order.OrderSalesDetailsMapper;
 import com.fjhx.params.order.OrderSalesDetailsEx;
 import com.fjhx.params.order.OrderSalesDetailsVo;
+import com.fjhx.params.order.OrderSalesIssueVo;
 import com.fjhx.service.order.OrderSalesDetailsService;
 import com.fjhx.utils.wrapperUtil.IWrapper;
 import org.springframework.stereotype.Service;
@@ -55,4 +56,18 @@ public class OrderSalesDetailsServiceImpl extends ServiceImpl<OrderSalesDetailsM
         return baseMapper.listByOrderSalesId(wrapper);
     }
 
+    @Override
+    public void issue(OrderSalesIssueVo orderSalesIssueVo) {
+
+//        // 出库数量大于0的订单明细id和出库数量
+//        Map<Long, BigDecimal> orderSalesDetailsIdList = orderSalesDetailsList.stream()
+//                .filter(item -> item.getIssueQuantity().compareTo(BigDecimal.ZERO) > 0)
+//                .collect(Collectors.toMap(
+//                        OrderSalesDetailsEx::getId,
+//                        OrderSalesDetailsEx::getIssueQuantity
+//                ));
+
+
+    }
+
 }

+ 1 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/order/impl/OrderSalesServiceImpl.java

@@ -86,6 +86,7 @@ public class OrderSalesServiceImpl extends ServiceImpl<OrderSalesMapper, OrderSa
         // 添加订单明细
         for (OrderSalesDetails orderSalesDetails : orderSalesDetailsList) {
             orderSalesDetails.setOrderSalesId(orderSalesVo.getId());
+            orderSalesDetails.setNotIssuedQuantity(orderSalesDetails.getQuantity());
         }
         orderSalesDetailsService.saveBatch(orderSalesDetailsList);
     }

+ 9 - 7
hx-service/victoriatourist/src/main/java/com/fjhx/service/product/impl/ProductInfoServiceImpl.java

@@ -27,11 +27,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -130,9 +126,15 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     @Override
     public void add(ProductInfoVo productInfoVo) {
 
+        productInfoVo.setComputingTime(new Date());
+
         synchronized (this) {
-            productInfoVo.setCode(CodeEnum.PRODUCT.getCode(productInfoVo.getCode()));
-            productInfoVo.setComputingTime(new Date());
+            if (ObjectUtil.equals(productInfoVo.getType(), 1)) {
+                productInfoVo.setCode(CodeEnum.PRODUCT_FINISHED.getCode(productInfoVo.getCode()));
+            } else {
+                productInfoVo.setCode(CodeEnum.PRODUCT_PARTIALLY_PREPARED.getCode(productInfoVo.getCode()));
+            }
+
             save(productInfoVo);
         }
 

+ 2 - 11
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockService.java

@@ -3,6 +3,7 @@ package com.fjhx.service.stock;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.base.BaseService;
 import com.fjhx.entity.stock.Stock;
+import com.fjhx.params.stock.StockChangeVo;
 import com.fjhx.params.stock.StockVo;
 
 import java.math.BigDecimal;
@@ -26,16 +27,6 @@ public interface StockService extends BaseService<Stock> {
 
     void delete(StockVo stockVo);
 
-    /**
-     * 变更数量
-     * 入库正数,出库负数
-     *
-     * @param goodsId     物品id
-     * @param warehouseId 仓库id
-     * @param quantity    数量
-     * @param detailsType 出入库详细类型
-     * @param remarks     备注
-     */
-    void changeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType, String remarks);
+    void changeQuantity(StockChangeVo stockChangeVo);
 
 }

+ 142 - 40
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockServiceImpl.java

@@ -1,17 +1,20 @@
 package com.fjhx.service.stock.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.constants.ErrorMsgConstant;
+import com.fjhx.constants.StatusConstant;
 import com.fjhx.constants.StockJournalTypeConstant;
-import com.fjhx.constants.VLockConstant;
 import com.fjhx.entity.stock.Stock;
+import com.fjhx.entity.stock.StockJournal;
+import com.fjhx.enums.stock.InTypeEnum;
+import com.fjhx.enums.stock.OutTypeEnum;
 import com.fjhx.mapper.stock.StockMapper;
+import com.fjhx.params.stock.StockChangeVo;
 import com.fjhx.params.stock.StockVo;
 import com.fjhx.service.stock.StockService;
-import com.fjhx.utils.Assert;
 import com.fjhx.utils.WrapperUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.redis.lock.RedisLockClient;
@@ -21,7 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Map;
+import java.util.*;
 
 /**
  * <p>
@@ -67,47 +70,146 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
         removeById(stockVo.getId());
     }
 
+//    @Transactional(rollbackFor = Exception.class)
+//    @Override
+//    public void changeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType, String remarks) {
+//        // 分布式锁,粒度为物品id + 仓库id
+//        Boolean flag = redisLockClient.lockFair(VLockConstant.STOCK_LOCK + goodsId + warehouseId,
+//                () -> {
+//                    Stock stock = getOne(q -> q.eq(Stock::getGoodsId, goodsId).eq(Stock::getWarehouseId, warehouseId));
+//
+//                    // 没有物料存储记录,则创建物料
+//                    if (stock == null) {
+//                        if (quantity.compareTo(BigDecimal.ZERO) < 0) {
+//                            throw new ServiceException("库存不足,出库失败");
+//                        }
+//
+//                        stock = new Stock();
+//                        stock.setGoodsId(goodsId);
+//                        stock.setQuantity(quantity);
+//                        stock.setWarehouseId(warehouseId);
+//                        return save(stock);
+//                    }
+//
+//                    BigDecimal newQuantity = stock.getQuantity().add(quantity);
+//                    if (newQuantity.compareTo(BigDecimal.ZERO) < 0) {
+//                        throw new ServiceException("库存不足,出库失败");
+//                    }
+//
+//                    stock.setQuantity(newQuantity);
+//                    return updateById(stock);
+//                });
+//
+//        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
+//        );
+//    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void changeQuantity(Long goodsId, Long warehouseId, BigDecimal quantity, Integer detailsType, String remarks) {
-        // 分布式锁,粒度为物品id + 仓库id
-        Boolean flag = redisLockClient.lockFair(VLockConstant.STOCK_LOCK + goodsId + warehouseId,
-                () -> {
-                    Stock stock = getOne(q -> q.eq(Stock::getGoodsId, goodsId).eq(Stock::getWarehouseId, warehouseId));
-
-                    // 没有物料存储记录,则创建物料
-                    if (stock == null) {
-                        if (quantity.compareTo(BigDecimal.ZERO) < 0) {
-                            throw new ServiceException("库存不足,出库失败");
-                        }
-
-                        stock = new Stock();
-                        stock.setGoodsId(goodsId);
-                        stock.setQuantity(quantity);
-                        stock.setWarehouseId(warehouseId);
-                        return save(stock);
+    public void changeQuantity(StockChangeVo stockChangeVo) {
+
+        Enum<?> typeEnum = stockChangeVo.getTypeEnum();
+        List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
+
+        HashMap<String, Stock> map = new HashMap<>();
+
+        for (StockChangeVo.ChangeDetails changeDetails : changeDetailsList) {
+
+            // 变更数量
+            BigDecimal changeQuantity = changeDetails.getChangeQuantity();
+            // 变更数量小于等于0,则跳过
+            if (changeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
+                return;
+            }
+            // 仓库id
+            Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeVo.getDefaultWarehouseId());
+            // 物品id
+            Long goodsId = changeDetails.getGoodsId();
+
+            String key = goodsId + "" + warehouseId;
+
+            Stock stock = map.get(key);
+            if (null == stock) {
+                stock = new Stock();
+                stock.setWarehouseId(warehouseId);
+                stock.setGoodsId(goodsId);
+                stock.setQuantity(changeQuantity);
+                stock.setFrozenQuantity(changeQuantity);
+                map.put(key, stock);
+            } else {
+                stock.setQuantity(stock.getQuantity().add(changeQuantity));
+                stock.setFrozenQuantity(stock.getFrozenQuantity().add(changeQuantity));
+            }
+        }
+        Set<String> keySet = map.keySet();
+        if (keySet.size() == 0) return;
+
+        synchronized (this) {
+            List<Stock> list = list(Wrappers.<Stock>query().in("CONCAT(goods_id, warehouse_id)", keySet));
+            if (list.size() == 0) return;
+            for (Stock stock : list) {
+                String key = stock.getGoodsId() + "" + stock.getWarehouseId();
+                Stock itemStock = map.get(key);
+                itemStock.setId(stock.getId());
+                if (stockChangeVo.getTypeEnum() instanceof InTypeEnum) {
+                    itemStock.setQuantity(itemStock.getQuantity().add(stock.getQuantity()));
+                    itemStock.setFrozenQuantity(itemStock.getFrozenQuantity().add(stock.getFrozenQuantity()));
+                } else {
+                    BigDecimal quantity = itemStock.getQuantity().subtract(stock.getQuantity());
+                    if (quantity.compareTo(BigDecimal.ZERO) < 0) {
+                        throw new ServiceException("产品库存不足,出库失败");
                     }
+                    itemStock.setQuantity(quantity);
+                }
+            }
+            saveOrUpdateBatch(new ArrayList<>(map.values()));
+        }
 
-                    BigDecimal newQuantity = stock.getQuantity().add(quantity);
-                    if (newQuantity.compareTo(BigDecimal.ZERO) < 0) {
-                        throw new ServiceException("库存不足,出库失败");
-                    }
 
-                    stock.setQuantity(newQuantity);
-                    return updateById(stock);
-                });
-
-        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
-        );
+        // 添加入库明细
+        List<StockJournal> stockJournalList = new ArrayList<>();
+
+        for (StockChangeVo.ChangeDetails changeDetails : changeDetailsList) {
+
+            // 变更数量
+            BigDecimal changeQuantity = changeDetails.getChangeQuantity();
+
+            // 变更数量小于等于0,则跳过
+            if (changeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
+                return;
+            }
+
+            StockJournal stockJournal = new StockJournal();
+
+            Integer type = typeEnum instanceof InTypeEnum ? StockJournalTypeConstant.IN : StockJournalTypeConstant.OUT;
+
+            stockJournal.setType(type);
+            stockJournal.setDetailsType(typeEnum instanceof InTypeEnum ?
+                    ((InTypeEnum) typeEnum).getKey() : ((OutTypeEnum) typeEnum).getKey());
+            stockJournal.setBusinessId(stockChangeVo.getBusinessId());
+            stockJournal.setGoodsId(changeDetails.getGoodsId());
+            stockJournal.setWarehouseId(changeDetails.getWarehouseId());
+            stockJournal.setChangeQuantity(changeQuantity);
+
+            if (typeEnum instanceof InTypeEnum) {
+                stockJournal.setActualQuantity(BigDecimal.ZERO);
+                stockJournal.setIsInStock(StatusConstant.NO);
+            }
+
+            stockJournal.setRemarks(ObjectUtil.defaultIfNull(changeDetails.getRemarks(), stockChangeVo.getDefaultRemarks()));
+            stockJournalList.add(stockJournal);
+        }
+
+        stockJournalService.saveBatch(stockJournalList);
     }
 
 }

+ 6 - 6
hx-service/victoriatourist/src/main/java/com/fjhx/service/supplier/impl/SupplierPriceServiceImpl.java

@@ -36,14 +36,14 @@ public class SupplierPriceServiceImpl extends ServiceImpl<SupplierPriceMapper, S
         IWrapper<SupplierPrice> wrapper = IWrapper.getWrapper(condition);
         wrapper.orderByDesc(Supplier::getId)
                 .keyword(new KeywordData("s", Supplier::getName),
-                        new KeywordData("m", Material::getName),
-                        new KeywordData("m", Material::getCode))
+                        new KeywordData("pi", Material::getName),
+                        new KeywordData("pi", Material::getCode))
                 .eq("s", Supplier::getId, condition.get("supplierId"))
-                .eq("m", Material::getId, condition.get("materialId"))
+                .eq("pi", Material::getId, condition.get("materialId"))
                 .like("s", Supplier::getName, condition.get("supplierName"))
-                .like("m", Material::getName, condition.get("materialName"))
-                .like("m", Material::getCode, condition.get("materialCode"))
-                .eq("m", Material::getType, condition.get("materialType"));
+                .like("pi", Material::getName, condition.get("materialName"))
+                .like("pi", Material::getCode, condition.get("materialCode"))
+                .eq("pi", Material::getType, condition.get("materialType"));
 
         return baseMapper.getPage(createPage(condition), wrapper);
     }

+ 4 - 2
hx-service/victoriatourist/src/main/java/com/fjhx/uitl/code/CodeEnum.java

@@ -30,8 +30,10 @@ public enum CodeEnum {
     SPU("SPU", null, "code", 5, ProductSpuService.class),
     //申购单
     APPLY_PURCHASE("AP", "yyyyMM-", "code", 5, ApplyPurchaseService.class),
-    // 产品,
-    PRODUCT("P", null, "code", 5, ProductInfoService.class),
+    // 产品_成品
+    PRODUCT_FINISHED("PF", null, "code", 5, ProductInfoService.class),
+    // 产品_半成品
+    PRODUCT_PARTIALLY_PREPARED("PP", null, "code", 5, ProductInfoService.class),
     //采购
     PURCHASE("PO", "yyyyMM-", "code", 5, PurchaseService.class),
     //客户