Commit b468da61443efed63ab4e19b1df455d8a4f27776

Authored by mahuandong
2 parents fd33a748 f6c7715c

Merge remote-tracking branch 'origin/develop' into develop

src/main/java/com/huaheng/pc/inventory/cycleCountDetail/controller/CycleCountDetailController.java
... ... @@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
34 34 import org.springframework.web.bind.annotation.ResponseBody;
35 35  
36 36 import javax.annotation.Resource;
  37 +import java.math.BigDecimal;
37 38 import java.util.Collections;
38 39 import java.util.List;
39 40  
... ... @@ -118,7 +119,6 @@ public class CycleCountDetailController extends BaseController {
118 119  
119 120 }
120 121  
121   -
122 122 /**
123 123 * 新增盘点明细
124 124 */
... ... @@ -215,10 +215,30 @@ public class CycleCountDetailController extends BaseController {
215 215 return cycleCountDetailService.createCycleCoutTaskByDetailId(cycleCoutdetailId);
216 216 }
217 217  
  218 + /**
  219 + *实盘登记
  220 + * @param detailId
  221 + * @param qty
  222 + * @return
  223 + */
  224 + //@RequiresPermissions("inventory:cyclecountDetail:confirm")
  225 + @PostMapping("/confirmGapQty")
  226 + @ResponseBody
  227 + public AjaxResult confirmGapQty(Integer detailId, BigDecimal qty){
  228 + return cycleCountDetailService.confirmGapQty(detailId,qty);
  229 + }
218 230  
219   -
220   -
221   -
  231 + /**
  232 + * 差异复盘
  233 + * @param cycleCountHeadCode
  234 + * @return
  235 + */
  236 + //@RequiresPermissions("inventory:cyclecountDetail:cyclecountRepeat")
  237 + @PostMapping("/createCyclecountWithGapQty")
  238 + @ResponseBody
  239 + public AjaxResult createCyclecountWithGapQty(String cycleCountHeadCode){
  240 + return cycleCountDetailService.createCyclecountWithGapQty(cycleCountHeadCode);
  241 + }
222 242  
223 243  
224 244  
... ...
src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailService.java
... ... @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
4 4 import com.huaheng.framework.web.domain.AjaxResult;
5 5 import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
6 6  
  7 +import java.math.BigDecimal;
