ソースを参照

待出库 自动组合

yzc 1 年間 前
コミット
15e566864d

+ 5 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/group/po/GroupRecord.java

@@ -38,4 +38,9 @@ public class GroupRecord extends BasePo {
     @NotNull(message = "组合后放置仓库/拆分前所在仓库 id不能为空")
     private Long groupWarehouseId;
 
+    /**
+     * 组合说明
+     */
+    private String remark;
+
 }

+ 25 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/WmsServiceImpl.java

@@ -4,10 +4,13 @@ import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.victoriatourist.entity.abnormal.po.AbnormalInfo;
+import com.fjhx.victoriatourist.entity.group.dto.GroupRecordDto;
+import com.fjhx.victoriatourist.entity.group.po.GroupRecordDetails;
 import com.fjhx.victoriatourist.entity.purchase.po.PurchaseBack;
 import com.fjhx.victoriatourist.entity.purchase.vo.PurchaseBackVo;
 import com.fjhx.victoriatourist.entity.quality.po.QualityDetails;
 import com.fjhx.victoriatourist.service.abnormal.AbnormalInfoService;
+import com.fjhx.victoriatourist.service.group.GroupRecordDetailsService;
 import com.fjhx.victoriatourist.service.order.OrderInfoService;
 import com.fjhx.victoriatourist.service.purchase.PurchaseBackService;
 import com.fjhx.victoriatourist.service.quality.QualityDetailsService;
@@ -17,6 +20,8 @@ import com.fjhx.wms.service.WmsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.List;
 
 @Service
@@ -29,6 +34,8 @@ public class WmsServiceImpl implements WmsService {
     private PurchaseBackService purchaseBackService;
     @Autowired
     private QualityDetailsService qualityDetailsService;
+    @Autowired
+    private GroupRecordDetailsService groupRecordDetailsService;
 
 //    /**
 //     * 销售订单出库
@@ -71,4 +78,22 @@ public class WmsServiceImpl implements WmsService {
         List<QualityDetailsPo> qualityDetailsPos = BeanUtil.copyToList(list, QualityDetailsPo.class);
         return qualityDetailsPos;
     }
+
+    @Override
+    public void autoCombination(Long productId, BigDecimal quantity, Long warehouseId) {
+        GroupRecordDto dto = new GroupRecordDto();
+        dto.setType(1);
+        dto.setGroupWarehouseId(warehouseId);
+        dto.setProductWarehouseId(warehouseId);
+        dto.setRemark("直接出库系统自动组合");
+
+        GroupRecordDetails groupRecordDetails = new GroupRecordDetails();
+        groupRecordDetails.setProductId(productId);
+        groupRecordDetails.setGroupNum(quantity);
+
+        dto.setGroupRecordDetailsList(Arrays.asList(groupRecordDetails));
+
+        //调用组合接口自动组合产品
+        groupRecordDetailsService.add(dto);
+    }
 }

+ 3 - 3
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/StockWaitType.java

@@ -38,15 +38,15 @@ public enum StockWaitType {
      */
     private final String linkBusinessTableName;
 
-    private static HashMap<String, String> hashMap = new HashMap<>();
+    private static HashMap<String, StockWaitType> hashMap = new HashMap<>();
     static {
         for (StockWaitType value : StockWaitType.values()) {
-            hashMap.put(String.valueOf(value.detailType), value.detailTypeRemark);
+            hashMap.put(String.valueOf(value.detailType), value);
         }
     }
 
     public static String getEnum(String code) {
-        return hashMap.get(code);
+        return hashMap.get(code).getDetailTypeRemark();
     }
 
 }

+ 6 - 0
hx-wms/src/main/java/com/fjhx/wms/service/WmsService.java

