diff --git a/src/main/java/com/huaheng/pc/check/checkDetail/controller/CheckDetailController.java b/src/main/java/com/huaheng/pc/check/checkDetail/controller/CheckDetailController.java
new file mode 100644
index 0000000..e705de3
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/check/checkDetail/controller/CheckDetailController.java
@@ -0,0 +1,156 @@
+package com.huaheng.pc.check.checkDetail.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaheng.common.support.Convert;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.controller.BaseController;
+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.check.checkDetail.domain.CheckDetail;
+import com.huaheng.pc.check.checkDetail.service.CheckDetailService;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.models.auth.In;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by mahuandong Cotter on 2019/9/8.
+ */
+@Controller
+@RequestMapping("/check/checkDetail")
+public class CheckDetailController extends BaseController {
+
+    @Resource
+    private CheckDetailService checkDetailService;
+
+    private String prefix = "check/checkDetail";
+
+    @RequiresPermissions("check:checkDetail:view")
+    @GetMapping("/{id}")
+    public String checkingRegister(@PathVariable("id")Integer id, ModelMap modelMap) {
+        modelMap.put("id",id);
+        return prefix + "/checkDetail";
+    }
+
+    /**
+     * 查询质检详情
+     */
+    @ApiOperation(value="查看质检详情", notes="根据详情表id获取质检详情", httpMethod = "POST")
+    @RequiresPermissions("check:checkDetail:list")
+    @Log(title = "质检-质检详情", operating = "查看质检详情", action = BusinessType.GRANT)
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(@ApiParam(name="receiptDetail",value="入库详情")Integer checkHeaderId) {
+        LambdaQueryWrapper<CheckDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+        lambdaQueryWrapper.eq(CheckDetail::getCheckHeaderId, checkHeaderId);
+
+        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){
+            /*使用分页查询*/
+            Page<CheckDetail> page = new Page<>(pageNum, pageSize);
+            IPage<CheckDetail> iPage = checkDetailService.page(page, lambdaQueryWrapper);
+            return getMpDataTable(iPage.getRecords(), iPage.getTotal());
+        } else {
+            List<CheckDetail> list = checkDetailService.list(lambdaQueryWrapper);
+            return getDataTable(list);
+        }
+    }
+
+    /**
+     * 新增质检详情
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存质检详情
+     */
+    @ApiOperation(value="新增质检详情 ", notes="新增质检详情 ", httpMethod = "POST")
+    @RequiresPermissions("check:checkDetail:add")
+    @Log(title = "质检-质检详情 ",operating = "新增质检详情 ", action = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(CheckDetail checkDetail) {
+        return toAjax(checkDetailService.save(checkDetail));
+    }
+
+    /**
+     * 修改质检详情
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
+        CheckDetail checkDetail = checkDetailService.getById(id);
+        mmap.put("checkDetail", checkDetail);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存质检详情
+     */
+    @ApiOperation(value="修改质检详情", notes="修改质检详情", httpMethod = "POST")
+    @RequiresPermissions("check:checkDetail:edit")
+    @Log(title = "质检-质检详情 ",operating = "修改质检详情 ", action = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(CheckDetail checkDetail) {
+        checkDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(checkDetailService.updateById(checkDetail));
+    }
+    
+    @ApiOperation(value="删除质检详情", notes="删除质检详情", httpMethod = "POST")
+    @RequiresPermissions("check:checkDetail:remove")
+    @Log(title = "质检-质检详情 ",operating = "质检详情删除", action = BusinessType.DELETE)
+    @PostMapping("remove")
+    public AjaxResult remove(String ids) {
+        if (StringUtils.isEmpty(ids)){
+            return AjaxResult.error("id不能为空");
+        }
+
+        List<Integer> idList = Arrays.asList(Convert.toIntArray(ids));
+        return toAjax(checkDetailService.removeByIds(idList));
+    }
+
+    /**
+     * 完成质检
+     */
+    @GetMapping("complete/{id}")
+    public String complete(@PathVariable("id") Integer id, ModelMap mmap) {
+        mmap.put("checkDetailId", id);
+        return prefix + "/checkComplete";
+    }
+
+    /**
+     * 保存质检完成
+     * @param inventorySts 库存状态
+     * @param qty 数量
+     * @return AjaxResult
+     */
+    @ApiOperation(value="完成质检详情", notes="完成质检详情", httpMethod = "POST")
+    @RequiresPermissions("check:checkDetail:complete")
+    @Log(title = "质检-质检详情 ",operating = "质检详情删除", action = BusinessType.DELETE)
+    @PostMapping("/complete")
+    public AjaxResult complete(@ApiParam(name="质检明细id",value="id")Integer id,
+                               @ApiParam(name="库存状态",value="inventorySts",example="good,bad")String inventorySts,
+                               @ApiParam(name = "数量",value = "qty",example = "10,20") String qty) {
+        return checkDetailService.complete(id, inventorySts, qty);
+    }
+}
diff --git a/src/main/java/com/huaheng/pc/check/checkDetail/domain/CheckDetail.java b/src/main/java/com/huaheng/pc/check/checkDetail/domain/CheckDetail.java
index aafd6bf..51925d2 100644
--- a/src/main/java/com/huaheng/pc/check/checkDetail/domain/CheckDetail.java
+++ b/src/main/java/com/huaheng/pc/check/checkDetail/domain/CheckDetail.java
@@ -116,8 +116,11 @@ public class CheckDetail implements Serializable {
     @ApiModelProperty(value="物料规格")
     private String materialSpec;
 
+    /**
+     * 物料单位
+     */
     @TableField(value = "materialUnit")
-    @ApiModelProperty(value="null")
+    @ApiModelProperty(value="物料单位")
     private String materialUnit;
 
     /**
diff --git a/src/main/java/com/huaheng/pc/check/checkDetail/service/CheckDetailService.java b/src/main/java/com/huaheng/pc/check/checkDetail/service/CheckDetailService.java
index 3a08afa..b525227 100644
--- a/src/main/java/com/huaheng/pc/check/checkDetail/service/CheckDetailService.java
+++ b/src/main/java/com/huaheng/pc/check/checkDetail/service/CheckDetailService.java
@@ -1,12 +1,102 @@
 package com.huaheng.pc.check.checkDetail.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.common.exception.service.ServiceException;
+import com.huaheng.common.support.Convert;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
+import com.huaheng.pc.check.checkHeader.service.CheckHeaderService;
+import com.huaheng.pc.check.checkingRegister.domain.CheckingRegister;
+import com.huaheng.pc.check.checkingRegister.service.CheckingRegisterService;
+import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.huaheng.pc.check.checkDetail.mapper.CheckDetailMapper;
 import com.huaheng.pc.check.checkDetail.domain.CheckDetail;
+import org.springframework.transaction.annotation.Transactional;
+
 @Service
 public class CheckDetailService extends ServiceImpl<CheckDetailMapper, CheckDetail> {
 
+    @Resource
+    private CheckingRegisterService checkingRegisterService;
+    @Resource
+    private CheckHeaderService checkHeaderService;
+
+    /**
+     * 质检完成
+     * @param id 质检明细id
+     * @param inventorySts 库存状态 good,
+     * @param qty 数量 10,20
+     * @return AjaxResult
+     */
+    @Transactional
+    public AjaxResult complete(Integer id, String inventorySts, String qty){
+
+        //将库存状态、数量字符串转为List
+        List<String> inventoryStsList = Arrays.asList(Convert.toStrArray(inventorySts));
+        List<Integer> qtyList = Arrays.asList(Convert.toIntArray(qty));
+        CheckDetail checkDetail = this.getById(id);
+
+        //
+        int sum = 0;
+        for (Integer quantity : qtyList) {
+            sum += quantity;
+        }
+        if (checkDetail.getQty() == sum) {
+            AjaxResult.error("质检登记数量和质检明细系统数量核对错误");
+        }
+        checkDetail.setStatus("20");
+        if ( !this.updateById(checkDetail)){
+            throw new ServiceException("更新质检明细表错误");
+        }
+        CheckingRegister checkingRegister = new CheckingRegister();
+        checkingRegister.setCheckDetailId(checkDetail.getId());
+        checkingRegister.setCheckHeaderId(checkDetail.getCheckHeaderId());
+        checkingRegister.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        checkingRegister.setCheckCode(checkDetail.getCheckCode());
+        checkingRegister.setReceiptDetailId(checkDetail.getReceiptDetailId());
+        checkingRegister.setReceiptCode(checkDetail.getReceiptCode());
+        checkingRegister.setReferCode(checkDetail.getReferCode());
+        checkingRegister.setReferLineId(checkDetail.getReferLineId());
+        checkingRegister.setReferPlatform(checkDetail.getReferPlatform());
+        checkingRegister.setMaterialCode(checkDetail.getMaterialCode());
+        checkingRegister.setMaterialName(checkDetail.getMaterialName());
+        checkingRegister.setMaterialSpec(checkDetail.getMaterialSpec());
+        checkingRegister.setMaterialUnit(checkDetail.getMaterialUnit());
+        checkingRegister.setCompanyCode(checkDetail.getCompanyCode());
+        checkingRegister.setCheckBy(ShiroUtils.getLoginName());
+        checkingRegister.setCheckAt(new Date());
+        checkingRegister.setCreatedBy(ShiroUtils.getLoginName());
+        checkingRegister.setLastUpdatedBy(ShiroUtils.getLoginName());
+
+        for (int i = 0; i<inventoryStsList.size(); i++){
+            checkingRegister.setInventorySts(inventoryStsList.get(i));
+            checkingRegister.setQty(qtyList.get(0));
+            if ( !checkingRegisterService.save(checkingRegister)){
+                throw new ServiceException("生成质检报告失败");
+            }
+        }
+
+        LambdaQueryWrapper<CheckDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(CheckDetail::getCheckHeaderId, checkDetail.getCheckHeaderId())
+                        .ne(CheckDetail::getStatus, 20);
+        List<CheckDetail> checkDetails = this.list(lambdaQueryWrapper);
+
+        //如果改质检单的全部明细都完成质检则更新质检头表状态
+        if (checkDetails == null){
+            CheckHeader checkHeader = new CheckHeader();
+            checkHeader.setId(checkDetail.getCheckHeaderId());
+            checkHeader.setStatus("20");
+            checkHeaderService.updateById(checkHeader);
+        }
+        return AjaxResult.success("质检完成");
+    }
 }
diff --git a/src/main/java/com/huaheng/pc/check/checkHeader/controller/CheckHeaderController.java b/src/main/java/com/huaheng/pc/check/checkHeader/controller/CheckHeaderController.java
new file mode 100644
index 0000000..322e389
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/check/checkHeader/controller/CheckHeaderController.java
@@ -0,0 +1,143 @@
+package com.huaheng.pc.check.checkHeader.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaheng.common.support.Convert;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.controller.BaseController;
+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.check.checkHeader.domain.CheckHeader;
+import com.huaheng.pc.check.checkHeader.service.CheckHeaderService;
+import com.huaheng.pc.check.checkingRegister.domain.CheckingRegister;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by mahuandong Cotter on 2019/9/6.
+ */
+@Api(tags="质检单")
+@Controller
+@RequestMapping("/check/checkHeader")
+public class CheckHeaderController extends BaseController {
+
+    @Resource
+    private CheckHeaderService checkHeaderService;
+
+    private String prefix = "check/checkHeader";
+
+    @RequiresPermissions("check:checkHeader:view")
+    @GetMapping("{type}")
+    public String checkingRegister(@PathVariable("type")String type, ModelMap modelMap) {
+        modelMap.put("type", type);
+        return prefix + "/checkHeader";
+    }
+
+    /**
+     * 查询质检头
+     */
+    @RequiresPermissions("check:checkHeader:list")
+    @Log(title = "质检-质检头表", operating = "查看质检头表", action = BusinessType.GRANT)
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(@ApiParam(name="checkHeader",value="质检头表") CheckHeader checkHeader,
+                              @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
+                              @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) {
+        LambdaQueryWrapper<CheckHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+
+        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), CheckHeader::getCreated, createdBegin)
+                .le(StringUtils.isNotEmpty(createdEnd), CheckHeader::getCreated, createdEnd)
+                .eq(CheckHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(StringUtils.isNotNull(checkHeader.getCode()), CheckHeader::getCode, checkHeader.getCode())
+                .eq(StringUtils.isNotEmpty(checkHeader.getReferCode()), CheckHeader::getReferCode, checkHeader.getReferCode())
+                .eq(StringUtils.isNotEmpty(checkHeader.getStatus()), CheckHeader::getStatus, checkHeader.getStatus())
+                .in(StringUtils.isNotEmpty(checkHeader.getType()), CheckHeader::getType, checkHeader.getType());
+
+        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){
+            // 使用分页查询
+            Page<CheckHeader> page = new Page<>(pageNum, pageSize);
+            IPage<CheckHeader> iPage = checkHeaderService.page(page, lambdaQueryWrapper);
+            return getMpDataTable(iPage.getRecords(), iPage.getTotal());
+        } else {
+            List<CheckHeader> list = checkHeaderService.list(lambdaQueryWrapper);
+            return getDataTable(list);
+        }
+    }
+
+    /**
+     * 新增质检头表
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存质检头
+     */
+    @ApiOperation(value="新增质检头 ", notes="新增质检头 ", httpMethod = "POST")
+    @RequiresPermissions("check:checkHeader:add")
+    @Log(title = "质检-质检头 ",operating = "新增质检头 ", action = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(CheckHeader checkHeader) {
+        return toAjax(checkHeaderService.save(checkHeader));
+    }
+
+    /**
+     * 修改质检头表
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
+        CheckHeader checkHeader = checkHeaderService.getById(id);
+        mmap.put("checkHeader", checkHeader);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存质检表
+     */
+    @ApiOperation(value="修改质检头", notes="修改质检头", httpMethod = "POST")
+    @RequiresPermissions("check:checkHeader:edit")
+    @Log(title = "质检-质检头 ",operating = "修改质检头 ", action = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(CheckHeader checkHeader) {
+        checkHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(checkHeaderService.updateById(checkHeader));
+    }
+
+    /**
+     * 删除质检头
+     */
+    @ApiOperation(value="删除质检头", notes="删除质检头", httpMethod = "POST")
+    @RequiresPermissions("check:checkHeader:remove")
+    @Log(title = "质检-质检头 ",operating = "质检头删除", action = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(@ApiParam(name = "id", value = "质检头表id字符串")String ids){
+        if (StringUtils.isNull(ids)){
+            return AjaxResult.error("id为空");
+        }
+        return toAjax(checkHeaderService.removeByIds(Arrays.asList(Convert.toIntArray(ids))));
+    }
+}
diff --git a/src/main/java/com/huaheng/pc/check/checkHeader/mapper/CheckHeaderMapper.java b/src/main/java/com/huaheng/pc/check/checkHeader/mapper/CheckHeaderMapper.java
index 11c32ad..488e43f 100644
--- a/src/main/java/com/huaheng/pc/check/checkHeader/mapper/CheckHeaderMapper.java
+++ b/src/main/java/com/huaheng/pc/check/checkHeader/mapper/CheckHeaderMapper.java
@@ -4,4 +4,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
 
 public interface CheckHeaderMapper extends BaseMapper<CheckHeader> {
+
+    /**
+     *  生成质检单编码
+     * @return
+     */
+    String createCode(String checkType);
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/check/checkHeader/service/CheckHeaderService.java b/src/main/java/com/huaheng/pc/check/checkHeader/service/CheckHeaderService.java
index 2cf279f..30e2182 100644
--- a/src/main/java/com/huaheng/pc/check/checkHeader/service/CheckHeaderService.java
+++ b/src/main/java/com/huaheng/pc/check/checkHeader/service/CheckHeaderService.java
@@ -2,11 +2,34 @@ package com.huaheng.pc.check.checkHeader.service;
 
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
 import com.huaheng.pc.check.checkHeader.mapper.CheckHeaderMapper;
 @Service
 public class CheckHeaderService extends ServiceImpl<CheckHeaderMapper, CheckHeader> {
 
+    @Resource
+    private CheckHeaderMapper checkHeaderMapper;
+
+    //根据单据类型建单据号
+    public String createCode(String checkType)
+    {
+        String code = null;
+        Date now = new Date();
+        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
+        String maxCode = checkHeaderMapper.createCode(checkType);
+        if (maxCode != null && maxCode.length() > 13 && maxCode.substring(maxCode.length() - 13, maxCode.length() - 5).equals(df.format(now)))
+        {
+            Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 5, maxCode.length()));
+            code = checkType + df.format(now) + String.format("%05d", Count + 1);
+        }
+        else
+        {
+            code = checkType + df.format(now) + "00001";
+        }
+        return code;
+    }
+
 }
diff --git a/src/main/java/com/huaheng/pc/check/checkingRegister/controller/CheckingRegisterController.java b/src/main/java/com/huaheng/pc/check/checkingRegister/controller/CheckingRegisterController.java
new file mode 100644
index 0000000..37aa6d5
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/check/checkingRegister/controller/CheckingRegisterController.java
@@ -0,0 +1,163 @@
+package com.huaheng.pc.check.checkingRegister.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.databind.ser.Serializers;
+import com.huaheng.common.support.Convert;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.controller.BaseController;
+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.check.checkingRegister.domain.CheckingRegister;
+import com.huaheng.pc.check.checkingRegister.service.CheckingRegisterService;
+import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 质检报告
+ * Created by mahuandong Cotter on 2019/9/6.
+ */
+@Api(tags = "质检报告")
+@Controller
+@RequestMapping("/check/checkingRegister")
+public class CheckingRegisterController extends BaseController {
+
+    @Resource
+    private CheckingRegisterService checkingRegisterService;
+
+    private String prefix = "check/checkingRegister";
+
+    @RequiresPermissions("check:checkingRegister:view")
+    @GetMapping()
+    public String checkingRegister()
+    {
+        return prefix + "/checkingRegister";
+    }
+
+    /**
+     * 查询质检报告
+     */
+    @RequiresPermissions("check:checkingRegister:list")
+    @Log(title = "质检-质检报告头表", operating = "查看质检报告列表", action = BusinessType.GRANT)
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(@ApiParam(name="receiptDetail",value="质检头表") CheckingRegister checkingRegister,
+                              @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
+                              @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) {
+        LambdaQueryWrapper<CheckingRegister> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+
+        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), CheckingRegister::getCreated, createdBegin)
+                .le(StringUtils.isNotEmpty(createdEnd), CheckingRegister::getCreated, createdEnd)
+                .in(CheckingRegister::getCompanyCode, ShiroUtils.getCompanyCodeList())
+                .eq(CheckingRegister::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(StringUtils.isNotNull(checkingRegister.getReceiptDetailId()),
+                        CheckingRegister::getReceiptDetailId, checkingRegister.getReceiptDetailId())
+                .eq(StringUtils.isNotEmpty(checkingRegister.getReceiptCode()),
+                        CheckingRegister::getReceiptCode, checkingRegister.getReceiptCode())
+                .eq(StringUtils.isNotEmpty(checkingRegister.getReferCode()),
+                        CheckingRegister::getReceiptCode, checkingRegister.getReceiptCode())
+                .eq(StringUtils.isNotNull(checkingRegister.getReferLineId()),
+                        CheckingRegister::getReferLineId, checkingRegister.getReferLineId())
+                .eq(StringUtils.isNotEmpty(checkingRegister.getReferPlatform()),
+                        CheckingRegister::getReferPlatform, checkingRegister.getReferPlatform())
+                .eq(StringUtils.isNotEmpty(checkingRegister.getMaterialCode()),
+                        CheckingRegister::getMaterialCode, checkingRegister.getMaterialCode())
+                .eq(StringUtils.isNotEmpty(checkingRegister.getMaterialName()),
+                        CheckingRegister::getMaterialName, checkingRegister.getMaterialName())
+                .eq(StringUtils.isNotEmpty(checkingRegister.getInventorySts()),
+                        CheckingRegister::getInventorySts, checkingRegister.getInventorySts())
+                .eq(StringUtils.isNotEmpty(checkingRegister.getCheckBy()),
+                        CheckingRegister::getCheckAt, checkingRegister.getCheckAt())
+                .orderByDesc(CheckingRegister::getReceiptDetailId);
+
+        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){
+            // 使用分页查询
+            Page<CheckingRegister> page = new Page<>(pageNum, pageSize);
+            IPage<CheckingRegister> iPage = checkingRegisterService.page(page, lambdaQueryWrapper);
+            return getMpDataTable(iPage.getRecords(), iPage.getTotal());
+        } else {
+            List<CheckingRegister> list = checkingRegisterService.list(lambdaQueryWrapper);
+            return getDataTable(list);
+        }
+    }
+
+    /**
+     * 新增质检报告
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存质检报告
+     */
+    @ApiOperation(value="新增质检报告 ", notes="新增质检报告 ", httpMethod = "POST")
+    @RequiresPermissions("check:checkingRegister:add")
+    @Log(title = "质检-质检报告 ",operating = "新增质检报告 ", action = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(CheckingRegister checkingRegister) {
+        return toAjax(checkingRegisterService.save(checkingRegister));
+    }
+
+    /**
+     * 修改质检报告
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
+        CheckingRegister checkingRegister = checkingRegisterService.getById(id);
+        mmap.put("checkingRegister", checkingRegister);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存质检报告
+     */
+    @ApiOperation(value="修改质检报告", notes="修改质检报告", httpMethod = "POST")
+    @RequiresPermissions("check:checkingRegister:edit")
+    @Log(title = "质检-质检报告 ",operating = "修改质检报告 ", action = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(CheckingRegister checkingRegister) {
+        checkingRegister.setCheckBy(ShiroUtils.getLoginName());
+        checkingRegister.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(checkingRegisterService.updateById(checkingRegister));
+    }
+
+    /**
+     * 删除质检报告
+     */
+    @ApiOperation(value="删除质检报告", notes="删除质检报告", httpMethod = "POST")
+    @RequiresPermissions("check:checkingRegister:remove")
+    @Log(title = "质检-质检报告 ",operating = "质检报告删除", action = BusinessType.UPDATE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(@ApiParam(name = "id", value = "质检头表id字符串")String ids){
+        if (StringUtils.isNull(ids)){
+            return AjaxResult.error("id为空");
+        }
+        return toAjax(checkingRegisterService.removeByIds(Arrays.asList(Convert.toIntArray(ids))));
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/config/shipmentPreference/controller/ShipmentPreferenceController.java b/src/main/java/com/huaheng/pc/config/shipmentPreference/controller/ShipmentPreferenceController.java
index 33b10b5..b9c8e25 100644
--- a/src/main/java/com/huaheng/pc/config/shipmentPreference/controller/ShipmentPreferenceController.java
+++ b/src/main/java/com/huaheng/pc/config/shipmentPreference/controller/ShipmentPreferenceController.java
@@ -114,7 +114,7 @@ public class ShipmentPreferenceController extends BaseController {
      */
     @ApiOperation(value="修改出库首选项", notes="修改出库首选项", httpMethod = "POST")
     @RequiresPermissions("config:shipmentPreference:edit")
-    @Log(title = "通用-出库首选项", operating = "修改出库首选项", action = BusinessType.UPDATE)
+    @Log(title = "配置-出库首选项", operating = "修改出库首选项", action = BusinessType.UPDATE)
     @PostMapping("/edit")
     @ResponseBody
     public AjaxResult editSave(
@@ -128,7 +128,7 @@ public class ShipmentPreferenceController extends BaseController {
      */
     @ApiOperation(value="删除出库首选项", notes="根据id批量删除入库首选项,参数示例1,2,3", httpMethod = "POST")
     @RequiresPermissions("config:shipmentPreference:remove")
-    @Log(title = "通用-出库首选项", operating = "删除出库首选项", action = BusinessType.DELETE)
+    @Log(title = "配置-出库首选项", operating = "删除出库首选项", action = BusinessType.DELETE)
     @PostMapping( "/remove")
     @ResponseBody
     public AjaxResult remove(String ids) {
diff --git a/src/main/java/com/huaheng/pc/shipment/wave/controller/WaveController.java b/src/main/java/com/huaheng/pc/config/wave/controller/WaveController.java
index b5b2a49..c554e69 100644
--- a/src/main/java/com/huaheng/pc/shipment/wave/controller/WaveController.java
+++ b/src/main/java/com/huaheng/pc/config/wave/controller/WaveController.java
@@ -1,29 +1,32 @@
-package com.huaheng.pc.shipment.wave.controller;
+package com.huaheng.pc.config.wave.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.aspectj.lang.annotation.Log;
 import com.huaheng.framework.aspectj.lang.constant.BusinessType;
 import com.huaheng.framework.web.controller.BaseController;
+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.shipment.wave.domain.Wave;
-import com.huaheng.pc.shipment.wave.service.WaveService;
+import com.huaheng.pc.config.wave.domain.Wave;
+import com.huaheng.pc.config.wave.service.WaveService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -50,7 +53,7 @@ public class WaveController extends BaseController {
     }
 
     /**
-     * 查询订单分析结果
+     * 查询波次
      */
     @RequiresPermissions("shipment:wave:list")
     @Log(title = "出库-波次", operating="查看波次", action = BusinessType.GRANT)
@@ -63,14 +66,14 @@ public class WaveController extends BaseController {
         Integer pageNum = pageDomain.getPageNum();
         Integer pageSize = pageDomain.getPageSize();
 
-        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin),Wave::getCreated, createdBegin)
+        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), Wave::getCreated, createdBegin)
                 .le(StringUtils.isNotEmpty(createdEnd), Wave::getCreated, createdEnd)
                 .eq(Wave::getWarehouseCode, ShiroUtils.getWarehouseCode())
                 .eq(StringUtils.isNotEmpty(wave.getWaveMode()
-                ),Wave::getWaveMode,wave.getWaveMode())
-                .eq(wave.getStatus()!=null,Wave::getStatus,wave.getStatus())
+                ), Wave::getWaveMode,wave.getWaveMode())
+                .eq(wave.getStatus()!=null, Wave::getStatus,wave.getStatus())
                 .like(StringUtils.isNotEmpty(wave.getWaveName()
-                ),Wave::getWaveName,wave.getWaveName());
+                ), Wave::getWaveName,wave.getWaveName());
 
         if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){
             /**
@@ -85,5 +88,66 @@ public class WaveController extends BaseController {
         }
     }
 
+    /**
+     * 新增波次
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增波次
+     */
+    @RequiresPermissions("config:wave:add")
+    @Log(title = "配置-波次", operating = "新增波次", action = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(Wave wave){
+        wave.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        wave.setCreatedBy(ShiroUtils.getLoginName());
+        wave.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveService.save(wave));
+    }
+
+    /**
+     * 修改波次
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
+        mmap.put("wave", waveService.getById(id));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改波次
+     */
+    @RequiresPermissions("config:wave:edit")
+    @Log(title = "通用-波次", operating = "修改波次", action = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(Wave wave) {
+        wave.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveService.updateById(wave));
+    }
+
+    /**
+     * 删除波次
+     */
+    @RequiresPermissions("config:wave:remove")
+    @Log(title = "配置-波次", operating = "删除波次", action = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        if (StringUtils.isEmpty(ids)){
+            return AjaxResult.error("id不能为空");
+        }
+        List<Integer> list = new ArrayList<>();
+        for (Integer id : Convert.toIntArray(ids)) {
+            list.add(id);
+        }
+        return toAjax(waveService.removeByIds(list));
+    }
+
 
 }
