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
index f34e2d3..7752a5d 100644
--- a/src/main/java/com/huaheng/pc/check/checkingRegister/controller/CheckingRegisterController.java
+++ b/src/main/java/com/huaheng/pc/check/checkingRegister/controller/CheckingRegisterController.java
@@ -15,10 +15,16 @@ 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 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 com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
+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 io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -42,12 +48,23 @@ public class CheckingRegisterController extends BaseController {
 
     @Resource
     private CheckingRegisterService checkingRegisterService;
+    @Resource
+    private CheckHeaderService checkHeaderService;
+    @Resource
+    private CheckDetailService checkDetailService;
+
 
     private String prefix = "check/checkingRegister";
 
     @RequiresPermissions("check:checkingRegister:view")
     @GetMapping("/{checkId}")
     public String checkingRegister(@PathVariable("checkId") Integer checkId, ModelMap modelMap) {
+        if (checkId != 0){
+            CheckHeader checkHeader = checkHeaderService.getById(checkId);
+            modelMap.put("checkHeaderId",checkHeader.getId());
+            modelMap.put("checkCode",checkHeader.getCode());
+        }
+
         modelMap.put("checkId",checkId);
         return prefix + "/checkingRegister";
     }
@@ -61,11 +78,22 @@ public class CheckingRegisterController extends BaseController {
     @ResponseBody
     public TableDataInfo list(@ApiParam(name="receiptDetail",value="质检头表") CheckingRegister checkingRegister,
                               @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
-                              @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) {
+                              @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd,
+                              Integer pageNumber) {
         LambdaQueryWrapper<CheckingRegister> lambdaQueryWrapper = Wrappers.lambdaQuery();
         PageDomain pageDomain = TableSupport.buildPageRequest();
-        Integer pageNum = pageDomain.getPageNum();
+        Integer pageNum = pageNumber;
         Integer pageSize = pageDomain.getPageSize();
+        boolean isDetailNull;
+        if (StringUtils.isNotNull(checkingRegister.getCheckDetailId())){
+            isDetailNull = true;
+            if (checkingRegister.getCheckDetailId() == 0){
+                isDetailNull = false;
+            }
+        } else {
+            isDetailNull = false;
+        }
+        CheckDetail checkDetail = checkDetailService.getById(checkingRegister.getCheckDetailId());
 
         lambdaQueryWrapper.ge(StringUtils.isNotEmpty(createdBegin), CheckingRegister::getCreated, createdBegin)
                 .le(StringUtils.isNotEmpty(createdEnd), CheckingRegister::getCreated, createdEnd)
@@ -73,6 +101,8 @@ public class CheckingRegisterController extends BaseController {
                 .eq(CheckingRegister::getWarehouseCode, ShiroUtils.getWarehouseCode())
                 .eq(StringUtils.isNotNull(checkingRegister.getCheckHeaderId()), CheckingRegister::getCheckHeaderId,
                         checkingRegister.getCheckHeaderId())
+                .eq(isDetailNull, CheckingRegister::getCheckDetailId,
+                        checkingRegister.getCheckDetailId())
                 .eq(StringUtils.isNotNull(checkingRegister.getReceiptDetailId()),
                         CheckingRegister::getReceiptDetailId, checkingRegister.getReceiptDetailId())
                 .eq(StringUtils.isNotEmpty(checkingRegister.getReceiptCode()),
@@ -91,16 +121,34 @@ public class CheckingRegisterController extends BaseController {
                         CheckingRegister::getInventorySts, checkingRegister.getInventorySts())
                 .eq(StringUtils.isNotEmpty(checkingRegister.getCheckBy()),
                         CheckingRegister::getCheckAt, checkingRegister.getCheckAt());
-//                .orderByDesc(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);
+            if (isDetailNull){
+                if (iPage.getTotal() == 0){
+                    List emptyList = checkingRegisterService.emptyList(checkingRegister.getCheckDetailId());
+                    return getMpDataTable(emptyList, Long.valueOf(emptyList.size()));
+                }
+                if (!"20".equals(checkDetail.getStatus())){
+                    List notCompleteList = checkingRegisterService.notCompleteList(checkingRegister.getCheckDetailId());
+                    return getMpDataTable(notCompleteList, Long.valueOf(notCompleteList.size()));
+                }
+            }
             return getMpDataTable(iPage.getRecords(), iPage.getTotal());
         } else {
             List<CheckingRegister> list = checkingRegisterService.list(lambdaQueryWrapper);
+            if (isDetailNull){
+                if (list.size() == 0){
+                    List emptyList = checkingRegisterService.emptyList(checkingRegister.getCheckDetailId());
+                    return getMpDataTable(emptyList, Long.valueOf(emptyList.size()));
+                }
+                if (!"20".equals(checkDetail.getStatus())){
+                    List notCompleteList = checkingRegisterService.notCompleteList(checkingRegister.getCheckDetailId());
+                    return getMpDataTable(notCompleteList, Long.valueOf(notCompleteList.size()));
+                }
+            }
             return getDataTable(list);
         }
     }
@@ -144,9 +192,7 @@ public class CheckingRegisterController extends BaseController {
     @PostMapping("/edit")
     @ResponseBody
     public AjaxResult editSave(CheckingRegister checkingRegister) {
-        checkingRegister.setCheckBy(ShiroUtils.getLoginName());
-        checkingRegister.setLastUpdatedBy(ShiroUtils.getLoginName());
-        return toAjax(checkingRegisterService.updateById(checkingRegister));
+        return checkingRegisterService.edit(checkingRegister);
     }
 
     /**
diff --git a/src/main/java/com/huaheng/pc/check/checkingRegister/service/CheckingRegisterService.java b/src/main/java/com/huaheng/pc/check/checkingRegister/service/CheckingRegisterService.java
index 1108846..7519ba3 100644
--- a/src/main/java/com/huaheng/pc/check/checkingRegister/service/CheckingRegisterService.java
+++ b/src/main/java/com/huaheng/pc/check/checkingRegister/service/CheckingRegisterService.java
@@ -1,7 +1,24 @@
 package com.huaheng.pc.check.checkingRegister.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.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.material.domain.Material;
+import com.huaheng.pc.config.material.service.MaterialService;
+import com.huaheng.pc.system.dict.domain.DictData;
+import com.huaheng.pc.system.dict.service.IDictDataService;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.huaheng.pc.check.checkingRegister.domain.CheckingRegister;
@@ -9,4 +26,117 @@ import com.huaheng.pc.check.checkingRegister.mapper.CheckingRegisterMapper;
 @Service
 public class CheckingRegisterService extends ServiceImpl<CheckingRegisterMapper, CheckingRegister> {
 
+    @Resource
+    private CheckHeaderService checkHeaderService;
+    @Resource
+    private CheckDetailService checkDetailService;
+    @Resource
+    private MaterialService materialService;
+    @Resource
+    private IDictDataService dictDataService;
+
+    /**
+     * 质检登记修改
+     * @return
+     */
+    public AjaxResult edit(CheckingRegister checkingRegister){
+
+        checkingRegister.setLastUpdatedBy(ShiroUtils.getLoginName());
+        checkingRegister.setCheckAt(new Date());
+        checkingRegister.setCheckBy(ShiroUtils.getLoginName());
+        if (StringUtils.isNull(checkingRegister.getId())){
+            checkingRegister.setCreatedBy(ShiroUtils.getLoginName());
+            if (!this.save(checkingRegister)){
+                throw new ServiceException("添加质检登记失败");
+            }
+        } else {
+            if (!this.updateById(checkingRegister)){
+                throw new SecurityException("更新质检登记失败");
+            }
+        }
+        return AjaxResult.success("保存成功");
+    }
+
+    /**
+     * 如果质检报告为空,返回所有库存状态记录
+     * @param checkDetailId
+     * @return
+     */
+    public List<CheckingRegister> emptyList(Integer checkDetailId){
+        List<CheckingRegister> list = new ArrayList<>();
+        List<DictData> dictDataList = dictDataService.selectDictDataByType("inventoryStatus");
+        CheckDetail checkDetail = checkDetailService.getById(checkDetailId);
+        for (DictData dictData: dictDataList){
+            CheckingRegister checkingRegister1 = new CheckingRegister();
+            checkingRegister1.setCheckDetailId(checkDetailId);
+            checkingRegister1.setCheckHeaderId(checkDetail.getCheckHeaderId());
+            checkingRegister1.setWarehouseCode(ShiroUtils.getWarehouseCode());
+            checkingRegister1.setCheckCode(checkDetail.getCheckCode());
+            checkingRegister1.setReceiptDetailId(checkDetail.getReceiptDetailId());
+            checkingRegister1.setReceiptCode(checkDetail.getReceiptCode());
+            checkingRegister1.setReferCode(checkDetail.getReferCode());
+            checkingRegister1.setReferLineId(checkDetail.getReferLineId());
+            checkingRegister1.setReferPlatform(checkDetail.getReferPlatform());
+            checkingRegister1.setMaterialCode(checkDetail.getMaterialCode());
+            checkingRegister1.setMaterialName(checkDetail.getMaterialName());
+            checkingRegister1.setMaterialSpec(checkDetail.getMaterialSpec());
+            checkingRegister1.setMaterialUnit(checkDetail.getMaterialUnit());
+            checkingRegister1.setCompanyCode(checkDetail.getCompanyCode());
+            checkingRegister1.setInventorySts(dictData.getDictValue());
+            checkingRegister1.setCheckBy(ShiroUtils.getLoginName());
+            checkingRegister1.setCreated(new Date());
+            checkingRegister1.setCreatedBy(ShiroUtils.getLoginName());
+            checkingRegister1.setLastUpdated(new Date());
+            checkingRegister1.setLastUpdatedBy(ShiroUtils.getLoginName());
+            list.add(checkingRegister1);
+        }
+        return list;
+    }
+
+    /**
+     * 如果质检未完成,返回
+     * @param checkDetailId
+     * @return
+     */
+    public List<CheckingRegister> notCompleteList(Integer checkDetailId){
+
+        LambdaQueryWrapper<CheckingRegister> lambda = Wrappers.lambdaQuery();
+        lambda.eq(CheckingRegister::getCheckDetailId, checkDetailId);
+        List<CheckingRegister> list = this.list(lambda);
+        List<CheckingRegister> list1 = new ArrayList<>();
+        List<DictData> dictDataList = dictDataService.selectDictDataByType("inventoryStatus");
+        CheckDetail checkDetail = checkDetailService.getById(checkDetailId);
+        for (CheckingRegister checkingRegister: list){
+            for (DictData dictData: dictDataList){
+                if (!checkingRegister.getInventorySts().equals(dictData.getDictValue())) {
+                    CheckingRegister checkingRegister1 = new CheckingRegister();
+                    checkingRegister1.setCheckDetailId(checkDetailId);
+                    checkingRegister1.setCheckHeaderId(checkDetail.getCheckHeaderId());
+                    checkingRegister1.setWarehouseCode(ShiroUtils.getWarehouseCode());
+                    checkingRegister1.setCheckCode(checkDetail.getCheckCode());
+                    checkingRegister1.setReceiptDetailId(checkDetail.getReceiptDetailId());
+                    checkingRegister1.setReceiptCode(checkDetail.getReceiptCode());
+                    checkingRegister1.setReferCode(checkDetail.getReferCode());
+                    checkingRegister1.setReferLineId(checkDetail.getReferLineId());
+                    checkingRegister1.setReferPlatform(checkDetail.getReferPlatform());
+                    checkingRegister1.setMaterialCode(checkDetail.getMaterialCode());
+                    checkingRegister1.setMaterialName(checkDetail.getMaterialName());
+                    checkingRegister1.setMaterialSpec(checkDetail.getMaterialSpec());
+                    checkingRegister1.setMaterialUnit(checkDetail.getMaterialUnit());
+                    checkingRegister1.setCompanyCode(checkDetail.getCompanyCode());
+                    checkingRegister1.setInventorySts(dictData.getDictValue());
+                    checkingRegister1.setCheckBy(ShiroUtils.getLoginName());
+                    checkingRegister1.setCreated(new Date());
+                    checkingRegister1.setCreatedBy(ShiroUtils.getLoginName());
+                    checkingRegister1.setLastUpdated(new Date());
+                    checkingRegister1.setLastUpdatedBy(ShiroUtils.getLoginName());
+                    list1.add(checkingRegister1);
+                }
+            }
+        }
+        for (CheckingRegister checkingRegister: list) {
+            list1.add(checkingRegister);
+        }
+        return list1;
+    }
 }
diff --git a/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/controller/CycleCountDetailController.java b/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/controller/CycleCountDetailController.java
index bc7bd60..4c7e8eb 100644
--- a/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/controller/CycleCountDetailController.java
+++ b/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/controller/CycleCountDetailController.java
@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 
@@ -118,7 +119,6 @@ public class CycleCountDetailController extends BaseController {
 
     }
 
-
     /**
      * 新增盘点明细
      */
@@ -215,10 +215,30 @@ public class CycleCountDetailController extends BaseController {
         return cycleCountDetailService.createCycleCoutTaskByDetailId(cycleCoutdetailId);
     }
 
+    /**
+     *实盘登记
+     * @param detailId
+     * @param qty
+     * @return
+     */
+    //@RequiresPermissions("inventory:cyclecountDetail:confirm")
+    @PostMapping("/confirmGapQty")
+    @ResponseBody
+    public AjaxResult confirmGapQty(Integer detailId, BigDecimal qty){
+        return cycleCountDetailService.confirmGapQty(detailId,qty);
+    }
 
-
-
-
+    /**
+     * 差异复盘
+     * @param cycleCountHeadCode
+     * @return
+     */
+    //@RequiresPermissions("inventory:cyclecountDetail:cyclecountRepeat")
+    @PostMapping("/createCyclecountWithGapQty")
+    @ResponseBody
+    public AjaxResult createCyclecountWithGapQty(String cycleCountHeadCode){
+        return cycleCountDetailService.createCyclecountWithGapQty(cycleCountHeadCode);
+    }
 
 
 
diff --git a/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailService.java b/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailService.java
index fdbfeb3..b2df118 100644
--- a/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailService.java
+++ b/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailService.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
 
+import java.math.BigDecimal;
 
 
 public interface CycleCountDetailService extends IService<CycleCountDetail> {
@@ -15,7 +16,11 @@ public interface CycleCountDetailService extends IService<CycleCountDetail> {
 
     AjaxResult createCycleCoutTaskByDetailId(Integer cycleCoutdetailId);
 
+    AjaxResult confirmGapQty(Integer detailId, BigDecimal qty);
 
+    void updataDetailStatus(Integer detailid,Integer status);
+
+    AjaxResult createCyclecountWithGapQty(String cycleCountHeadCode);
 
 
 
diff --git a/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailServiceImpl.java b/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailServiceImpl.java
index 87a1b29..4675cf5 100644
--- a/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailServiceImpl.java
@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -46,6 +47,43 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
 
 
 
+
+
+
+
+
+    /**
+     * 执行任务修改状态为10
+     * @param detailid
+     */
+    @Transactional
+    @Override
+    public void updataDetailStatus(Integer detailid,Integer status) {
+        /*传入明细ID,状态,通过明细ID修改状态,并修改主单状态 */
+        if(detailid == null || status == null){
+            throw new ServiceException("明细ID或状态不能为空!");
+        }
+        CycleCountDetail cycleCountDetail = this.getById(detailid) ;//盘点明细单
+        cycleCountDetail.setEnableStatus(status);
+        cycleCountDetail.setLastUpdated(new Date());
+        cycleCountDetail.setLastUpdatedBy(ShiroUtils.getLoginName());//更新用户
+        //主单
+        CycleCountHeader cycleCountHeader = new CycleCountHeader();
+        cycleCountHeader.setCode(cycleCountDetail.getCycleCountHeadCode());
+        cycleCountHeader.setWarehouseCode(cycleCountDetail.getWarehouseCode());
+        cycleCountHeader.setCompanyCode(cycleCountDetail.getCompanyCode());
+        LambdaQueryWrapper<CycleCountHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(cycleCountHeader);
+        cycleCountHeader = cycleCountHeaderService.getOne(lambdaQueryWrapper);
+        if(cycleCountHeader.getStatusCyc() < 10 ){
+            //主单状态小于10则修改
+            cycleCountHeader.setStatusCyc(status);  //主单状态
+            cycleCountHeaderService.saveOrUpdate(cycleCountHeader);
+        }
+        if(!this.saveOrUpdate(cycleCountDetail)){
+            throw new ServiceException("更新盘点执行状态失败!");
+        }
+    }
+
     /**
      * 新增盘点明细
      * */
@@ -118,7 +156,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
         return AjaxResult.success("生成盘点明细成功");
     }
 
-
     /**
      * 生成全部盘点任务
      * @param cycleCountHeadCode
@@ -196,7 +233,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
         }
 
         //查询任务头和明细有相同容器,没有就新增任务头和明细
-
         LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
         taskHeaderLambdaQueryWrapper
                 .lt(TaskHeader::getStatus,100)
@@ -207,12 +243,9 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
                 .eq(TaskHeader::getContainerCode,cycleCountDetail.getContainerCode());//容器
         List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper);
 
-
         TaskHeader task = new TaskHeader();
         TaskDetail taskDetail = new TaskDetail();
-
         if(taskHeaderList.size() <= 0){
-
             //存在相同容器的主任务直接加入该条主任务的明细
             task.setWarehouseCode(ShiroUtils.getWarehouseCode());
             task.setCompanyCode(cycleCountDetail.getCompanyCode());
@@ -242,7 +275,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
             taskDetail.setWarehouseCode(task.getWarehouseCode());
             cycleCountDetail.setTaskHeaderId(task.getId()); //盘点明细修改状态task数据源
         }else{
-
             //取其中一条主单即可
             TaskHeader taskHeader = taskHeaderList.get(0);
             taskDetail.setTaskId(taskHeader.getId());//主单ID
@@ -254,7 +286,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
             taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
             cycleCountDetail.setTaskHeaderId(taskHeader.getId());//盘点明细修改状态taskHeader数据源
         }
-
         taskDetail.setBillCode(cycleCountDetail.getCycleCountHeadCode());
         taskDetail.setBillDetailId(cycleCountDetail.getId());
         taskDetail.setMaterialCode(cycleCountDetail.getMaterialCode());
@@ -273,7 +304,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
         if(taskDetailService.save(taskDetail) == false){
             throw new ServiceException("盘点任务明细生成失败!");
             }
-
         //修改细单状态
         cycleCountDetail.setTaskHeaderId(taskDetail.getId());
         //cycleCountDetail.setTaskHeaderId(task.getId());
@@ -283,7 +313,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
         cycleCountDetail.setTaskHeaderId(task.getId());
         cycleCountDetail.setTaskDetailId(taskDetail.getId());
         this.saveOrUpdate(cycleCountDetail);
-
         //修改主单状态
         CycleCountHeader cycleCountHeader = new CycleCountHeader();
         cycleCountHeader.setCode(cycleCountDetail.getCycleCountHeadCode());
@@ -296,6 +325,124 @@ public class CycleCountDetailServiceImpl extends ServiceImpl<CycleCountDetailMap
         return AjaxResult.success("盘点任务生成成功");
     }
 
+    /**
+     * 实盘登记
+     * 登记完成后,修改状态为15
+     * @param detailId
+     * @param qty
+     * @return
+     */
+    @Transactional
+    @Override
+    public AjaxResult confirmGapQty(Integer detailId, BigDecimal qty) {
+        CycleCountDetail cyclecountDetail = this.getById(detailId); //明细单据
+        CycleCountHeader cycleCountHeader =new CycleCountHeader();
+        cycleCountHeader.setWarehouseCode(cyclecountDetail.getWarehouseCode());
+        cycleCountHeader.setCompanyCode(cyclecountDetail.getCompanyCode());
+        cycleCountHeader.setCode(cyclecountDetail.getCycleCountHeadCode());
+        LambdaQueryWrapper<CycleCountHeader> cycleCountHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(cycleCountHeader);
+         cycleCountHeader = cycleCountHeaderService.getOne(cycleCountHeaderLambdaQueryWrapper); //主单
+        //任务执行后再实盘登记
+        if(cyclecountDetail.getEnableStatus() < 10){
+            return AjaxResult.error("盘点任务未执行不能登记数量!");
+        }
+        if(cyclecountDetail.getEnableStatus() == 100){
+            return AjaxResult.error("盘点任务完成后不能再登记数量!");
+        }
+        if(cycleCountHeader==null){
+            return AjaxResult.error("主单据不存在");
+        }
+        /*if(cyclecountDetail.getEnableStatus() == 10){
+            return AjaxResult.error("该条已调整,不能重复调整!");
+        }*/
+        if(qty.compareTo(new BigDecimal("0")) < 0){
+            return AjaxResult.error("实盘登记数不能小于0");
+        }
+        if(cyclecountDetail.getInventoryDetailId() != null){
+            InventoryDetail inventoryDetail = inventoryDetailService.getById(cyclecountDetail.getInventoryDetailId());
+            if (inventoryDetail == null) {
+                return AjaxResult.error("没有对应库存信息,请重建盘点单");
+            }
+            if(qty.compareTo(inventoryDetail.getTaskQty()) < 0){
+                return AjaxResult.error("登记数量不能小于任务分配数量");
+            }
+        }
+        cyclecountDetail.setCountedQty(qty);
+        cyclecountDetail.setGapQty(qty.subtract(cyclecountDetail.getSystemQty()));
+        cyclecountDetail.setEnableStatus(15);
+        cyclecountDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        cyclecountDetail.setLastUpdated(new Date());
+        this.saveOrUpdate(cyclecountDetail);
+        //修改主单状态
+        cycleCountHeaderService.updataHeaderStatus(cycleCountHeader.getCode());
+
+        return AjaxResult.success("登记成功");
+    }
+
+
+    /**
+     * 差异复盘
+     * @param cycleCountHeaderCode
+     * @return
+     */
+    @Transactional
+    @Override
+    public AjaxResult createCyclecountWithGapQty(String cycleCountHeaderCode) {
+        /*找出实盘登记中数量有差异的,重新生成盘点单*/
+
+
+        CycleCountHeader cycleCountHeader = new CycleCountHeader();
+        cycleCountHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        cycleCountHeader.setCode(cycleCountHeaderCode);
+        LambdaQueryWrapper<CycleCountHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(cycleCountHeader);
+        cycleCountHeader = cycleCountHeaderService.getOne(lambdaQueryWrapper);//主单
+        if(cycleCountHeader == null){
+            return AjaxResult.error("盘点单不存在");
+        }
+        //不能重复生成,使用盘点单编码查找sourceCode源盘点单号,已存在就是重复
+        CycleCountHeader cy = new CycleCountHeader();
+        cy.setSourceCode(cycleCountHeader.getCode());
+        cy.setWarehouseCode(cycleCountHeader.getWarehouseCode());
+        cy.setCompanyCode(cycleCountHeader.getCompanyCode());
+        LambdaQueryWrapper<CycleCountHeader> lam = Wrappers.lambdaQuery(cy);
+        CycleCountHeader countHeader = cycleCountHeaderService.getOne(lam);
+        if(countHeader != null){
+            return AjaxResult.error("该单据已生成复盘单,请勿重复生成!");
+        }
+        CycleCountDetail cycleCountDetail = new CycleCountDetail();
+        cycleCountDetail.setTaskHeaderId(cycleCountHeader.getId());
+        cycleCountDetail.setWarehouseCode(cycleCountHeader.getWarehouseCode());
+        cycleCountDetail.setCompanyCode(cycleCountHeader.getCompanyCode());
+        LambdaQueryWrapper<CycleCountDetail> cycleCountDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
+        List<CycleCountDetail> cycleCountDetails = this.list(cycleCountDetailLambdaQueryWrapper);//明细
+        //生成复盘盘点主单
+        cycleCountHeader.setCode(cycleCountHeaderService.createCode());
+        cycleCountHeader.setRound(cycleCountHeader.getRound() + 1);//盘点轮次+1
+        cycleCountHeader.setCreated(new Date());
+        cycleCountHeader.setCreatedBy(ShiroUtils.getLoginName());
+        cycleCountHeader.setSourceCode(cycleCountHeaderCode);//源盘点单号
+        if(!cycleCountHeaderService.saveOrUpdate(cycleCountHeader)){
+            throw new ServiceException("复盘主单生成失败!");
+        }
+        //获取差异数量不为零的子单重新再生成盘点单
+        List<CycleCountDetail> cycleCountDetailList = new ArrayList<>();
+        for(CycleCountDetail item:cycleCountDetails){
+            //getGapQty不能为null默认值为0
+           int f = item.getGapQty().compareTo(BigDecimal.ZERO);
+            if(f > 0){
+                item.setCountedQty(null);
+                item.setGapQty(BigDecimal.ZERO);
+                item.setCreatedBy(ShiroUtils.getLoginName());
+                item.setCreated(new Date());
+                cycleCountDetailList.add(item);
+                }
+
+        }
+        if(!this.saveBatch(cycleCountDetailList)){
+            throw new ServiceException("复盘明细子单生成失败");
+        }
+        return AjaxResult.success("生成复盘单成功!");
+    }
 
 
 
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
index 1116ed7..1b22eef 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
@@ -312,10 +312,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     }
 
     /**
-     * 下发WCS执行任务
-     */
-    /**
-     *
+     *下发WCS执行任务
      * 执行任务
      * */
     @Override
@@ -324,6 +321,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         TaskHeader task = null;
         for (Integer taskId : taskIds) {
             task = taskHeaderService.getById(taskId);
+
             if (task.getStatus() > 9) {
                 return AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
             }
@@ -335,17 +333,25 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             task.setLastUpdatedBy(ShiroUtils.getLoginName());
             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)){
+            LambdaQueryWrapper<TaskDetail> lambdaWrapper = Wrappers.lambdaQuery();
+            lambdaWrapper.eq(TaskDetail::getTaskId, task.getId());
+            List<TaskDetail> taskDetailList = taskDetailService.list(lambdaWrapper);
+            List<TaskDetail> taskDetails = new ArrayList<>();
+            for (TaskDetail item:taskDetailList){
+                item.setStatus(10);
+                item.setLastUpdated(new Date());
+                item.setLastUpdatedBy(ShiroUtils.getLoginName());
+                item.setProcessStamp("100");
+                taskDetails.add(item);
+                //盘点执行修改盘点单据状态为10
+                if(task.getTaskType() == 700){
+                    cycleCountDetailService.updataDetailStatus(item.getBillDetailId(),10);
+                }
+            }
+            if (!taskDetailService.saveOrUpdateBatch(taskDetails)){
                 throw new ServiceException("更新任务明细失败");
             }
+
 //            //修改入库明细
 //            if (task.getInternalTaskType()==100){
 //                ReceiptDetail receiptDetail = receiptDetailService.queryflow(receiptDetailService.getById(record.getId()));
@@ -387,7 +393,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
 
 
         }
-        return AjaxResult.success("下发任务成功", task);
+        return AjaxResult.success("执行下发任务成功", task);
     }
 
     @Override
@@ -416,7 +422,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
      * 完成任务
      *
      * @param task
-     * @throws Exception
      */
     @Transactional
     public void completeTask(TaskHeader task) {
@@ -429,7 +434,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
 //            出库任务
             completeShipmentTask(task);
         }
-        // 900 出库查看,包过空托出库查看
+        // 900 出库查看,空托出库查看
         if ( task.getTaskType() == 900) {
             completeSeeOutTask(task);
         }
@@ -1004,10 +1009,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     @Transactional
     public void completeEmptyIn(TaskHeader taskHeader) {
 
-        //解锁容器,更新库位
-        containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(),taskHeader.getToLocation(),"empty");
-        //解锁库位,更新容器
-        locationService.updateContainerCodeAndStatus(taskHeader.getToLocation(),taskHeader.getContainerCode(),"empty");
         //完成任务,修改主单和明细状态
         taskHeader.setStatus(100);
         taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
@@ -1026,9 +1027,14 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
             item.setLastUpdated(new Date());   //更新时间
             taskDetailList.add(item);
         }