@@ -3,6 +3,7 @@ package com.fjhx.wms.service;
 import com.fjhx.wms.entity.QualityDetailsPo;
 import com.fjhx.wms.entity.stock.dto.StockWaitDto;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 public interface WmsService {
@@ -31,4 +32,9 @@ public interface WmsService {
      * 根据到货id获取质检明细
      */
     List<QualityDetailsPo> getQualityDetailsList(List<Long> arrivalStockRecordsDetailsIds);
+
+    /**
+     * 自动组合
+     */
+    void autoCombination(Long productId, BigDecimal quantity, Long warehouseId);
 }

+ 41 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -10,6 +10,7 @@ import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductClassify;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductClassifyService;
@@ -35,6 +36,7 @@ import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
 import com.fjhx.wms.entity.warehouse.po.Warehouse;
 import com.fjhx.wms.mapper.stock.StockMapper;
 import com.fjhx.wms.service.PurService;
+import com.fjhx.wms.service.WmsService;
 import com.fjhx.wms.service.stock.StockJournalDetailsService;
 import com.fjhx.wms.service.stock.StockJournalService;
 import com.fjhx.wms.service.stock.StockService;
@@ -86,6 +88,8 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
     private StockWaitService stockWaitService;
     @Autowired
     private DictTenantDataService dictTenantDataService;
+    @Autowired
+    private WmsService wmsService;
 
     @Override
     public Page<StockVo> getPage(StockSelectDto dto) {
@@ -546,6 +550,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 oldStocks.setProductId(stock.getProductId());
                 oldStocks.setWarehouseId(warehouseId);
                 oldStocks.setQuantity(BigDecimal.ZERO);
+                this.save(oldStocks);
             }
 
             if (type == 1) {
@@ -560,7 +565,42 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 }
                 BigDecimal quantity = oldStocks.getQuantity().subtract(stock.getQuantity());
                 if (quantity.compareTo(BigDecimal.ZERO) < 0) {
-                    throw new ServiceException("以下商品库存不足,无法出库:" + productInfo.getName());
+                    //库存不足判断是否是组合
+                    String victoriatouristJson = productInfo.getVictoriatouristJson();
+                    JSONObject json = ObjectUtil.isNotEmpty(victoriatouristJson) ? JSONObject.parseObject(victoriatouristJson) : new JSONObject();
+                    Integer combination = json.getInteger("combination");
+                    if (combination != 1) {
+                        //不是组合直接报错
+                        throw new ServiceException("以下商品库存不足,无法出库:" + productInfo.getName());
+                    }
+                    //计算差多少 自动组合差的那部分
+                    BigDecimal differenceQuantity = stock.getQuantity().subtract(oldStocks.getQuantity());
+                    //获取产品组合信息
+                    JSONArray productCombinationListArr = json.getJSONArray("productCombinationList");
+                    Assert.notEmpty(productCombinationListArr, "产品组合信息为空");
+                    List<JSONObject> productCombinationList = productCombinationListArr.toJavaList(JSONObject.class);
+                    List<Long> linkProductIds = productCombinationList.stream().map(item -> item.getLong("linkProductId")).collect(Collectors.toList());
+                    Map<Long, Stock> combinationStockMap = this.mapKEntity(Stock::getProductId, q -> q
+                            .eq(Stock::getWarehouseId, warehouseId)
+                            .in(Stock::getProductId, linkProductIds));
+                    //检查是否满足自动组合条件
+                    for (JSONObject jsonObject : productCombinationList) {
+                        Stock stockInfo = combinationStockMap.get(jsonObject.getLong("linkProductId"));
+                        BigDecimal requiredQuantity = jsonObject.getBigDecimal("linkQuantity").multiply(differenceQuantity);
+                        if (ObjectUtil.isEmpty(stockInfo) || stockInfo.getQuantity().compareTo(requiredQuantity) < 0) {
+                            throw new ServiceException("该组合产品,子产品库存不足无法自动组合出库:" + productInfo.getName());
+                        }
+                    }
+                    //创建组合信息
+                    wmsService.autoCombination(productInfo.getId(), differenceQuantity, warehouseId);
+
+                    //组合完成 再次尝试出库
+                    oldStocks = this.getOne(q -> q.eq(Stock::getProductId, productInfo.getId()).eq(Stock::getWarehouseId, warehouseId));
+                    quantity = oldStocks.getQuantity().subtract(stock.getQuantity());
+                    oldStocks.setQuantity(quantity);
+                    if (quantity.compareTo(BigDecimal.ZERO) < 0) {
+                        throw new ServiceException("以下商品库存不足,无法出库:" + productInfo.getName());
+                    }
                 }
                 oldStocks.setQuantity(quantity);
             } else if (type == 3) {

+ 19 - 26
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java

@@ -230,31 +230,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         List<Stock> stockList = new ArrayList<>();
 
         List<StockWaitDetails> stockWaitDetailsDtoList = stockWaitDto.getStockWaitDetailsList();
-//        List<Long> dids = stockWaitDetailsDtoList.stream().map(StockWaitDetails::getId).collect(Collectors.toList());
         Map<Long, StockWaitDetails> stockWaitDetailsMap = stockWaitDetailsDtoList.stream().collect(Collectors.toMap(StockWaitDetails::getId, Function.identity()));
-//        List<StockWaitDetails> stockWaitDetailss = stockWaitDetailsService.listByIds(dids);
-
-        //已经完全入库数量统计
-//        int statusFlag = 0;
-//        for (StockWaitDetails stockWaitDetail : stockWaitDetailss) {
-//            StockWaitDetails temp = stockWaitDetailsMap.get(stockWaitDetail.getId());
-//            //更新已入库数量
-//            BigDecimal receiptQuantity = stockWaitDetail.getReceiptQuantity() == null ? BigDecimal.ZERO : stockWaitDetail.getReceiptQuantity();
-//            stockWaitDetail.setReceiptQuantity(receiptQuantity.add(temp.getQuantity()));
-//
-//            //计算已经完全入库的数量
-//            if (stockWaitDetail.getReceiptQuantity().compareTo(stockWaitDetail.getQuantity()) >= 0) {
-//                statusFlag++;
-//            }
-//        }
-//        stockWaitDetailsService.updateBatchById(stockWaitDetailss);
-//        //修改待入库状态
-//        StockWait stockWait = getById(stockWaitDto.getId());
-//        if (statusFlag == stockWaitDetailss.size()) {
-//            stockWait.setStatus(2);//入库完成
-//        } else {
-//            stockWait.setStatus(1);//部分入库
-//        }
 
         //更新已出入库数量以及待出入库状态
         stockWaitDetailsService.changeStockWaitStatus(stockWaitDto);
@@ -334,7 +310,24 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         //保存出入库记录
         stockJournalService.save(stockJournal);
 
-        List<StockJournalDetails> stockJournalDetailsList = stockService.ModifyInventory(stockJournal.getId(), 3, stockList, stockWaitDto.getWarehouseId());
+
+        //库存操作类型
+        Integer opType = -1;
+        //到货入库
+        if (StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType() == businessType) {
+            opType = 3;
+        }
+        //退货出库
+        if (StockWaitType.BACK_OUT.getDetailType() == businessType) {
+            opType = 4;
+        }
+        //销售订单出库
+        if (StockWaitType.SALE_ORDER_OUT.getDetailType() == businessType) {
+            opType = 2;
+        }
+
+
+        List<StockJournalDetails> stockJournalDetailsList = stockService.ModifyInventory(stockJournal.getId(), opType, stockList, stockWaitDto.getWarehouseId());
         //保存出入库明细
         stockJournalDetailsService.saveBatch(stockJournalDetailsList);
 
@@ -452,7 +445,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
                 .in("sw.id", ids)
         );
         //赋值业务来源
-        stockWaitList.forEach(item->item.setBusinessType(StockWaitType.getEnum(item.getBusinessType())));
+        stockWaitList.forEach(item -> item.setBusinessType(StockWaitType.getEnum(item.getBusinessType())));
 
         //导出Excel
         ExcelUtil.export(httpServletResponse, stockWaitList, InStockWaitExportExcel.class);