From d3374e8d1a233e595abf2246389af0a920509e9f Mon Sep 17 00:00:00 2001
From: yiwenpeng <ywp303@163.com>
Date: Tue, 3 Dec 2024 11:00:53 +0800
Subject: [PATCH] 二厂库位分配去除高度大于等于

---
 src/main/java/com/huaheng/api/wcs/service/taskAssignService/TaskAssignServiceImpl.java            |   3 +++
 src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java   | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------
 src/main/java/com/huaheng/api/wcs/service/warecellAllocation/WarecellAllocationServiceImpl.java   |   6 ++++--
 src/main/java/com/huaheng/framework/config/ShiroConfig.java                                       |   1 +
 src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java                          |  28 +++++++++++++++++++++-------
 src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java                        |  35 +++++++++++++++++++++++++++--------
 src/main/java/com/huaheng/pc/config/container/service/ContainerServiceImpl.java                   |   4 +---
 src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java  |   3 +++
 src/main/java/com/huaheng/pc/shipment/shippingCombination/service/ShippingCombinationService.java |  42 ++++++++++++++++++++++++++++++++++++++++--
 src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java                   |  22 +++++++++++++---------
 10 files changed, 171 insertions(+), 79 deletions(-)

diff --git a/src/main/java/com/huaheng/api/wcs/service/taskAssignService/TaskAssignServiceImpl.java b/src/main/java/com/huaheng/api/wcs/service/taskAssignService/TaskAssignServiceImpl.java
index d4225bd..d6c7488 100644
--- a/src/main/java/com/huaheng/api/wcs/service/taskAssignService/TaskAssignServiceImpl.java
+++ b/src/main/java/com/huaheng/api/wcs/service/taskAssignService/TaskAssignServiceImpl.java
@@ -185,6 +185,9 @@ public class TaskAssignServiceImpl implements TaskAssignService {
                             //获取一个最近的空闲库位(优先找外侧)
                             destinationLocation = locationService.getEmptyLocation(insideLocation, isSelfCreated);
                         }