-        if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false || taskHeaderService.saveOrUpdate(taskHeader) == false) {
+        if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false ||
+                taskHeaderService.saveOrUpdate(taskHeader) == false) {
             throw new ServiceException("任务单据状态更新失败!");
         }
+        //解锁容器,更新库位
+        containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(),taskHeader.getToLocation(),"empty");
+        //解锁库位,更新容器
+        locationService.updateContainerCodeAndStatus(taskHeader.getToLocation(),taskHeader.getContainerCode(),"empty");
 
     }
 
@@ -1038,10 +1044,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
      */
     @Transactional
     public void completeEmptyOut(TaskHeader taskHeader) {
-        //更新货位
-        locationService.updateContainerCodeAndStatus(taskHeader.getFromLocation(), "", "empty");
-        //更新容器信息
-        containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(), "", "empty");
 
         taskHeader.setStatus(100);
         taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
@@ -1063,6 +1065,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false || taskHeaderService.saveOrUpdate(taskHeader) == false) {
             throw new ServiceException("任务单据状态更新失败!");
         }
+        //更新货位
+        locationService.updateContainerCodeAndStatus(taskHeader.getFromLocation(), "", "empty");
+        //更新容器信息
+        containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(), "", "empty");
+
     }
 
     /**
diff --git a/src/main/resources/application-druid.properties b/src/main/resources/application-druid.properties
index 54782c1..f46a33f 100644
--- a/src/main/resources/application-druid.properties
+++ b/src/main/resources/application-druid.properties
@@ -2,14 +2,14 @@
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
 # \u4E3B\u5E93
-spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/wms_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
+#spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/wms_v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
 #spring.datasource.druid.master.url=jdbc:mysql://172.16.29.45:3306/huahengExample?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
-#spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/wms2.0?characterEncoding=utf8&serverTimezone=GMT%2b8
+spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/wms2.0?characterEncoding=utf8&serverTimezone=GMT%2b8
 
-spring.datasource.druid.master.username=softhuaheng
-spring.datasource.druid.master.password=HHrobot123.
-#spring.datasource.druid.master.username=root
-#spring.datasource.druid.master.password=123456
+#spring.datasource.druid.master.username=softhuaheng
+#spring.datasource.druid.master.password=HHrobot123.
+spring.datasource.druid.master.username=root
+spring.datasource.druid.master.password=123456
 # \u4ECE\u5E93
 #spring.datasource.druid.slave.open = true
 #spring.datasource.druid.slave.url=jdbc:mysql://172.16.29.45:3306/huaheng?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
diff --git a/src/main/resources/static/huaheng/js/huahengUI.js b/src/main/resources/static/huaheng/js/huahengUI.js
index f36dde4..40260c3 100644
--- a/src/main/resources/static/huaheng/js/huahengUI.js
+++ b/src/main/resources/static/huaheng/js/huahengUI.js
@@ -317,6 +317,10 @@
         },
         // 表单封装处理
     	form: {
+            reset: function(formId) {
+                var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
+                $("#" + currentId)[0].reset();
+            },
             // 获取选中复选框项
             selectCheckeds: function(name) {
             	var checkeds = "";
diff --git a/src/main/resources/templates/check/checkDetail/checkDetail.html b/src/main/resources/templates/check/checkDetail/checkDetail.html
index 567e70a..ccf7a4d 100644
--- a/src/main/resources/templates/check/checkDetail/checkDetail.html
+++ b/src/main/resources/templates/check/checkDetail/checkDetail.html
@@ -26,6 +26,7 @@
     var checkDetailStatus = [[${@dict.getType('checkDetailStatus')}]];
     var prefix = ctx + "check/checkDetail";
     var inventorySts = [[${@dict.getType('inventoryStatus')}]];
+    var prefix2 = ctx + "check/checkingRegister";
 
     $(function() {
         var options = {
@@ -173,6 +174,25 @@
             checkHeaderId : [[${id}]]
         };
     }
+
+    function detail(id, code) {
+        checkId = id;
+        var url = prefix2+"/" + id;
+        createtable();
+    }
+
+    function createtable() {
+        var url = prefix2+"/"+checkId;
+        $("#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");
+    }
+
 </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
index 0a23c26..80c3231 100644
--- a/src/main/resources/templates/check/checkHeader/checkHeader.html
+++ b/src/main/resources/templates/check/checkHeader/checkHeader.html
@@ -10,7 +10,7 @@
             <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>
-                <li><a href="#registration" data-toggle="tab" onclick="createTableRegistration()">质检登记</a></li>
+                <li><a href="#registration" data-toggle="tab">质检登记</a></li>
             </ul>
             <div id="myTabContent" class="tab-content">
                 <div class="tab-pane fade in active" id="tabHeader">
@@ -62,8 +62,57 @@
                 </div>
 
                 <div class="tab-pane fade" id="registration">
-                    <table id="bootstrap-table2" data-mobile-responsive="true"
-                           class="table table-bordered table-hover"></table>
+                    <div class="col-sm-12 select-info">
+                        <form id="registration-form">
+                            <div class="select-list">
+                                <ul>
+                                    <li>
+                                        质检单号:<input type="text" name="checkCode"/>
+                                    </li>
+                                    <li>
+                                        入库单号:<input type="text" name="receiptCode"/>
+                                    </li>
+                                    <li>
+                                        关联单号:<input type="text" name="referCode"/>
+                                    </li>
+                                    <li>
+                                        关联行号:<input type="text" name="referLineId"/>
+                                    </li>
+                                    <li>
+                                        物料编码:<input type="text" name="materialCode"/>
+                                    </li>
+                                    <li>
+                                        物料名称:<input type="text" name="materialName"/>
+                                    </li>
+                                    <li>
+                                        质检人:<input type="text" name="checkBy"/>
+                                    </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>
+                                        <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset('registration-form')"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                                    </li>
+                                </ul>
+                            </div>
+                        </form>
+                    </div>
+
+                    <div class="btn-group hidden-xs" id="toolbarReg" role="group">
+                        <a class="btn btn-outline btn-danger btn-rounded" onclick="complete()" shiro:hasPermission="check:checkingRegister:remove">
+                            <i class="fa fa-trash-o"></i> 质检完成
+                        </a>
+                        <a class="btn btn-outline btn-danger btn-rounded" onclick="$.operate.batRemove()" shiro:hasPermission="check:checkingRegister:remove">
+                            <i class="fa fa-trash-o"></i> 删除
+                        </a>
+                    </div>
+                    <div class="col-sm-12 select-info">
+                        <table id="bootstrap-table2" data-mobile-responsive="true" class="table table-bordered table-hover"></table>
+                    </div>
                 </div>
             </div>
         </div>
@@ -78,11 +127,16 @@
     var removeFlag = [[${@permission.hasPermi('check:checkHeader:remove')}]];
     var receiptTypes = [[${@receiptTypeService.getType()}]];
     var checkHeaderStatus = [[${@dict.getType('checkHeaderStatus')}]];
+    var checkDetailStatus = [[${@dict.getType('checkDetailStatus')}]];
+    var inventorySts = [[${@dict.getType('inventoryStatus')}]];
     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')}]];
     var checkId = 0;
+    var checkHeaderCode = 0;
+    var checkDetailId = 0;
+
     $(function() {
         var options = {
             url: prefix + "/list",
@@ -94,6 +148,7 @@
             search: false,
             sortName: "id",
             sortOrder: "desc",
+
             columns: [{
                 checkbox: true
             },
@@ -202,33 +257,381 @@
         $.table.init(options);
     });
 
+    //质检明细表格初始化
+    $("#bootstrap-table1").bootstrapTable({
+        url: prefix + "/list",
+        createUrl: prefix1 + "/add",
+        updateUrl: prefix1 + "/edit/{id}",
+        removeUrl: prefix1 + "/remove",
+        queryParams: queryParams,
+        modalName: "质检明细",
+        sortName: "lastUpdated",
+        sortOrder: "desc",
+        iconSize: "outline",
+        toolbar: "#toolbar1",
+        contentType: "application/x-www-form-urlencoded",
+        pagination: true,   // 是否显示分页(*)
+        pageNumber: 1,                                      // 初始化加载第一页,默认第一页
+        pageSize: 50,                                       // 每页的记录行数(*)
+        pageList: [10, 25, 50, 100],                        // 可供选择的每页的行数(*)
+        onRefresh: function(){
+            loadDetail();
+        },
+        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-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                    return actions.join('');
+                }
+            }],
+        onDblClickRow: function (row) {
+            if (typeof detail != 'undefined') {
+                detailReg(row.id)
+            }
+        }
+    });
+    //质检登记表格初始化
+    $("#bootstrap-table2").bootstrapTable({
+        contentType: "application/x-www-form-urlencoded",
+        editable: true,
+        clickEdit: true,
+        clickToSelect: true,
+        cache: false,
+        showToggle:true, //显示切换按钮来切换表/卡片视图。
+        showPaginationSwitch:false, //显示分页切换按钮
+        pagination: true,
+        idePagination: "server",
+        queryParamsType: "params",
+        pageList: [10,25,50],
+        pageNumber: 1,
+        uniqueId: "id",
+        toolbar: "#toolbarReg",
+        iconSize: 'outline',
+        showRefresh: true,
+        showColumns: true,
+        showExport: true,
+        smartDisplay:true,
+        url: prefix2 + "/list",
+        modalName: "质检报告",
+        method: "post",
+        search: false,
+        sortName: "id",
+        sortOrder: "desc",
+        sortable: true,
+        onRefresh: function(){
+            loadReg();
+        },
+        columns: [{
+            checkbox: true
+        },
+            {
+                field : 'id',
+                title : 'id'
+            },
+            {
+                field : 'checkDetailId',
+                title : '质检明细标识',
+                visible : false
+            },
+            {
+                field : 'checkHeaderId',
+                title : '头表标识',
+                visible : false
+            },
+            {
+                field : 'warehouseCode',
+                title : '仓库代码',
+                visible : false
+            },
+            {
+                field : 'checkCode',
+                title : '质检单号',
+                align:"center",
+                order:"asc",
+                sortable:"true"
+            },
+            {
+                field : 'receiptDetailId',
+                title : '入库单明细标识'  ,
+                visible:false
+            },
+            {
+                field : 'receiptCode',
+                title : '入库单号'
+            },
+            {
+                field : 'referCode',
+                title : '关联单号'
+            },
+            {
+                field : 'referLineId',
+                title : '关联行号'  ,
+                visible:false
+            },
+            {
+                field : 'referPlatform',
+                title : '关联平台'  ,
+                visible:false
+            },
+            {
+                field : 'materialCode',
+                title : '物料编码'
+            },
+            {
+                field : 'materialName',
+                title : '物料名称'
+            },
+            {
+                field : 'materialSpec',
+                title : '物料规格'
+            },
+            {
+                field : 'materialUnit',
+                title : '物料单位'
+            },
+            {
+                field : 'companyCode',
+                title : '货主编码'  ,
+                visible:false
+            },
+            {
+                field : 'inventorySts',
+                title : '库存状态',
+                align: 'center',
+                formatter: function (value, row, index) {
+                    return $.table.selectDictLabel(inventorySts, value);
+                }
+            },
+            {
+                field : 'qty',
+                title : '数量',
+                editable: {
+                    type: 'text',
+                    title: '数量',
+                    validate: function (v) {
+                        if (isNaN(v)) return '数量必须是数字';
+                        var age = parseInt(v);
+                        if (age < 0) return '数量必须是正整数';
+                    }
+                }
+            },
+            {
+                field : 'checkBy',
+                title : '质检人'
+            },
+            {
+                field : 'checkAt',
+                title : '质检时间'
+            },
+            {
+                field : 'created',
+                title : '创建时间'
+            },
+            {
+                field : 'createdBy',
+                title : '创建用户'
+            },
+            {
+                field : 'lastUpdated',
+                title : '更新时间'
+            },
+            {
+                field : 'lastUpdatedBy',
+                title : '更新用户'
+            },
+            {
+                field : 'userDef1',
+                title : '自定义字段1' ,
+                visible:false
+            },
+            {
+                field : 'userDef2',
+                title : '自定义字段2'  ,
+                visible:false
+            },
+            {
+                field : 'userDef3',
+                title : '自定义字段3'  ,
+                visible:false
+            }],
+        onClickRow: function (row, $element) {
+            curRow = row;
+        },
+        onEditableSave: function (field, row, oldValue, $el) {
+            $.ajax({
+                type: "post",
+                url: prefix2+"/edit",
+                data: row,
+                dataType: 'JSON',
+                success: function (data, status) {
+                    if (status != "success") {
+                        alert('提交数据失败');
+                    }
+                },
+                error: function () {
+                    alert('编辑失败');
+                },
+                complete: function () {
+                }
+            });
+        }
+    });
+    /* 质检单列表-详细 */
     function detail(id, code) {
         checkId = id;
-        var url = prefix1+"/" + id;
-        createtable(url);
-    }
-
-    function createtable(url) {
-        $("#tabDetail").children().remove();
+        checkHeaderCode = code;
         $("#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");
+        $("#tabHeader").removeClass("in active");
         $("#myTab li:eq(1)").addClass("active");
         $("#tabDetail").addClass("in active");
+        loadDetail();
     }
 
