andy 2 năm trước cách đây
mục cha
commit
34478d49b0

+ 0 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/wms/order/WmsDocOrderHeaderController.java

@@ -144,7 +144,6 @@ public class WmsDocOrderHeaderController extends BaseController {
         return wmsDocOrderHeaderService.doAllocation(allocationForm.getOrderNo());
     }
 
-
     @GetMapping(value = "/initOrderDetails/{orderNo}")
     public AjaxResult initOrderDetails(@PathVariable("orderNo") String orderNo) {
         LoginUser loginUser = getLoginUser();

+ 6 - 6
ruoyi-ui/src/views/wms/allocation/index.vue

@@ -95,7 +95,7 @@
 
     <el-table v-loading="loading" :data="allocationList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="主键" align="center" prop="allocationId" />
+      <!--<el-table-column label="主键" align="center" prop="allocationId" />-->
       <el-table-column label="出库单号" align="center" prop="orderNo" />
       <el-table-column label="行号" align="center" prop="lineNo" />
       <el-table-column label="物料" align="center" prop="material" />
@@ -106,17 +106,17 @@
       </el-table-column>
       <el-table-column label="分配数量" align="center" prop="qty" />
       <el-table-column label="lotnum" align="center" prop="lotnum" />
+      <el-table-column label="拣货数量" align="center" prop="pickQty" />
       <el-table-column label="拣货库位" align="center" prop="pickToLocation" />
       <el-table-column label="拣货事务" align="center" prop="pickTransactionId" />
-      <el-table-column label="拣货数量" align="center" prop="pickQty" />
-      <el-table-column label="待检库位" align="center" prop="locationId" />
-      <el-table-column label="叫料待检事务id" align="center" prop="callTransactionId" />
+      <!--<el-table-column label="待检库位" align="center" prop="locationId" />
+      <el-table-column label="叫料待检事务id" align="center" prop="callTransactionId" />-->
       <el-table-column label="创建时间" align="center" prop="createDate" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createDate, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <!--<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -133,7 +133,7 @@
             v-hasPermi="['ams:allocation:remove']"
           >删除</el-button>
         </template>
-      </el-table-column>
+      </el-table-column>-->
     </el-table>
 
     <pagination

+ 72 - 0
warewms-ams/src/main/java/com/ruoyi/ams/asn/mapper/WmsDocAsnDetailsMapper.java

@@ -0,0 +1,72 @@
+package com.ruoyi.ams.asn.mapper;
+
+import java.math.BigDecimal;
+import java.util.List;
+import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 入库单明细Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2022-11-03
+ */
+public interface WmsDocAsnDetailsMapper 
+{
+    /**
+     * 查询入库单明细
+     * 
+     * @param asnLineNo 入库单明细主键
+     * @return 入库单明细
+     */
+     WmsDocAsnDetails selectWmsDocAsnDetailsByAsnLineNo(Long asnLineNo);
+
+    /**
+     * 查询入库单明细列表
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 入库单明细集合
+     */
+     List<WmsDocAsnDetails> selectWmsDocAsnDetailsList(WmsDocAsnDetails wmsDocAsnDetails);
+
+    /**
+     * 新增入库单明细
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 结果
+     */
+     int insertWmsDocAsnDetails(WmsDocAsnDetails wmsDocAsnDetails);
+
+    /**
+     * 修改入库单明细
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 结果
+     */
+     int updateWmsDocAsnDetails(WmsDocAsnDetails wmsDocAsnDetails);
+
+    /**
+     * 删除入库单明细
+     * 
+     * @param asnLineNo 入库单明细主键
+     * @return 结果
+     */
+     int deleteWmsDocAsnDetailsByAsnLineNo(Long asnLineNo);
+
+    /**
+     * 批量删除入库单明细
+     * 
+     * @param asnLineNos 需要删除的数据主键集合
+     * @return 结果
+     */
+     int deleteWmsDocAsnDetailsByAsnLineNos(Long[] asnLineNos);
+
+    /**
+     * 更新接收数
+     * @param asnNo
+     * @param asnLineNo
+     * @param qty
+     * @return
+     */
+    int updateWmsReceivedQty(@Param("asnNo") String asnNo, @Param("asnLineNo") int asnLineNo, @Param("qty") BigDecimal qty, @Param("asnStatus") String asnStatus);
+}

+ 0 - 9
warewms-ams/src/main/java/com/ruoyi/ams/asn/mapper/WmsDocAsnHeaderMapper.java

@@ -102,13 +102,4 @@ public interface WmsDocAsnHeaderMapper {
      * @return
      */
     WmsDocAsnDetails selectWmsDocDetailsOne(@Param("asnNo") String asnNo, @Param("asnLineNo") int asnLineNo);
-
-    /**
-     * 更新接收数
-     * @param asnNo
-     * @param asnLineNo
-     * @param qty
-     * @return
-     */
-    int updateWmsReceivedQty(@Param("asnNo") String asnNo, @Param("asnLineNo") int asnLineNo, @Param("qty") BigDecimal qty, @Param("asnStatus") String asnStatus);
 }

+ 69 - 0
warewms-ams/src/main/java/com/ruoyi/ams/asn/service/IWmsDocAsnDetailsService.java

@@ -0,0 +1,69 @@
+package com.ruoyi.ams.asn.service;
+
+import java.util.List;
+import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
+
+/**
+ * 入库单明细Service接口
+ * 
+ * @author ruoyi
+ * @date 2022-11-03
+ */
+public interface IWmsDocAsnDetailsService 
+{
+    /**
+     * 查询入库单明细
+     * 
+     * @param asnLineNo 入库单明细主键
+     * @return 入库单明细
+     */
+     WmsDocAsnDetails selectWmsDocAsnDetailsByAsnLineNo(Long asnLineNo);
+
+    /**
+     * 查询入库单明细列表
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 入库单明细集合
+     */
+     List<WmsDocAsnDetails> selectWmsDocAsnDetailsList(WmsDocAsnDetails wmsDocAsnDetails);
+
+    /**
+     * 查询入库单明细
+     *
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 入库单明细集合
+     */
+    WmsDocAsnDetails selectWmsDocAsnDetailsByModel(WmsDocAsnDetails wmsDocAsnDetails);
+
+    /**
+     * 新增入库单明细
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 结果
+     */
+     int insertWmsDocAsnDetails(WmsDocAsnDetails wmsDocAsnDetails);
+
+    /**
+     * 修改入库单明细
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 结果
+     */
+     int updateWmsDocAsnDetails(WmsDocAsnDetails wmsDocAsnDetails);
+
+    /**
+     * 批量删除入库单明细
+     * 
+     * @param asnLineNos 需要删除的入库单明细主键集合
+     * @return 结果
+     */
+     int deleteWmsDocAsnDetailsByAsnLineNos(Long[] asnLineNos);
+
+    /**
+     * 删除入库单明细信息
+     * 
+     * @param asnLineNo 入库单明细主键
+     * @return 结果
+     */
+     int deleteWmsDocAsnDetailsByAsnLineNo(Long asnLineNo);
+}

+ 110 - 0
warewms-ams/src/main/java/com/ruoyi/ams/asn/service/impl/WmsDocAsnDetailsServiceImpl.java

@@ -0,0 +1,110 @@
+package com.ruoyi.ams.asn.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.ams.asn.mapper.WmsDocAsnDetailsMapper;
+import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
+import com.ruoyi.ams.asn.service.IWmsDocAsnDetailsService;
+
+/**
+ * 入库单明细Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2022-11-03
+ */
+@Service
+public class WmsDocAsnDetailsServiceImpl implements IWmsDocAsnDetailsService 
+{
+    @Autowired
+    private WmsDocAsnDetailsMapper wmsDocAsnDetailsMapper;
+
+    /**
+     * 查询入库单明细
+     * 
+     * @param asnLineNo 入库单明细主键
+     * @return 入库单明细
+     */
+    @Override
+    public WmsDocAsnDetails selectWmsDocAsnDetailsByAsnLineNo(Long asnLineNo)
+    {
+        return wmsDocAsnDetailsMapper.selectWmsDocAsnDetailsByAsnLineNo(asnLineNo);
+    }
+
+    /**
+     * 查询入库单明细列表
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 入库单明细
+     */
+    @Override
+    public List<WmsDocAsnDetails> selectWmsDocAsnDetailsList(WmsDocAsnDetails wmsDocAsnDetails)
+    {
+        return wmsDocAsnDetailsMapper.selectWmsDocAsnDetailsList(wmsDocAsnDetails);
+    }
+
+    /**
+     * 查询入库单明细
+     *
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 入库单明细
+     */
+    @Override
+    public WmsDocAsnDetails selectWmsDocAsnDetailsByModel(WmsDocAsnDetails wmsDocAsnDetails)
+    {
+        List<WmsDocAsnDetails> list = wmsDocAsnDetailsMapper.selectWmsDocAsnDetailsList(wmsDocAsnDetails);
+        if (list!=null && list.size()>0) {
+            return list.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 新增入库单明细
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 结果
+     */
+    @Override
+    public int insertWmsDocAsnDetails(WmsDocAsnDetails wmsDocAsnDetails)
+    {
+        return wmsDocAsnDetailsMapper.insertWmsDocAsnDetails(wmsDocAsnDetails);
+    }
+
+    /**
+     * 修改入库单明细
+     * 
+     * @param wmsDocAsnDetails 入库单明细
+     * @return 结果
+     */
+    @Override
+    public int updateWmsDocAsnDetails(WmsDocAsnDetails wmsDocAsnDetails)
+    {
+        return wmsDocAsnDetailsMapper.updateWmsDocAsnDetails(wmsDocAsnDetails);
+    }
+
+    /**
+     * 批量删除入库单明细
+     * 
+     * @param asnLineNos 需要删除的入库单明细主键
+     * @return 结果
+     */
+    @Override
+    public int deleteWmsDocAsnDetailsByAsnLineNos(Long[] asnLineNos)
+    {
+        return wmsDocAsnDetailsMapper.deleteWmsDocAsnDetailsByAsnLineNos(asnLineNos);
+    }
+
+    /**
+     * 删除入库单明细信息
+     * 
+     * @param asnLineNo 入库单明细主键
+     * @return 结果
+     */
+    @Override
+    public int deleteWmsDocAsnDetailsByAsnLineNo(Long asnLineNo)
+    {
+        return wmsDocAsnDetailsMapper.deleteWmsDocAsnDetailsByAsnLineNo(asnLineNo);
+    }
+}

+ 28 - 3
warewms-ams/src/main/java/com/ruoyi/ams/asn/service/impl/WmsDocAsnHeaderServiceImpl.java

@@ -6,6 +6,7 @@ import java.util.List;
 
 import com.ruoyi.ams.asn.form.StockForm;
 import com.ruoyi.ams.asn.form.StockInfoForm;
+import com.ruoyi.ams.asn.mapper.WmsDocAsnDetailsMapper;
 import com.ruoyi.ams.box.domain.WmsBoxInfo;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.common.Constant;
@@ -15,7 +16,10 @@ import com.ruoyi.ams.inv.domain.InvLotLocId;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.ams.order.domain.WmsDocOrderDetails;
 import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
+import com.ruoyi.ams.order.mapper.WmsDocOrderDetailsMapper;
 import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
+import com.ruoyi.base.domain.BaseSku;
+import com.ruoyi.base.service.IBaseSkuService;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
@@ -43,11 +47,15 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
     @Autowired
     private WmsDocAsnHeaderMapper wmsDocAsnHeaderMapper;
     @Autowired
+    private WmsDocAsnDetailsMapper wmsDocAsnDetailsMapper;
+    @Autowired
     private IInvLotLocIdService invLotLocIdService;
     @Autowired
     private IWmsBoxInfoService boxInfoService;
     @Autowired
     private IWmsDocOrderHeaderService wmsDocOrderHeaderService;
+    @Autowired
+    private IBaseSkuService baseSkuService;
 
     /**
      * 查询入库单
@@ -234,12 +242,22 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
 
 
         List<StockInfoForm> stockInfoForms = stockForm.getStockInfoFormList();
+        String skuType = "";
         for (StockInfoForm s : stockInfoForms) {
+            BaseSku baseSku = baseSkuService.selectBaseSkuByCustomerId(Constant.CUSTOMER_ID, s.getSku());
+            if (skuType.equals("")) {
+                skuType = baseSku.getSkuType();
+            } else {
+                if (!baseSku.getSkuType().equals(skuType)) {
+                    throw new ServiceException("不同的产品分类不允许放一个托盘上");
+                }
+            }
+
             //判断成品条码
             InvLotAtt queryAtt = new InvLotAtt();
             List<InvLotLocId> invList = invLotLocIdService.queryInvByInvLotatt(queryAtt, stockForm.getPalletNo());
             if (invList != null && invList.size() > 0) {
-                throw new ServiceException("该条码已码过");
+                throw new ServiceException("每个成品条码只允许码一次");
             }
 
             WmsDocAsnDetails asnDetails = wmsDocAsnHeaderMapper.selectWmsDocDetailsOne(s.getAsnNo(), s.getAsnLineNo());
@@ -274,8 +292,15 @@ public class WmsDocAsnHeaderServiceImpl implements IWmsDocAsnHeaderService {
                 asnStatus = "40";
             }
             //更新入库单数量
-            wmsDocAsnHeaderMapper.updateWmsReceivedQty(asnDetails.getAsnNo(), asnDetails.getAsnLineNo().intValue(), new BigDecimal(s.getQty()), asnStatus);
-
+            wmsDocAsnDetailsMapper.updateWmsReceivedQty(asnDetails.getAsnNo(), asnDetails.getAsnLineNo().intValue(), new BigDecimal(s.getQty()), asnStatus);
+            if(!StringUtils.isEmpty(stockForm.getOrderNo())) {
+                //绑定对应入库单号
+                WmsDocAsnDetails updateDetails = new WmsDocAsnDetails();
+                updateDetails.setAsnNo(asnDetails.getAsnNo());
+                updateDetails.setAsnLineNo(asnDetails.getAsnLineNo());
+                updateDetails.setdEdi01(stockForm.getOrderNo());
+                wmsDocAsnDetailsMapper.updateWmsDocAsnDetails(updateDetails);
+            }
         }
         return AjaxResult.success("操作成功");
     }

+ 12 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/mapper/InvLotLocIdMapper.java

@@ -150,5 +150,17 @@ public interface InvLotLocIdMapper
      */
     List<InvLotLocId> queryInvOrderBy(@Param("lotnum") String lotnum,@Param("sku")String sku,@Param("location")String location,@Param("customerId")String customerId);
 
+    /**
+     * 根据托盘查询库存
+     * @param invLotAtt
+     * @param boxNo
+     * @return
+     */
     List<InvLotLocId> queryInvByInvLotatt(@Param("lotattDTO") InvLotAtt invLotAtt,@Param("boxNo") String boxNo);
+
+    /**
+     * 查询
+     * @return
+     */
+    List<InvLotLocId> queryInvByFull(@Param("orderNo") String orderNo,@Param("sku") String sku);
 }

+ 9 - 1
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/IInvLotLocIdService.java

@@ -126,9 +126,17 @@ public interface IInvLotLocIdService {
      */
     List<InvLotLocId> queryInvOrderBy(String lotnum, String sku, String location, String customerId);
 
-    /**
+    /**根据托盘号查询库存
      * @param invLotAtt
      * @return
      */
     List<InvLotLocId> queryInvByInvLotatt(InvLotAtt invLotAtt, String boxNo);
+
+    /**
+     * 查询已备货的满托库存
+     * @param orderNo
+     * @param sku
+     * @return
+     */
+    List<InvLotLocId> queryInvByFull(String orderNo, String sku);
 }

+ 5 - 0
warewms-ams/src/main/java/com/ruoyi/ams/inv/service/impl/InvLotLocIdServiceImpl.java

@@ -192,4 +192,9 @@ public class InvLotLocIdServiceImpl implements IInvLotLocIdService {
     public List<InvLotLocId> queryInvByInvLotatt(InvLotAtt invLotAtt, String boxNo) {
         return invLotLocIdMapper.queryInvByInvLotatt(invLotAtt, boxNo);
     }
+
+    @Override
+    public List<InvLotLocId> queryInvByFull(String orderNo, String sku) {
+        return invLotLocIdMapper.queryInvByFull(orderNo, sku);
+    }
 }

+ 1 - 0
warewms-ams/src/main/java/com/ruoyi/ams/order/form/AllocationForm.java

@@ -11,4 +11,5 @@ import lombok.Data;
 @Data
 public class AllocationForm {
     private String orderNo;
+    private String orderLineNo;
 }

+ 8 - 1
warewms-ams/src/main/java/com/ruoyi/ams/order/service/IWmsDocOrderHeaderService.java

@@ -77,12 +77,19 @@ public interface IWmsDocOrderHeaderService {
      */
     AjaxResult doAllocation(String orderNo);
 
+    /**
+     * 多单分配
+     * @param orderNoList
+     * @return
+     */
+    AjaxResult doAllocation(List<String> orderNoList);
+
     /**
      * 按明细分配
      * @param details
      * @return
      */
-    AjaxResult doAllocationDetails(WmsDocOrderDetails details);
+    AjaxResult doAllocationDetails(WmsDocOrderHeader header,WmsDocOrderDetails details);
 
     /**
      * 初始化表体

+ 87 - 59
warewms-ams/src/main/java/com/ruoyi/ams/order/service/impl/WmsDocOrderHeaderServiceImpl.java

@@ -133,73 +133,101 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
         }
         List<WmsDocOrderDetails> orderDetails = orderHeader.getWmsDocOrderDetailsList();
         for (WmsDocOrderDetails o : orderDetails) {
-            wmsDocOrderHeaderService.doAllocationDetails(o);
+            wmsDocOrderHeaderService.doAllocationDetails(orderHeader, o);
         }
         return AjaxResult.success("分配完成");
     }
 
+    @Transactional
     @Override
-    public AjaxResult doAllocationDetails(WmsDocOrderDetails details) {
-        List<InvLotLocId> invList = invLotLocIdService.queryInvOrderBy(details.getLotnum(), details.getSku(), details.getLocation(), details.getCustomerId());
-        //库存可分配数小于订单数
-        BigDecimal orderQty = details.getQtyOrdered();
-        //判断总数是否足够分配
-        double qtySum = invList.stream().mapToDouble(item -> item.getQty().doubleValue() > item.getQtyallocated().doubleValue() ? item.getQty().doubleValue() : 0).sum();
-        if (qtySum < orderQty.doubleValue()) {
-            return AjaxResult.error("库存不足分配失败");
+    public AjaxResult doAllocation(List<String> orderNoList) {
+        for (String s : orderNoList) {
+            wmsDocOrderHeaderService.doAllocation(s);
         }
-        for (InvLotLocId inv : invList) {
-            if (orderQty.doubleValue() == 0) {
-                return AjaxResult.success("分配完成");
+        return AjaxResult.success("分配成功");
+    }
+
+    @Override
+    public AjaxResult doAllocationDetails(WmsDocOrderHeader header, WmsDocOrderDetails details) {
+        if (header.getOrderType().equals("")) {
+            List<InvLotLocId> invList = invLotLocIdService.queryInvByFull(header.getOrderNo(), details.getSku());
+            BigDecimal totalQty = BigDecimal.ZERO;
+            for (InvLotLocId inv : invList) {
+                //可以分配的库存
+                inv.setQtyallocated(inv.getQty());
+                inv.setQtyallocatedEach(inv.getQtyEach());
+
+                if (invLotLocIdService.updateInvLotLocId(inv) > 0) {
+                    totalQty.add(inv.getQty());
+                    //修改出库单状态
+                    details.setQtyAllocated(details.getQtyAllocated().add(inv.getQty()));
+                    wmsDocOrderDetailsMapper.updateWmsDocOrderDetails(details);
+                    //生成分配明细
+                    return actAllocationDetailsService.addActAllocationDetails(inv.getLotnum(), inv.getLocationId(), inv.getQty(), details);
+                }
             }
-            BigDecimal canallocatedQty = inv.getQty().subtract(inv.getQtyallocated());
-            if (canallocatedQty.doubleValue() > 0) {
-                if (inv.getQty().intValue() > 0) {
-                    if (inv.getQty().subtract(inv.getQtyallocated()).compareTo(orderQty) == -1) {
-                        //可以分配的库存
-                        BigDecimal allocatedQty = inv.getQty().subtract(inv.getQtyallocated());
-                        inv.setQtyallocated(inv.getQtyallocated().add(allocatedQty));
-                        inv.setQtyallocatedEach(inv.getQtyallocatedEach().add(allocatedQty));
-                        if (invLotLocIdService.updateInvLotLocId(inv) > 0) {
-                            orderQty = orderQty.subtract(allocatedQty);
-                            //修改出库单状态
-                            details.setQtyAllocated(details.getQtyAllocated().add(allocatedQty));
-                            wmsDocOrderDetailsMapper.updateWmsDocOrderDetails(details);
-
-                            //生成分配明细
-                            return actAllocationDetailsService.addActAllocationDetails(inv.getLotnum(), inv.getLocationId(), allocatedQty, details);
-                        } else {
-                            continue;
-                        }
-                    } else if (inv.getQty().subtract(inv.getQtyallocated()).compareTo(orderQty) == 0) {
-                        //可以分配的库存
-                        BigDecimal allocatedQty = inv.getQty().subtract(inv.getQtyallocated());
-                        inv.setQtyallocated(inv.getQtyallocated().add(allocatedQty));
-                        inv.setQtyallocatedEach(inv.getQtyallocatedEach().add(allocatedQty));
-                        if (invLotLocIdService.updateInvLotLocId(inv) > 0) {
-                            orderQty = orderQty.subtract(allocatedQty);
-                            //修改出库单状态
-                            //修改出库单状态
-                            details.setQtyAllocated(details.getQtyAllocated().add(allocatedQty));
-                            wmsDocOrderDetailsMapper.updateWmsDocOrderDetails(details);
-
-                            //生成分配明细
-                            return actAllocationDetailsService.addActAllocationDetails(inv.getLotnum(), inv.getLocationId(), allocatedQty, details);
-                        } else {
-                            return AjaxResult.error("占用库存分配数失败");
-                        }
-                    } else {
-                        BigDecimal currentQty = orderQty;
-                        inv.setQtyallocated(inv.getQtyallocated().add(currentQty));
-                        inv.setQtyallocatedEach(inv.getQtyallocatedEach().add(currentQty));
-                        if (invLotLocIdService.updateInvLotLocId(inv) > 0) {
-                            //修改出库单状态
-                            details.setQtyAllocated(details.getQtyAllocated().add(currentQty));
-                            wmsDocOrderDetailsMapper.updateWmsDocOrderDetails(details);
-                            //生成分配明细
-                            return actAllocationDetailsService.addActAllocationDetails(inv.getLotnum(), inv.getLocationId(), currentQty, details);
+        } else {
+            List<InvLotLocId> invList = invLotLocIdService.queryInvOrderBy(details.getLotnum(), details.getSku(), details.getLocation(), details.getCustomerId());
+            //库存可分配数小于订单数
+            BigDecimal orderQty = details.getQtyOrdered();
+            //判断总数是否足够分配
+            double qtySum = invList.stream().mapToDouble(item -> item.getQty().doubleValue() > item.getQtyallocated().doubleValue() ? item.getQty().doubleValue() : 0).sum();
+            if (qtySum < orderQty.doubleValue()) {
+                return AjaxResult.error("库存不足分配失败");
+            }
+            for (InvLotLocId inv : invList) {
+                if (orderQty.doubleValue() == 0) {
+                    return AjaxResult.success("分配完成");
+                }
+                BigDecimal canallocatedQty = inv.getQty().subtract(inv.getQtyallocated());
+                if (canallocatedQty.doubleValue() > 0) {
+                    if (inv.getQty().intValue() > 0) {
+                        if (inv.getQty().subtract(inv.getQtyallocated()).compareTo(orderQty) == -1) {
+                            //可以分配的库存
+                            BigDecimal allocatedQty = inv.getQty().subtract(inv.getQtyallocated());
+                            inv.setQtyallocated(inv.getQtyallocated().add(allocatedQty));
+                            inv.setQtyallocatedEach(inv.getQtyallocatedEach().add(allocatedQty));
+                            if (invLotLocIdService.updateInvLotLocId(inv) > 0) {
+                                orderQty = orderQty.subtract(allocatedQty);
+                                //修改出库单状态
+                                details.setQtyAllocated(details.getQtyAllocated().add(allocatedQty));
+                                wmsDocOrderDetailsMapper.updateWmsDocOrderDetails(details);
+
+                                //生成分配明细
+                                return actAllocationDetailsService.addActAllocationDetails(inv.getLotnum(), inv.getLocationId(), allocatedQty, details);
+                            } else {
+                                continue;
+                            }
+                        } else if (inv.getQty().subtract(inv.getQtyallocated()).compareTo(orderQty) == 0) {
+                            //可以分配的库存
+                            BigDecimal allocatedQty = inv.getQty().subtract(inv.getQtyallocated());
+                            inv.setQtyallocated(inv.getQtyallocated().add(allocatedQty));
+                            inv.setQtyallocatedEach(inv.getQtyallocatedEach().add(allocatedQty));
+                            if (invLotLocIdService.updateInvLotLocId(inv) > 0) {
+                                orderQty = orderQty.subtract(allocatedQty);
+                                //修改出库单状态
+                                //修改出库单状态
+                                details.setQtyAllocated(details.getQtyAllocated().add(allocatedQty));
+                                wmsDocOrderDetailsMapper.updateWmsDocOrderDetails(details);
+
+                                //生成分配明细
+                                return actAllocationDetailsService.addActAllocationDetails(inv.getLotnum(), inv.getLocationId(), allocatedQty, details);
+                            } else {
+                                return AjaxResult.error("占用库存分配数失败");
+                            }
                         } else {
-                            return AjaxResult.error("占用库存分配数失败");
+                            BigDecimal currentQty = orderQty;
+                            inv.setQtyallocated(inv.getQtyallocated().add(currentQty));
+                            inv.setQtyallocatedEach(inv.getQtyallocatedEach().add(currentQty));
+                            if (invLotLocIdService.updateInvLotLocId(inv) > 0) {
+                                //修改出库单状态
+                                details.setQtyAllocated(details.getQtyAllocated().add(currentQty));
+                                wmsDocOrderDetailsMapper.updateWmsDocOrderDetails(details);
+                                //生成分配明细
+                                return actAllocationDetailsService.addActAllocationDetails(inv.getLotnum(), inv.getLocationId(), currentQty, details);
+                            } else {
+                                return AjaxResult.error("占用库存分配数失败");
+                            }
                         }
                     }
                 }

+ 7 - 0
warewms-ams/src/main/resources/mapper/ams/InvLotLocIdMapper.xml

@@ -417,4 +417,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              and b.box_no = #{boxNo}
         </where>
     </select>
+
+    <select id="queryInvByFull" resultMap="InvLotLocIdResult">
+        select inv.*
+        from inv_lot_loc_id inv
+        left join inv_lot_att att on inv.lotnum = att.lotnum
+        where att.lotatt14 = #{orderNo} and inv.sku = #{sku}
+    </select>
 </mapper>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 306 - 0
warewms-ams/src/main/resources/mapper/ams/WmsDocAsnDetailsMapper.xml


+ 0 - 4
warewms-ams/src/main/resources/mapper/docAsn/WmsDocAsnHeaderMapper.xml

@@ -369,8 +369,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join (select * from sys_dict_data where dict_type = 'asn_status') ast on de.line_status = ast.dict_value
         where asn_no = #{asnNo} and asn_line_no = #{asnLineNo} order by asn_line_no
     </select>
-
-    <update id="updateWmsReceivedQty">
-        update wms_doc_asn_details set received_qty += #{qty},asn_status = #{asnStatus} where asn_no = #{asnNo} and asn_line_no = #{asnLineNo}
-    </update>
 </mapper>