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 e689b9d..ebdb1aa 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
@@ -21,6 +21,8 @@ import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
 import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
 import com.huaheng.pc.shipment.shippingCombination.domain.ShippingSearch;
 import com.huaheng.pc.shipment.shippingCombination.service.ShippingCombinationService;
+import com.huaheng.pc.shipment.wave.domain.Wave;
+import com.huaheng.pc.shipment.wave.service.WaveService;
 import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
 import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
 import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
@@ -63,6 +65,8 @@ public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentCont
     private TaskHeaderService taskHeaderService;
     @Autowired
     private TaskDetailService taskDetailService;
+    @Autowired
+    private WaveService waveService;
 
 
     @Override
@@ -249,6 +253,7 @@ public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentCont
             shipmentContainerDetail.setMaterialSpec(material.getSpec());
             shipmentContainerDetail.setQty(shipmentCombinationModel.getShipQty());
             shipmentContainerDetail.setCreated(null);
+            shipmentContainerDetail.setWaveId(shipmentDetail.getWaveId());
             shipmentContainerDetail.setCreatedBy(ShiroUtils.getLoginName());
             shipmentContainerDetailService.save(shipmentContainerDetail);
         }
@@ -418,6 +423,9 @@ public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentCont
 
             List<InventoryDetail> inventoryList = shippingCombinationService.getInventorys(item);
             if(inventoryList.size() < 1 && item.getWaveId() != 0){
+                Wave wave = waveService.getById(item.getWaveId());
+                wave.setStatus(999);
+                waveService.updateById(wave);
                 return AjaxResult.error("主单为"+item.getShipmentCode()+"子单id为"+item.getId() + "的单据没有库存,波次失败");
             }
             if (inventoryList.size() < 1) {
diff --git a/src/main/java/com/huaheng/pc/shipment/shipmentDetail/service/ShipmentDetailServiceImpl.java b/src/main/java/com/huaheng/pc/shipment/shipmentDetail/service/ShipmentDetailServiceImpl.java
index fee6620..ec62ba5 100644
--- a/src/main/java/com/huaheng/pc/shipment/shipmentDetail/service/ShipmentDetailServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/shipment/shipmentDetail/service/ShipmentDetailServiceImpl.java
@@ -191,8 +191,10 @@ public class ShipmentDetailServiceImpl extends ServiceImpl<ShipmentDetailMapper,
                 if (shipmentDetail.getWaveId() != 0) {
                     throw new ServiceException("主单id为" + id + "子单id为" + shipmentDetail.getId() + "的子单已加入波次,不可再加入波次");
                 }
-                shipmentDetailList.add(shipmentDetail);
-                qty=qty.add(shipmentDetail.getShipQty());
+                if(shipmentDetail.getShipQty().compareTo(shipmentDetail.getRequestQty())!=0) {
+                    shipmentDetailList.add(shipmentDetail);
+                    qty = qty.add(shipmentDetail.getShipQty().subtract(shipmentDetail.getRequestQty()));
+                }
             }
         }
 
@@ -236,7 +238,9 @@ public class ShipmentDetailServiceImpl extends ServiceImpl<ShipmentDetailMapper,
         //修改出库子单,加入波次ID,并修改状态为波次
         for(ShipmentDetail shipmentDetail :shipmentDetailList){
             shipmentDetail.setWaveId(wave.getId());
-            shipmentDetail.setStatus(200);
+            if(shipmentDetail.getStatus()<200) {
+                shipmentDetail.setStatus(200);
+            }
         }
 
         flag = this.updateBatchById(shipmentDetailList);
@@ -248,7 +252,6 @@ public class ShipmentDetailServiceImpl extends ServiceImpl<ShipmentDetailMapper,
         //修改主单状态
         for (Integer id : Convert.toIntArray(ids)){
             ShipmentHeader shipmentHeader = shipmentHeaderService.getById(id);
-            shipmentHeader.setFirstStatus(200);
             shipmentHeader.setLastStatus(200);
             shipmentHeaderList.add(shipmentHeader);
         }