diff --git a/src/main/java/com/huaheng/pc/shipment/wave/domain/Wave.java b/src/main/java/com/huaheng/pc/config/wave/domain/Wave.java
index 718b813..6f8dea0 100644
--- a/src/main/java/com/huaheng/pc/shipment/wave/domain/Wave.java
+++ b/src/main/java/com/huaheng/pc/config/wave/domain/Wave.java
@@ -1,4 +1,4 @@
-package com.huaheng.pc.shipment.wave.domain;
+package com.huaheng.pc.config.wave.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -6,9 +6,10 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.util.Date;
-import lombok.Data;
 
 @ApiModel(value="com.huaheng.pc.shipment.wave.domain.Wave")
 @Data
diff --git a/src/main/java/com/huaheng/pc/shipment/wave/mapper/WaveMapper.java b/src/main/java/com/huaheng/pc/config/wave/mapper/WaveMapper.java
index 72d3ffa..679ba35 100644
--- a/src/main/java/com/huaheng/pc/shipment/wave/mapper/WaveMapper.java
+++ b/src/main/java/com/huaheng/pc/config/wave/mapper/WaveMapper.java
@@ -1,7 +1,7 @@
-package com.huaheng.pc.shipment.wave.mapper;
+package com.huaheng.pc.config.wave.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.huaheng.pc.shipment.wave.domain.Wave;
+import com.huaheng.pc.config.wave.domain.Wave;
 
 public interface WaveMapper extends BaseMapper<Wave> {
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/shipment/wave/service/WaveService.java b/src/main/java/com/huaheng/pc/config/wave/service/WaveService.java
index 989b74e..904d9cd 100644
--- a/src/main/java/com/huaheng/pc/shipment/wave/service/WaveService.java
+++ b/src/main/java/com/huaheng/pc/config/wave/service/WaveService.java
@@ -1,11 +1,10 @@
-package com.huaheng.pc.shipment.wave.service;
+package com.huaheng.pc.config.wave.service;
 
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import java.util.List;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.huaheng.pc.shipment.wave.mapper.WaveMapper;
-import com.huaheng.pc.shipment.wave.domain.Wave;
+import com.huaheng.pc.config.wave.domain.Wave;
+import com.huaheng.pc.config.wave.mapper.WaveMapper;
+import org.springframework.stereotype.Service;
+
 @Service
 public class WaveService extends ServiceImpl<WaveMapper, Wave> {
 
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/controller/WaveFlowDetailController.java b/src/main/java/com/huaheng/pc/config/waveFlowDetail/controller/WaveFlowDetailController.java
index 7785a02..3f4a79d 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/controller/WaveFlowDetailController.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowDetail/controller/WaveFlowDetailController.java
@@ -1,29 +1,30 @@
-package com.huaheng.pc.shipment.waveFlowDetail.controller;
+package com.huaheng.pc.config.waveFlowDetail.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.aspectj.lang.annotation.Log;
 import com.huaheng.framework.aspectj.lang.constant.BusinessType;
 import com.huaheng.framework.web.controller.BaseController;
+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.shipment.waveFlowDetail.domain.WaveFlowDetail;
-import com.huaheng.pc.shipment.waveFlowDetail.service.WaveFlowDetailService;
+import com.huaheng.pc.config.waveFlowDetail.domain.WaveFlowDetail;
+import com.huaheng.pc.config.waveFlowDetail.service.WaveFlowDetailService;
 import io.swagger.annotations.Api;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -50,7 +51,7 @@ public class WaveFlowDetailController extends BaseController {
     }
 
     /**
-     * 查询订单分析结果
+     * 查询波次流明细
      */
     @RequiresPermissions("shipment:waveFlowDetail:list")
     @Log(title = "出库-波次流明细", operating="查看波次流明细", action = BusinessType.GRANT)
@@ -63,7 +64,7 @@ public class WaveFlowDetailController extends BaseController {
         Integer pageNum = pageDomain.getPageNum();
         Integer pageSize = pageDomain.getPageSize();
 
-        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin),WaveFlowDetail::getCreated, createdBegin)
+        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), WaveFlowDetail::getCreated, createdBegin)
                 .le(StringUtils.isNotEmpty(createdEnd), WaveFlowDetail::getCreated, createdEnd)
                 .eq(WaveFlowDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
 
@@ -80,5 +81,65 @@ public class WaveFlowDetailController extends BaseController {
         }
     }
 
