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 566a51a..ce58f67 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
@@ -101,6 +101,7 @@ public class TaskAssignServiceImpl implements TaskAssignService {
         wcsTask.setPreTaskNo("0");
         wcsTask.setTaskType(taskHeader.getTaskType().toString());
         wcsTask.setFromPort("1000");
+        wcsTask.setToPort(taskHeader.getStationCode());
 
         wcsTask.setContainerCode(taskHeader.getContainerCode());
         Location location;
@@ -112,7 +113,6 @@ public class TaskAssignServiceImpl implements TaskAssignService {
 
         wcsTask.setStation(location.getRoadway());
         wcsTask.setDestination(location.getRoadway());
-        wcsTask.setToPort(location.getRoadway());
         if(StringUtils.isEmpty(taskHeader.getFromLocation())){
             wcsTask.setFromLocationCode("0");
         }else {
diff --git a/src/main/java/com/huaheng/pc/config/station/controller/stationController.java b/src/main/java/com/huaheng/pc/config/station/controller/stationController.java
index 820f7cf..d9cd4f6 100644
--- a/src/main/java/com/huaheng/pc/config/station/controller/stationController.java
+++ b/src/main/java/com/huaheng/pc/config/station/controller/stationController.java
@@ -14,6 +14,7 @@ import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.framework.web.page.PageDomain;
 import com.huaheng.framework.web.page.TableDataInfo;
 import com.huaheng.framework.web.page.TableSupport;
+import com.huaheng.pc.config.material.domain.Material;
 import com.huaheng.pc.config.station.domain.Station;
 import com.huaheng.pc.config.station.service.StationService;
 import io.swagger.annotations.ApiParam;
@@ -23,9 +24,7 @@ import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
 
 /**
  * Created by Enzo Cotter on 2019/10/14.
@@ -134,4 +133,21 @@ public class stationController extends BaseController {
         return toAjax(stationService.removeByIds(list));
     }
 
+    @PostMapping("/getData")
+    @ResponseBody
+    public Map<String, Object> getData() {
+        LambdaQueryWrapper<Station> queryWrapper = Wrappers.lambdaQuery();
+        List<Station> stationList = stationService.list(queryWrapper);
+
+        List<Map<String, Object>> list = new ArrayList<>();
+        for (Station station : stationList) {
+            Map<String, Object> resultMap = new HashMap<>();
+            resultMap.put("id", station.getCode());
+            resultMap.put("text", station.getName());
+            list.add(resultMap);
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("results", list);
+        return map;
+    }
 }
diff --git a/src/main/java/com/huaheng/pc/receipt/receiving/controller/ReceivingController.java b/src/main/java/com/huaheng/pc/receipt/receiving/controller/ReceivingController.java
index 088fcf3..fc4ba87 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiving/controller/ReceivingController.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiving/controller/ReceivingController.java
@@ -116,6 +116,9 @@ public class ReceivingController extends BaseController {
             @ApiParam(name="locationCode",value="库位编码", required = false)String locationCode,
             @ApiParam(name="qty",value="收货数量") BigDecimal qty,
             @ApiParam(name="localtionRule",value="定位规则", required = false)String locatingRule){
+        if(qty.intValue() <= 0) {
+            return AjaxResult.error("配盘数量必须大于0");
+        }
         AjaxResult result = receiptContainerHeaderService.saveContainer(receiptCode, containerCode, receiptDetailId,
                  locationCode, qty, locatingRule);
         return result;
diff --git a/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/domain/ShipmentContainerHeader.java b/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/domain/ShipmentContainerHeader.java
index 6474c70..3fcd4e2 100644
--- a/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/domain/ShipmentContainerHeader.java
+++ b/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/domain/ShipmentContainerHeader.java
@@ -57,6 +57,13 @@ public class ShipmentContainerHeader implements Serializable {
     private Integer status;
 
     /**
+     * 出库站台
+     */
+    @TableField(value = "stationCode")
+    @ApiModelProperty(value="出库站台")
+    private String stationCode;
+
+    /**
      * 父
      */
     @TableField(value = "parent")
@@ -443,6 +450,14 @@ public class ShipmentContainerHeader implements Serializable {
         this.status = status;
     }
 
+    public String getStationCode() {
+        return stationCode;
+    }
+
+    public void setStationCode(String stationCode) {
+        this.stationCode = stationCode;
+    }
+
     /**
      * 获取父
      *
diff --git a/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/service/ShipmentContainerHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/service/ShipmentContainerHeaderServiceImpl.java
index 5904bff..88b94ab 100644
--- a/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/service/ShipmentContainerHeaderServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/service/ShipmentContainerHeaderServiceImpl.java
@@ -211,6 +211,7 @@ public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentCont
                 shipmentContainerHeader.setLocationCode(location.getCode());
                 shipmentContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
                 shipmentContainerHeader.setCompanyCode(shipmentDetail.getCompanyCode());
+                shipmentContainerHeader.setStationCode(shipmentDetail.getStationCode());
                 shipmentContainerHeader.setContainerType(container.getContainerType());
                 shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
                 shipmentContainerHeader.setTaskCreated(0);
diff --git a/src/main/java/com/huaheng/pc/shipment/shipmentDetail/domain/ShipmentDetail.java b/src/main/java/com/huaheng/pc/shipment/shipmentDetail/domain/ShipmentDetail.java
index 76ca1aa..0cb0b30 100644
--- a/src/main/java/com/huaheng/pc/shipment/shipmentDetail/domain/ShipmentDetail.java
+++ b/src/main/java/com/huaheng/pc/shipment/shipmentDetail/domain/ShipmentDetail.java
@@ -188,6 +188,13 @@ public class ShipmentDetail implements Serializable {
     private String projectNo;
 
     /**
+     * 出库站台
+     */
+    @TableField(value = "stationCode")
+    @ApiModelProperty(value="出库站台")
+    private String stationCode;
+
+    /**
      * 生产日期
      */
     @TableField(value = "manufactureDate")
@@ -1009,6 +1016,14 @@ public class ShipmentDetail implements Serializable {
         return processStamp;
     }
 
+    public String getStationCode() {
+        return stationCode;
+    }
+
+    public void setStationCode(String stationCode) {
+        this.stationCode = stationCode;
+    }
+
     /**
      * 设置处理标记
      *
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java
index 693f2b9..b9467ba 100644
--- a/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 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.DataUtils;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.web.domain.AjaxResult;
@@ -37,12 +38,15 @@ import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
 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.mapper.TaskHeaderMapper;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 入库任务创建和完成
@@ -71,6 +75,8 @@ public class ReceiptTaskService {
     @Resource
     private ReceiptContainerHeaderService receiptContainerHeaderService;
     @Resource
+    private TaskHeaderMapper taskHeaderMapper;
+    @Resource
     private ContainerService containerService;
     @Resource
     private LocationService locationService;
@@ -186,90 +192,137 @@ public class ReceiptTaskService {
 
     /**
      * 完成入库任务
-     *
-     * @param task
-     * @return
      */
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult completeReceiptTask(TaskHeader task) {
-        /* 判断任务状态*/
-        if (task.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) {
-            return AjaxResult.error("任务已完成");
+        List<Map<String, Object>> taskReceiptContainerDetail = taskHeaderMapper.getReceiptTask(task.getId());
+        if (taskReceiptContainerDetail.size() < 1) {
+            return AjaxResult.success("未找到对应任务的入库单号!!!");
         }
-        BigDecimal totalQty = BigDecimal.ZERO;
-        List<TaskDetail> taskDetailList = taskDetailService.findByTaskId(task.getId());
-        if (taskDetailList.isEmpty()) {
-            throw new ServiceException("任务明细为空");
+        LambdaQueryWrapper<InventoryHeader> inventoryHeaderErapper = Wrappers.lambdaQuery();
+        inventoryHeaderErapper.eq(InventoryHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(InventoryHeader::getLocationCode, task.getToLocation())
+                .eq(InventoryHeader::getContainerCode, task.getContainerCode());
+        InventoryHeader header = inventoryHeaderService.getOne(inventoryHeaderErapper);
+
+        if(header == null) {
+            //添加库存单
+            header = new InventoryHeader();
+            header.setWarehouseCode(task.getWarehouseCode());
+            header.setCompanyCode(task.getCompanyCode());//货主
+            header.setContainerCode(task.getContainerCode());
+            header.setContainerStatus("some");
+            header.setLocationCode(task.getToLocation());
+            header.setLocking(1);
+            header.setEnable(1);
+            header.setTotalQty(new BigDecimal(0));
+            header.setTotalWeight(task.getWeight());
+            header.setCreatedBy(ShiroUtils.getLoginName());
+            header.setCreated(new Date());
+            header.setLastUpdatedBy(ShiroUtils.getLoginName());
+            header.setLastUpdated(new Date());
+            if (!inventoryHeaderService.save(header)) {
+                throw new ServiceException("添加库存单失败");
+            }
         }
-        /* 遍历任务明细,修改关联的入库组盘、入库单状态、添加库存*/
-        for (TaskDetail taskDetail : taskDetailList) {
-            if (taskDetail.getStatus() < QuantityConstant.TASK_STATUS_COMPLETED) {
-                totalQty = totalQty.add(taskDetail.getQty());
-                /*查询入库单明细*/
-                ReceiptDetail receiptDetail = receiptDetailService.getById(taskDetail.getBillDetailId());
-                if (StringUtils.isNotNull(receiptDetail)) {
-                    LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
-                    inventoryHeaderLambdaQueryWrapper.eq(InventoryHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
-                            .eq(InventoryHeader::getLocationCode, task.getToLocation())
-                            .eq(InventoryHeader::getContainerCode, task.getContainerCode());
-                    InventoryHeader inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaQueryWrapper);
-                    /* 如果库存 头明细不存在则新增库存头表记录*/
-                    if (StringUtils.isNull(inventoryHeader)) {
-                        inventoryHeader = new InventoryHeader();
-                        inventoryHeader.setWarehouseCode(receiptDetail.getWarehouseCode());
-                        inventoryHeader.setLocationCode(task.getToLocation());
-                        inventoryHeader.setContainerCode(task.getContainerCode());
-                        inventoryHeader.setContainerStatus("some");
-                        inventoryHeader.setCompanyCode(receiptDetail.getCompanyCode());
-                        inventoryHeader.setTotalWeight(task.getWeight());
-                        inventoryHeader.setTotalQty(new BigDecimal(0));
-                        inventoryHeader.setTotalLines(0);
-                        inventoryHeader.setLocking(1);
-                        inventoryHeader.setEnable(1);
-                        if (!inventoryHeaderService.save(inventoryHeader)) {
-                            throw new ServiceException("添加库存单失败");
-                        }
-                        inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaQueryWrapper);
+        for (Map<String, Object> map : taskReceiptContainerDetail) {
+            //将未完成的任务数量更新到库存表
+            if (DataUtils.getInteger(map.get("status")) < QuantityConstant.TASK_STATUS_COMPLETED) {
+
+                LambdaQueryWrapper<InventoryDetail> inventory = Wrappers.lambdaQuery();
+                inventory.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                        .eq(InventoryDetail::getLocationCode, task.getToLocation())
+                        .eq(InventoryDetail::getMaterialCode, DataUtils.getString(map.get("materialCode")))
+                        .eq(InventoryDetail::getContainerCode, DataUtils.getString(map.get("containerCode")))
+                        .eq(InventoryDetail::getBatch, DataUtils.getString(map.get("batch")))
+                        .eq(InventoryDetail::getLot, DataUtils.getString(map.get("lot")))
+                        .eq(InventoryDetail::getProjectNo, DataUtils.getString(map.get("projectNo")))
+                        .eq(InventoryDetail::getCompanyCode, DataUtils.getString(map.get("companyCode")));
+                InventoryDetail detail = inventoryDetailService.getOne(inventory);
+                if (detail == null) {
+                    //库存明细添加
+                    detail = new InventoryDetail();
+                    detail.setInventoryHeaderId(header.getId());//库存头ID
+                    detail.setWarehouseCode(DataUtils.getString(map.get("warehouseCode")));//仓库
+                    detail.setCompanyCode(task.getCompanyCode());//货主
+                    detail.setLocationCode(task.getToLocation());//库位号
+                    detail.setContainerCode(DataUtils.getString(map.get("containerCode")));//容器号
+                    detail.setMaterialCode(DataUtils.getString(map.get("materialCode")));//物料号
+                    detail.setMaterialName(DataUtils.getString(map.get("materialName")));//物料名称
+                    detail.setMaterialSpec(DataUtils.getString(map.get("materialSpec")));//物料规格
+                    detail.setMaterialUnit(DataUtils.getString(map.get("materialUnit")));//物料单位
+                    detail.setReceiptCode(DataUtils.getString(map.get("receiptCode")));//入库单编码
+                    detail.setReceiptDetailId(DataUtils.getInteger(map.get("receiptDetailId")));//入库单明细ID
+                    detail.setBatch(DataUtils.getString(map.get("batch")));//批次
+                    detail.setLot(DataUtils.getString(map.get("lot")));//批号
+                    detail.setProjectNo(DataUtils.getString(map.get("projectNo")));//项目号
+                    detail.setInventorySts(DataUtils.getString(map.get("inventorySts")));//库存状态
+//                    detail.setManufactureDate(new SimpleDateFormat("yyyy-MM-dd").parse(map.get("manufactureDate").toString()));//生产日期
+//                    detail.setExpirationDate(new SimpleDateFormat("yyyy-MM-dd").parse(map.get("expirationDate").toString()));//失效日期
+                    detail.setQty(DataUtils.getBigDecimal(map.get("qty")));//数量
+                    detail.setLockedQty(DataUtils.getBigDecimal(0));
+                    detail.setTaskQty(DataUtils.getBigDecimal(0));
+                    detail.setCreatedBy(ShiroUtils.getLoginName());//创建人
+                    detail.setLastUpdatedBy(ShiroUtils.getLoginName());//创建时间
+                    if (!inventoryDetailService.save(detail)) {
+                        throw new ServiceException("添加库存明细失败");
                     }
-                    totalQty = this.addInventoryDetail(taskDetail, receiptDetail, inventoryHeader);
-                    //修改组盘表状态为完成
-                    ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
-                    receiptContainerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED);
-                    LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
-                    receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getId, taskDetail.getAllocationId());
-                    if (!receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper)){
-                        throw new ServiceException("更新组盘状态失败");
+                } else {
+                    detail.setQty(detail.getQty().add(DataUtils.getBigDecimal(map.get("qty"))));
+                    detail.setLastUpdatedBy(ShiroUtils.getLoginName());
+                    LambdaUpdateWrapper<InventoryDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                    lambdaUpdateWrapper.eq(InventoryDetail::getId, detail.getId());
+                    if (!inventoryDetailService.update(detail, lambdaUpdateWrapper)){
+                        throw new ServiceException("更新库存明细失败");
                     }
+                }
+                //记录库存交易记录
+                InventoryTransaction inventoryTransaction = new InventoryTransaction();
+                inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT);
+                inventoryTransaction.setWarehouseCode(DataUtils.getString(map.get("warehouseCode")));
+                inventoryTransaction.setCompanyCode(task.getCompanyCode());
+                inventoryTransaction.setLocationCode(task.getToLocation());
+                inventoryTransaction.setContainerCode(DataUtils.getString(map.get("containerCode")));
+                inventoryTransaction.setMaterialCode(DataUtils.getString(map.get("materialCode")));
+                inventoryTransaction.setMaterialName(DataUtils.getString(map.get("materialName")));
+                inventoryTransaction.setMaterialSpec(DataUtils.getString(map.get("materialSpec")));//物料规格
+                inventoryTransaction.setMaterialUnit(DataUtils.getString(map.get("materialUnit")));//物料单位
+                inventoryTransaction.setBillCode(DataUtils.getString(map.get("receiptCode")));
+                inventoryTransaction.setBillDetailId(DataUtils.getInteger(map.get("receiptDetailId")));
+                inventoryTransaction.setBatch(DataUtils.getString(map.get("batch")));
+                inventoryTransaction.setLot(DataUtils.getString(map.get("lot")));
+                inventoryTransaction.setInventorySts(DataUtils.getString((map.get("inventorySts"))));
+                inventoryTransaction.setTaskQty(DataUtils.getBigDecimal(map.get("qty")));
+                inventoryTransaction.setCreated(new Date());
+                inventoryTransaction.setCreatedBy(ShiroUtils.getLoginName());
+                if (!inventoryTransactionService.save(inventoryTransaction)) {
+                    throw new ServiceException("新增库存记录失败");
+                }
 
-                } else {
-                    throw new ServiceException("未找到id:" + taskDetail.getBillDetailId() + "入库单明细");
+                //修改任务明细的状态为完成
+                TaskDetail taskDetail = new TaskDetail();
+                taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+                taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+                taskDetail.setAgingDate(new Date());   //入库时间
+                LambdaUpdateWrapper<TaskDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                lambdaUpdateWrapper.eq(TaskDetail::getTaskId, task.getId());
+                taskDetailService.update(taskDetail, lambdaUpdateWrapper);
+                if (!taskDetailService.update(taskDetail, lambdaUpdateWrapper)) {
+                    throw new ServiceException("修改入库单明细失败");
                 }
-                receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_POSTING));
-                receiptDetailService.updateById(receiptDetail);
-                receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
-                materialWarningService.materialWarning(taskDetail.getMaterialCode(), taskDetail.getCompanyCode());
+
             }
-        }
-        LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
-        inventoryHeaderLambdaQueryWrapper.eq(InventoryHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
-                .eq(InventoryHeader::getLocationCode, task.getToLocation())
-                .eq(InventoryHeader::getContainerCode, task.getContainerCode());
-        InventoryHeader inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaQueryWrapper);
-        if (StringUtils.isNull(inventoryHeader)) {
-            throw new ServiceException("库存添加失败");
-        } else {
-            inventoryHeader.setTotalQty(inventoryHeader.getTotalQty().add(totalQty));
-            inventoryHeader.setTotalLines(inventoryHeader.getTotalLines()+taskDetailList.size());
-            inventoryHeaderService.updateById(inventoryHeader);
+
         }
         //修改任务主表状态,因为立库任务表单头只对应一个货箱,表单详情的任务会同时完成
         task.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+        task.setLastUpdatedBy(ShiroUtils.getLoginName());
+        task.setLastUpdated(new Date());
         LambdaUpdateWrapper<TaskHeader> taskHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
         taskHeaderLambdaUpdateWrapper.eq(TaskHeader::getId, task.getId());
         if (!taskHeaderService.update(task, taskHeaderLambdaUpdateWrapper)){
             throw new ServiceException("更新任务主表失败");
         }
-
         //修改库位状态和对应的容器
         Location location = new Location();
         location.setContainerCode(task.getContainerCode());
@@ -288,15 +341,41 @@ public class ReceiptTaskService {
         if (!containerService.update(container, containerLambdaUpdateWrapper)) {
             throw new ServiceException("更新容器失败");
         }
+        //修改组盘表状态为20
+        ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
+        receiptContainerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_REVIEWSUCCESS);
+        receiptContainerDetail.setProcessStamp("0");
+        receiptContainerDetail.setLastUpdated(new Date());
+        receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getReceiptId, DataUtils.getInteger(taskReceiptContainerDetail.get(0).get("receiptId")));
+        if (!receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper)){
+            throw new ServiceException("更新组盘状态失败");
+        }
 
         //修改入库组盘头表状态
+
         ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
         receiptContainerHeader.setId(task.getAllocationHeadId());
-        receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED);
+        receiptContainerHeader.setLastUpdated(new Date());
+        receiptContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED.intValue());
         if (!receiptContainerHeaderService.updateById(receiptContainerHeader)) {
             throw new ServiceException("更新入库组盘头表状态失败");
         }
-        return AjaxResult.success();
+
+        //修改入库单状态
+        ReceiptHeader receiptHeader = new ReceiptHeader();
+        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
+        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
+        receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        receiptHeader.setLastUpdated(new Date());
+        LambdaUpdateWrapper<ReceiptHeader> receiptHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        receiptHeaderLambdaUpdateWrapper.eq(ReceiptHeader::getId, DataUtils.getInteger(taskReceiptContainerDetail.get(0).get("receiptId")));
+        if (!receiptHeaderService.update(receiptHeader, receiptHeaderLambdaUpdateWrapper)) {
+            throw new ServiceException("更新入库头表状态失败");
+        }
+        return AjaxResult.success("完成入库任务");
     }
 
     /**
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java
index 371b493..14e9223 100644
--- a/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/ShipmentTaskService.java
@@ -139,6 +139,7 @@ public class ShipmentTaskService {
         task.setWarehouseCode(shipmentContainerHeader.getWarehouseCode());
         task.setAssignedUser(ShiroUtils.getLoginName());
         task.setConfirmedBy(ShiroUtils.getLoginName());
+        task.setStationCode(shipmentContainerHeader.getStationCode());
         task.setStatus(QuantityConstant.TASK_STATUS_BUILD);
         task.setContainerCode(shipmentContainerHeader.getContainerCode());
         if (!taskHeaderService.save(task)){
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java
index 6a87e45..ee43962 100644
--- a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java
@@ -56,4 +56,10 @@ public interface TaskHeaderService extends IService<TaskHeader>{
 
     AjaxResult setLocationCode(Integer taskId, Integer high);
 
+    AjaxResult createTaskFromShipmentContainers(ShipmentTaskCreateModel shipmentTaskCreateModel);
+
+    AjaxResult completeReceiptTask(TaskHeader task);
+
+    AjaxResult createReceiptTask(List<Integer> ids);
+
 }
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 538d699..ccd5946 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
@@ -73,6 +73,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     @Resource
     private ShipmentContainerHeaderService shipmentContainerHeaderService;
     @Resource
+    private ShipmentContainerDetailService shipmentContainerDetailService;
+    @Resource
     private LocationService locationService;
     @Resource
     private ContainerService containerService;
@@ -84,12 +86,19 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     private InventoryHeaderService inventoryHeaderService;
     @Resource
     private InventoryDetailService inventoryDetailService;
-
     @Resource
-    private TransferTaskService transferTaskService;
+    private InventoryTransactionService inventoryTransactionService;
+    @Resource
+    private ReceiptHeaderService receiptHeaderService;
+    @Resource
+    private ReceiptDetailService receiptDetailService;
     @Resource
     private ReceiptContainerDetailService receiptContainerDetailService;
     @Resource
+    private ShipmentHeaderService shipmentHeaderService;
+    @Resource
+    private ShipmentDetailService shipmentDetailService;
+    @Resource
     private CycleCountDetailService cycleCountDetailService;
     @Resource
     private CycleCountHeaderService cycleCountHeaderService;
@@ -97,9 +106,15 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     private ReceiptContainerHeaderService receiptContainerHeaderService;
     @Resource
     private TaskHeaderMapper taskHeaderMapper;
-    @Resource
+    @Autowired
     private TaskAssignService taskAssignService;
     @Resource
+    private ContainerCapacityService containerCapacityService;
+    @Resource
+    private ConfigWarningService configWarningService;
+    @Resource
+    private ReceivingService receivingService;
+    @Resource
     private CreateTaskMessage createTaskMessage;
     @Resource
     private ReceiptTaskService receiptTaskService;
@@ -107,6 +122,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     private ShipmentTaskService shipmentTaskService;
     @Resource
     private WorkTaskService workTaskService;
+    @Resource
+    private TransferTaskService transferTaskService;
 
     /**
      * 盘点任务首选项
@@ -153,7 +170,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         }
         if(list.get(0).getTaskType()==100 || list.get(0).getTaskType()==200){
             //入库任务
-            return receiptTaskService.completeReceiptTask((list.get(0)));
+            return  completeReceiptTask((list.get(0)));
         } else {
             throw new ServiceException("库位(" + locationCode + ")的任务不是上架,不能完成!");
         }
@@ -191,7 +208,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         }
         List<Integer> ids = new ArrayList<>();
         ids.add(containerHeader.getId());
-        receiptTaskService.createReceiptTask(ids);
+        this.createReceiptTask(ids);
         return AjaxResult.success("成功!");
     }
 
@@ -321,6 +338,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         return AjaxResult.success("取消任务成功!");
     }
 
+
     /**
      * 容器收货上架
      *
@@ -356,19 +374,145 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             if (StringUtils.isEmpty(ids)){
                 return AjaxResult.error("id不能为空");
             }
-
             Integer maxId = idList.stream().max(Comparator.comparing(Integer::intValue)).orElse(null);
 
             LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
             lambda.select(ReceiptContainerHeader::getId)
                     .lt(ReceiptContainerHeader::getStatus, 10)
                     .le(ReceiptContainerHeader::getId, maxId);
-            return receiptTaskService.createReceiptTask(idList);
+            return createReceiptTask(idList);
         }
         return AjaxResult.error("生成入库任务失败");
     }
 
     /**
+     * 生成出库任务
+     *
+     * @param shipmentTaskCreateModel
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult createTaskFromShipmentContainers(ShipmentTaskCreateModel shipmentTaskCreateModel) {
+        Boolean flag = true;
+        Integer shipmentContainerHeaderId = shipmentTaskCreateModel.getShipmentContainerHeaderIds();
+        //获取表头
+        ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.getById(shipmentContainerHeaderId);
+        if (shipmentContainerHeader == null) {
+            return AjaxResult.error("出库货箱" + shipmentContainerHeaderId + "未找到,操作中止");
+        }
+        if (shipmentContainerHeader.getStatus() >= QuantityConstant.SHIPMENT_CONTAINER_TASK) {
+            return AjaxResult.error("出库货箱" + shipmentContainerHeader.getContainerCode() + "已经生成任务,请不要重复生成,操作中止");
+        }
+        //获取所有子货箱
+        LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId, shipmentContainerHeader.getId());
+        List<ShipmentContainerDetail> shipmentContainerDetails = shipmentContainerDetailService.list(lambdaQueryWrapper);
+        if (shipmentContainerDetails == null || shipmentContainerDetails.size() == 0) {
+            return AjaxResult.error("货箱" + shipmentContainerHeader.getContainerCode() + "没有子任务,操作中止");
+        }
+        //检测库位
+        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
+        locationLambdaQueryWrapper.eq(Location::getCode, shipmentContainerHeader.getLocationCode())
+                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(Location::getDeleted, false);
+        Location location = locationService.getOne(locationLambdaQueryWrapper);
+        if (location == null) {
+            return AjaxResult.error("库位禁用或不存在!");
+        }
+        //创建任务头
+        TaskHeader task = new TaskHeader();
+        //分拣出库
+        task.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
+        task.setFromLocation(shipmentContainerHeader.getLocationCode());
+        task.setToLocation(shipmentContainerHeader.getLocationCode());
+        //判断是否整出任务,钱柜和AGV不能整出
+
+        //表示整出优先
+        //判断当前子货箱所有数量是否等于该托盘对应的所有库存的数量,
+        //这里必须与库存的在库数量对比,后期可能存在一个配盘在执行任务,后一个配盘又在配这个的情况(这个时候不能整出)
+        // 如果相等,则说明这个货箱包含了所有的数量,则可以整出,否则,创建拣选任务;
+        //查询所有库存
+        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
+        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getLocationCode, shipmentContainerHeader.getLocationCode())
+                .eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
+        List<InventoryDetail> inventories = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
+        BigDecimal inventoryTotal = new BigDecimal("0");
+        for (InventoryDetail item : inventories) {
+            inventoryTotal = inventoryTotal.add(item.getQty());
+        }
+        BigDecimal containerTotal = new BigDecimal("0");
+        for (ShipmentContainerDetail item : shipmentContainerDetails) {
+            containerTotal = containerTotal.add(item.getQty());
+        }
+        if (inventoryTotal.compareTo(containerTotal) == 0) {
+            task.setTaskType(QuantityConstant.TASK_TYPE_WHOLESHIPMENT);//整盘出库
+            task.setToLocation("");
+        }
+
+        task.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_PICKING);
+        task.setAllocationHeadId(shipmentContainerHeader.getId());
+        task.setWarehouseCode(shipmentContainerHeader.getWarehouseCode());
+        task.setCompanyCode(shipmentContainerHeader.getCompanyCode());
+        task.setAssignedUser(ShiroUtils.getLoginName());
+        task.setConfirmedBy(ShiroUtils.getLoginName());
+        task.setStatus(QuantityConstant.TASK_STATUS_BUILD);
+        task.setContainerCode(shipmentContainerHeader.getContainerCode());
+        task.setCreatedBy(ShiroUtils.getLoginName());
+        task.setCreated(new Date());
+        task.setLastUpdatedBy(ShiroUtils.getLoginName());
+        task.setLastUpdated(null);
+        this.save(task);
+        //遍历子货箱创建子任务
+        for (ShipmentContainerDetail shipmentContainerDetail : shipmentContainerDetails) {
+            TaskDetail taskDetail = new TaskDetail();
+            taskDetail.setTaskId(task.getId());
+            taskDetail.setInternalTaskType(task.getInternalTaskType());
+            taskDetail.setWarehouseCode(task.getWarehouseCode());
+            taskDetail.setCompanyCode(task.getCompanyCode());
+            taskDetail.setTaskType(task.getTaskType());
+            taskDetail.setToInventoryId(shipmentContainerDetail.getInventoryId());
+            taskDetail.setAllocationId(shipmentContainerDetail.getId());
+            taskDetail.setBillCode(shipmentContainerDetail.getShipmentCode());
+            taskDetail.setBillDetailId(shipmentContainerDetail.getShipmentDetailId());
+            taskDetail.setMaterialCode(shipmentContainerDetail.getMaterialCode());
+            taskDetail.setMaterialName(shipmentContainerDetail.getMaterialName());
+            taskDetail.setMaterialSpec(shipmentContainerDetail.getMaterialSpec());
+            taskDetail.setMaterialUnit(shipmentContainerDetail.getMaterialUnit());
+            taskDetail.setFromInventoryId(shipmentContainerDetail.getInventoryId());
+            taskDetail.setQty(shipmentContainerDetail.getQty());
+            taskDetail.setContainerCode(task.getContainerCode());
+            taskDetail.setFromLocation(task.getFromLocation());
+            taskDetail.setToLocation(task.getToLocation());
+            taskDetail.setLot(shipmentContainerDetail.getLot());
+            taskDetail.setBatch(shipmentContainerDetail.getBatch());
+            taskDetail.setProjectNo(shipmentContainerDetail.getProjectNo());
+            taskDetail.setStatus(QuantityConstant.TASK_STATUS_BUILD);
+            taskDetail.setWaveId(shipmentContainerDetail.getWaveId());
+            taskDetail.setInventorySts(shipmentContainerDetail.getInventorySts());
+            taskDetail.setCreatedBy(ShiroUtils.getLoginName());
+            taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+            flag = taskDetailService.save(taskDetail);
+            if (flag == false) {
+                throw new ServiceException("新建任务明细失败,sql报错");
+            }
+            shipmentContainerDetail.setStatus(QuantityConstant.SHIPMENT_CONTAINER_TASK);
+        }
+        //更新货位状态
+        shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_TASK);
+        flag = shipmentContainerHeaderService.updateById(shipmentContainerHeader);
+        if (flag == false) {
+            throw new ServiceException("修改组盘头状态失败,sql报错");
+        }
+
+        flag = shipmentContainerDetailService.updateBatchById(shipmentContainerDetails);
+        if (flag == false) {
+            throw new ServiceException("修改组盘明细状态明细失败,sql报错");
+        }
+        return AjaxResult.success(task.getId());
+    }
+
+    /**
      * 下发WCS执行任务
      * 执行任务
      */