-    function createTableRegistration() {
-        url = prefix2+"/"+checkId;
-        $("#registration").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>';
-        $("#registration").append(str);
-        $(".tab-pane").removeClass("in active");
-        $("#myTab li:eq(1)").addClass("active");
+    function detailReg(id) {
+        checkDetailId = id;
+        $("#myTab li:eq(1)").removeClass("active");
+        $("#tabDetail").removeClass("in active");
+        $("#myTab li:eq(2)").addClass("active");
         $("#registration").addClass("in active");
+        loadReg();
+    }
+
+    /* 质检单列表-详细 */
+    function loadDetail() {
+        $.ajax({
+            url:prefix1+'/list',
+            type:"post",
+            data:{
+                checkHeaderId: checkId,
+            },
+            success:function (value) {
+                $("#bootstrap-table1").bootstrapTable('load',value.data);
+            }
+        });
+    }
+
+    /* 质检登记*/
+    function loadReg(params) {
+        $.ajax({
+            url:prefix2+'/list',
+            type:"post",
+            data:{
+                checkDetailId: checkDetailId
+            },
+            success:function (value) {
+                $("#bootstrap-table2").bootstrapTable('load',value.data);
+            }
+        });
     }
 
     function queryParams(params) {
@@ -242,8 +645,10 @@
         };
     };
 