+    /**
+     * 新增波次流明细
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增波次流明细
+     */
+    @RequiresPermissions("config:wave:add")
+    @Log(title = "配置-波次流明细", operating = "新增波次流明细", action = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(WaveFlowDetail waveFlowDetail){
+        waveFlowDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        waveFlowDetail.setCreatedBy(ShiroUtils.getLoginName());
+        waveFlowDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveFlowDetailService.save(waveFlowDetail));
+    }
+
+    /**
+     * 修改波次流明细
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
+        mmap.put("wave", waveFlowDetailService.getById(id));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改波次流明细
+     */
+    @RequiresPermissions("config:wave:edit")
+    @Log(title = "通用-波次流明细", operating = "修改波次流明细", action = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(WaveFlowDetail waveFlowDetail) {
+        waveFlowDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveFlowDetailService.updateById(waveFlowDetail));
+    }
+
+    /**
+     * 删除波次流明细
+     */
+    @RequiresPermissions("config:wave:remove")
+    @Log(title = "配置-波次流明细", operating = "删除波次流明细", action = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        if (StringUtils.isEmpty(ids)){
+            return AjaxResult.error("id不能为空");
+        }
+        List<Integer> list = new ArrayList<>();
+        for (Integer id : Convert.toIntArray(ids)) {
+            list.add(id);
+        }
+        return toAjax(waveFlowDetailService.removeByIds(list));
+    }
 
 }
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/domain/WaveFlowDetail.java b/src/main/java/com/huaheng/pc/config/waveFlowDetail/domain/WaveFlowDetail.java
index 9d16257..f04a929 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/domain/WaveFlowDetail.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowDetail/domain/WaveFlowDetail.java
@@ -1,4 +1,4 @@
-package com.huaheng.pc.shipment.waveFlowDetail.domain;
+package com.huaheng.pc.config.waveFlowDetail.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -6,9 +6,10 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.util.Date;
-import lombok.Data;
 
 @ApiModel(value="com.huaheng.pc.shipment.waveFlowDetail.domain.WaveFlowDetail")
 @Data
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/mapper/WaveFlowDetailMapper.java b/src/main/java/com/huaheng/pc/config/waveFlowDetail/mapper/WaveFlowDetailMapper.java
index bba1ac4..9a28317 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/mapper/WaveFlowDetailMapper.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowDetail/mapper/WaveFlowDetailMapper.java
@@ -1,7 +1,7 @@
-package com.huaheng.pc.shipment.waveFlowDetail.mapper;
+package com.huaheng.pc.config.waveFlowDetail.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.huaheng.pc.shipment.waveFlowDetail.domain.WaveFlowDetail;
+import com.huaheng.pc.config.waveFlowDetail.domain.WaveFlowDetail;
 
 public interface WaveFlowDetailMapper extends BaseMapper<WaveFlowDetail> {
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/service/WaveFlowDetailService.java b/src/main/java/com/huaheng/pc/config/waveFlowDetail/service/WaveFlowDetailService.java
index 2bed049..c71c2c0 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowDetail/service/WaveFlowDetailService.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowDetail/service/WaveFlowDetailService.java
@@ -1,11 +1,10 @@
-package com.huaheng.pc.shipment.waveFlowDetail.service;
+package com.huaheng.pc.config.waveFlowDetail.service;
 
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import java.util.List;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.huaheng.pc.shipment.waveFlowDetail.domain.WaveFlowDetail;
-import com.huaheng.pc.shipment.waveFlowDetail.mapper.WaveFlowDetailMapper;
+import com.huaheng.pc.config.waveFlowDetail.domain.WaveFlowDetail;
+import com.huaheng.pc.config.waveFlowDetail.mapper.WaveFlowDetailMapper;
+import org.springframework.stereotype.Service;
+
 @Service
 public class WaveFlowDetailService extends ServiceImpl<WaveFlowDetailMapper, WaveFlowDetail> {
 
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/controller/WaveFlowHeaderController.java b/src/main/java/com/huaheng/pc/config/waveFlowHeader/controller/WaveFlowHeaderController.java
index 8384d9f..9f64d8d 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/controller/WaveFlowHeaderController.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowHeader/controller/WaveFlowHeaderController.java
@@ -1,29 +1,30 @@
-package com.huaheng.pc.shipment.waveFlowHeader.controller;
+package com.huaheng.pc.config.waveFlowHeader.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.aspectj.lang.annotation.Log;
 import com.huaheng.framework.aspectj.lang.constant.BusinessType;
 import com.huaheng.framework.web.controller.BaseController;
+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.shipment.waveFlowHeader.domain.WaveFlowHeader;
-import com.huaheng.pc.shipment.waveFlowHeader.service.WaveFlowHeaderService;
+import com.huaheng.pc.config.waveFlowHeader.domain.WaveFlowHeader;
+import com.huaheng.pc.config.waveFlowHeader.service.WaveFlowHeaderService;
 import io.swagger.annotations.Api;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -50,7 +51,7 @@ public class WaveFlowHeaderController extends BaseController {
     }
 
     /**
-     * 查询订单分析结果
+     * 查询波次流头表
      */
     @RequiresPermissions("shipment:waveFlowHeader:list")
     @Log(title = "出库-波次流头表", operating="查看波次流头表", action = BusinessType.GRANT)
@@ -63,11 +64,11 @@ public class WaveFlowHeaderController extends BaseController {
         Integer pageNum = pageDomain.getPageNum();
         Integer pageSize = pageDomain.getPageSize();
 
-        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin),WaveFlowHeader::getCreated, createdBegin)
+        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), WaveFlowHeader::getCreated, createdBegin)
                 .le(StringUtils.isNotEmpty(createdEnd), WaveFlowHeader::getCreated, createdEnd)
                 .eq(WaveFlowHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
                 .eq(StringUtils.isNotEmpty(waveFlowHeader.getCode()
-                ),WaveFlowHeader::getCode,waveFlowHeader.getCode());
+                ), WaveFlowHeader::getCode,waveFlowHeader.getCode());
 
         if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){
             /**
@@ -83,4 +84,66 @@ public class WaveFlowHeaderController extends BaseController {
     }
 
 
+    /**
+     * 新增波次流头表
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增波次流头表
+     */
+    @RequiresPermissions("config:waveFlowHeader:add")
+    @Log(title = "配置-波次流头表", operating = "新增波次流头表", action = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(WaveFlowHeader waveFlowHeader){
+        waveFlowHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        waveFlowHeader.setCreatedBy(ShiroUtils.getLoginName());
+        waveFlowHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveFlowHeaderService.save(waveFlowHeader));
+    }
+
+    /**
+     * 修改波次流头表
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
+        mmap.put("waveFlowHeader", waveFlowHeaderService.getById(id));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改波次流头表
+     */
+    @RequiresPermissions("config:waveFlowHeader:edit")
+    @Log(title = "通用-波次流头表", operating = "修改波次流头表", action = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(WaveFlowHeader waveFlowHeader) {
+        waveFlowHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveFlowHeaderService.updateById(waveFlowHeader));
+    }
+
+    /**
+     * 删除波次流头表
+     */
+    @RequiresPermissions("config:waveFlowHeader:remove")
+    @Log(title = "配置-波次流头表", operating = "删除波次流头表", action = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        if (StringUtils.isEmpty(ids)){
+            return AjaxResult.error("id不能为空");
+        }
+        List<Integer> list = new ArrayList<>();
+        for (Integer id : Convert.toIntArray(ids)) {
+            list.add(id);
+        }
+        return toAjax(waveFlowHeaderService.removeByIds(list));
+    }
+
+
 }
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/domain/WaveFlowHeader.java b/src/main/java/com/huaheng/pc/config/waveFlowHeader/domain/WaveFlowHeader.java
index 5bfc476..36a68e1 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/domain/WaveFlowHeader.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowHeader/domain/WaveFlowHeader.java
@@ -1,4 +1,4 @@
-package com.huaheng.pc.shipment.waveFlowHeader.domain;
+package com.huaheng.pc.config.waveFlowHeader.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -6,9 +6,10 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.util.Date;
-import lombok.Data;
 
 @ApiModel(value="com.huaheng.pc.shipment.waveFlowHeader.domain.WaveFlowHeader")
 @Data
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/mapper/WaveFlowHeaderMapper.java b/src/main/java/com/huaheng/pc/config/waveFlowHeader/mapper/WaveFlowHeaderMapper.java
index c31afeb..cbeecec 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/mapper/WaveFlowHeaderMapper.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowHeader/mapper/WaveFlowHeaderMapper.java
@@ -1,7 +1,7 @@
-package com.huaheng.pc.shipment.waveFlowHeader.mapper;
+package com.huaheng.pc.config.waveFlowHeader.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.huaheng.pc.shipment.waveFlowHeader.domain.WaveFlowHeader;
+import com.huaheng.pc.config.waveFlowHeader.domain.WaveFlowHeader;
 
 public interface WaveFlowHeaderMapper extends BaseMapper<WaveFlowHeader> {
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/service/WaveFlowHeaderService.java b/src/main/java/com/huaheng/pc/config/waveFlowHeader/service/WaveFlowHeaderService.java
index d073586..04a2919 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveFlowHeader/service/WaveFlowHeaderService.java
+++ b/src/main/java/com/huaheng/pc/config/waveFlowHeader/service/WaveFlowHeaderService.java
@@ -1,11 +1,10 @@
-package com.huaheng.pc.shipment.waveFlowHeader.service;
+package com.huaheng.pc.config.waveFlowHeader.service;
 
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import java.util.List;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.huaheng.pc.shipment.waveFlowHeader.mapper.WaveFlowHeaderMapper;
-import com.huaheng.pc.shipment.waveFlowHeader.domain.WaveFlowHeader;
+import com.huaheng.pc.config.waveFlowHeader.domain.WaveFlowHeader;
+import com.huaheng.pc.config.waveFlowHeader.mapper.WaveFlowHeaderMapper;
+import org.springframework.stereotype.Service;
+
 @Service
 public class WaveFlowHeaderService extends ServiceImpl<WaveFlowHeaderMapper, WaveFlowHeader> {
 
diff --git a/src/main/java/com/huaheng/pc/shipment/waveMaster/controller/WaveMasterController.java b/src/main/java/com/huaheng/pc/config/waveMaster/controller/WaveMasterController.java
index ca38a65..c1eaa88 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveMaster/controller/WaveMasterController.java
+++ b/src/main/java/com/huaheng/pc/config/waveMaster/controller/WaveMasterController.java
@@ -1,30 +1,30 @@
-package com.huaheng.pc.shipment.waveMaster.controller;
+package com.huaheng.pc.config.waveMaster.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.aspectj.lang.annotation.Log;
 import com.huaheng.framework.aspectj.lang.constant.BusinessType;
 import com.huaheng.framework.web.controller.BaseController;
+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.shipment.wave.domain.Wave;
-import com.huaheng.pc.shipment.waveMaster.domain.WaveMaster;
-import com.huaheng.pc.shipment.waveMaster.service.WaveMasterService;
+import com.huaheng.pc.config.waveMaster.domain.WaveMaster;
+import com.huaheng.pc.config.waveMaster.service.WaveMasterService;
 import io.swagger.annotations.Api;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -51,7 +51,7 @@ public class WaveMasterController extends BaseController {
     }
 
     /**
-     * 查询订单分析结果
+     * 查询波次主表
      */
     @RequiresPermissions("shipment:waveMaster:list")
     @Log(title = "出库-波次主表", operating="查看波次主表", action = BusinessType.GRANT)
@@ -64,13 +64,13 @@ public class WaveMasterController extends BaseController {
         Integer pageNum = pageDomain.getPageNum();
         Integer pageSize = pageDomain.getPageSize();
 
-        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin),WaveMaster::getCreated, createdBegin)
+        lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), WaveMaster::getCreated, createdBegin)
                 .le(StringUtils.isNotEmpty(createdEnd), WaveMaster::getCreated, createdEnd)
                 .eq(WaveMaster::getWarehouseCode, ShiroUtils.getWarehouseCode())
                 .eq(StringUtils.isNotEmpty(waveMaster.getCode()
-                ),WaveMaster::getCode,waveMaster.getCode())
+                ), WaveMaster::getCode,waveMaster.getCode())
                 .like(StringUtils.isNotEmpty(waveMaster.getShipmentFilterCode()
-                ),WaveMaster::getShipmentFilterCode,waveMaster.getShipmentFilterCode());
+                ), WaveMaster::getShipmentFilterCode,waveMaster.getShipmentFilterCode());
 
         if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)){
             /**
@@ -86,4 +86,67 @@ public class WaveMasterController extends BaseController {
     }
 
 
+    /**
+     * 新增波次主表
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增波次主表
+     */
+    @RequiresPermissions("config:waveMaster:add")
+    @Log(title = "配置-波次主表", operating = "新增波次主表", action = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(WaveMaster waveMaster){
+        waveMaster.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        waveMaster.setCreatedBy(ShiroUtils.getLoginName());
+        waveMaster.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveMasterService.save(waveMaster));
+    }
+
+    /**
+     * 修改波次
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
+        mmap.put("waveMaster", waveMasterService.getById(id));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改波次
+     */
+    @RequiresPermissions("config:waveMaster:edit")
+    @Log(title = "通用-波次主表", operating = "修改波次主表", action = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(WaveMaster waveMaster) {
+        waveMaster.setLastUpdatedBy(ShiroUtils.getLoginName());
+        return toAjax(waveMasterService.updateById(waveMaster));
+    }
+
+    /**
+     * 删除波次
+     */
+    @RequiresPermissions("config:waveMaster:remove")
+    @Log(title = "配置-波次主表", operating = "删除波次主表", action = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        if (StringUtils.isEmpty(ids)){
+            return AjaxResult.error("id不能为空");
+        }
+        List<Integer> list = new ArrayList<>();
+        for (Integer id : Convert.toIntArray(ids)) {
+            list.add(id);
+        }
+        return toAjax(waveMasterService.removeByIds(list));
+    }
+
+
+
 }
diff --git a/src/main/java/com/huaheng/pc/shipment/waveMaster/domain/WaveMaster.java b/src/main/java/com/huaheng/pc/config/waveMaster/domain/WaveMaster.java
index a44fe78..1fd6dc4 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveMaster/domain/WaveMaster.java
+++ b/src/main/java/com/huaheng/pc/config/waveMaster/domain/WaveMaster.java
@@ -1,4 +1,4 @@
-package com.huaheng.pc.shipment.waveMaster.domain;
+package com.huaheng.pc.config.waveMaster.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -6,9 +6,10 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.util.Date;
-import lombok.Data;
 
 @ApiModel(value="com.huaheng.pc.shipment.waveMaster.domain.WaveMaster")
 @Data
diff --git a/src/main/java/com/huaheng/pc/shipment/waveMaster/mapper/WaveMasterMapper.java b/src/main/java/com/huaheng/pc/config/waveMaster/mapper/WaveMasterMapper.java
index eda0820..d789f23 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveMaster/mapper/WaveMasterMapper.java
+++ b/src/main/java/com/huaheng/pc/config/waveMaster/mapper/WaveMasterMapper.java
@@ -1,7 +1,7 @@
-package com.huaheng.pc.shipment.waveMaster.mapper;
+package com.huaheng.pc.config.waveMaster.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.huaheng.pc.shipment.waveMaster.domain.WaveMaster;
+import com.huaheng.pc.config.waveMaster.domain.WaveMaster;
 
 public interface WaveMasterMapper extends BaseMapper<WaveMaster> {
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/shipment/waveMaster/service/WaveMasterService.java b/src/main/java/com/huaheng/pc/config/waveMaster/service/WaveMasterService.java
index 230c9d5..ee2ad9b 100644
--- a/src/main/java/com/huaheng/pc/shipment/waveMaster/service/WaveMasterService.java
+++ b/src/main/java/com/huaheng/pc/config/waveMaster/service/WaveMasterService.java
@@ -1,11 +1,10 @@
-package com.huaheng.pc.shipment.waveMaster.service;
+package com.huaheng.pc.config.waveMaster.service;
 
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import java.util.List;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.huaheng.pc.shipment.waveMaster.mapper.WaveMasterMapper;
-import com.huaheng.pc.shipment.waveMaster.domain.WaveMaster;
+import com.huaheng.pc.config.waveMaster.domain.WaveMaster;
+import com.huaheng.pc.config.waveMaster.mapper.WaveMasterMapper;
+import org.springframework.stereotype.Service;
+
 @Service
 public class WaveMasterService extends ServiceImpl<WaveMasterMapper, WaveMaster> {
 
diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java
index 51bf1de..9782ef9 100644
--- a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java
+++ b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/controller/InventoryDetailController.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.aspectj.lang.annotation.Log;
@@ -24,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.Resource;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 
 /**
@@ -106,7 +108,20 @@ public class InventoryDetailController extends BaseController
             return AjaxResult.error("库存明细ID不能为空");
         }
         Integer id = Integer.valueOf(ids);
-        return inventoryDetailService.detailcreateCheckOutTask(id);
+        inventoryDetailService.detailcreateCheckOutTask(id);
+        return AjaxResult.success("库存明细出库查看任务下发成功!");
+    }
+
+
+    /**在库质检*/
+    //@RequiresPermissions("inventory:inventoryHeader:detailCheckTask")
+    @PostMapping("/detailCheckTask")
+    @ResponseBody
+    public AjaxResult detailCheckTask(String ids) throws InvocationTargetException, IllegalAccessException {
+        if(StringUtils.isEmpty(ids)){
+            return AjaxResult.error("库存明细ID不能为空");
+        }
+        return inventoryDetailService.detailCheckTask(Convert.toIntArray(ids));
     }
 
 
diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java
index 9d8f509..99736d4 100644
--- a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java
+++ b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailService.java
@@ -5,15 +5,19 @@ import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
 import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 
 public interface InventoryDetailService extends IService<InventoryDetail> {
 
 
-    AjaxResult detailcreateCheckOutTask (Integer id);
+    void detailcreateCheckOutTask (Integer id);
 
     List<InventoryDetail> selectBysql(String sql, ShipmentDetail shipmentDetail);
 
+
+    AjaxResult detailCheckTask (Integer[] ids) throws InvocationTargetException, IllegalAccessException;
+
 }
 
 
diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java
index 24b68ef..385bd16 100644
--- a/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java
@@ -6,22 +6,36 @@ import com.huaheng.common.exception.service.ServiceException;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.check.checkDetail.domain.CheckDetail;
+import com.huaheng.pc.check.checkDetail.service.CheckDetailService;
+import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
+import com.huaheng.pc.check.checkHeader.service.CheckHeaderService;
 import com.huaheng.pc.config.location.domain.Location;
 import com.huaheng.pc.config.location.service.LocationService;
 import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
+import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
+import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
+import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
+import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
 import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
+import com.huaheng.pc.system.dict.domain.DictData;
+import com.huaheng.pc.system.dict.service.DictDataServiceImpl;
+import com.huaheng.pc.system.dict.service.IDictDataService;
 import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
 import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
 import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
 import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import org.apache.commons.beanutils.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.huaheng.pc.inventory.inventoryDetail.mapper.InventoryDetailMapper;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.lang.reflect.InvocationTargetException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @Service
 public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMapper, InventoryDetail> implements InventoryDetailService {
@@ -36,6 +50,16 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe
     private InventoryDetailMapper inventoryDetailMapper;
     @Resource
     private LocationService locationService;
+    @Autowired
+    private InventoryHeaderService inventoryHeaderService;
+    @Autowired
+    private ReceiptDetailService receiptDetailService;
+    @Autowired
+    private CheckHeaderService checkHeaderService;
+    @Autowired
+    private CheckDetailService checkDetailService;
+    @Autowired
+    private IDictDataService dictDataService;
 
 
 
@@ -43,7 +67,7 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe
      * 库存明细出库查看
      * */
     @Override
-    public AjaxResult detailcreateCheckOutTask(Integer id) {
+    public void detailcreateCheckOutTask(Integer id) {
         /*传入库存明细ID,通过该ID找到明细条码确定库位容器,再生成任务*/
 
         InventoryDetail inventoryDetail = inventoryDetailMapper.selectById(id);
@@ -66,10 +90,10 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe
         TaskHeader taskHeader = new TaskHeader();
         taskHeader.setWarehouseCode(inventoryDetail.getWarehouseCode());
         taskHeader.setCompanyCode(inventoryDetail.getCompanyCode());
-        taskHeader.setInternalTaskType(900);
+        taskHeader.setInternalTaskType(200);
         taskHeader.setTaskType(900);
         taskHeader.setContainerCode(inventoryDetail.getContainerCode());
-        taskHeader.setStatus(1);
+        taskHeader.setStatus(0);
         taskHeader.setFromLocation(inventoryDetail.getLocationCode());
         taskHeader.setToLocation(inventoryDetail.getLocationCode());
         taskHeader.setCreated(new Date());
@@ -100,7 +124,6 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe
             throw new ServiceException("出库查看任务明细生成失败!");
         }
 
-        return AjaxResult.success("库存明细出库查看任务下发成功!");
     }
 
     @Override
@@ -112,6 +135,103 @@ public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMappe
         return inventoryDetailMapper.selectBysql(sql);
     }
 
+    //在库质检,把入库主单和子单明细加入到质检单主从中
+    @Override
+    @Transactional
+    public AjaxResult detailCheckTask(Integer[] ids) throws InvocationTargetException, IllegalAccessException {
+        HashSet<String> codeSet=new HashSet();
+        Integer size=0;
+        for(Integer id : ids){
+            //查找库存明细,是否为同一个入库单入库的
+            InventoryDetail inventoryDetail=this.getById(id);
+            if(inventoryDetail==null){
+                throw new ServiceException("查不到库存明细");
+            }
+            if(StringUtils.isEmpty(inventoryDetail.getReceiptCode())){
+                throw new ServiceException("查不到库存的入库源头");
+            }
+
+            //查找未质检的
+            if(inventoryDetail.getQcCheck().equals("2")) {
+                codeSet.add(inventoryDetail.getReceiptCode());
+            }
+        }
+
+        List<InventoryDetail> inventoryDetails=new ArrayList<>();
+        for(String code : codeSet){
+            //对库存分类,已入库单划分
+            for(Integer id : ids){
+                InventoryDetail inventoryDetail=this.getById(id);
+                if(inventoryDetail.getReceiptCode().equals(code) && inventoryDetail.getQcCheck().equals("2")){
+                    inventoryDetails.add(inventoryDetail);
+                }
+            }
+            LambdaQueryWrapper<InventoryDetail> lam=Wrappers.lambdaQuery();
+            lam.eq(InventoryDetail::getReceiptCode,code)
+                    .eq(InventoryDetail::getWarehouseCode,ShiroUtils.getWarehouseCode());
+            List<InventoryDetail> inventoryDetailList=this.list(lam);
+
+            CheckHeader checkHeader = new CheckHeader();
+            //判断入库单明细与该单已选中质检的库存明细比较,得出质检单的类型
+            if(inventoryDetailList.size()>inventoryDetails.size()){
+                checkHeader.setType("300");
+            }else {
+                checkHeader.setType("200");
+            }
+
+            //生成质检单号code
+            DictData dictData=new DictData();
+            dictData.setWarehouseCode(ShiroUtils.getWarehouseCode());
+            dictData.setDictType("checkType");
+            dictData.setRemark(checkHeader.getType());
+            dictData=dictDataService.selectModel(dictData);
+            String checkCode=checkHeaderService.createCode(dictData.getDictValue());
+
+            //质检主表插入数据
+            checkHeader.setCode(checkCode);
+            checkHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
+            checkHeader.setReferCode(code);
+            checkHeader.setEnable(1);
+            checkHeader.setStatus("0");
+            checkHeader.setCreatedBy(ShiroUtils.getLoginName());
+            Boolean flag=checkHeaderService.save(checkHeader);
+            if(flag == false){
+                throw new ServiceException("质检主表插入失败");
+            }
+
+            List<CheckDetail> checkDetails=new ArrayList<>();
+            CheckDetail checkDetail=new CheckDetail();
+            //质检明细插入数据
+            for(InventoryDetail item : inventoryDetails){
+                BeanUtils.copyProperties(checkDetail,item);
+                checkDetail.setCheckHeaderId(checkHeader.getId());
+                checkDetail.setCheckCode(checkCode);
+                checkDetail.setInventoryDetailId(item.getId());
+                checkDetail.setStatus("0");
+                checkDetail.setCreatedBy(ShiroUtils.getLoginName());
+                checkDetail.setCreated(new Date());
+                checkDetail.setLastUpdatedBy(null);
+                checkDetail.setLastUpdated(new Date());
+                checkDetails.add(checkDetail);
+                detailcreateCheckOutTask(item.getId());
+                item.setQcCheck("1");
+            }
+            flag=checkDetailService.saveBatch(checkDetails);
+            if(flag == false){
+                throw new ServiceException("质检子表插入失败");
+            }
+            if(this.updateBatchById(inventoryDetails) == false){
+                throw new ServiceException("库存修改状态失败");
+            }
+        }
+        size=ids.length-inventoryDetails.size();
+        if(size == ids.length){
+            return AjaxResult.success("所有库存已质检!或无需质检");
+        }else {
+            return AjaxResult.success("在库质检任务下发成功!有" + size + "条库存明细已质检。");
+        }
+    }
+
 
 }
 
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerHeader.java b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerHeader.java
index f6bdc1d..eaa2e5b 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerHeader.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerHeader.java
@@ -269,8 +269,8 @@ public class ReceiptContainerHeader implements Serializable {
      *
      * @return id - ID
      */
-    public Integer getId() {
-        return id;
+    public  Integer getId() {
+        return this.id;
     }
 
     /**
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java b/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java
index 8abf70e..0994951 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java
@@ -29,8 +29,6 @@ public class ReceiptHeaderService extends ServiceImpl<ReceiptHeaderMapper, Recei
     @Resource
     private ReceiptTypeService receiptTypeService;
     @Resource
-    private StatusFlowDetailService statusFlowDetailService;
-    @Resource
     private ReceiptDetailService receiptDetailService;
 
     public AjaxResult saveReceiptHeader(ReceiptHeader receiptHeader){
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/controller/TaskHeaderController.java b/src/main/java/com/huaheng/pc/task/taskHeader/controller/TaskHeaderController.java
index ea9ae4e..fa04ccf 100644
--- a/src/main/java/com/huaheng/pc/task/taskHeader/controller/TaskHeaderController.java
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/controller/TaskHeaderController.java
@@ -119,5 +119,21 @@ public class TaskHeaderController extends BaseController {
     }
 
 
+    /**
+     * 删除立库任务
+     */
+    @RequiresPermissions("task:taskHeader:remove")
+    @Log(title = "任务-任务管理", operating = "删除立库任务", action = BusinessType.DELETE)
+    @PostMapping( "/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        if (StringUtils.isEmpty(ids))
+            return AjaxResult.error("taskId不能为空");
+        AjaxResult ajaxResult = taskHeaderService.cancelTask(Convert.toIntArray(ids));
+        return ajaxResult;
+    }
+
+
 
 }
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 efd5185..298fc69 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
@@ -35,5 +35,7 @@ public interface TaskHeaderService extends IService<TaskHeader>{
 
     Integer UncompleteCount(String containerCode);
 
+    AjaxResult cancelTask(Integer[] taskIds) ;
+
 
 }
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 caf80f5..d6d6b4c 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
@@ -12,6 +12,7 @@ import com.huaheng.pc.config.container.domain.Container;
 import com.huaheng.pc.config.container.service.ContainerService;
 import com.huaheng.pc.config.location.domain.Location;
 import com.huaheng.pc.config.location.service.LocationService;
+import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
 import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
 import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
 import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
@@ -88,7 +89,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     private ShipmentDetailService shipmentDetailService;
 
 
-
     @Resource
     private ReceiptContainerHeaderService receiptContainerHeaderService;
     @Resource
@@ -96,9 +96,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
 
 
 
-
-
-
     /**
      * 查询容器有无任务
      */
@@ -107,6 +104,64 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         return taskHeaderMapper.UncompleteCount(ContainerCode, ShiroUtils.getWarehouseCode());
     }
 
+
+    /**
+     * 取消任务
+     * */
+
+    @Override
+    public AjaxResult cancelTask(Integer[] taskIds) {
+        for(int taskId : taskIds){
+            TaskHeader taskHeader = taskHeaderService.getById(taskId);
+            if(taskHeader==null){
+                return AjaxResult.error("任务"+taskId+"未找到,操作中止");
+            }
+            if(taskHeader.getStatus() > 9){
+                return AjaxResult.error("存在任务"+taskHeader.getId()+"已下发或执行,操作中止");
+            }
+            //删除子任务
+            LambdaQueryWrapper<TaskDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
+            lambdaQueryWrapper.eq(TaskDetail::getTaskId,taskHeader.getId());
+            taskDetailService.remove(lambdaQueryWrapper);
+            //删除主任务
+            taskHeaderService.removeById(taskHeader.getId());
+            // 更改库位状态(整盘入库任务除外)
+            if(taskHeader.getInternalTaskType() == 100 )
+            {
+                ReceiptContainerHeader record =new ReceiptContainerHeader();
+                record.setStatus((short)0);
+                record.setId(taskHeader.getAllocationHeadId());
+                receiptContainerHeaderService.updateById(record);
+            }
+            //根据任务类型来更新货箱状态
+            //修改关联的货箱状态
+            if(taskHeader.getInternalTaskType() == 200)  {
+                ShipmentContainerHeader shipmentContainerHeader = new ShipmentContainerHeader();
+                shipmentContainerHeader.setId(taskHeader.getAllocationHeadId());
+                shipmentContainerHeader.setStatus(0);
+                shipmentContainerHeaderService.updateById(shipmentContainerHeader);
+            }
+//            if(taskHeader.getInternalTaskType() == 700)   {
+//                CycleCountHeader cycleCountHeader = new CycleCountHeader();
+//                cycleCountHeader.setId(task.getAllocationHeadId());
+//                cycleCountHeader.setLastUpdated(new Date());
+//                cycleCountHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+//                cyclecountDetailService.updateByModel(cyclecountDetail);
+//            }
+            if(taskHeader.getInternalTaskType()==100||taskHeader.getInternalTaskType()==200){
+                if(taskHeader.getToLocation()!=null){
+                    //更新托盘、库位状态
+                    locationService.updateStatus(taskHeader.getToLocation(), "empty");
+                }
+            }
+//            if(task.getType()==900){
+//                //出库查看任务没有关联的货箱,不做处理
+//            }
+        }
+
+        return AjaxResult.success("取消任务成功!");
+    }
+
     /**
      * 生成出库任务
      *
@@ -215,7 +270,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         ShipmentContainerHeader record = new ShipmentContainerHeader();
         record.setId(shipmentContainerHeaderId);
         record.setStatus(10);
-        record.setStatus(task.getTaskType());//实际出库类型
         shipmentContainerHeaderService.saveOrUpdate(record);
         return AjaxResult.success(task.getId());
 
@@ -238,39 +292,64 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
                 return AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
             }
             //修改任务头表
+            task.setId(taskId);
             task.setStatus(10);
             task.setStartPickDateTime(new Date());   //生成时间
             task.setLastUpdated(new Date());
             task.setLastUpdatedBy(ShiroUtils.getLoginName());
-            LambdaUpdateWrapper<TaskHeader> HeaderUpdateWrapper = Wrappers.lambdaUpdate();
-            HeaderUpdateWrapper.eq(TaskHeader::getId, taskId);
-            if (!taskHeaderService.update(task, HeaderUpdateWrapper))
-                throw new ServiceException("更新任务头失败");
+            taskHeaderService.saveOrUpdate(task);
             //修改任务明细状态
             TaskDetail record = new TaskDetail();
             record.setStatus(10);
             record.setLastUpdated(new Date());
             record.setLastUpdatedBy(ShiroUtils.getLoginName());
+            record.setProcessStamp("100");
+            taskDetailService.updateById(record);
             LambdaUpdateWrapper<TaskDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
             lambdaUpdateWrapper.eq(TaskDetail::getTaskId, task.getId());
             if (!taskDetailService.update(record, lambdaUpdateWrapper)){
                 throw new ServiceException("更新任务明细失败");
             }
-            //修改入库明细
-            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()==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);
     }
@@ -483,7 +562,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
                 }
                //修改组盘表状态为20
                 ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
-                receiptContainerDetail.setStatus(20);
+                receiptContainerDetail.setStatus(30);
                 receiptContainerDetail.setProcessStamp("0");
                 receiptContainerDetail.setLastUpdated(new Date());
                 receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
@@ -491,12 +570,37 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
                 receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getReceiptId, DataUtils.getInteger(map.get("receiptId")));
                 if (! receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper))
                     throw new ServiceException("更新组盘状态失败");
-                //修改入库明细
-                ReceiptDetail receiptDetail = receiptDetailService.queryflow(receiptDetailService.getById(DataUtils.getInteger(map.get("receiptDetailId"))));
-                if (!receiptDetailService.updateById(receiptDetail)){
-                    throw new ServiceException("更新状态失败");
+
+                if (task.getInternalTaskType()==100){
+                    //修改入库明细
+                    ReceiptDetail receiptDetail = receiptDetailService.queryflow(receiptDetailService.getById(DataUtils.getInteger(map.get("receiptDetailId"))));
+                    if (!receiptDetailService.updateById(receiptDetail)){
+                        throw new ServiceException("更新状态失败");
+                    }
+                    receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
                 }
-                receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
+
+                //修改出库单明细
+                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);
+                }
+                }
+
+
             }
 
         }
@@ -1015,15 +1119,20 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
                     throw new ServiceException("任务明细对应的库存ID【" + taskDetail.getToInventoryId().toString() + "】不存在!");
                 }
                 BigDecimal orignalQty = inventoryDetail.getQty();
-                //扣减库存
+                //减扣库存单
+                InventoryHeader inventoryHeader = inventoryHeaderService.getById(inventoryDetail.getInventoryHeaderId());
+                inventoryHeader.setTotalQty(inventoryDetail.getQty().subtract(taskDetail.getQty()).intValue());
+                //扣减库存明细
                 inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().subtract(taskDetail.getQty()));
                 inventoryDetail.setQty(inventoryDetail.getQty().subtract(taskDetail.getQty()));
                 if(inventoryDetail.getQty().compareTo(new BigDecimal("0"))==0 && inventoryDetail.getTaskQty().compareTo(new BigDecimal("0"))==0){
                     //如果库存没有了,就删除这个库存
                     inventoryDetailService.removeById(inventoryDetail.getId());
+                    inventoryHeaderService.removeById(inventoryHeader.getId());
                 }else {
                     //否则更新这个库存
                     inventoryDetailService.updateById(inventoryDetail);
+                    inventoryHeaderService.updateById(inventoryHeader);
                 }
                 //设置子任务状态为已执行
                 taskDetail.setStatus(100);
@@ -1092,11 +1201,25 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
                containerService.update(containerLambdaUpdateWrapper);
             }
         }
-//        //设置出库货箱状态为拣货任务完成
-//        shipmentContainerHeaderService.resetStatusShipmentContainer(task.getAllocationHeadId(),(short)20);
-       // 最后更新单据状态
-        shipmentHeadIds.stream().distinct().forEach(t->shipmentHeaderService.updateShipmentStatus(t));
-
+        //设置出库货箱状态为拣货任务完成
+        ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
+        receiptContainerDetail.setStatus(30);
+        receiptContainerDetail.setLastUpdated(new Date());
+        receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getId,task.getAllocationHeadId());
+        if (! receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper)){
+            throw new ServiceException("更新组盘明细状态失败");
+        }
+    //设置出库货箱表头状态为拣货任务完成
+        ReceiptContainerHeader ContainerHeader = new ReceiptContainerHeader();
+        ContainerHeader.setStatus((short)30);
+        ContainerHeader.setLastUpdated(new Date());
+        ContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        LambdaUpdateWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        receiptContainerHeaderLambdaUpdateWrapper.eq(ReceiptContainerHeader::getId,task.getAllocationHeadId());
+        if (! receiptContainerHeaderService.update(ContainerHeader, receiptContainerHeaderLambdaUpdateWrapper))
+            throw new ServiceException("更新组盘头状态失败");
     }
 
 
diff --git a/src/main/resources/mybatis/check/CheckHeaderMapper.xml b/src/main/resources/mybatis/check/CheckHeaderMapper.xml
index 8c466f3..e6d53ed 100644
--- a/src/main/resources/mybatis/check/CheckHeaderMapper.xml
+++ b/src/main/resources/mybatis/check/CheckHeaderMapper.xml
@@ -34,4 +34,9 @@
     closedAt, created, createdBy, lastUpdated, lastUpdatedBy, version, userDef1, userDef2, 
     userDef3, userDef4, userDef5, userDef6, userDef7, userDef8, processStamp
   </sql>
+
+  <select id="createCode" resultType="java.lang.String">
+        SELECT code FROM check_header WHERE substring(code,1,2) = #{checkType,jdbcType=VARCHAR} ORDER BY id DESC LIMIT 1
+  </select>
+
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/shipment/WaveFlowDetailMapper.xml b/src/main/resources/mybatis/config/WaveFlowDetailMapper.xml
index 37b59c4..91d07b0 100644
--- a/src/main/resources/mybatis/shipment/WaveFlowDetailMapper.xml
+++ b/src/main/resources/mybatis/config/WaveFlowDetailMapper.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.huaheng.pc.shipment.waveFlowDetail.mapper.WaveFlowDetailMapper">
-  <resultMap id="BaseResultMap" type="com.huaheng.pc.shipment.waveFlowDetail.domain.WaveFlowDetail">
+<mapper namespace="com.huaheng.pc.config.waveFlowDetail.mapper.WaveFlowDetailMapper">
+  <resultMap id="BaseResultMap" type="com.huaheng.pc.config.waveFlowDetail.domain.WaveFlowDetail">
     <!--@mbg.generated-->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="headerId" jdbcType="INTEGER" property="headerId" />
@@ -23,16 +23,12 @@
     <result column="userDef2" jdbcType="VARCHAR" property="userDef2" />
     <result column="userDef3" jdbcType="VARCHAR" property="userDef3" />
     <result column="userDef4" jdbcType="VARCHAR" property="userDef4" />
-    <result column="userDef5" jdbcType="VARCHAR" property="userDef5" />
-    <result column="userDef6" jdbcType="VARCHAR" property="userDef6" />
-    <result column="userDef7" jdbcType="VARCHAR" property="userDef7" />
-    <result column="userDef8" jdbcType="VARCHAR" property="userDef8" />
     <result column="processStamp" jdbcType="VARCHAR" property="processStamp" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id, headerId, waveFlowCode, warehouseCode, `sequence`, waveStepCode, waveStepName, 
     value1, value2, value3, value4, created, createdBy, lastUpdated, lastUpdatedBy, version, 
-    userDef1, userDef2, userDef3, userDef4, userDef5, userDef6, userDef7, userDef8, processStamp
+    userDef1, userDef2, userDef3, userDef4,  processStamp
   </sql>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/shipment/WaveFlowHeaderMapper.xml b/src/main/resources/mybatis/config/WaveFlowHeaderMapper.xml
index e131b4d..626cb71 100644
--- a/src/main/resources/mybatis/shipment/WaveFlowHeaderMapper.xml
+++ b/src/main/resources/mybatis/config/WaveFlowHeaderMapper.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.huaheng.pc.shipment.waveFlowHeader.mapper.WaveFlowHeaderMapper">
-  <resultMap id="BaseResultMap" type="com.huaheng.pc.shipment.waveFlowHeader.domain.WaveFlowHeader">
+<mapper namespace="com.huaheng.pc.config.waveFlowHeader.mapper.WaveFlowHeaderMapper">
+  <resultMap id="BaseResultMap" type="com.huaheng.pc.config.waveFlowHeader.domain.WaveFlowHeader">
     <!--@mbg.generated-->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="code" jdbcType="VARCHAR" property="code" />
@@ -15,15 +15,11 @@
     <result column="userDef2" jdbcType="VARCHAR" property="userDef2" />
     <result column="userDef3" jdbcType="VARCHAR" property="userDef3" />
     <result column="userDef4" jdbcType="VARCHAR" property="userDef4" />
-    <result column="userDef5" jdbcType="VARCHAR" property="userDef5" />
-    <result column="userDef6" jdbcType="VARCHAR" property="userDef6" />
-    <result column="userDef7" jdbcType="VARCHAR" property="userDef7" />
-    <result column="userDef8" jdbcType="VARCHAR" property="userDef8" />
     <result column="processStamp" jdbcType="VARCHAR" property="processStamp" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id, code, warehouseCode, created, createdBy, lastUpdated, lastUpdatedBy, version, 
-    userDef1, userDef2, userDef3, userDef4, userDef5, userDef6, userDef7, userDef8, processStamp
+    userDef1, userDef2, userDef3, userDef4, processStamp
   </sql>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/shipment/WaveMapper.xml b/src/main/resources/mybatis/config/WaveMapper.xml
index 6831b49..23fa520 100644
--- a/src/main/resources/mybatis/shipment/WaveMapper.xml
+++ b/src/main/resources/mybatis/config/WaveMapper.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.huaheng.pc.shipment.wave.mapper.WaveMapper">
-  <resultMap id="BaseResultMap" type="com.huaheng.pc.shipment.wave.domain.Wave">
+<mapper namespace="com.huaheng.pc.config.wave.mapper.WaveMapper">
+  <resultMap id="BaseResultMap" type="com.huaheng.pc.config.wave.domain.Wave">
     <!--@mbg.generated-->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="warehouseCode" jdbcType="VARCHAR" property="warehouseCode" />
     <result column="waveName" jdbcType="VARCHAR" property="waveName" />
     <result column="masterCode" jdbcType="VARCHAR" property="masterCode" />
-    <result column="enable" jdbcType="INTEGER" property="enable" />
+    <result column="status" jdbcType="INTEGER" property="status" />
     <result column="currentWaveStep" jdbcType="VARCHAR" property="currentWaveStep" />
     <result column="lastWaveStep" jdbcType="VARCHAR" property="lastWaveStep" />
     <result column="totalShipments" jdbcType="INTEGER" property="totalShipments" />
@@ -32,10 +32,6 @@
     <result column="userDef2" jdbcType="VARCHAR" property="userDef2" />
     <result column="userDef3" jdbcType="VARCHAR" property="userDef3" />
     <result column="userDef4" jdbcType="VARCHAR" property="userDef4" />
-    <result column="userDef5" jdbcType="VARCHAR" property="userDef5" />
-    <result column="userDef6" jdbcType="VARCHAR" property="userDef6" />
-    <result column="userDef7" jdbcType="VARCHAR" property="userDef7" />
-    <result column="userDef8" jdbcType="VARCHAR" property="userDef8" />
     <result column="processStamp" jdbcType="VARCHAR" property="processStamp" />
     <result column="closed" jdbcType="INTEGER" property="closed" />
     <result column="closedBy" jdbcType="VARCHAR" property="closedBy" />
@@ -44,10 +40,10 @@
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
-    id, warehouseCode, waveName, masterCode, `enable`, currentWaveStep, lastWaveStep, 
+    id, warehouseCode, waveName, masterCode, `status`, currentWaveStep, lastWaveStep,
     totalShipments, totalLines, totalQty, startedAt, completedAt, waveMode, errorMessage, 
     locked, replenishmentReqd, messageId, runBy, releasedBy, releasedAt, created, createdBy, 
-    lastUpdated, lastUpdatedBy, version, userDef1, userDef2, userDef3, userDef4, userDef5, 
-    userDef6, userDef7, userDef8, processStamp, closed, closedBy, closedAt, released
+    lastUpdated, lastUpdatedBy, version, userDef1, userDef2, userDef3, userDef4, processStamp,
+    closed, closedBy, closedAt, released
   </sql>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/shipment/WaveMasterMapper.xml b/src/main/resources/mybatis/config/WaveMasterMapper.xml
index 61294f4..c275431 100644
--- a/src/main/resources/mybatis/shipment/WaveMasterMapper.xml
+++ b/src/main/resources/mybatis/config/WaveMasterMapper.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.huaheng.pc.shipment.waveMaster.mapper.WaveMasterMapper">
-  <resultMap id="BaseResultMap" type="com.huaheng.pc.shipment.waveMaster.domain.WaveMaster">
+<mapper namespace="com.huaheng.pc.config.waveMaster.mapper.WaveMasterMapper">
+  <resultMap id="BaseResultMap" type="com.huaheng.pc.config.waveMaster.domain.WaveMaster">
     <!--@mbg.generated-->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="code" jdbcType="VARCHAR" property="code" />
@@ -33,10 +33,6 @@
     <result column="userDef2" jdbcType="VARCHAR" property="userDef2" />
     <result column="userDef3" jdbcType="VARCHAR" property="userDef3" />
     <result column="userDef4" jdbcType="VARCHAR" property="userDef4" />
-    <result column="userDef5" jdbcType="VARCHAR" property="userDef5" />
-    <result column="userDef6" jdbcType="VARCHAR" property="userDef6" />
-    <result column="userDef7" jdbcType="VARCHAR" property="userDef7" />
-    <result column="userDef8" jdbcType="VARCHAR" property="userDef8" />
     <result column="processStamp" jdbcType="VARCHAR" property="processStamp" />
   </resultMap>
   <sql id="Base_Column_List">
diff --git a/src/main/resources/mybatis/system/DictDataMapper.xml b/src/main/resources/mybatis/system/DictDataMapper.xml
index 8ccc6e4..5f6a411 100644
--- a/src/main/resources/mybatis/system/DictDataMapper.xml
+++ b/src/main/resources/mybatis/system/DictDataMapper.xml
@@ -181,7 +181,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</insert>
 
 	<select id="selectModel" resultType="com.huaheng.pc.system.dict.domain.DictData">
-		select * from sys_dict_data where warehouseCode=#{warehouseCode} and  dictType=#{dictType} and dictValue=#{dictValue} limit 1
+		select * from sys_dict_data
+		<where>
+			<if test="warehouseCode != null">
+				AND warehouseCode = #{warehouseCode}
+			</if>
+			<if test="headerId != null">
+				AND headerId = #{headerId}
+			</if>
+			<if test="dictValue != null">
+				AND dictValue = #{dictValue}
+			</if>
+			<if test="dictLabel != null">
+				AND dictLabel = #{dictLabel}
+			</if>
+			<if test="dictType != null">
+				AND dictType = #{dictType}
+			</if>
+			<if test="remark != null">
+				AND remark = #{remark}
+			</if>
+		</where>
+		limit 1
 	</select>
 
 </mapper> 
\ No newline at end of file
diff --git a/src/main/resources/templates/check/checkDetail/checkComplete.html b/src/main/resources/templates/check/checkDetail/checkComplete.html
new file mode 100644
index 0000000..32e50f2
--- /dev/null
+++ b/src/main/resources/templates/check/checkDetail/checkComplete.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<html  lang="zh" xmlns:th="http://www.thymeleaf.org">
+<meta charset="utf-8">
+<head th:include="include :: header"></head>
+<body class="white-bg">
+<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+    <form class="form-horizontal m" id="form-checkComplete-add">
+        <div class="form-group">
+            <label class="col-sm-3 control-label">库存状态:</label>
+            <div class="col-sm-8">
+                <select class="form-control" id="inventorySts0" name="inventorySts0" th:with="statusList=${@dict.getType('inventoryStatus')}">
+                    <option value="">请选择</option>
+                    <option th:each="status : ${statusList}" th:text="${status['dictLabel']}" th:value="${status['dictValue']}"></option>
+                </select>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">数量:</label>
+            <div class="col-sm-8">
+                <input name="qty0" class="form-control" type="text">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">库存状态:</label>
+            <div class="col-sm-8">
+                <select class="form-control" id="inventorySts1" name="inventorySts1" th:with="statusList=${@dict.getType('inventoryStatus')}">
+                    <option value="">请选择</option>
+                    <option th:each="status : ${statusList}" th:text="${status['dictLabel']}" th:value="${status['dictValue']}"></option>
+                </select>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">数量:</label>
+            <div class="col-sm-8">
+                <input name="qty1" class="form-control" type="text">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">库存状态:</label>
+            <div class="col-sm-8">
+                <select class="form-control" id="inventorySts2" name="inventorySts2" th:with="statusList=${@dict.getType('inventoryStatus')}">
+                    <option value="">请选择</option>
+                    <option th:each="status : ${statusList}" th:text="${status['dictLabel']}" th:value="${status['dictValue']}"></option>
+                </select>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-3 control-label">数量:</label>
+            <div class="col-sm-8">
+                <input name="qty2" class="form-control" type="text">
+            </div>
+        </div>
+        <div class="form-group">
+            <div class="form-control-static col-sm-offset-9">
+                <button type="submit" class="btn btn-primary">提交</button>
+                <button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button>
+            </div>
+        </div>
+    </form>
+</div>
+<div th:include="include::footer"></div>
+<script type="text/javascript">
+    var prefix = ctx + "check/checkDetail";
+    $("#form-checkComplete-add").validate({
+        submitHandler: function() {
+            var tableValue;
+            var inventorySts;
+            var qty;
+            if ( $("#inventorySts0 option:selected").val() == ""){
+                inventorySts = $("#inventorySts0 option:selected").val()
+            }
+            if ( $("#inventorySts1 option:selected").val() == ""){
+                inventorySts = ","+$("#inventorySts1 option:selected").val()
+            }
+            if ( $("#inventorySts2 option:selected").val() == ""){
+                inventorySts = ","+$("#inventorySts2 option:selected").val()
+            }
+                if ( $("input[name='qty"+i+"']").val() == ""){
+                    qty = $("input[name='qty"+i+"']").val()+","
+                }
+
+            tableValue = formValueReplace(tableValue, "id", [[${checkDetailId}]]);
+            tableValue = formValueReplace(tableValue, "inventorySts", inventorySts);
+            tableValue = formValueReplace(tableValue, "qty", qty);
+            $.operate.save(prefix + "/complete", $('#form-checkComplete-add').serialize());
+        }
+    });
+</script>
+</body>
+</html>
diff --git a/src/main/resources/templates/check/checkDetail/checkDetail.html b/src/main/resources/templates/check/checkDetail/checkDetail.html
new file mode 100644
index 0000000..e996624
--- /dev/null
+++ b/src/main/resources/templates/check/checkDetail/checkDetail.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<meta charset="utf-8">
+<head th:include="include :: header"></head>
+<body class="gray-bg">
+<div class="container-div">
+    <div class="row">
+        <div class="btn-group hidden-xs" id="toolbar" role="group">
+            <!--<a class="btn btn-outline btn-success btn-rounded" onclick="$.operate.add()" shiro:hasPermission="receipt:receiptContainer:add">-->
+            <!--<i class="fa fa-plus"></i> 新增-->
+            <!--</a>-->
+            <a class="btn btn-outline btn-danger btn-rounded" onclick="$.operate.batRemove()" shiro:hasPermission="receipt:receiptContainer:remove">
+                <i class="fa fa-trash-o"></i> 删除
+            </a>
+        </div>
+
+        <div class="col-sm-12 select-info">
+            <table id="bootstrap-table" data-mobile-responsive="true" class="table table-bordered table-hover"></table>
+        </div>
+    </div>
+</div>
+<div th:include="include :: footer"></div>
+<script th:inline="javascript">
+    var editFlag = [[${@permission.hasPermi('check:checkDetail:edit')}]];
+    var removeFlag = [[${@permission.hasPermi('check:checkDetail:remove')}]];
+    var checkDetailStatus = [[${@dict.getType('checkDetailStatus')}]];
+    var prefix = ctx + "check/checkDetail";
+    var inventorySts = [[${@dict.getType('inventoryStatus')}]];
+
+    $(function() {
+        var options = {
+            url: prefix + "/list",
+            createUrl: prefix + "/add",
+            updateUrl: prefix + "/edit/{id}",
+            removeUrl: prefix + "/remove",
+            queryParams: queryParams,
+            modalName: "质检明细",
+            sortName: "id",
+            sortOrder: "desc",
+            search: false,
+            columns: [{
+                checkbox: true
+            },
+                {
+                    field : 'id',
+                    title : 'id'
+                },
+                {
+                    field : 'checkHeaderId',
+                    title : '质检头id'
+                },
+                {
+                    field : 'warehouseCode',
+                    title : '仓库编码',
+                    visible : false
+                },
+                {
+                    field : 'checkCode',
+                    title : '质检单编码'
+                },
+                {
+                    field : 'inventoryDetailId',
+                    title : '库存明细标识'
+                },
+                {
+                    field : 'locationCode',
+                    title : '库位编码'
+                },
+                {
+                    field : 'containerCode',
+                    title : '容器编码'
+                },
+                {
+                    field : 'receiptDetailId',
+                    title : '入库单明细标识'
+                },
+                {
+                    field : 'receiptCode',
+                    title : '入库单号'
+                },
+                {
+                    field : 'referCode',
+                    title : '关联单号'
+                },
+                {
+                    field : 'referLineId',
+                    title : '关联行号'
+                },
+                {
+                    field : 'referPlatform',
+                    title : '关联平台'
+                },
+                {
+                    field : 'materialCode',
+                    title : '物料编码'
+                },
+                {
+                    field : 'materialName',
+                    title : '物料名称'
+                },
+                {
+                    field : 'materialSpec',
+                    title : '物料规格'
+                },
+                {
+                    field : 'materialUnit',
+                    title : '物料单位'
+                },
+                {
+                    field : 'companyCode',
+                    title : '货主代码'
+                },
+                {
+                    field : 'inventorySts',
+                    title : '库存状态',
+                    align: 'center',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(inventorySts, value);
+                    }
+                },
+                {
+                    field : 'status',
+                    title : '状态',
+                    align: 'center',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(checkDetailStatus, value);
+                    }
+                },
+                {
+                    field : 'qty',
+                    title : '系统数量'
+                },
+                {
+                    field : 'checkBy',
+                    title : '质检人'
+                },
+                {
+                    field : 'checkAt',
+                    title : '质检时间'
+                },
+                {
+                    field : 'created',
+                    title : '创建时间'
+                },
+                {
+                    field : 'createdBy',
+                    title : '创建用户'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="#" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        if (row.status == 10) {
+                            actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="#" onclick="complete(\'' + row.id + '\')"><i class="fa fa-edit"></i>质检完成</a> ');
+                        }
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+        };
+        $.table.init(options);
+    });
+
+
+    function complete(id) {
+        var url = prefix+"/complete/"+id;
+        $.modal.open("完成质检", url);
+    }
+
+    function queryParams(params) {
+        return {
+            checkHeaderId : [[${id}]]
+        };
+    }
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/check/checkHeader/checkHeader.html b/src/main/resources/templates/check/checkHeader/checkHeader.html
new file mode 100644
index 0000000..10e3de2
--- /dev/null
+++ b/src/main/resources/templates/check/checkHeader/checkHeader.html
@@ -0,0 +1,223 @@
+<!DOCTYPE HTML>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<meta charset="utf-8">
+<head th:include="include :: header"></head>
+<body class="gray-bg">
+
+<div class="container-div">
+    <div class="row">
+        <div class="col-sm-12 select-info">
+            <ul id="myTab" class="nav nav-tabs">
+                <li class="active"><a href="#tabHeader" data-toggle="tab">主表</a></li>
+                <li><a href="#tabDetail" data-toggle="tab">明细</a></li>
+            </ul>
+            <div id="myTabContent" class="tab-content">
+                <div class="tab-pane fade in active" id="tabHeader">
+                    <div class="col-sm-12 select-info">
+                        <form id="receiptHeader-form">
+                            <div class="select-list">
+                                <ul>
+                                    <li>
+                                        编码:<input type="text" name="code"/>
+                                    </li>
+                                    <li>
+                                        入库单编码:<input type="text" name="referCode">
+                                    </li>
+                                    <li>状态:
+                                       <select name="lastStatus">
+                                            <option value="">所有</option>
+                                            <option value="0">新建</option>
+                                       </select>
+                                    </li>
+                                    <li class="time">
+                                        <label>创建时间: </label>
+                                        <input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[createdBegin]"/>
+                                        <span>-</span>
+                                        <input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[createdEnd]"/>
+                                    </li>
+                                    <li>
+                                        <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                    </li>
+                                </ul>
+                            </div>
+                        </form>
+                    </div>
+                    <div class="btn-group hidden-xs" id="toolbar" role="group">
+                        <a class="btn btn-outline btn-success btn-rounded" onclick="$.operate.add()"
+                           shiro:hasPermission="receipt:receiptHeader:add">
+                            <i class="fa fa-plus"></i> 新增
+                        </a>
+                        <a class="btn btn-outline btn-danger btn-rounded" onclick="$.operate.batRemove()"
+                           shiro:hasPermission="receipt:receiptHeader:remove">
+                            <i class="fa fa-trash-o"></i> 删除
+                        </a>
+                    </div>
+                    <table id="bootstrap-table" data-mobile-responsive="true" class="table table-bordered table-hover"></table>
+                </div>
+
+                <div class="tab-pane fade" id="tabDetail">
+                    <table id="bootstrap-table1" data-mobile-responsive="true"
+                           class="table table-bordered table-hover"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<div th:include="include :: footer"></div>
+<script th:inline="javascript">
+    var prefix = ctx + "check/checkHeader";
+    var prefix1 = ctx + "check/checkDetail";
+    var editFlag = [[${@permission.hasPermi('check:checkHeader:edit')}]];
+    var removeFlag = [[${@permission.hasPermi('check:checkHeader:remove')}]];
+    var receiptTypes = [[${@receiptTypeService.getType()}]];
+    var checkHeaderStatus = [[${@dict.getType('checkHeaderStatus')}]];
+    var printFlag = [[${@permission.hasPermi('check:checkHeader:report')}]];
+    var addFlag= [[${@permission.hasPermi('check:checkHeader:add')}]];
+    var datas = [[${@dict.getType('sys_normal_disable')}]];
+    var type = [[${@dict.getType('checkType')}]];
+
+    $(function() {
+        var options = {
+            url: prefix + "/list",
+            createUrl: prefix + "/add",
+            updateUrl: prefix + "/edit/{id}",
+            removeUrl: prefix + "/remove",
+            modalName: "流程",
+            search: false,
+            sortName: "id",
+            sortOrder: "desc",
+            queryParams: queryParams,
+            columns: [{
+                checkbox: true
+            },
+                {
+                    field : 'id',
+                    title : '入库单id'
+                },
+                {
+                    field : 'code',
+                    title : '编码'
+                },
+                {
+                    field : 'type',
+                    title : '质检类型',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        return $.table.selectDictLabel(type, value);
+                    }
+                },
+                {
+                    field : 'referCode',
+                    title : '关联单号'
+                },
+                {
+                    field : 'referPlatform',
+                    title : '关联平台'
+                },
+                {
+                    field : 'enable',
+                    title : '是否有效',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        return $.table.selectDictLabel(datas, value);
+                    }
+                },
+                {
+                    field : 'status',
+                    title : '状态',
+                    align: 'center',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(checkHeaderStatus, value);
+                    }
+                },
+                {
+                    field : 'closedBy',
+                    title : '关闭人'
+                },
+                {
+                    field : 'closedAt',
+                    title : '关闭日期'
+                },
+                {
+                    field : 'created',
+                    title : '创建时间',
+                    sortable:true,
+                    visible:false
+                },
+                {
+                    field : 'createdBy',
+                    title : '创建用户',
+                    visible:false
+                },
+                {
+                    field : 'lastUpdated',
+                    title : '最后修改时间',
+                    sortable:true,
+                    visible:false
+                },
+                {
+                    field : 'lastUpdatedBy',
+                    title : '更新用户',
+                    visible:false
+                },
+                {
+                    field : 'userDef1',
+                    title : '自定义字段1',
+                    visible: false
+                },
+                {
+                    field : 'userDef2',
+                    title : '自定义字段2',
+                    visible: false
+                },
+                {
+                    field : 'userDef3',
+                    title : '自定义字段3' ,
+                    visible: false
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        if (row.status == 0){
+                            actions.push('<a id="table_edit" class="btn btn-success btn-xs ' + printFlag + '" href="#" onclick="verify(\'' + row.id + '\')"><i class="fa fa-print"></i>审核</a> ');
+                        }
+                        actions.push('<a id="table_edit" class="btn btn-success btn-xs ' + printFlag + '" href="#" onclick="complete(\'' + row.id + '\')"><i class="fa fa-print"></i>完成</a> ');
+                        actions.push('<a class="btn btn-info btn-xs ' + editFlag + '" href="#" onclick="$.operate.edit(\'' + row.id + '\')" ><i class="fa fa-edit"></i>编辑</a> ');
+                        // actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-trash-o"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+        };
+        $.table.init(options);
+    });
+
+    function detail(id, code) {
+        var url = prefix1+"/" + id;
+        createtable(url);
+    }
+
+    function createtable(url) {
+        $("#tabDetail").children().remove();
+        $("#myTab li").removeClass("active");
+        var height = $(document).height()-100 + 'px';
+        var str = '<iframe class="huaheng_iframe" name="iframe" width="100%" height="' + height + '" src="' + url + '" frameborder="0" data-id="' + url + '" seamless></iframe>';
+        $("#tabDetail").append(str);
+        $(".tab-pane").removeClass("in active");
+        $("#myTab li:eq(1)").addClass("active");
+        $("#tabDetail").addClass("in active");
+    }
+
+    function verify(id) {
+
+    }
+
+    function queryParams(params) {
+        return {
+            type:[[${type}]]
+        };
+    }
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html b/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html
index 6bcf112..8b59b6a 100644
--- a/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html
+++ b/src/main/resources/templates/inventory/inventoryDetail/inventoryDetail.html
@@ -86,6 +86,10 @@
                shiro:hasPermission="inventory:inventory:seeOut">
                 <i class="fa fa-eye"></i> 出库查看
             </a>
+            <a class="btn btn-outline btn-primary btn-rounded" onclick="check()"
+            >
+                <i class="fa fa-eye"></i> 在库质检
+            </a>
         </div>
         <div class="col-sm-12 select-info">
             <table id="bootstrap-table" data-mobile-responsive="true" class="table table-bordered table-hover"></table>
@@ -338,6 +342,20 @@
         localSubmit(url, "post", "json", data);
     }
 
+    //在库质检
+    function check() {
+        var rows = $("#bootstrap-table").bootstrapTable('getSelections');
+        if (rows.length == 0) {
+            $.modal.alertWarning("请至少选择一条记录");
+            return;
+        }
+        var url = prefix + "/detailCheckTask";
+        var data = {
+            "ids": rows[0].id
+        };
+        localSubmit(url, "post", "json", data);
+    }
+
     function localSubmit(url, type, dataType, data) {
         $.modal.loading("正在处理中,请稍后...");
         var config = {