@@ -382,9 +526,12 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             if (task.getStatus() >= QuantityConstant.TASK_STATUS_RELEASE) {
                 return AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
             }
-
             // 给wcs传递任务
-            taskAssignService.wcsTaskAssign(task);
+            try {
+                createTaskMessage.createTask(task);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
 
             //修改任务头表
             task.setId(taskId);
@@ -415,12 +562,50 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
                 }
             }
 
+//            //修改入库明细
+//            if (task.getInternalTaskType()==100){
+//                ReceiptDetail receiptDetail = receiptDetailService.queryflow(receiptDetailService.getById(record.getId()));
+//                if (!receiptDetailService.updateById(receiptDetail)){
+//                    throw new ServiceException("更新状态失败");
+//                }
+//                receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
+//
+//                //修改组盘表状态为20
+//                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
+//                receiptContainerDetail.setStatus(20);
+//                receiptContainerDetail.setLastUpdated(new Date());
+//                receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+//                LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+//                receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getReceiptId,receiptDetail.getReceiptId());
+//                if (! receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper))
+//                    throw new ServiceException("更新组盘状态失败");
+//            }
+//
+//            //修改出库单状态
+//            if (task.getInternalTaskType()==200){
+//                LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
+//                taskDetailLambdaQueryWrapper.eq(TaskDetail::getTaskId,task.getId());
+//               List<TaskDetail> taskDetailList = taskDetailService.list(taskDetailLambdaQueryWrapper);
+//
+//                for (TaskDetail taskDeatails: taskDetailList) {
+//                    LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
+//                    shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getId,taskDeatails.getBillDetailId());
+//
+//                    ShipmentHeader shipmentHeader =new ShipmentHeader();
+//                    shipmentHeader.setId(shipmentDetailService.getOne(shipmentDetailLambdaQueryWrapper).getShipmentId());
+//                    shipmentHeader.setFirstStatus(100);
+//                    shipmentHeader.setLastStatus(100);
+//                    shipmentHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+//                    shipmentHeader.setLastUpdated(new Date());
+//                    shipmentHeaderService.updateById(shipmentHeader);
+//                }
+//            }
+
         }
         return AjaxResult.success("执行下发任务成功", task);
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public AjaxResult completeTaskByWMS(Integer[] taskIds, String[] weightConvert) {
         for (int i = 0;i<taskIds.length;i++) {
             TaskHeader task = taskHeaderService.getById(taskIds[i]);
@@ -444,8 +629,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             if(task.getTaskType().equals(QuantityConstant.TASK_TYPE_WHOLERECEIPT) || task.getTaskType().equals(QuantityConstant.TASK_TYPE_EMPTYRECEIPT)){
                 if(StringUtils.isEmpty(task.getToLocation())){
                     //自动分配库位
-                 //  AjaxResult ajaxResult = this.setLocationCode(task.getId(),0 );
-                //   task.setToLocation((String)ajaxResult.getData());
+//                    AjaxResult ajaxResult = this.setLocationCode(task.getId(),0 );
+//                    task.setToLocation((String)ajaxResult.getData());
                 }
             }
             //如果没有库位不能完成
@@ -468,6 +653,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         if (task.getInternalTaskType().equals(QuantityConstant.TASK_INTENERTYPE_SHELF) ) {
             //入库任务
             receiptTaskService.completeReceiptTask(task);
+            combineInventory(task);
         }
         if (task.getInternalTaskType().equals(QuantityConstant.TASK_INTENERTYPE_PICKING) &&
                 (task.getTaskType().equals(QuantityConstant.TASK_TYPE_WHOLESHIPMENT) || task.getTaskType().equals(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT))) {
@@ -476,7 +662,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         }
         // 900 出库查看,空托出库查看
         if (task.getTaskType().equals( QuantityConstant.TASK_TYPE_VIEW)) {
-            workTaskService.completeCheckOutTask(task);
+             workTaskService.completeCheckOutTask(task);
         }
         // 700 盘点
         if (task.getTaskType().equals(QuantityConstant.TASK_TYPE_CYCLECOUNT)) {
@@ -496,6 +682,244 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         }
     }
 
+
+    /**
+     * 完成入库任务
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult completeReceiptTask(TaskHeader task) {
+        List<Map<String, Object>> taskReceiptContainerDetail = taskHeaderMapper.getReceiptTask(task.getId());
+        if (taskReceiptContainerDetail.size() < 1) {
+            return AjaxResult.success("未找到对应任务的入库单号!!!");
+        }
+        LambdaQueryWrapper<InventoryHeader> inventoryHeaderErapper = Wrappers.lambdaQuery();
+        inventoryHeaderErapper.eq(InventoryHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(InventoryHeader::getLocationCode, task.getToLocation())
+                .eq(InventoryHeader::getContainerCode, task.getContainerCode());
+        InventoryHeader header = inventoryHeaderService.getOne(inventoryHeaderErapper);
+
+        if(header == null) {
+            //添加库存单
+            header = new InventoryHeader();
+            header.setWarehouseCode(task.getWarehouseCode());
+            header.setCompanyCode(task.getCompanyCode());//货主
+            header.setContainerCode(task.getContainerCode());
+            header.setContainerStatus("some");
+            header.setLocationCode(task.getToLocation());
+            header.setLocking(1);
+            header.setEnable(1);
+            header.setTotalQty(new BigDecimal(0));
+            header.setTotalWeight(task.getWeight());
+            header.setCreatedBy(ShiroUtils.getLoginName());
+            header.setCreated(new Date());
+            header.setLastUpdatedBy(ShiroUtils.getLoginName());
+            header.setLastUpdated(new Date());
+            if (!inventoryHeaderService.save(header)) {
+                throw new ServiceException("添加库存单失败");
+            }
+        }
+        for (Map<String, Object> map : taskReceiptContainerDetail) {
+            //将未完成的任务数量更新到库存表
+            if (DataUtils.getInteger(map.get("status")) < QuantityConstant.TASK_STATUS_COMPLETED) {
+
+                LambdaQueryWrapper<InventoryDetail> inventory = Wrappers.lambdaQuery();
+                inventory.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                        .eq(InventoryDetail::getLocationCode, task.getToLocation())
+                        .eq(InventoryDetail::getMaterialCode, DataUtils.getString(map.get("materialCode")))
+                        .eq(InventoryDetail::getContainerCode, DataUtils.getString(map.get("containerCode")))
+                        .eq(InventoryDetail::getBatch, DataUtils.getString(map.get("batch")))
+                        .eq(InventoryDetail::getLot, DataUtils.getString(map.get("lot")))
+                        .eq(InventoryDetail::getProjectNo, DataUtils.getString(map.get("projectNo")))
+                        .eq(InventoryDetail::getCompanyCode, DataUtils.getString(map.get("companyCode")));
+                InventoryDetail detail = inventoryDetailService.getOne(inventory);
+                if (detail == null) {
+                    //库存明细添加
+                    detail = new InventoryDetail();
+                    detail.setInventoryHeaderId(header.getId());//库存头ID
+                    detail.setWarehouseCode(DataUtils.getString(map.get("warehouseCode")));//仓库
+                    detail.setCompanyCode(task.getCompanyCode());//货主
+                    detail.setLocationCode(task.getToLocation());//库位号
+                    detail.setContainerCode(DataUtils.getString(map.get("containerCode")));//容器号
+                    detail.setMaterialCode(DataUtils.getString(map.get("materialCode")));//物料号
+                    detail.setMaterialName(DataUtils.getString(map.get("materialName")));//物料名称
+                    detail.setMaterialSpec(DataUtils.getString(map.get("materialSpec")));//物料规格
+                    detail.setMaterialUnit(DataUtils.getString(map.get("materialUnit")));//物料单位
+                    detail.setReceiptCode(DataUtils.getString(map.get("receiptCode")));//入库单编码
+                    detail.setReceiptDetailId(DataUtils.getInteger(map.get("receiptDetailId")));//入库单明细ID
+                    detail.setBatch(DataUtils.getString(map.get("batch")));//批次
+                    detail.setLot(DataUtils.getString(map.get("lot")));//批号
+                    detail.setProjectNo(DataUtils.getString(map.get("projectNo")));//项目号
+                    detail.setInventorySts(DataUtils.getString(map.get("inventorySts")));//库存状态
+//                    detail.setManufactureDate(new SimpleDateFormat("yyyy-MM-dd").parse(map.get("manufactureDate").toString()));//生产日期
+//                    detail.setExpirationDate(new SimpleDateFormat("yyyy-MM-dd").parse(map.get("expirationDate").toString()));//失效日期
+                    detail.setQty(DataUtils.getBigDecimal(map.get("qty")));//数量
+                    detail.setLockedQty(DataUtils.getBigDecimal(0));
+                    detail.setTaskQty(DataUtils.getBigDecimal(0));
+                    detail.setCreatedBy(ShiroUtils.getLoginName());//创建人
+                    detail.setLastUpdatedBy(ShiroUtils.getLoginName());//创建时间
+                    if (!inventoryDetailService.save(detail)) {
+                        throw new ServiceException("添加库存明细失败");
+                    }
+                } else {
+                    detail.setQty(detail.getQty().add(DataUtils.getBigDecimal(map.get("qty"))));
+                    detail.setLastUpdatedBy(ShiroUtils.getLoginName());
+                    LambdaUpdateWrapper<InventoryDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                    lambdaUpdateWrapper.eq(InventoryDetail::getId, detail.getId());
+                    if (!inventoryDetailService.update(detail, lambdaUpdateWrapper)){
+                        throw new ServiceException("更新库存明细失败");
+                    }
+                }
+                //记录库存交易记录
+                InventoryTransaction inventoryTransaction = new InventoryTransaction();
+                inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT);
+                inventoryTransaction.setWarehouseCode(DataUtils.getString(map.get("warehouseCode")));
+                inventoryTransaction.setCompanyCode(task.getCompanyCode());
+                inventoryTransaction.setLocationCode(task.getToLocation());
+                inventoryTransaction.setContainerCode(DataUtils.getString(map.get("containerCode")));
+                inventoryTransaction.setMaterialCode(DataUtils.getString(map.get("materialCode")));
+                inventoryTransaction.setMaterialName(DataUtils.getString(map.get("materialName")));
+                inventoryTransaction.setMaterialSpec(DataUtils.getString(map.get("materialSpec")));//物料规格
+                inventoryTransaction.setMaterialUnit(DataUtils.getString(map.get("materialUnit")));//物料单位
+                inventoryTransaction.setBillCode(DataUtils.getString(map.get("receiptCode")));
+                inventoryTransaction.setBillDetailId(DataUtils.getInteger(map.get("receiptDetailId")));
+                inventoryTransaction.setBatch(DataUtils.getString(map.get("batch")));
+                inventoryTransaction.setLot(DataUtils.getString(map.get("lot")));
+                inventoryTransaction.setInventorySts(DataUtils.getString((map.get("inventorySts"))));
+                inventoryTransaction.setTaskQty(DataUtils.getBigDecimal(map.get("qty")));
+                inventoryTransaction.setCreated(new Date());
+                inventoryTransaction.setCreatedBy(ShiroUtils.getLoginName());
+                if (!inventoryTransactionService.save(inventoryTransaction)) {
+                    throw new ServiceException("新增库存记录失败");
+                }
+
+                //修改任务明细的状态为完成
+                TaskDetail taskDetail = new TaskDetail();
+                taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+                taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+                taskDetail.setAgingDate(new Date());   //入库时间
+                LambdaUpdateWrapper<TaskDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                lambdaUpdateWrapper.eq(TaskDetail::getTaskId, task.getId());
+                taskDetailService.update(taskDetail, lambdaUpdateWrapper);
+                if (!taskDetailService.update(taskDetail, lambdaUpdateWrapper)) {
+                    throw new ServiceException("修改入库单明细失败");
+                }
+
+            }
+
+        }
+        //修改任务主表状态,因为立库任务表单头只对应一个货箱,表单详情的任务会同时完成
+        task.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+        task.setLastUpdatedBy(ShiroUtils.getLoginName());
+        task.setLastUpdated(new Date());
+        LambdaUpdateWrapper<TaskHeader> taskHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        taskHeaderLambdaUpdateWrapper.eq(TaskHeader::getId, task.getId());
+        if (!taskHeaderService.update(task, taskHeaderLambdaUpdateWrapper)){
+            throw new ServiceException("更新任务主表失败");
+        }
+        //修改库位状态和对应的容器
+        Location location = new Location();
+        location.setContainerCode(task.getContainerCode());
+        location.setStatus("empty");
+        LambdaUpdateWrapper<Location> locationLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        locationLambdaUpdateWrapper.eq(Location::getCode, task.getToLocation());
+        if (!locationService.update(location, locationLambdaUpdateWrapper)){
+            throw new ServiceException("更新库位失败");
+        }
+        //修改容器状态和对应的库位
+        Container container = new Container();
+        container.setLocationCode(task.getToLocation());
+        container.setStatus("some");
+        LambdaUpdateWrapper<Container> containerLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        containerLambdaUpdateWrapper.eq(Container::getCode, task.getContainerCode());
+        if (!containerService.update(container, containerLambdaUpdateWrapper)) {
+            throw new ServiceException("更新容器失败");
+        }
+        //修改组盘表状态为20
+        ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
+        receiptContainerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_REVIEWSUCCESS);
+        receiptContainerDetail.setProcessStamp("0");
+        receiptContainerDetail.setLastUpdated(new Date());
+        receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getReceiptId, DataUtils.getInteger(taskReceiptContainerDetail.get(0).get("receiptId")));
+        if (!receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper)){
+            throw new ServiceException("更新组盘状态失败");
+        }
+
+        //修改入库组盘头表状态
+
+        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
+        receiptContainerHeader.setId(task.getAllocationHeadId());
+        receiptContainerHeader.setLastUpdated(new Date());
+        receiptContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED.intValue());
+        if (!receiptContainerHeaderService.updateById(receiptContainerHeader)) {
+            throw new ServiceException("更新入库组盘头表状态失败");
+        }
+
+        //修改入库单状态
+        ReceiptHeader receiptHeader = new ReceiptHeader();
+        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
+        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
+        receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        receiptHeader.setLastUpdated(new Date());
+        LambdaUpdateWrapper<ReceiptHeader> receiptHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        receiptHeaderLambdaUpdateWrapper.eq(ReceiptHeader::getId, DataUtils.getInteger(taskReceiptContainerDetail.get(0).get("receiptId")));
+        if (!receiptHeaderService.update(receiptHeader, receiptHeaderLambdaUpdateWrapper)) {
+            throw new ServiceException("更新入库头表状态失败");
+        }
+        return AjaxResult.success("完成入库任务");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void combineInventory(TaskHeader task) {
+        LambdaQueryWrapper<InventoryHeader> inventoryHeaderErapper = Wrappers.lambdaQuery();
+        inventoryHeaderErapper.eq(InventoryHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(InventoryHeader::getLocationCode, task.getToLocation())
+                .eq(InventoryHeader::getContainerCode, task.getContainerCode());
+        InventoryHeader header = inventoryHeaderService.getOne(inventoryHeaderErapper);
+        if(header != null) {
+            LambdaQueryWrapper<InventoryDetail> inventory = Wrappers.lambdaQuery();
+            inventory.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                    .eq(InventoryDetail::getLocationCode, task.getFromLocation())
+                    .eq(InventoryDetail::getContainerCode, task.getContainerCode());
+            List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventory);
+            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.getBatch().equals(inventoryDetail2.getBatch())
+                            && inventoryDetail.getLot().equals(inventoryDetail2.getLot())
+                            && inventoryDetail.getProjectNo().equals(inventoryDetail2.getProjectNo())) {
+                        BigDecimal totalQty = inventoryDetailList.get(i).getQty().add(inventoryDetailList.get(j).getQty());
+                        inventoryDetailList.get(i).setQty(totalQty);
+                        LambdaQueryWrapper<InventoryDetail> wrapper = Wrappers.lambdaQuery();
+                        wrapper.eq(InventoryDetail::getId, inventoryDetailList.get(i).getId());
+                        inventoryDetailService.update(inventoryDetailList.get(i), wrapper);
+                        LambdaQueryWrapper<InventoryDetail> wrapper2 = Wrappers.lambdaQuery();
+                        wrapper2.eq(InventoryDetail::getId, inventoryDetailList.get(j).getId());
+                        inventoryDetailService.remove(wrapper2);
+                        inventoryDetailList.remove(j);
+                    }
+                }
+            }
+            BigDecimal totalQty = new BigDecimal(0);
+            int totalLines = 0;
+            for(InventoryDetail inventoryDetail : inventoryDetailList) {
+                totalQty = totalQty.add(inventoryDetail.getQty());
+                totalLines++;
+            }
+            header.setTotalQty(totalQty);
+            header.setTotalLines(totalLines);
+            header.setContainerStatus("some");
+            LambdaQueryWrapper<InventoryHeader> wrapper = Wrappers.lambdaQuery();
+            wrapper.eq(InventoryHeader::getId, header.getId());
+            inventoryHeaderService.update(header, wrapper);
+        }
+    }
+
     /**
      * 移动端创建入库任务
      *
@@ -518,11 +942,138 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         }
         List<Integer> idList = new ArrayList<>();
         idList.add(receiptContainerHeader.getId());
-        receiptTaskService.createReceiptTask(idList);
+        createReceiptTask(idList);
 
         return AjaxResult.success(receiptContainerHeader);
     }
 
+
+    /**
+     * 完成移库任务
+     *
+     * @param task
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void completeTransferTask(TaskHeader task) {
+        //找到任务明细
+        TaskDetail taskDetail = new TaskDetail();
+        taskDetail.setTaskId(task.getId());
+        taskDetail.setWarehouseCode(task.getWarehouseCode());
+        taskDetail.setCompanyCode(task.getCompanyCode());
+        taskDetail.setContainerCode(task.getContainerCode());
+        LambdaQueryWrapper<TaskDetail> taskDetailLW = Wrappers.lambdaQuery(taskDetail);
+        taskDetail = taskDetailService.getOne(taskDetailLW);
+        //更新库存主表和明细的库位,更改更新用户和时间
+        InventoryHeader inventoryHeader = new InventoryHeader();
+        //主表
+        inventoryHeader.setWarehouseCode(taskDetail.getWarehouseCode());
+        inventoryHeader.setCompanyCode(taskDetail.getCompanyCode());
+        inventoryHeader.setContainerCode(taskDetail.getContainerCode());
+        inventoryHeader.setLocationCode(taskDetail.getFromLocation());//通过源库位查找库存
+        LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(inventoryHeader);
+        inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaQueryWrapper);
+        if (StringUtils.isNotNull(inventoryHeader)){
+            inventoryHeader.setLocationCode(taskDetail.getToLocation());//把目的库位写入库存
+            inventoryHeader.setLastUpdated(new Date());
+            inventoryHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+            inventoryHeaderService.saveOrUpdate(inventoryHeader);//修改主表库位
+
+            //明细表
+            List<InventoryDetail> inventoryDetails = new ArrayList<>();
+            InventoryDetail inventoryDetail = new InventoryDetail();
+            inventoryDetail.setWarehouseCode(inventoryHeader.getWarehouseCode());
+            inventoryDetail.setCompanyCode(inventoryHeader.getCompanyCode());
+            inventoryDetail.setInventoryHeaderId(inventoryHeader.getId());
+            LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(inventoryDetail);
+            List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
+            /*同时写入库存交易表*/
+            List<InventoryTransaction> inventoryTransactionList = new ArrayList<>();
+            for (InventoryDetail item : inventoryDetailList) {
+                item.setLocationCode(inventoryHeader.getLocationCode());//修改明细表库位
+                item.setLastUpdated(new Date());
+                item.setLastUpdatedBy(ShiroUtils.getLoginName());
+                inventoryDetails.add(item);
+                /*----------*/
+                InventoryTransaction inventoryTransaction = new InventoryTransaction();
+                inventoryTransaction.setWarehouseCode(task.getWarehouseCode());
+                inventoryTransaction.setLocationCode(taskDetail.getToLocation());
+                inventoryTransaction.setContainerCode(taskDetail.getContainerCode());
+                inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_ADJUSTPROPERTIES);
+                inventoryTransaction.setMaterialCode(item.getMaterialCode());
+                inventoryTransaction.setManufactureDate(item.getManufactureDate());
+                inventoryTransaction.setMaterialName(item.getMaterialName());
+                inventoryTransaction.setMaterialSpec(item.getMaterialSpec());
+                inventoryTransaction.setMaterialUnit(item.getMaterialUnit());
+                inventoryTransaction.setTaskQty(BigDecimal.ZERO);
+                inventoryTransaction.setInventorySts(item.getInventorySts());
+                inventoryTransaction.setCompanyCode(item.getCompanyCode());
+                inventoryTransaction.setReferDetailId(item.getId().toString());
+                inventoryTransaction.setBatch(item.getBatch());
+                inventoryTransaction.setLot(item.getLot());
+                inventoryTransaction.setProjectNo(item.getProjectNo());
+                inventoryTransaction.setWeight(item.getWeight());
+                inventoryTransaction.setManufactureDate(item.getManufactureDate());
+                inventoryTransaction.setExpirationDate(item.getExpirationDate());
+                inventoryTransaction.setAgingDate(item.getCreated());
+                inventoryTransaction.setAttributeId(item.getAttributeId());
+                inventoryTransaction.setAttribute1(item.getAttribute1());
+                inventoryTransaction.setAttribute2(item.getAttribute2());
+                inventoryTransaction.setAttribute3(item.getAttribute3());
+                inventoryTransaction.setCreated(new Date());
+                inventoryTransaction.setCreatedBy(ShiroUtils.getLoginName());
+                //inventoryTransaction.setLockCode();
+                inventoryTransaction.setBillCode(item.getInventoryHeaderId().toString());
+                inventoryTransaction.setBillDetailId(item.getId());
+                inventoryTransaction.setSupplierCode(item.getSupplierCode());
+                inventoryTransactionList.add(inventoryTransaction);
+            }
+            if(inventoryDetails != null && inventoryDetails.size() > 0) {
+                if (inventoryDetailService.saveOrUpdateBatch(inventoryDetails)) {
+                    //更新库存明细成功后,写入库存交易
+                    inventoryTransactionService.saveBatch(inventoryTransactionList);
+                } else {
+                    throw new ServiceException("库存明细更新错误!");
+                }
+            }
+
+        }
+        //更新托盘、库位状态
+        Location temp1 = new Location(); //源库位
+        temp1.setCode(taskDetail.getFromLocation());
+        temp1.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper<Location> lambdaQueryWrapper1 = Wrappers.lambdaQuery(temp1);
+        Location loc1 = locationService.getOne(lambdaQueryWrapper1);
+
+        Location temp2 = new Location();//目的库位
+        temp2.setCode(taskDetail.getToLocation());
+        temp2.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper<Location> lambdaQueryWrapper2 = Wrappers.lambdaQuery(temp2);
+        Location loc2 = locationService.getOne(lambdaQueryWrapper2);
+        loc2.setContainerCode(loc1.getContainerCode());
+        loc2.setStatus("empty");
+        loc1.setContainerCode("");
+        loc1.setStatus("empty");
+        locationService.saveOrUpdate(loc1);
+        locationService.saveOrUpdate(loc2);
+
+        Container container = containerService.findAllByCode(task.getContainerCode());
+        container.setLocationCode(task.getToLocation());
+        if (!containerService.updateById(container)){
+            throw new ServiceException("更新容器失败");
+        }
+
+        //更新taskHeader状态
+        task.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+        task.setLastUpdatedBy(ShiroUtils.getLoginName());
+        task.setLastUpdated(new Date());
+        taskHeaderService.saveOrUpdate(task);
+        //更新taskDetail状态
+        taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+        taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        taskDetail.setLastUpdated(new Date());
+        taskDetailService.saveOrUpdate(taskDetail);
+    }
+
     /**
      * 盘点完成
      *
@@ -578,6 +1129,191 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     }
 
     /**
+     * 完成空托盘入库任务
+     *
+     * @param taskHeader
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void completeEmptyIn(TaskHeader taskHeader) {
+
+        //完成任务,修改主单和明细状态
+        taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+        taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        taskHeader.setLastUpdated(new Date());
+        //taskHeaderService.saveOrUpdate(taskHeader);
+        //taskDetail更新明细单总的状态
+        TaskDetail taskDetail = new TaskDetail();
+        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
+        taskDetail.setTaskType(taskHeader.getTaskType());
+        taskDetail.setTaskId(taskHeader.getId());
+        LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(taskDetail);
+        List<TaskDetail> taskDetailList = taskDetailService.list(lambdaQueryWrapper);//查询子单
+        for (TaskDetail item : taskDetailList) {
+            item.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
+            item.setLastUpdatedBy(ShiroUtils.getLoginName()); //更新用户
+            item.setLastUpdated(new Date());   //更新时间
+        }
+        if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false ||
+                taskHeaderService.saveOrUpdate(taskHeader) == false) {
+            throw new ServiceException("任务单据状态更新失败!");
+        }
+        //解锁容器,更新库位
+        containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(), taskHeader.getToLocation(), "empty");
+        //解锁库位,更新容器
+        locationService.updateContainerCodeAndStatus(taskHeader.getToLocation(), taskHeader.getContainerCode(), "empty");
+
+        //写入库存头表
+        InventoryHeader inventoryHeader = new InventoryHeader();
+        inventoryHeader.setWarehouseCode(taskHeader.getWarehouseCode());
+        inventoryHeader.setLocationCode(taskHeader.getToLocation());
+        inventoryHeader.setContainerCode(taskHeader.getContainerCode());
+        inventoryHeader.setContainerStatus("empty");
+        inventoryHeader.setCompanyCode(taskHeader.getCompanyCode());
+        inventoryHeader.setMaterialSkuQty("0");
+        inventoryHeader.setTotalWeight("0");
+        inventoryHeader.setTotalQty(new BigDecimal(0));
+        inventoryHeader.setTotalLines(0);
+        inventoryHeader.setProjectNos("");
+        inventoryHeader.setBatchs("");
+        inventoryHeader.setLots("");
+        inventoryHeader.setLockRemark("");
+        inventoryHeader.setCreated(new Date());
+        inventoryHeader.setCreatedBy(ShiroUtils.getLoginName());
+        inventoryHeader.setLastUpdated(new Date());
+        inventoryHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        Boolean j = inventoryHeaderService.save(inventoryHeader);
+        if(!j){
+            throw new ServiceException("新增空托库存头失败!");
+
+        }
+    }
+
+    /**
+     * 创建上架任务
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult createReceiptTask(List<Integer> ids) {
+        for (Integer id : ids) {
+            ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getById(id);
+            if (receiptContainerHeader == null) {
+                throw new ServiceException("任务不存在!");
+            }
+
+            if (!receiptContainerHeader.getWarehouseCode().equals(ShiroUtils.getWarehouseCode())) {
+                throw new ServiceException("任务不在当前仓库!");
+            }
+
+            //锁定容器
+            Container container = new Container();
+            container.setStatus("lock");
+            LambdaUpdateWrapper<Container> containerUpdateWrapper = Wrappers.lambdaUpdate();
+            containerUpdateWrapper.eq(Container::getCode, receiptContainerHeader.getContainerCode());
+            containerService.update(container, containerUpdateWrapper);
+
+            //查询入库组盘明细
+            LambdaQueryWrapper<ReceiptContainerDetail> containerDetailLambda = Wrappers.lambdaQuery();
+            containerDetailLambda.eq(ReceiptContainerDetail::getReceiptContainerId, id);
+            List<ReceiptContainerDetail> list = receiptContainerDetailService.list(containerDetailLambda);
+
+            if (list.size() < 1) {
+                throw new ServiceException("没有组盘明细,请先组盘!");
+            }
+            if (receiptContainerHeader.getStatus() == QuantityConstant.RECEIPT_CONTAINER_BUILD.intValue()) {
+                if (receiptContainerHeader.getStatus().intValue() < QuantityConstant.RECEIPT_CONTAINER_TASK) {
+                    receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK.intValue());
+                    receiptContainerHeaderService.updateById(receiptContainerHeader);
+                }
+                //添加任务主表
+                TaskHeader task = new TaskHeader();
+                task.setAllocationHeadId(receiptContainerHeader.getId());
+                task.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHELF);
+                task.setWarehouseCode(receiptContainerHeader.getWarehouseCode());
+                task.setCompanyCode(receiptContainerHeader.getCompanyCode());
+                task.setTaskType(Integer.valueOf(receiptContainerHeader.getTaskType()));
+                task.setFromLocation(receiptContainerHeader.getFromLocation());
+                task.setToLocation(receiptContainerHeader.getToLocation());
+                task.setContainerCode(receiptContainerHeader.getContainerCode());
+                task.setRecvDock(receiptContainerHeader.getRecvDock());
+                task.setCreated(new Date());
+                task.setCreatedBy(ShiroUtils.getLoginName());
+                if (this.save(task)) {
+                    //添加任务明细表
+                    int conatinQty = 0;
+                    for (ReceiptContainerDetail item : list) {
+                        LambdaQueryWrapper<ContainerCapacity> lambdaQueryWrapper = Wrappers.lambdaQuery();
+                        String[] containCodeSplit = task.getContainerCode().split("\\D");
+                        String containType = containCodeSplit[0];
+                        lambdaQueryWrapper.eq(ContainerCapacity::getContainerType, task.getContainerCode())
+                                .eq(ContainerCapacity::getMaterialCode, item.getMaterialCode())
+                                .eq(ContainerCapacity::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                                .eq(ContainerCapacity::getEnable, 0);
+                        ContainerCapacity containerCapacity = containerCapacityService.getOne(lambdaQueryWrapper);
+
+                        TaskDetail taskDetail = new TaskDetail();
+                        taskDetail.setTaskId(task.getId());
+                        taskDetail.setTaskType(Integer.valueOf(receiptContainerHeaderService.getById(item.getReceiptContainerId()).getTaskType()));
+                        taskDetail.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHELF);
+                        taskDetail.setWarehouseCode(task.getWarehouseCode());
+                        taskDetail.setAllocationId(item.getId());
+                        taskDetail.setCompanyCode(task.getCompanyCode());
+                        taskDetail.setCompanyCode(task.getCompanyCode());
+                        taskDetail.setMaterialCode(item.getMaterialCode());
+                        taskDetail.setMaterialName(item.getMaterialName());
+                        taskDetail.setMaterialSpec(item.getMaterialSpec());
+                        taskDetail.setMaterialUnit(item.getMaterialUnit());
+                        taskDetail.setBillCode(item.getReceiptCode());
+                        taskDetail.setBillDetailId(item.getReceiptDetailId());
+                        taskDetail.setBillCode(item.getReceiptCode());
+                        taskDetail.setQty(item.getQty());
+                        taskDetail.setContainerCode(task.getContainerCode());
+                        taskDetail.setFromLocation(task.getFromLocation());
+                        taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+                        taskDetail.setBatch(item.getBatch());
+                        taskDetail.setProjectNo(item.getProjectNo());
+                        if (containerCapacity != null) {
+                            conatinQty += (int) Math.floor(item.getQty().intValue() / containerCapacity.getQty().intValue());
+                            taskDetail.setContainQty((int) Math.floor(item.getQty().intValue() / containerCapacity.getQty().intValue()));
+                        }
+                        if (!taskDetailService.save(taskDetail)) {
+                            throw new ServiceException("生成任务明细失败");
+                        }
+
+                        //更新入库组盘明细状态
+                        item.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
+                        if (!receiptContainerDetailService.updateById(item)) {
+                            throw new ServiceException("更新入库组盘明细状态出错");
+                        }
+
+                        /**
+                         * 修改明细状态为上架
+                         */
+                        ReceiptDetail receiptDetail = receiptDetailService.getById(item.getReceiptDetailId());
+                        receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_SHELF));
+                        if (!receiptDetailService.updateById(receiptDetail)) {
+                            throw new ServiceException("更新入库单详情失败");
+                        }
+                        //更新头表状态
+                        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
+
+                    }
+
+                    task.setContainQty(conatinQty);
+                    if (!taskHeaderService.updateById(task)) {
+                        throw new ServiceException("更新任务头表容器数量失败");
+                    }
+                } else {
+                    throw new ServiceException("生成任务头表失败");
+                }
+            }
+        }
+        return AjaxResult.success("生成上架任务成功");
+    }
+
+    /**
      * 自动空托出库
      * */
     @Override