7 8  
8 9  
9 10 public interface CycleCountDetailService extends IService<CycleCountDetail> {
... ... @@ -15,7 +16,11 @@ public interface CycleCountDetailService extends IService&lt;CycleCountDetail&gt; {
15 16  
16 17 AjaxResult createCycleCoutTaskByDetailId(Integer cycleCoutdetailId);
17 18  
  19 + AjaxResult confirmGapQty(Integer detailId, BigDecimal qty);
18 20  
  21 + void updataDetailStatus(Integer detailid,Integer status);
  22 +
  23 + AjaxResult createCyclecountWithGapQty(String cycleCountHeadCode);
19 24  
20 25  
21 26  
... ...
src/main/java/com/huaheng/pc/inventory/cycleCountDetail/service/CycleCountDetailServiceImpl.java
... ... @@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
23 23 import org.springframework.transaction.annotation.Transactional;
24 24  
25 25 import javax.annotation.Resource;
  26 +import java.math.BigDecimal;
26 27 import java.util.ArrayList;
27 28 import java.util.Date;
28 29 import java.util.List;
... ... @@ -46,6 +47,43 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
46 47  
47 48  
48 49  
  50 +
  51 +
  52 +
  53 +
  54 +
  55 + /**
  56 + * 执行任务修改状态为10
  57 + * @param detailid
  58 + */
  59 + @Transactional
  60 + @Override
  61 + public void updataDetailStatus(Integer detailid,Integer status) {
  62 + /*传入明细ID,状态,通过明细ID修改状态,并修改主单状态 */
  63 + if(detailid == null || status == null){
  64 + throw new ServiceException("明细ID或状态不能为空!");
  65 + }
  66 + CycleCountDetail cycleCountDetail = this.getById(detailid) ;//盘点明细单
  67 + cycleCountDetail.setEnableStatus(status);
  68 + cycleCountDetail.setLastUpdated(new Date());
  69 + cycleCountDetail.setLastUpdatedBy(ShiroUtils.getLoginName());//更新用户
  70 + //主单
  71 + CycleCountHeader cycleCountHeader = new CycleCountHeader();
  72 + cycleCountHeader.setCode(cycleCountDetail.getCycleCountHeadCode());
  73 + cycleCountHeader.setWarehouseCode(cycleCountDetail.getWarehouseCode());
  74 + cycleCountHeader.setCompanyCode(cycleCountDetail.getCompanyCode());
  75 + LambdaQueryWrapper<CycleCountHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(cycleCountHeader);
  76 + cycleCountHeader = cycleCountHeaderService.getOne(lambdaQueryWrapper);
  77 + if(cycleCountHeader.getStatusCyc() < 10 ){
  78 + //主单状态小于10则修改
  79 + cycleCountHeader.setStatusCyc(status); //主单状态
  80 + cycleCountHeaderService.saveOrUpdate(cycleCountHeader);
  81 + }
  82 + if(!this.saveOrUpdate(cycleCountDetail)){
  83 + throw new ServiceException("更新盘点执行状态失败!");
  84 + }
  85 + }
  86 +
49 87 /**
50 88 * 新增盘点明细
51 89 * */
... ... @@ -118,7 +156,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
118 156 return AjaxResult.success("生成盘点明细成功");
119 157 }
120 158  
121   -
122 159 /**
123 160 * 生成全部盘点任务
124 161 * @param cycleCountHeadCode
... ... @@ -196,7 +233,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
196 233 }
197 234  
198 235 //查询任务头和明细有相同容器,没有就新增任务头和明细
199   -
200 236 LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
201 237 taskHeaderLambdaQueryWrapper
202 238 .lt(TaskHeader::getStatus,100)
... ... @@ -207,12 +243,9 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
207 243 .eq(TaskHeader::getContainerCode,cycleCountDetail.getContainerCode());//容器
208 244 List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper);
209 245  
210   -
211 246 TaskHeader task = new TaskHeader();
212 247 TaskDetail taskDetail = new TaskDetail();
213   -
214 248 if(taskHeaderList.size() <= 0){
215   -
216 249 //存在相同容器的主任务直接加入该条主任务的明细
217 250 task.setWarehouseCode(ShiroUtils.getWarehouseCode());
218 251 task.setCompanyCode(cycleCountDetail.getCompanyCode());
... ... @@ -242,7 +275,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
242 275 taskDetail.setWarehouseCode(task.getWarehouseCode());
243 276 cycleCountDetail.setTaskHeaderId(task.getId()); //盘点明细修改状态task数据源
244 277 }else{
245   -
246 278 //取其中一条主单即可
247 279 TaskHeader taskHeader = taskHeaderList.get(0);
248 280 taskDetail.setTaskId(taskHeader.getId());//主单ID
... ... @@ -254,7 +286,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
254 286 taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
255 287 cycleCountDetail.setTaskHeaderId(taskHeader.getId());//盘点明细修改状态taskHeader数据源
256 288 }
257   -
258 289 taskDetail.setBillCode(cycleCountDetail.getCycleCountHeadCode());
259 290 taskDetail.setBillDetailId(cycleCountDetail.getId());
260 291 taskDetail.setMaterialCode(cycleCountDetail.getMaterialCode());
... ... @@ -273,7 +304,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
273 304 if(taskDetailService.save(taskDetail) == false){
274 305 throw new ServiceException("盘点任务明细生成失败!");
275 306 }
276   -
277 307 //修改细单状态
278 308 cycleCountDetail.setTaskHeaderId(taskDetail.getId());
279 309 //cycleCountDetail.setTaskHeaderId(task.getId());
... ... @@ -283,7 +313,6 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
283 313 cycleCountDetail.setTaskHeaderId(task.getId());
284 314 cycleCountDetail.setTaskDetailId(taskDetail.getId());
285 315 this.saveOrUpdate(cycleCountDetail);
286   -
287 316 //修改主单状态
288 317 CycleCountHeader cycleCountHeader = new CycleCountHeader();
289 318 cycleCountHeader.setCode(cycleCountDetail.getCycleCountHeadCode());
... ... @@ -296,6 +325,124 @@ public class CycleCountDetailServiceImpl extends ServiceImpl&lt;CycleCountDetailMap
296 325 return AjaxResult.success("盘点任务生成成功");
297 326 }
298 327  
  328 + /**
  329 + * 实盘登记
  330 + * 登记完成后,修改状态为15
  331 + * @param detailId
  332 + * @param qty
  333 + * @return
  334 + */
  335 + @Transactional
  336 + @Override
  337 + public AjaxResult confirmGapQty(Integer detailId, BigDecimal qty) {
  338 + CycleCountDetail cyclecountDetail = this.getById(detailId); //明细单据
  339 + CycleCountHeader cycleCountHeader =new CycleCountHeader();
  340 + cycleCountHeader.setWarehouseCode(cyclecountDetail.getWarehouseCode());
  341 + cycleCountHeader.setCompanyCode(cyclecountDetail.getCompanyCode());
  342 + cycleCountHeader.setCode(cyclecountDetail.getCycleCountHeadCode());
  343 + LambdaQueryWrapper<CycleCountHeader> cycleCountHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(cycleCountHeader);
  344 + cycleCountHeader = cycleCountHeaderService.getOne(cycleCountHeaderLambdaQueryWrapper); //主单
  345 + //任务执行后再实盘登记
  346 + if(cyclecountDetail.getEnableStatus() < 10){
  347 + return AjaxResult.error("盘点任务未执行不能登记数量!");
  348 + }
  349 + if(cyclecountDetail.getEnableStatus() == 100){
  350 + return AjaxResult.error("盘点任务完成后不能再登记数量!");
  351 + }
  352 + if(cycleCountHeader==null){
  353 + return AjaxResult.error("主单据不存在");
  354 + }
  355 + /*if(cyclecountDetail.getEnableStatus() == 10){
  356 + return AjaxResult.error("该条已调整,不能重复调整!");
  357 + }*/
  358 + if(qty.compareTo(new BigDecimal("0")) < 0){
  359 + return AjaxResult.error("实盘登记数不能小于0");
  360 + }
  361 + if(cyclecountDetail.getInventoryDetailId() != null){
  362 + InventoryDetail inventoryDetail = inventoryDetailService.getById(cyclecountDetail.getInventoryDetailId());
  363 + if (inventoryDetail == null) {
  364 + return AjaxResult.error("没有对应库存信息,请重建盘点单");
  365 + }
  366 + if(qty.compareTo(inventoryDetail.getTaskQty()) < 0){
  367 + return AjaxResult.error("登记数量不能小于任务分配数量");
  368 + }
  369 + }
  370 + cyclecountDetail.setCountedQty(qty);
  371 + cyclecountDetail.setGapQty(qty.subtract(cyclecountDetail.getSystemQty()));
  372 + cyclecountDetail.setEnableStatus(15);
  373 + cyclecountDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
  374 + cyclecountDetail.setLastUpdated(new Date());
  375 + this.saveOrUpdate(cyclecountDetail);
  376 + //修改主单状态
  377 + cycleCountHeaderService.updataHeaderStatus(cycleCountHeader.getCode());
  378 +
  379 + return AjaxResult.success("登记成功");
  380 + }
  381 +
  382 +
  383 + /**
  384 + * 差异复盘
  385 + * @param cycleCountHeaderCode
  386 + * @return
  387 + */
  388 + @Transactional
  389 + @Override
  390 + public AjaxResult createCyclecountWithGapQty(String cycleCountHeaderCode) {
  391 + /*找出实盘登记中数量有差异的,重新生成盘点单*/
  392 +
  393 +
  394 + CycleCountHeader cycleCountHeader = new CycleCountHeader();
  395 + cycleCountHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
  396 + cycleCountHeader.setCode(cycleCountHeaderCode);
  397 + LambdaQueryWrapper<CycleCountHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(cycleCountHeader);
  398 + cycleCountHeader = cycleCountHeaderService.getOne(lambdaQueryWrapper);//主单
  399 + if(cycleCountHeader == null){
  400 + return AjaxResult.error("盘点单不存在");
  401 + }
  402 + //不能重复生成,使用盘点单编码查找sourceCode源盘点单号,已存在就是重复
  403 + CycleCountHeader cy = new CycleCountHeader();
  404 + cy.setSourceCode(cycleCountHeader.getCode());
  405 + cy.setWarehouseCode(cycleCountHeader.getWarehouseCode());
  406 + cy.setCompanyCode(cycleCountHeader.getCompanyCode());
  407 + LambdaQueryWrapper<CycleCountHeader> lam = Wrappers.lambdaQuery(cy);
  408 + CycleCountHeader countHeader = cycleCountHeaderService.getOne(lam);
  409 + if(countHeader != null){
  410 + return AjaxResult.error("该单据已生成复盘单,请勿重复生成!");
  411 + }
  412 + CycleCountDetail cycleCountDetail = new CycleCountDetail();
  413 + cycleCountDetail.setTaskHeaderId(cycleCountHeader.getId());
  414 + cycleCountDetail.setWarehouseCode(cycleCountHeader.getWarehouseCode());
  415 + cycleCountDetail.setCompanyCode(cycleCountHeader.getCompanyCode());
  416 + LambdaQueryWrapper<CycleCountDetail> cycleCountDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
  417 + List<CycleCountDetail> cycleCountDetails = this.list(cycleCountDetailLambdaQueryWrapper);//明细
  418 + //生成复盘盘点主单
  419 + cycleCountHeader.setCode(cycleCountHeaderService.createCode());
  420 + cycleCountHeader.setRound(cycleCountHeader.getRound() + 1);//盘点轮次+1
  421 + cycleCountHeader.setCreated(new Date());
  422 + cycleCountHeader.setCreatedBy(ShiroUtils.getLoginName());
  423 + cycleCountHeader.setSourceCode(cycleCountHeaderCode);//源盘点单号
  424 + if(!cycleCountHeaderService.saveOrUpdate(cycleCountHeader)){
  425 + throw new ServiceException("复盘主单生成失败!");
  426 + }
  427 + //获取差异数量不为零的子单重新再生成盘点单
  428 + List<CycleCountDetail> cycleCountDetailList = new ArrayList<>();
  429 + for(CycleCountDetail item:cycleCountDetails){
  430 + //getGapQty不能为null默认值为0
  431 + int f = item.getGapQty().compareTo(BigDecimal.ZERO);
  432 + if(f > 0){
  433 + item.setCountedQty(null);
  434 + item.setGapQty(BigDecimal.ZERO);
  435 + item.setCreatedBy(ShiroUtils.getLoginName());
  436 + item.setCreated(new Date());
  437 + cycleCountDetailList.add(item);
  438 + }
  439 +
  440 + }
  441 + if(!this.saveBatch(cycleCountDetailList)){
  442 + throw new ServiceException("复盘明细子单生成失败");
  443 + }
  444 + return AjaxResult.success("生成复盘单成功!");
  445 + }
299 446  
300 447  
301 448  
... ...
src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
... ... @@ -312,10 +312,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
312 312 }
313 313  
314 314 /**
315   - * 下发WCS执行任务
316   - */
317   - /**
318   - *
  315 + *下发WCS执行任务
319 316 * 执行任务
320 317 * */
321 318 @Override
... ... @@ -324,6 +321,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
324 321 TaskHeader task = null;
325 322 for (Integer taskId : taskIds) {
326 323 task = taskHeaderService.getById(taskId);
  324 +
327 325 if (task.getStatus() > 9) {
328 326 return AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
329 327 }
... ... @@ -335,17 +333,25 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
335 333 task.setLastUpdatedBy(ShiroUtils.getLoginName());
336 334 taskHeaderService.saveOrUpdate(task);
337 335 //修改任务明细状态
338   - TaskDetail record = new TaskDetail();
339   - record.setStatus(10);
340   - record.setLastUpdated(new Date());
341   - record.setLastUpdatedBy(ShiroUtils.getLoginName());
342   - record.setProcessStamp("100");
343   - taskDetailService.updateById(record);
344   - LambdaUpdateWrapper<TaskDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
345   - lambdaUpdateWrapper.eq(TaskDetail::getTaskId, task.getId());
346   - if (!taskDetailService.update(record, lambdaUpdateWrapper)){
  336 + LambdaQueryWrapper<TaskDetail> lambdaWrapper = Wrappers.lambdaQuery();
  337 + lambdaWrapper.eq(TaskDetail::getTaskId, task.getId());
  338 + List<TaskDetail> taskDetailList = taskDetailService.list(lambdaWrapper);
  339 + List<TaskDetail> taskDetails = new ArrayList<>();
  340 + for (TaskDetail item:taskDetailList){
  341 + item.setStatus(10);
  342 + item.setLastUpdated(new Date());
  343 + item.setLastUpdatedBy(ShiroUtils.getLoginName());
  344 + item.setProcessStamp("100");
  345 + taskDetails.add(item);
  346 + //盘点执行修改盘点单据状态为10
  347 + if(task.getTaskType() == 700){
  348 + cycleCountDetailService.updataDetailStatus(item.getBillDetailId(),10);
  349 + }
  350 + }
  351 + if (!taskDetailService.saveOrUpdateBatch(taskDetails)){
347 352 throw new ServiceException("更新任务明细失败");
348 353 }
  354 +
349 355 // //修改入库明细
350 356 // if (task.getInternalTaskType()==100){
351 357 // ReceiptDetail receiptDetail = receiptDetailService.queryflow(receiptDetailService.getById(record.getId()));
... ... @@ -387,7 +393,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
387 393  
388 394  
389 395 }
390   - return AjaxResult.success("下发任务成功", task);
  396 + return AjaxResult.success("执行下发任务成功", task);
391 397 }
392 398  
393 399 @Override
... ... @@ -416,7 +422,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
416 422 * 完成任务
417 423 *
418 424 * @param task
419   - * @throws Exception
420 425 */
421 426 @Transactional
422 427 public void completeTask(TaskHeader task) {
... ... @@ -429,7 +434,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
429 434 // 出库任务
430 435 completeShipmentTask(task);
431 436 }
432   - // 900 出库查看,包过空托出库查看
  437 + // 900 出库查看,空托出库查看