-
-
+    function complete() {
+        var url = prefix1+"/complete";
+        $.operate.submit(url, "post", "json", data);
+    }
 </script>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/resources/templates/check/checkingRegister/checkingRegister.html b/src/main/resources/templates/check/checkingRegister/checkingRegister.html
index ba92336..22e3298 100644
--- a/src/main/resources/templates/check/checkingRegister/checkingRegister.html
+++ b/src/main/resources/templates/check/checkingRegister/checkingRegister.html
@@ -60,6 +60,7 @@
     var editFlag = [[${@permission.hasPermi('check:checkingRegister:edit')}]];
     var removeFlag = [[${@permission.hasPermi('check:checkingRegister:remove')}]];
     var inventorySts = [[${@dict.getType('inventoryStatus')}]];
+    var curRow = {};
     $(function() {
 
         $("#bootstrap-table").bootstrapTable({
@@ -70,12 +71,14 @@
             cache: false,
             showToggle:true, //显示切换按钮来切换表/卡片视图。
             showPaginationSwitch:true, //显示分页切换按钮
+            method: "post",
             queryParams: queryParams,
             pagination: true,
             pageList: [10,25,50,100],
             pageSize:10,
             pageNumber:1,
             uniqueId: "id",
+            toolbar: "#toolbar",
             showRefresh: true,
             minimumCountColumns: 2,
             smartDisplay:true,
@@ -97,7 +100,15 @@
                 {
                     field : 'checkDetailId',
                     title : '质检明细标识',
-                    visible : false
+                    editable: {
+                        type: 'text',
+                        title: '质检明细标识',
+                        validate: function (v) {
+                            if (isNaN(v)) return '必须是数字';
+                            var age = parseInt(v);
+                            if (age < 0) return '必须是正整数';
+                        }
+                    }
                 },
                 {
                     field : 'checkHeaderId',
@@ -114,15 +125,7 @@
                     title : '质检单号',
                     align:"center",
                     order:"asc",
-                    sortable:"true",
-                    editable: {
-                        type: 'text',
-                        title: '用户名',
-                        validate: function (v) {
-                            if (!v) return '用户名不能为空';
-
-                        }
-                    }
+                    sortable:"true"
                 },
                 {
                     field : 'receiptDetailId',
@@ -131,16 +134,7 @@
                 },
                 {
                     field : 'receiptCode',
-                    title : '入库单号',
-                    editable: {
-                        type: 'text',
-                        title: '入库单号',
-                        validate: function (v) {
-                            if (isNaN(v)) return '年龄必须是数字';
-                            var age = parseInt(v);
-                            if (age <= 0) return '年龄必须是正整数';
-                        }
-                    }
+                    title : '入库单号'
                 },
                 {
                     field : 'referCode',
@@ -158,7 +152,11 @@
                 },
                 {
                     field : 'materialCode',
-                    title : '物料编码'
+                    title : '物料编码',
+                    editable: {
+                        type: 'text',
+                        title: '物料编码',
+                    }
                 },
                 {
                     field : 'materialName',
@@ -181,13 +179,24 @@
                     field : 'inventorySts',
                     title : '库存状态',
                     align: 'center',
-                    formatter: function (value, row, index) {
-                        return $.table.selectDictLabel(inventorySts, value);
+                    editable: {
+                        type: 'select',
+                        title: '库存状态',
+                        source:[{value:"defective",text:"次品"},{value:"discussed",text:"待确认"},{value:"good",text:"良品"},{value:"scrap",text:"报废品"}]
                     }
                 },
                 {
                     field : 'qty',
-                    title : '数量'
+                    title : '数量',
+                    editable: {
+                        type: 'text',
+                        title: '数量',
+                        validate: function (v) {
+                            if (isNaN(v)) return '数量必须是数字';
+                            var age = parseInt(v);
+                            if (age < 0) return '数量必须是正整数';
+                        }
+                    }
                 },
                 {
                     field : 'checkBy',
@@ -231,25 +240,24 @@
             onClickRow: function (row, $element) {
                 curRow = row;
             },
-            onLoadSuccess: function (aa, bb, cc) {
-                $("#tb_user a").editable({
-                    url: function (params) {
-                        var sName = $(this).attr("name");
-                        curRow[sName] = params.value;
-                        $.ajax({
-                            type: 'POST',
-                            url: "/Editable/Edit",
-                            data: curRow,
-                            dataType: 'JSON',
-                            success: function (data, textStatus, jqXHR) {
-                                alert('保存成功!');
-                            },
-                            error: function () { alert("error");}
-                        });
+            onEditableSave: function (field, row, oldValue, $el) {
+                $.ajax({
+                    type: "post",
+                    url: prefix+"/edit",
+                    data: row,
+                    dataType: 'JSON',
+                    success: function (data, status) {
+                        if (status == "success") {
+                            alert('提交数据成功');
+                        }
+                    },
+                    error: function () {
+                        alert('编辑失败');
                     },
-                    type: 'text'
+                    complete: function () {
+                    }
                 });
-            },
+            }
             // onClickCell: function(field, value, row, $element) {
             //     $element.attr('contenteditable', true);
             //     $element.attr('bgcolor', "#FFF");
@@ -261,18 +269,7 @@
             //     })
             // },
         });
-        // $('#bootstrap-table').editable({
-        //     type: "select",              //编辑框的类型。支持text|textarea|select|date|checklist等
-        //     source: [{ value: 1, text: "开发部" }, { value: 2, text: "销售部" }, {value:3,text:"行政部"}],
-        //     title: "选择部门",           //编辑框的标题
-        //     disabled: false,           //是否禁用编辑
-        //     mode: "popup",            //编辑框的模式:支持popup和inline两种模式,默认是popup
-        //     validate: function (value) { //字段验证
-        //         if (!$.trim(value)) {
-        //             return '不能为空';
-        //         }
-        //     }
-        // });
+
         // var options = {
         //
         // };
@@ -282,6 +279,12 @@
 
     var checkHeaderId;
 
+    function addButton() {
+        if (checkHeaderId != ""){
+            $("#toolbar").append("<a class=\"btn btn-outline btn-success btn-rounded\" onclick=\"addRow()\" shiro:hasPermission=\"check:checkingRegister:add\"><i class=\"fa fa-plus\"></i>新增</a>");
+        }
+    }
+
     function queryParams(params) {
         var checkId = [[${checkId}]];
         if (checkId == 0) {
@@ -289,19 +292,13 @@
         } else {
             checkHeaderId = checkId;
         }
+        addButton();
         return {
             checkHeaderId :checkHeaderId,
             pageSize:       params.limit,
             pageNum:        params.offset / params.limit + 1,
             searchValue:    params.search,
         };
-        addButton();
-    }
-
-    function addButton() {
-        if (checkHeaderId != ""){
-            $("#toolbar").append("<a class=\"btn btn-outline btn-success btn-rounded\" onclick=\"addRow()\" shiro:hasPermission=\"check:checkingRegister:add\"><i class=\"fa fa-plus\"></i>新增</a>");
-        }
     }
 
     function addRow() {
@@ -310,9 +307,9 @@
             row: {
                 id: '',
                 checkDetailId: '',
-                checkHeaderId: '',
+                checkHeaderId: [[${checkHeaderId}]],
                 warehouseCode: '',
-                checkCode: '',
+                checkCode: [[${checkCode}]],
                 receiptDetailId: '',
                 receiptCode: '',
                 referCode: '',
diff --git a/src/main/resources/templates/include.html b/src/main/resources/templates/include.html
index cdaac58..b67955d 100644
--- a/src/main/resources/templates/include.html
+++ b/src/main/resources/templates/include.html
@@ -25,6 +25,7 @@
 	<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js}"></script>
 	<script th:src="@{/ajax/libs/bootstrap3-editable/js/bootstrap-editable.js}"></script>
 	<script th:src="@{/ajax/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js}"></script>
+	<script th:src="@{/ajax/libs/bootstrap-table/extensions/editable/bootstrap-table-editable.js}"></script>
 	<script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js}"></script>
 	<script th:src="@{/ajax/libs/bootstrap-table/extensions/toolbar/bootstrap-table-toolbar.min.js}"></script>
 	<!-- jquery-validate 表单验证插件 -->
diff --git a/src/main/resources/templates/inventory/cycleCountDetail/cycleCountDetail.html b/src/main/resources/templates/inventory/cycleCountDetail/cycleCountDetail.html
index 7231b96..8c9e175 100644
--- a/src/main/resources/templates/inventory/cycleCountDetail/cycleCountDetail.html
+++ b/src/main/resources/templates/inventory/cycleCountDetail/cycleCountDetail.html
@@ -88,10 +88,10 @@
                shiro:hasPermission="inventory:cycleCountDetail:add">
                 <i class="fa fa-plus"></i> 新增
             </a>
-            <!--<a class="btn btn-outline btn-danger btn-rounded" onclick="createCyclecountWithGapQty()"
+            <a class="btn btn-outline btn-danger btn-rounded" onclick="createCyclecountWithGapQty()"
                shiro:hasPermission="inventory:cyclecountDetail:cyclecountRepeat">
                 <i class="fa fa-vcard"></i> 差异复盘
-            </a>-->
+            </a>
             <a class="btn btn-outline btn-danger btn-rounded" onclick="outcheckAll()"
                shiro:hasPermission="inventory:cyclecountDetail:createTask">
                 <i class="fa fa-vcard"></i> 生成全部盘点任务