+                        if (destinationLocation == null) {
+                            return AjaxResult.error("移库获取一个目标库位为空");
+                        }
                         AjaxResult ajaxResult = transferTaskService.createTransferTask(insideLocation.getCode(), destinationLocation.getCode(), warehouseCode);
                         if (ajaxResult.getCode() == 400) {
                             return AjaxResult.error(ajaxResult.getMsg());
diff --git a/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java b/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java
index adb6aa1..af3f280 100644
--- a/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java
+++ b/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java
@@ -237,8 +237,9 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String doubleRk(String roadWay, int high, Integer frequencyLocation, Integer emptyContainerTask, boolean isFlammable, String taskNo, boolean bypass) {
-        boolean isSecondFactory = isSecondFactory();//是否是二厂一期项目
+        //boolean isSecondFactory = isSecondFactory();//是否是二厂项目
         int reserveNumber = 0;
+        //二厂,分拣任务回库的时候,也要判断预留库位
         if (!bypass) {
             reserveNumber = getReserveNumber(roadWay);
         }
@@ -263,12 +264,13 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                 .eq(Location::getContainerCode, "")
                 .eq(Location::getSelfCreated, NO_TSELFCREATED)
                 .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
+                .eq(Location::getHigh, high)
                 .last(" limit 20");
-        if (isSecondFactory) {
-            wrapper.ge(Location::getHigh, high);
-        } else {
-            wrapper.eq(Location::getHigh, high);
-        }
+        //if (isSecondFactory) {
+        //    wrapper.ge(Location::getHigh, high);
+        //} else {
+        //    wrapper.eq(Location::getHigh, high);
+        //}
         List<Location> totalLocationList = locationService.list(wrapper);
         if (totalLocationList.size() <= reserveNumber) {
             return "可能是库位不够用了,请检查预留库位数";
@@ -280,17 +282,18 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                 .eq(Location::getStatus, STATUS_LOCATION_EMPTY)
                 .eq(Location::getRowFlag, ROW_OUT)//外侧
                 .eq(Location::getContainerCode, "")
+                .eq(Location::getHigh, high)
                 .eq(Location::getSelfCreated, NO_TSELFCREATED)
                 .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
                 .orderByAsc(Location::getHigh)
                 .orderByAsc(Location::getILayer)
                 .orderByAsc(Location::getId)
                 .last(" limit 20");
-        if (isSecondFactory) {
-            locationLambda.ge(Location::getHigh, high);
-        } else {
-            locationLambda.eq(Location::getHigh, high);
-        }
+        //if (isSecondFactory) {
+        //    locationLambda.ge(Location::getHigh, high);
+        //} else {
+        //    locationLambda.eq(Location::getHigh, high);
+        //}
 
         List<Location> locationList = locationService.list(locationLambda);
         List<Location> removeLocaationList = new ArrayList<>();
@@ -315,15 +318,16 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                     .eq(Location::getContainerCode, "")
                     .eq(Location::getSelfCreated, NO_TSELFCREATED)
                     .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
+                    .eq(Location::getHigh, high)
                     .orderByAsc(Location::getHigh)
                     .orderByAsc(Location::getILayer)
                     .orderByAsc(Location::getId)
                     .last(" limit 20");
-            if (isSecondFactory) {
-                locationLambda2.ge(Location::getHigh, high);
-            } else {
-                locationLambda2.eq(Location::getHigh, high);
-            }
+            //if (isSecondFactory) {
+            //    locationLambda2.ge(Location::getHigh, high);
+            //} else {
+            //    locationLambda2.eq(Location::getHigh, high);
+            //}
 
             locationList = locationService.list(locationLambda2);
             removeLocaationList = new ArrayList<>();
@@ -350,7 +354,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
     //自建单据
     @Override
     public String isSelfCreated(String roadWay, int high, Integer frequencyLocation, boolean bypass) {
-        boolean isSecondFactory = isSecondFactory();
+        //boolean isSecondFactory = isSecondFactory();
         int reserveNumber = 0;
         if (!bypass) {
             reserveNumber = getReserveNumber(roadWay);
@@ -363,12 +367,13 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                 .eq(Location::getContainerCode, "")
                 .eq(Location::getSelfCreated, SELFCREATED)
                 .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
+                .eq(Location::getHigh, high)
                 .last(" limit 20");
-        if (isSecondFactory) {
-            wrapper.ge(Location::getHigh, high);
-        } else {
-            wrapper.eq(Location::getHigh, high);
-        }
+        //if (isSecondFactory) {
+        //    wrapper.ge(Location::getHigh, high);
+        //} else {
+        //    wrapper.eq(Location::getHigh, high);
+        //}
         List<Location> totalLocationList = locationService.list(wrapper);
         //双伸位预留库位数不够了就排除掉该巷道
         if (totalLocationList.size() <= reserveNumber) {
@@ -382,17 +387,18 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                 .eq(Location::getRowFlag, ROW_OUT)//外侧
                 .eq(Location::getContainerCode, "")
                 .eq(Location::getSelfCreated, SELFCREATED)
+                .eq(Location::getHigh, high)
                 .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
                 .orderByAsc(Location::getHigh)
                 .orderByAsc(Location::getILayer)
                 .orderByAsc(Location::getId)
                 .last(" limit 20");
 
-        if (isSecondFactory) {
-            locationLambda.ge(Location::getHigh, high);
-        } else {
-            locationLambda.eq(Location::getHigh, high);
-        }
+        //if (isSecondFactory) {
+        //    locationLambda.ge(Location::getHigh, high);
+        //} else {
+        //    locationLambda.eq(Location::getHigh, high);
+        //}
         List<Location> locationList = locationService.list(locationLambda);
         List<Location> removeLocaationList = new ArrayList<>();
         if (locationList != null && !locationList.isEmpty()) {
@@ -417,15 +423,16 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                     .eq(Location::getContainerCode, "")
                     .eq(Location::getSelfCreated, SELFCREATED)
                     .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
+                    .eq(Location::getHigh, high)
                     .orderByAsc(Location::getHigh)
                     .orderByAsc(Location::getILayer)
                     .orderByAsc(Location::getId)
                     .last(" limit 20");
-            if (isSecondFactory) {
-                locationLambda2.ge(Location::getHigh, high);
-            } else {
-                locationLambda2.eq(Location::getHigh, high);
-            }
+            //if (isSecondFactory) {
+            //    locationLambda2.ge(Location::getHigh, high);
+            //} else {
+            //    locationLambda2.eq(Location::getHigh, high);
+            //}
             locationList = locationService.list(locationLambda2);
             removeLocaationList = new ArrayList<>();
             if (locationList != null && !locationList.isEmpty()) {
@@ -459,7 +466,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
     @Override
     public String isFlammable(String roadWay, int high, Integer frequencyLocation, String taskNo, boolean bypass) {
         int flammableLayer = 3;
-        boolean isSecondFactory = isSecondFactory();
+        //boolean isSecondFactory = isSecondFactory();
         int reserveNumber = 0;
         if (!bypass) {
             reserveNumber = getReserveNumber(roadWay);
@@ -471,14 +478,15 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                 .eq(Location::getStatus, STATUS_LOCATION_EMPTY)
                 .eq(Location::getContainerCode, "")
                 .eq(Location::getSelfCreated, NO_TSELFCREATED)
+                .eq(Location::getHigh, high)
                 .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
                 .last(" limit 20");
 
-        if (isSecondFactory) {
-            wrapper.ge(Location::getHigh, high);
-        } else {
-            wrapper.eq(Location::getHigh, high);
-        }
+        //if (isSecondFactory) {
+        //    wrapper.ge(Location::getHigh, high);
+        //} else {
+        //    wrapper.eq(Location::getHigh, high);
+        //}
         List<Location> totalLocationList = locationService.list(wrapper);
         if (totalLocationList.size() <= reserveNumber) {
             return "可能是库位不够用了,请检查预留库位数";
@@ -491,14 +499,15 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                 .eq(Location::getRowFlag, ROW_OUT)//外侧
                 .eq(Location::getContainerCode, "")
                 .eq(Location::getSelfCreated, NO_TSELFCREATED)
+                .eq(Location::getHigh, high)
                 .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
                 .last("ORDER BY (CASE WHEN iLayer > " + flammableLayer + " THEN iLayer ELSE iLayer + 20 END) ASC LIMIT 20");
 
-        if (isSecondFactory) {
-            locationLambda.ge(Location::getHigh, high);
-        } else {
-            locationLambda.eq(Location::getHigh, high);
-        }
+        //if (isSecondFactory) {
+        //    locationLambda.ge(Location::getHigh, high);
+        //} else {
+        //    locationLambda.eq(Location::getHigh, high);
+        //}
 
         List<Location> locationList = locationService.list(locationLambda);
         List<Location> removeLocaationList = new ArrayList<>();
@@ -521,14 +530,15 @@ public class LocationAllocationServiceImpl implements LocationAllocationService 
                     .eq(Location::getStatus, STATUS_LOCATION_EMPTY)
                     .eq(Location::getRowFlag, ROW_IN)
                     .eq(Location::getContainerCode, "")
+                    .eq(Location::getHigh, high)
                     .eq(Location::getSelfCreated, NO_TSELFCREATED)
                     .eq(Location::getOnlyEmptyContainer, NO_EMPTY_CONTAINER_LOCATION)
                     .last("ORDER BY (CASE WHEN iLayer > " + flammableLayer + " THEN iLayer ELSE iLayer + 20 END) ASC LIMIT 20");
-            if (isSecondFactory) {
-                locationLambda2.ge(Location::getHigh, high);
-            } else {
-                locationLambda2.eq(Location::getHigh, high);
-            }
+            //if (isSecondFactory) {
+            //    locationLambda2.ge(Location::getHigh, high);
+            //} else {
+            //    locationLambda2.eq(Location::getHigh, high);
+            //}
             locationList = locationService.list(locationLambda2);
             removeLocaationList = new ArrayList<>();
             if (locationList != null && !locationList.isEmpty()) {
diff --git a/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/WarecellAllocationServiceImpl.java b/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/WarecellAllocationServiceImpl.java
index be72723..27be9d9 100644
--- a/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/WarecellAllocationServiceImpl.java
+++ b/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/WarecellAllocationServiceImpl.java
@@ -234,7 +234,7 @@ public class WarecellAllocationServiceImpl implements WarecellAllocationService 
         if (StringUtils.isNotEmpty(taskHeader.getToLocation()) && !locationCode.equals(taskHeader.getToLocation())) {
             int updateCount2 = locationService.updateStatusNew(taskHeader.getToLocation(), warehouseCode, QuantityConstant.STATUS_LOCATION_EMPTY, QuantityConstant.STATUS_LOCATION_LOCK);
             if (updateCount2 != 1) {
-                throw new ServiceException("重复分配库位时,解锁库位失败!");
+                throw new ServiceException("重复分配库位时,解锁库位失败!" + taskHeader.getToLocation());
             }
             //解除右侧库位禁用状态和对应4个库位标记
             locationService.unbanRightLocationAndUnmark(container.getContainerType(), taskHeader.getToLocation());
@@ -273,7 +273,9 @@ public class WarecellAllocationServiceImpl implements WarecellAllocationService 
                     //获取一个最近的空闲库位(优先找外侧)
                     destinationLocation = locationService.getEmptyLocation(insideLocation, isSelfCreated);
                 }
-
+                if (destinationLocation == null) {
+                    throw new ServiceException("创建移库任务失败,目标库位无法分配,可能是库位已经全满了");
+                }
                 //创建移库任务
                 AjaxResult ajaxResult = transferTaskService.createTransferTask(insideLocation.getCode(), destinationLocation.getCode(), warehouseCode);
                 preTaskNo = (Integer) ajaxResult.getData();
diff --git a/src/main/java/com/huaheng/framework/config/ShiroConfig.java b/src/main/java/com/huaheng/framework/config/ShiroConfig.java
index 707ef02..7e859b7 100644
--- a/src/main/java/com/huaheng/framework/config/ShiroConfig.java
+++ b/src/main/java/com/huaheng/framework/config/ShiroConfig.java
@@ -300,6 +300,7 @@ public class ShiroConfig {
         //filterChainDefinitionMap.put("/receipt/receiving/saveBatch", "anon");
         //filterChainDefinitionMap.put("/config/zone/getAllFlatLocation", "anon");
         //filterChainDefinitionMap.put("/mobile/getModules2", "anon");
+        //filterChainDefinitionMap.put("/inventory/inventoryHeader/listEmptyContainer", "anon");
 
 
         // 系统权限列表
diff --git a/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java b/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java
index 0e427be..29bce52 100644
--- a/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java
+++ b/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java
@@ -32,8 +32,11 @@ import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
 import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction;
 import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService;
 import com.huaheng.pc.report.excelReport.mapper.ExcelReportMapper;
+import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
+import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
 import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
 import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderServiceImpl;
 import com.huaheng.pc.task.taskHeader.service.TransferTaskService;
 import com.huaheng.pc.task.taskHeader.service.WorkTaskService;
 import io.swagger.annotations.Api;
@@ -62,7 +65,10 @@ import java.util.stream.Collectors;
 @RequestMapping("/mobile/inventory")
 @Api(tags = {"手机立体库库存相关"}, value = "手机立体库库存相关MobileInventoryController")
 public class MobileInventoryController extends BaseController {
-
+    @Resource
+    private TaskDetailService taskDetailService;
+    @Resource
+    private TaskHeaderService taskHeaderService;
     @Resource
     private InventoryHeaderService inventoryService;
     @Resource
@@ -89,6 +95,8 @@ public class MobileInventoryController extends BaseController {
     private CycleCountDetailChildService cycleCountDetailChildService;
     @Resource
     private CycleCountHeaderMapper cycleCountHeaderMapper;
+    @Autowired
+    private TaskHeaderServiceImpl taskHeaderServiceImpl;
 
     @PostMapping("/getInventoryInfo")
     //@ApiOperation("移动端获得库存详情")
@@ -172,6 +180,7 @@ public class MobileInventoryController extends BaseController {
     @Autowired
     private RedisTemplate<String, String> redisTemplate;
 
+    @ApiLogger(apiName = "PDA完成平库任务", from = "PDA")
     @PostMapping("/completeTaskListByWMS")
     @ResponseBody
     public AjaxResult completeTaskListByWMS(@RequestBody List<TaskIds> taskDetails) {
@@ -180,18 +189,23 @@ public class MobileInventoryController extends BaseController {
 
         List<TaskHeader> tasks = taskService.getTasksByIds(taskIds);
 
-        // 筛选出未完成的任务
-        List<Integer> pendingTaskIds = tasks.stream()
+        // 筛选出未完成的任务的ID
+        Integer[] pendingTaskIds = tasks.stream()
                 .filter(task -> task.getStatus() != QuantityConstant.TASK_STATUS_COMPLETED)
                 .map(TaskHeader::getId)
-                .collect(Collectors.toList());
-
+                .distinct()  // 确保ID是唯一的
+                .toArray(Integer[]::new);
 
         // 如果没有未完成的任务,直接返回
-        if (pendingTaskIds.isEmpty()) {
+        if (pendingTaskIds.length == 0) {
             return AjaxResult.success("任务已完成");
         }
-        return taskService.completeTaskByWMS(taskIds, null);
+
+        for (Integer taskId : pendingTaskIds) {
+            taskService.completeTaskByWMS(new Integer[]{taskId}, null);
+        }
+        return AjaxResult.success("任务完成");
+
     }
 
 
diff --git a/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java b/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java
index c2b079b..0b4019b 100644
--- a/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java
+++ b/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java
@@ -25,6 +25,8 @@ import com.huaheng.pc.config.receiptType.domain.ReceiptType;
 import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
 import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
 import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
+import com.huaheng.pc.monitor.apilog.domain.ApiLog;
+import com.huaheng.pc.monitor.apilog.service.IApiLogService;
 import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
 import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
 import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
@@ -99,6 +101,8 @@ public class MobileBatchReceiptController {
     @Resource
     private InventoryHeaderService inventoryHeaderService;
 
+    @Resource
+    private IApiLogService apiLogService;
 
     @PostMapping("/scanContainer")
     @ApiOperation("移动端入库扫描容器")
@@ -537,9 +541,9 @@ public class MobileBatchReceiptController {
 
 
     @PostMapping("/callBox")
-    @ApiOperation("移动端呼叫料盒")
-    @ApiLogger(apiName = "PDA呼叫料盒", from = "WCS")
-    @Log(title = "移动端呼叫料盒", action = BusinessType.OTHER)
+    @ApiOperation("PDA呼叫料盒")
+    @ApiLogger(apiName = "PDA呼叫料盒", from = "PDA")
+    @Log(title = "PDA呼叫料盒", action = BusinessType.OTHER)
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult callBox(@RequestBody @ApiParam(value = "物料号") Map<String, String> param) {
         String containerCode = param.get("containerCode");
@@ -577,12 +581,16 @@ public class MobileBatchReceiptController {
             }
         }
 
-
         Location location = locationService.getOne(new LambdaQueryWrapper<Location>().eq(Location::getCode, destinationLocation));
-        Container container = containerService.getOne(new LambdaQueryWrapper<Container>().eq(Container::getCode, containerCode).eq(Container::getWarehouseCode, "CS0001").last("limit 1"));
-        if (container == null) {
+        List<Container> list = containerService.list(new LambdaQueryWrapper<Container>().eq(Container::getCode, containerCode));
+        if (list.isEmpty()) {
             return AjaxResult.error("容器不存在");
         }
+        if (list.size() > 1) {
+            return AjaxResult.error("容器大于1");
+        }
+        Container container = list.get(0);
+
         if (location == null) {
             return AjaxResult.error("库位不存在");
         }
@@ -639,10 +647,10 @@ public class MobileBatchReceiptController {
         TaskHeader taskHeader = new TaskHeader();
         taskHeader.setWarehouseCode(location.getWarehouseCode());
         taskHeader.setCompanyCode(companyCode);//货主
-        if (type == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) {
+        if (type == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) {//补充入库
             taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
             taskHeader.setTaskType(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
-        } else if (type == QuantityConstant.TASK_TYPE_WHOLERECEIPT) {
+        } else if (type == QuantityConstant.TASK_TYPE_WHOLERECEIPT) {//整盘入库
             taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
             taskHeader.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
         } else {
@@ -669,9 +677,20 @@ public class MobileBatchReceiptController {
             throw new ServiceException("补充入库主表生成失败!");
         }
 
+        addApiLog("PDA呼叫料盒", taskHeader.getContainerCode() + "/" + taskHeader.getFromLocation());
         return AjaxResult.success(taskHeader.getId());
     }
 
+    public void addApiLog(String name, String requestBody) {
+        ApiLog apiLog = new ApiLog();
+        apiLog.setApiName(name);
+        apiLog.setRequestBody(requestBody);
+        apiLog.setRequestTime(new Date());
+        apiLog.setRequestFrom("MOM");
+        apiLog.setResponseBy("WMS");
+        apiLog.setResponseBody("成功");
+        apiLogService.save(apiLog);
+    }
 
     @PostMapping("/searchReceipt")
     @ApiOperation("移动端查询入库单")
diff --git a/src/main/java/com/huaheng/pc/config/container/service/ContainerServiceImpl.java b/src/main/java/com/huaheng/pc/config/container/service/ContainerServiceImpl.java
index f1d0d78..3f61c7f 100644
--- a/src/main/java/com/huaheng/pc/config/container/service/ContainerServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/config/container/service/ContainerServiceImpl.java
@@ -139,9 +139,7 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container
                 .eq(Location::getZoneCode, "L")
                 .isNotNull(Location::getContainerCode)
                 .notInSql(Location::getContainerCode, "SELECT h.containerCode FROM task_header h WHERE h.status < 100")
-                .notInSql(Location::getCode, "SELECT b.locationCode FROM inventory_detail b")
-                .notInSql(Location::getCode, "SELECT r.locationCode FROM receipt_container_detail r WHERE r.status != 20")
-                .notInSql(Location::getCode, "SELECT s.locationCode FROM shipment_container_detail s WHERE s.status != 20");
+                .notInSql(Location::getCode, "SELECT b.locationCode FROM inventory_detail b");
 
         if (zoneCode != null && !zoneCode.isEmpty()) {
             queryWrapper.eq(Location::getZoneCode, zoneCode);
diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java
index e91d909..12b424d 100644
--- a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java
+++ b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/controller/InventoryHeaderController.java
@@ -42,6 +42,7 @@ import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
 import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
 import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
 import com.huaheng.pc.task.taskHeader.service.TaskHeaderServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Controller;
@@ -59,6 +60,7 @@ import java.util.stream.Collectors;
 /**
  * 库存控制层
  */
+@Slf4j
 @Controller
 @RequestMapping("/inventory/inventoryHeader")
 public class InventoryHeaderController extends BaseController {
@@ -416,6 +418,7 @@ public class InventoryHeaderController extends BaseController {
      */
     @PostMapping("/listEmptyContainer")
     @ResponseBody
+    @ApiLogger(apiName = "PDA呼叫空托盘出库", from = "PDA")
     public TableDataInfo listEmptyContainer(String zoneCode, String containerCode, String locationCode) {
         containerCode = containerCode == null ? "" : containerCode.trim();
         locationCode = locationCode == null ? "" : locationCode.trim();
diff --git a/src/main/java/com/huaheng/pc/shipment/shippingCombination/service/ShippingCombinationService.java b/src/main/java/com/huaheng/pc/shipment/shippingCombination/service/ShippingCombinationService.java
index 0010c86..3ed6a08 100644
--- a/src/main/java/com/huaheng/pc/shipment/shippingCombination/service/ShippingCombinationService.java
+++ b/src/main/java/com/huaheng/pc/shipment/shippingCombination/service/ShippingCombinationService.java
@@ -3,8 +3,10 @@ package com.huaheng.pc.shipment.shippingCombination.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.common.constant.QuantityConstant;
 import com.huaheng.common.exception.service.ServiceException;
 import com.huaheng.common.utils.StringUtils;
+import com.huaheng.framework.web.service.ConfigService;
 import com.huaheng.pc.config.FilterConfigDetail.domain.FilterConfigDetail;
 import com.huaheng.pc.config.FilterConfigDetail.service.FilterConfigDetailService;
 import com.huaheng.pc.config.cinvcType.domain.CinvcType;
@@ -59,10 +61,47 @@ public class ShippingCombinationService {
     MaterialTypeService materialTypeService;
     @Resource
     ShipmentHeaderService shipmentHeaderService;
-
+    @Resource
+    private ConfigService configService;
 
     //根据分配规则查找库存
     public List<InventoryDetail> getInventorys(ShipmentDetail shipmentDetail, boolean isAuto, boolean isFlatWarehouse, boolean openExhibitionRestrictions) {
+        //一厂一期物料相同就合并
+        String version = configService.getKey(QuantityConstant.PROJECT_VERSION);
+        if (version.equals("1")) {
+            return getInventoryVersion1(shipmentDetail, isAuto, isFlatWarehouse, openExhibitionRestrictions);
+        } else {
+            return getInventoryVersion2(shipmentDetail, isAuto, isFlatWarehouse, openExhibitionRestrictions);
+        }
+
+    }
+
+
+    //一期
+    public List<InventoryDetail> getInventoryVersion1(ShipmentDetail shipmentDetail, boolean isAuto, boolean isFlatWarehouse, boolean openExhibitionRestrictions) {
+        String materialCode = shipmentDetail.getMaterialCode();
+        checkNotEmpty(materialCode, "出库明细没有物料编码");
+        String containerCode = shipmentDetail.getContainerCode();
+        String receiptCode = shipmentDetail.getReceiptCode();
+        ShipmentHeader shipmentHeader = shipmentHeaderService.getById(shipmentDetail.getShipmentId());
+        String warehouse = shipmentHeader.getWarehouse();
+
+        LambdaQueryWrapper<InventoryDetail> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(InventoryDetail::getMaterialCode, materialCode)
+                .eq(StringUtils.isNotEmpty(warehouse), InventoryDetail::getWarehouse, warehouse)//原仓库
+                .eq(StringUtils.isNotEmpty(containerCode), InventoryDetail::getContainerCode, containerCode) //托盘号
+                .eq(StringUtils.isNotEmpty(receiptCode), InventoryDetail::getReceiptCode, receiptCode)//入库单号
+                .ne(isFlatWarehouse, InventoryDetail::getZoneCode, "L")//如果用平库组盘功能,只能出平库的库存
+                .orderByAsc(InventoryDetail::getCreated); // 添加根据创建时间生序排序
+        List<InventoryDetail> list = inventoryDetailService.list(wrapper);
+        if (list.isEmpty()) {
+            return list;
+        }
+        return list;
+    }
+
+    //二期和二厂
+    public List<InventoryDetail> getInventoryVersion2(ShipmentDetail shipmentDetail, boolean isAuto, boolean isFlatWarehouse, boolean openExhibitionRestrictions) {
         String materialCode = shipmentDetail.getMaterialCode();
         checkNotEmpty(materialCode, "出库明细没有物料编码");
 
@@ -139,7 +178,6 @@ public class ShippingCombinationService {
                     .thenComparing(InventoryDetail::getReceiptCode));
         }
         return list;
-
     }
 
     //判断是否是展会物料,仓库是否符合
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
index 0998d31..9585532 100644
--- a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
@@ -644,6 +644,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
 
     @Transactional(rollbackFor = Exception.class)
     public void combineInventory(TaskHeader task) {
+
+        //一期项目,物料编码相同就合并
+        String version = configService.getKey(QuantityConstant.PROJECT_VERSION);
+        boolean isVersionOne = version.equals("1");
+
         InventoryHeader inventoryHeader = inventoryHeaderService.getOne(new LambdaQueryWrapper<InventoryHeader>()
                 .eq(InventoryHeader::getLocationCode, task.getToLocation())
                 .eq(InventoryHeader::getContainerCode, task.getContainerCode()));
@@ -654,15 +659,14 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
 
             for (int i = 0; i < inventoryDetailList.size() - 1; i++) {
                 for (int j = inventoryDetailList.size() - 1; j > i; j--) {
-                    InventoryDetail inventoryDetail = inventoryDetailList.get(i);
-                    InventoryDetail inventoryDetail2 = inventoryDetailList.get(j);
-                    if (
-
-                            inventoryDetail.getMaterialCode().equals(inventoryDetail2.getMaterialCode())
-                                    && inventoryDetail.getNoticeCode().equals(inventoryDetail2.getNoticeCode())
-                                    && inventoryDetail.getMaterialColor().equals(inventoryDetail2.getMaterialColor())
-                                    && inventoryDetail.getRemarks().equals(inventoryDetail2.getRemarks())
-                                    && inventoryDetail.getPaintStatus().equals(inventoryDetail2.getPaintStatus())) {
+                    InventoryDetail detail1 = inventoryDetailList.get(i);
+                    InventoryDetail detail2 = inventoryDetailList.get(j);
+                    if (isVersionOne ? detail1.getMaterialCode().equals(detail2.getMaterialCode()) :
+                            detail1.getMaterialCode().equals(detail2.getMaterialCode()) &&
+                                    detail1.getNoticeCode().equals(detail2.getNoticeCode()) &&
+                                    detail1.getMaterialColor().equals(detail2.getMaterialColor()) &&
+                                    detail1.getRemarks().equals(detail2.getRemarks()) &&
+                                    detail1.getPaintStatus().equals(detail2.getPaintStatus())) {
 
 
                         //如果都相同的话,合并库存,
--
libgit2 0.22.2