@@ -604,7 +1340,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         inventoryHeaderService.createEmptyOut(container.getCode(), location.getCode());
         return AjaxResult.success("空容器出库任务已下发!",container.getCode());
     }
-
+    
     /**
      * 自动分配库位
      * @param taskId  任务号
@@ -621,11 +1357,26 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         if (StringUtils.isNotEmpty(taskHeader.getToLocation())) {
             return AjaxResult.success("任务已经有目的库位,不需要再分配");
         }
+//        Location location = new Location();
+//        location.setWarehouseCode(ShiroUtils.getWarehouseCode());
+//
+//        location.setContainerCode("");
+//        location.setStatus("empty");
+//        location.setDeleted(false);
+//        if("M".equals(taskHeader.getContainerCode().substring(0,1))){
+//            if (high.intValue() == 1) {
+//                location.setILayer(5);
+//            }
+//        }
         LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
         locationLambdaQueryWrapper.eq(Location::getWarehouseCode,ShiroUtils.getWarehouseCode())
                 .eq(Location::getContainerCode,"")
                 .eq(Location::getStatus,"empty")
                 .eq(Location::getDeleted,false);
+//        location = locationService.getOne(locationLambdaQueryWrapper);
+//        if (location == null) {
+//            throw new ServiceException("没有对应库位可以分配给容器了!");
+//        }
         List<Location> locations = locationService.list(locationLambdaQueryWrapper);
         if (locations.size() == 0) {
             throw new ServiceException("没有空闲库位!");
@@ -639,6 +1390,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         //锁定库位
         locationService.updateStatus(location.getCode(),"lock");
         //给组盘分配库位
+
         int internalTaskType = taskHeader.getInternalTaskType();
         if(internalTaskType == QuantityConstant.TASK_TYPE_WHOLERECEIPT.intValue() || internalTaskType == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT.intValue() ) {
             ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
@@ -651,14 +1403,10 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             condition.setWarehouseCode(ShiroUtils.getWarehouseCode());
             condition.setTaskId(taskHeader.getId());
             LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery(condition);
-            List<TaskDetail> taskDetailList = taskDetailService.list(taskDetailLambdaQueryWrapper);
-            if(taskDetailList != null && taskDetailList.size() > 0) {
-                for(TaskDetail taskDetail : taskDetailList) {
-                    if (taskDetail != null) {
-                        taskDetail.setToLocation(location.getCode());
-                        taskDetailService.update(taskDetail, taskDetailLambdaQueryWrapper);
-                    }
-                }
+            TaskDetail taskDetail = taskDetailService.getOne(taskDetailLambdaQueryWrapper);
+            if (taskDetail != null) {
+                taskDetail.setToLocation(location.getCode());
+                taskDetailService.update(taskDetail, taskDetailLambdaQueryWrapper);
             }
         }
         //给任务分配库位
@@ -669,4 +1417,9 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
 
     }
 
+
+
+
+
+
 }
\ No newline at end of file
diff --git a/src/main/resources/application-druid.properties b/src/main/resources/application-druid.properties
index 419aee0..6446e93 100644
--- a/src/main/resources/application-druid.properties
+++ b/src/main/resources/application-druid.properties
@@ -4,12 +4,12 @@ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
 # ����
 spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/wms_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2b8
 #spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/huahengExample?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
-#spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/wms_v2?characterEncoding=utf8&serverTimezone=GMT%2b8
+#spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/wms2?characterEncoding=utf8&serverTimezone=GMT%2b8
 
 spring.datasource.druid.master.username=softhuaheng
 spring.datasource.druid.master.password=HHrobot123.
 #spring.datasource.druid.master.username=root
-#spring.datasource.druid.master.password=123456
+#spring.datasource.druid.master.password=hhsoftware
 # �ӿ�
 spring.datasource.druid.slave.open = false
 spring.datasource.druid.slave.url=jdbc:mysql://199.19.109.117:3306/wms_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
diff --git a/src/main/resources/templates/shipment/shipmentContainerHeader/shipmentContainerHeader.html b/src/main/resources/templates/shipment/shipmentContainerHeader/shipmentContainerHeader.html
index abde545..a2612b6 100644
--- a/src/main/resources/templates/shipment/shipmentContainerHeader/shipmentContainerHeader.html
+++ b/src/main/resources/templates/shipment/shipmentContainerHeader/shipmentContainerHeader.html
@@ -147,6 +147,10 @@
                 //     },sortable:true
                 // },
 				{
+					field : 'stationCode',
+					title : '出库站台'
+				},
+				{
 					field : 'status', 
 					title : '容器任务状态' ,
                     formatter: function(value, row, index) {
diff --git a/src/main/resources/templates/shipment/shipmentDetail/add.html b/src/main/resources/templates/shipment/shipmentDetail/add.html
index 3705f0b..5fc50e5 100644
--- a/src/main/resources/templates/shipment/shipmentDetail/add.html
+++ b/src/main/resources/templates/shipment/shipmentDetail/add.html
@@ -46,6 +46,12 @@
 			</div>
 		</div>
 		<div class="form-group">
+			<label class="col-sm-3 control-label">出库站台:</label>
+			<div class="col-sm-8">
+				<select id="stationCode" name="stationCode" class="form-control"></select>
+			</div>
+		</div>
+		<div class="form-group">
 			<label class="col-sm-3 control-label">批次:</label>
 			<div class="col-sm-8">
 				<input id="batch" name="batch" class="form-control" type="text">
@@ -198,6 +204,19 @@
 					}
 				}
 			});
+            $('#stationCode').select2({
+                ajax: {
+                    url: ctx+'config/station/getData',
+                    dataType: 'json',
+                    type: 'post',
+                    data: function (params) {
+                        let query = {
+                            code: params.term,
+                        }
+                        return query;
+                    }
+                }
+            });
         })
 	</script>
 </body>
diff --git a/src/main/resources/templates/shipment/shipmentHeader/shipmentHeader.html b/src/main/resources/templates/shipment/shipmentHeader/shipmentHeader.html
index c5dee3a..2a26b26 100644
--- a/src/main/resources/templates/shipment/shipmentHeader/shipmentHeader.html
+++ b/src/main/resources/templates/shipment/shipmentHeader/shipmentHeader.html
@@ -476,6 +476,10 @@
                     },
                 },
                 {
+                    field: 'stationCode',
+                    title: '出库站台',
+                },
+                {
                     field: 'shipQty',
                     title: '发货数量'
                 },
diff --git a/src/main/resources/templates/task/taskHeader/taskHeader.html b/src/main/resources/templates/task/taskHeader/taskHeader.html
index 074c824..943f5cd 100644
--- a/src/main/resources/templates/task/taskHeader/taskHeader.html
+++ b/src/main/resources/templates/task/taskHeader/taskHeader.html
@@ -214,6 +214,10 @@
 						field : 'weight',
 						title : '重量'
 					},
+                    {
+                        field : 'stationCode',
+                        title : '站台'
+                    },
 					{
 						field : 'exceptionCode',
 						title : '异常原因',