diff --git a/src/main/java/com/huaheng/pc/shipment/wave/controller/WaveController.java b/src/main/java/com/huaheng/pc/shipment/wave/controller/WaveController.java
index 22c9dd0..630f5f8 100644
--- a/src/main/java/com/huaheng/pc/shipment/wave/controller/WaveController.java
+++ b/src/main/java/com/huaheng/pc/shipment/wave/controller/WaveController.java
@@ -175,10 +175,10 @@ public class WaveController extends BaseController {
 
 
     /**
-     * 开始波次
+     * 释放
      */
     @RequiresPermissions("shipment:wave:freed")
-    @Log(title = "出库-波次", operating = "开始波次", action = BusinessType.UPDATE)
+    @Log(title = "出库-波次", operating = "波次释放", action = BusinessType.UPDATE)
     @PostMapping("/freed")
     @ResponseBody
     public AjaxResult freed(String ids) {
diff --git a/src/main/java/com/huaheng/pc/shipment/wave/service/WaveService.java b/src/main/java/com/huaheng/pc/shipment/wave/service/WaveService.java
index 67d171f..2968a98 100644
--- a/src/main/java/com/huaheng/pc/shipment/wave/service/WaveService.java
+++ b/src/main/java/com/huaheng/pc/shipment/wave/service/WaveService.java
@@ -10,14 +10,20 @@ import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
 import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
 import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
+import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
+import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
 import com.huaheng.pc.shipment.wave.domain.Wave;
 import com.huaheng.pc.shipment.wave.mapper.WaveMapper;
+import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
+import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 
 @Service
@@ -28,6 +34,12 @@ public class WaveService extends ServiceImpl<WaveMapper, Wave> {
     private ShipmentDetailService shipmentDetailService;
     @Autowired
     private ShipmentContainerHeaderService shipmentContainerHeaderService;
+    @Autowired
+    private TaskDetailService taskDetailService;
+    @Autowired
+    private TaskHeaderService taskHeaderService;
+    @Autowired
+    private ShipmentHeaderService shipmentHeaderService;
 
     /**
      * 开始波次,对带有此波次号的单据进行后续的后台操作
@@ -44,14 +56,14 @@ public class WaveService extends ServiceImpl<WaveMapper, Wave> {
         List<ShipmentDetail> list = new ArrayList<>();
         for (Integer id : Convert.toIntArray(ids)) {
 
-            //查看此波次的状态,状态不为o时,无法开始波次
+            //1、查看此波次的状态,状态不为o时,无法开始波次
             Wave wave = this.getById(id);
             if(wave == null || wave.getStatus() != 0){
                 return AjaxResult.error("id为"+id+"的波次找不到,或者状态不能做开始操作");
             }
             waves.add(wave);
 
-            //找到此波次的单据
+            //2、找到此波次的单据
             LambdaQueryWrapper<ShipmentDetail> lam = Wrappers.lambdaQuery();
             lam.eq(ShipmentDetail::getWaveId,id)
                 .eq(ShipmentDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
@@ -63,15 +75,16 @@ public class WaveService extends ServiceImpl<WaveMapper, Wave> {
             }
         }
 
-        //自动组盘
+        //3、自动组盘
         AjaxResult ajaxResult=shipmentContainerHeaderService.autoCombination(list);
         if(ajaxResult.getData() != null){
-            //生成任务
+            //4、生成任务
             shipmentContainerHeaderService.createTask(Arrays.asList(Convert.toIntArray(ajaxResult.getData().toString())));
         }
 
+        //5、修改波次的状态
         for(Wave wave : waves){
-            wave.setStatus(400);
+            wave.setStatus(300);
             wave.setCurrentWaveStep("生成任务");
         }
         Boolean flag = this.updateBatchById(waves);
@@ -84,12 +97,85 @@ public class WaveService extends ServiceImpl<WaveMapper, Wave> {
 
     /**
      * 释放波次,执行任务
+     * 1、查看此波次的状态,是否可以释放波次
+     * 2、查看波次的状态,是成功释放还是失败释放
+     * 成功释放:1、找到此波次的所有子任务
+     *          2、根据子任务选出主任务
+     *          3、将这些主任务执行
+     *  失败释放:1.找到次波次的所有子单据
+     *             2.修改子单据的波次为0
+     *             3.修改主子单的状态
      * @param ids
      * @return
      */
     @Transactional
     public AjaxResult freed(String ids) {
+        Boolean flag = false;
+        List<TaskDetail> taskDetailList = new ArrayList<>();
+        for (Integer id : Convert.toIntArray(ids)) {
+
+            //1、查看此波次是否可以释放
+            Wave wave = this.getById(id);
+            if(wave == null || (wave.getStatus()!=300 && wave.getStatus()!=999)){
+                return AjaxResult.error(id+"波次不可释放");
+            }
+
+            //2、查看此波次的状态,看是成功释放还是失败释放
+            if(wave.getStatus() == 300) {
+                //成功释放——找到此波次的未执行的子任务列表
+                LambdaQueryWrapper<TaskDetail> lam = Wrappers.lambdaQuery();
+                lam.eq(TaskDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                        .eq(TaskDetail::getStatus, 0)
+                        .eq(TaskDetail::getWaveId, id);
+                List<TaskDetail> taskDetails = taskDetailService.list(lam);
+                if (taskDetails != null) {
+                    taskDetailList.addAll(taskDetails);
+                }
+            }else {
+                //失败释放——找到次波次的所有子单据
+                LambdaQueryWrapper<ShipmentDetail> detailLam = Wrappers.lambdaQuery();
+                detailLam.eq(ShipmentDetail::getWarehouseCode,ShiroUtils.getWarehouseCode())
+                        .eq(ShipmentDetail::getWaveId,wave.getId());
+                List<ShipmentDetail> shipmentDetails =shipmentDetailService.list(detailLam);
+
+                //2.修改子单据的波次为0
+                //3.修改主子单的状态
+                HashSet<Integer> set = new HashSet<>();
+                for(ShipmentDetail item : shipmentDetails){
+                    if(item.getShipQty().compareTo(item.getRequestQty())!=0) {
+                        item.setStatus(0);
+                    }
+                    item.setWaveId(0);
+                    set.add(item.getShipmentId());
+                }
+                flag = shipmentDetailService.updateBatchById(shipmentDetails);
+                if(flag == false){
+                    throw new ServiceException("修改出库子单状态失败");
+                }
+                for(Integer shipmentId :set){
+                    ShipmentHeader shipmentHeader = shipmentHeaderService.getById(shipmentId);
+                    if(shipmentHeader == null){
+                        throw  new ServiceException("没有对应的出库主单");
+                    }
+                    if(shipmentHeader.getFirstStatus()<= 200) {
+                        shipmentHeader.setFirstStatus(0);
+                        flag = shipmentHeaderService.updateById(shipmentHeader);
+                        if (flag == false) {
+                            throw new ServiceException("修改出库主单失败");
+                        }
+                    }
+                }
+            }
+        }
+
+        HashSet<Integer> idSet = new HashSet();
+        //成功释放——遍历子任务列表,找出主单(distinct)id
+        for(TaskDetail item : taskDetailList){
+            idSet.add(item.getTaskId());
+        }
+        //成功释放——将这些主任务执行
+        taskHeaderService.sendTaskToWcs(idSet.toArray(new Integer[idSet.size()]));
 
-        return null;
+        return AjaxResult.success("波次释放成功");
     }
 }
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 59a21d0..0445d0d 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
@@ -296,6 +296,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             taskDetail.setFromLocation(task.getFromLocation());
             taskDetail.setToLocation(task.getToLocation());
             taskDetail.setStatus(0);
+            taskDetail.setWaveId(shipmentContainerDetail.getWaveId());
             taskDetail.setInventorySts(shipmentContainerDetail.getInventorySts());
             taskDetail.setTaskType(task.getTaskType());
             taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());