433 438 if ( task.getTaskType() == 900) {
434 439 completeSeeOutTask(task);
435 440 }
... ... @@ -1004,10 +1009,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
1004 1009 @Transactional
1005 1010 public void completeEmptyIn(TaskHeader taskHeader) {
1006 1011  
1007   - //解锁容器,更新库位
1008   - containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(),taskHeader.getToLocation(),"empty");
1009   - //解锁库位,更新容器
1010   - locationService.updateContainerCodeAndStatus(taskHeader.getToLocation(),taskHeader.getContainerCode(),"empty");
1011 1012 //完成任务,修改主单和明细状态
1012 1013 taskHeader.setStatus(100);
1013 1014 taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
... ... @@ -1026,9 +1027,14 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
1026 1027 item.setLastUpdated(new Date()); //更新时间
1027 1028 taskDetailList.add(item);
1028 1029 }
1029   - if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false || taskHeaderService.saveOrUpdate(taskHeader) == false) {
  1030 + if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false ||
  1031 + taskHeaderService.saveOrUpdate(taskHeader) == false) {
1030 1032 throw new ServiceException("任务单据状态更新失败!");
1031 1033 }
  1034 + //解锁容器,更新库位
  1035 + containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(),taskHeader.getToLocation(),"empty");
  1036 + //解锁库位,更新容器
  1037 + locationService.updateContainerCodeAndStatus(taskHeader.getToLocation(),taskHeader.getContainerCode(),"empty");
1032 1038  
1033 1039 }
1034 1040  
... ... @@ -1038,10 +1044,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
1038 1044 */
1039 1045 @Transactional
1040 1046 public void completeEmptyOut(TaskHeader taskHeader) {
1041   - //更新货位
1042   - locationService.updateContainerCodeAndStatus(taskHeader.getFromLocation(), "", "empty");
1043   - //更新容器信息
1044   - containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(), "", "empty");
1045 1047  
1046 1048 taskHeader.setStatus(100);
1047 1049 taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
... ... @@ -1063,6 +1065,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl&lt;TaskHeaderMapper, TaskHea
1063 1065 if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false || taskHeaderService.saveOrUpdate(taskHeader) == false) {
1064 1066 throw new ServiceException("任务单据状态更新失败!");
1065 1067 }
  1068 + //更新货位
  1069 + locationService.updateContainerCodeAndStatus(taskHeader.getFromLocation(), "", "empty");
  1070 + //更新容器信息
  1071 + containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(), "", "empty");
  1072 +
1066 1073 }
1067 1074  
1068 1075 /**
... ...
src/main/resources/templates/inventory/cycleCountDetail/cycleCountDetail.html
... ... @@ -88,10 +88,10 @@
88 88 shiro:hasPermission="inventory:cycleCountDetail:add">
89 89 <i class="fa fa-plus"></i> 新增
90 90 </a>
91   - <!--<a class="btn btn-outline btn-danger btn-rounded" onclick="createCyclecountWithGapQty()"
  91 + <a class="btn btn-outline btn-danger btn-rounded" onclick="createCyclecountWithGapQty()"
92 92 shiro:hasPermission="inventory:cyclecountDetail:cyclecountRepeat">
93 93 <i class="fa fa-vcard"></i> 差异复盘
94   - </a>-->
  94 + </a>
95 95 <a class="btn btn-outline btn-danger btn-rounded" onclick="outcheckAll()"
96 96 shiro:hasPermission="inventory:cyclecountDetail:createTask">
97 97 <i class="fa fa-vcard"></i> 生成全部盘点任务
... ...