|  |  | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.baomidou.mybatisplus.mapper.Wrapper; | 
 |  |  | import com.baomidou.mybatisplus.plugins.Page; | 
 |  |  | import com.core.common.*; | 
 |  |  | import com.core.exception.CoolException; | 
 |  |  | import com.zy.asrs.entity.*; | 
 |  |  | import com.zy.asrs.entity.param.*; | 
 |  |  | import com.zy.asrs.mapper.ManLocDetlMapper; | 
 |  |  | import com.zy.asrs.mapper.MatMapper; | 
 |  |  | import com.zy.asrs.mapper.OrderDetlMapper; | 
 |  |  | import com.zy.asrs.service.*; | 
 |  |  | import com.zy.asrs.task.core.ReturnT; | 
 |  |  | import com.zy.asrs.utils.MatUtils; | 
 |  |  | import com.zy.asrs.utils.PostMesDataUtils; | 
 |  |  | import com.zy.common.CodeRes; | 
 |  |  | import com.zy.common.constant.MesConstant; | 
 |  |  | import com.zy.common.entity.Parameter; | 
 |  |  | import com.zy.common.model.DetlDto; | 
 |  |  | import com.zy.common.model.LocTypeDto; | 
 |  |  | import com.zy.common.model.MesCombParam; | 
 |  |  | import com.zy.common.model.StartupDto; | 
 |  |  | import com.zy.common.model.enums.WorkNoType; | 
 |  |  | import com.zy.common.service.CommonService; | 
 |  |  | import com.zy.common.utils.HttpHandler; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import javax.annotation.Resource; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 移动端服务核心类 | 
 |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private MatService matService; | 
 |  |  |     @Autowired | 
 |  |  |     private MatMapper matMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private WaitPakinService waitPakinService; | 
 |  |  |     @Autowired | 
 |  |  | 
 |  |  |     private TagService tagService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasBoxTypeService basBoxTypeService; | 
 |  |  |     @Autowired | 
 |  |  |     private WrkMastLogService wrkMastLogService; | 
 |  |  |  | 
 |  |  |     @Resource | 
 |  |  |     private OpenServiceImpl openServiceImpl; | 
 |  |  |  | 
 |  |  |     @Resource | 
 |  |  |     private OrderDetlMapper orderDetlMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  | 
 |  |  |         } | 
 |  |  |         List<String> orderBoxNoList = new ArrayList<>(); | 
 |  |  |         for (OrderDetl orderDetl: orderDetls){ | 
 |  |  |             if (orderDetl.getWorkQty()==0){ | 
 |  |  |             if (orderDetl.getWorkQty().equals(0.0)){ | 
 |  |  |                 orderBoxNoList.add(orderDetl.getBatch()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |             if (!orderBoxNoList.contains(matList.getBatch())){ | 
 |  |  |                 throw new CoolException("单号:"+param.getOrderNo()+" 箱号:"+matList.getBatch()+"不属于此订单或者已经入库"); | 
 |  |  |             }else { | 
 |  |  |                 matListBoxNoList.add(matList.getBoxNo()); | 
 |  |  |                 matListBoxNoList.add(matList.getBatch()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         List<OrderDetl> orderDetlList = new ArrayList<>(); | 
 |  |  | 
 |  |  |                 throw new CoolException("规格:"+matList.getMatnr()+"、参数:毛重 roughWeight为空"); | 
 |  |  |             }else if (Cools.isEmpty(matList.getRollExtent()) || matList.getRollExtent().equals(0D)){ | 
 |  |  |                 throw new CoolException("规格:"+matList.getMatnr()+"、参数:卷长度 rollExtent为空"); | 
 |  |  |             }else if (Cools.isEmpty(matList.getJoint()) || matList.getJoint()==0){ | 
 |  |  |                 throw new CoolException("规格:"+matList.getMatnr()+"、参数:接头 joint为空"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (matList.getPosition().equals("1")){//1、左  2、右 | 
 |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public R pakoutFhqr(PdckqrParam param) { | 
 |  |  |  | 
 |  |  |          // 获取工作档 | 
 |  |  |         WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode",param.getBarcode())); | 
 |  |  |         if (wrkMast == null) { | 
 |  |  |             throw new CoolException("工作档不存在:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |         if (wrkMast.getWrkSts() != 20) { | 
 |  |  |             throw new CoolException(wrkMast.getWrkNo() + ",工作档类型:" + wrkMast.getIoType() + "工作状态:" + wrkMast.getWrkSts() + ",不匹配"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo()); | 
 |  |  |         List<PdckqrParam.Material> materials = param.getMaterials(); | 
 |  |  |  | 
 |  |  |         boolean isFullyCancelled = compareAndCheckCancellation(wrkDetls, materials); | 
 |  |  |         if (isFullyCancelled) { | 
 |  |  |                 // 复核确认,更新状态为15出库完成更新 | 
 |  |  |                 wrkMast.setWrkSts(14L); | 
 |  |  |                 wrkMastService.updateById(wrkMast); | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("出口复核失败"); | 
 |  |  |         } | 
 |  |  |         return R.ok("出口复核成功"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public R pdckqr(PdckqrParam param) { | 
 |  |  |         WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode",param.getBarcode())); | 
 |  |  |         if (wrkMast == null) { | 
 |  |  |             throw new CoolException("工作档不存在:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |         if (wrkMast.getIoType() != 107 || wrkMast.getWrkSts() != 2) { | 
 |  |  |             throw new CoolException(wrkMast.getWrkNo() + ":工作状态不匹配"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo()); | 
 |  |  |         List<PdckqrParam.Material> materials = param.getMaterials(); | 
 |  |  |  | 
 |  |  |         boolean isFullyCancelled = compareAndCheckCancellation(wrkDetls, materials); | 
 |  |  |         // todo 两箱盘两箱需要确定位置没错 | 
 |  |  |  | 
 |  |  |         if (isFullyCancelled) { // 盘点物料确成功,工作档转换 盘点出库->盘点再入库,下发回库命令 | 
 |  |  |             // 保存工作主档历史档 | 
 |  |  |             if (!wrkMastLogService.save(wrkMast.getWrkNo())) { | 
 |  |  |                 throw new CoolException("保存工作主档历史档失败"); | 
 |  |  |             } | 
 |  |  |             // 获取目标站 | 
 |  |  |             Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() | 
 |  |  |                     .eq("type_no", wrkMast.getIoType() - 50) | 
 |  |  |                     .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站 | 
 |  |  |                     .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 | 
 |  |  |             StaDesc staDesc = staDescService.selectOne(wrapper); | 
 |  |  |             if (Cools.isEmpty(staDesc)) { | 
 |  |  |                 throw new CoolException("入库路径不存在"); | 
 |  |  |             } | 
 |  |  |             Date now = new Date(); | 
 |  |  |             // 堆垛机站点(目标站) | 
 |  |  |             Integer staNo = staDesc.getCrnStn(); | 
 |  |  |             // 更新工作档数据状态 | 
 |  |  |             wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 | 
 |  |  |             wrkMast.setWrkSts(14L); // 工作状态: 14.已出库未确认 | 
 |  |  |             wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 | 
 |  |  |             wrkMast.setStaNo(staNo); // 目标站 | 
 |  |  |             wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 | 
 |  |  |             wrkMast.setSourceLocNo(""); // 源库位清空 | 
 |  |  |             wrkMast.setModiTime(now); | 
 |  |  |             if (!wrkMastService.updateById(wrkMast)) { | 
 |  |  |                 throw new CoolException("更新工作档数据状态失败"); | 
 |  |  |             } | 
 |  |  |             // 修改库位状态 Q.拣料/盘点/并板再入库 | 
 |  |  |             LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  |             locMast.setLocSts("Q"); | 
 |  |  |             locMast.setModiTime(now); | 
 |  |  |             if (!locMastService.updateById(locMast)) { | 
 |  |  |                 throw new CoolException("修改库位状态失败"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 推送给gwcs执行命令 | 
 |  |  |             openServiceImpl.pushStaNoToGwcs(wrkMast.getSourceStaNo(),wrkMast.getStaNo(),wrkMast.getWrkNo(),wrkMast.getBarcode(),"盘点确认成功推送gwcs"); | 
 |  |  |  | 
 |  |  |             return R.ok("盘点确认成功"); | 
 |  |  |  | 
 |  |  |         } else { // 物料不一致 | 
 |  |  |             // 不一致的处理处理方法:弹出调整界面 | 
 |  |  |  | 
 |  |  | //            重新扫描实物上面的码进行调整 | 
 |  |  | //            实物在库存里面的地方清空,任务所在库存清空 | 
 |  |  | //            将实物和当前托盘位置和库位绑定 | 
 |  |  | //            一个木箱情况直接调整 | 
 |  |  | //            两个木箱出两个 都调整 | 
 |  |  | //            两个木箱出一个 调整一个 | 
 |  |  | //            工作档标记异常->回库 | 
 |  |  |  | 
 |  |  |             return R.error("盘点确认异常"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public R pdaWarehousingNow(PdaWarehousingNowParam param, Long userId) { | 
 |  |  |  | 
 |  |  |         String barcode = param.getBarcode(); | 
 |  |  |         Integer sourceStaNo = param.getSourceStaNo(); | 
 |  |  |  | 
 |  |  |         int zpalletCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", barcode)); | 
 |  |  |         if (zpalletCount > 0) { | 
 |  |  |             throw new CoolException("库存托盘码已存在:" + barcode); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         int barcodeCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", barcode)); | 
 |  |  |         if (barcodeCount > 0) { | 
 |  |  |             throw new CoolException("工作档已存在该托盘码:" + barcode); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Map<String, List<PdaWarehousingNowParam.Roll>> boxGroup = param.getBoxGroup(); | 
 |  |  |         List<PdaWarehousingNowParam.Roll> leftPosList = boxGroup.get("左"); | 
 |  |  |         List<PdaWarehousingNowParam.Roll> centrePosList = boxGroup.get("中"); | 
 |  |  |         List<PdaWarehousingNowParam.Roll> rightPosList = boxGroup.get("右"); | 
 |  |  |  | 
 |  |  |         // 根据箱号获取包装组号 | 
 |  |  |         List<String> boxNoList = leftPosList.stream().map(PdaWarehousingNowParam.Roll::getBoxNo).distinct().collect(Collectors.toList()); | 
 |  |  |         boxNoList.addAll(centrePosList.stream().map(PdaWarehousingNowParam.Roll::getBoxNo).distinct().collect(Collectors.toList())); | 
 |  |  |         boxNoList.addAll(rightPosList.stream().map(PdaWarehousingNowParam.Roll::getBoxNo).distinct().collect(Collectors.toList())); | 
 |  |  |         Map<String, String> map = new HashMap<>(); | 
 |  |  | //        if (boxNoList.size() > 0) { | 
 |  |  | //             map = getPackageGroupNoByGwms(boxNoList); | 
 |  |  | //        } | 
 |  |  |  | 
 |  |  |         LocTypeDto locTypeDto = new LocTypeDto(); | 
 |  |  |         locTypeDto.setLocType1((short)1); | 
 |  |  |  | 
 |  |  |         // 根据源站点寻找库位 | 
 |  |  |         StartupDto dto = commonService.getLocNo(1, sourceStaNo, locTypeDto,0); | 
 |  |  |  | 
 |  |  |         int workNo = dto.getWorkNo(); | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // 生成工作档 | 
 |  |  |         WrkMast wrkMast = new WrkMast(); | 
 |  |  |         wrkMast.setWrkNo(workNo); | 
 |  |  |         wrkMast.setIoTime(new Date()); | 
 |  |  |         wrkMast.setWrkSts(1L); // 工作状态:1.生成入库id | 
 |  |  |         wrkMast.setIoType(1); // 入出库状态:1.入库 | 
 |  |  |         wrkMast.setIoPri(13D); // 优先级 | 
 |  |  |         wrkMast.setCrnNo(dto.getCrnNo()); | 
 |  |  |         wrkMast.setSourceStaNo(dto.getSourceStaNo()); | 
 |  |  |         wrkMast.setStaNo(dto.getStaNo()); | 
 |  |  |         wrkMast.setLocNo(dto.getLocNo()); | 
 |  |  |         wrkMast.setBarcode(barcode); // 托盘码 | 
 |  |  |         wrkMast.setFullPlt("Y"); // 满板:Y | 
 |  |  |         wrkMast.setPicking("N"); // 拣料 | 
 |  |  |         wrkMast.setExitMk("N"); // 退出 | 
 |  |  |         wrkMast.setEmptyMk("N"); // 空板 | 
 |  |  |         wrkMast.setLinkMis("Y"); | 
 |  |  |         wrkMast.setCtnType(1); // 容器类型 | 
 |  |  |         // 操作人员数据 | 
 |  |  |         wrkMast.setAppeTime(now); | 
 |  |  |         wrkMast.setModiTime(now); | 
 |  |  |         wrkMast.setAppeUser(userId); | 
 |  |  |         wrkMast.setModiUser(userId); | 
 |  |  |         boolean res = wrkMastService.insert(wrkMast); | 
 |  |  |         if (!res) { | 
 |  |  |             throw new CoolException("保存工作档失败"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         for (PdaWarehousingNowParam.Roll roll: leftPosList) { | 
 |  |  |             WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |             wrkDetl.setWrkNo(workNo); | 
 |  |  |             wrkDetl.setMatnr(roll.getSpecs()); // 规格 | 
 |  |  |             wrkDetl.setMaktx(roll.getSpecs()); //规格 | 
 |  |  |             wrkDetl.setBatch(roll.getBoxNo()); // 箱号 | 
 |  |  |             wrkDetl.setModel(roll.getRollNo()); // 卷号 | 
 |  |  |             wrkDetl.setBrand(map.get(roll.getBoxNo()) == null ? "" : map.get(roll.getBoxNo())); // 包装组号 | 
 |  |  |             wrkDetl.setZpallet(barcode); // 托盘吗 | 
 |  |  |             wrkDetl.setOrigin("左"); // 木箱在托盘位置 | 
 |  |  |             wrkDetl.setWeight(roll.getNetWeight()); // 净重 | 
 |  |  |             wrkDetl.setVolume(roll.getGrossWeight()); // 毛重 | 
 |  |  |             wrkDetl.setPrice(roll.getLength()); | 
 |  |  |             wrkDetl.setSpecs(String.valueOf(roll.getSplices())); | 
 |  |  |             wrkDetl.setAnfme(1.0); | 
 |  |  |             wrkDetl.setIoTime(now); | 
 |  |  |             wrkDetl.setAppeTime(now); | 
 |  |  |             wrkDetl.setModiTime(now); | 
 |  |  |             wrkDetl.setAppeUser(userId); | 
 |  |  |             wrkDetl.setModiUser(userId); | 
 |  |  |             if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                 throw new CoolException("保存工作明细失败"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         for (PdaWarehousingNowParam.Roll roll: centrePosList) { | 
 |  |  |             WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |             wrkDetl.setWrkNo(workNo); | 
 |  |  |             wrkDetl.setMatnr(roll.getSpecs()); // 规格 | 
 |  |  |             wrkDetl.setMaktx(roll.getSpecs()); //规格 | 
 |  |  |             wrkDetl.setBatch(roll.getBoxNo()); // 箱号 | 
 |  |  |             wrkDetl.setModel(roll.getRollNo()); // 卷号 | 
 |  |  |             wrkDetl.setBrand(map.get(roll.getBoxNo()) == null ? "" : map.get(roll.getBoxNo())); // 包装组号 | 
 |  |  |             wrkDetl.setZpallet(barcode); // 托盘吗 | 
 |  |  |             wrkDetl.setOrigin("中"); // 木箱在托盘位置 | 
 |  |  |             wrkDetl.setWeight(roll.getNetWeight()); // 净重 | 
 |  |  |             wrkDetl.setVolume(roll.getGrossWeight()); // 毛重 | 
 |  |  |             wrkDetl.setPrice(roll.getLength()); | 
 |  |  |             wrkDetl.setSpecs(String.valueOf(roll.getSplices())); | 
 |  |  |             wrkDetl.setAnfme(1.0); | 
 |  |  |             wrkDetl.setIoTime(now); | 
 |  |  |             wrkDetl.setAppeTime(now); | 
 |  |  |             wrkDetl.setModiTime(now); | 
 |  |  |             wrkDetl.setAppeUser(userId); | 
 |  |  |             wrkDetl.setModiUser(userId); | 
 |  |  |             if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                 throw new CoolException("保存工作明细失败"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         for (PdaWarehousingNowParam.Roll roll: rightPosList) { | 
 |  |  |             WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |             wrkDetl.setWrkNo(workNo); | 
 |  |  |             wrkDetl.setMatnr(roll.getSpecs()); // 规格 | 
 |  |  |             wrkDetl.setMaktx(roll.getSpecs()); //规格 | 
 |  |  |             wrkDetl.setBatch(roll.getBoxNo()); // 箱号 | 
 |  |  |             wrkDetl.setModel(roll.getRollNo()); // 卷号 | 
 |  |  |             wrkDetl.setBrand(map.get(roll.getBoxNo()) == null ? "" : map.get(roll.getBoxNo())); // 包装组号 | 
 |  |  |             wrkDetl.setZpallet(barcode); // 托盘吗 | 
 |  |  |             wrkDetl.setOrigin("右"); // 木箱在托盘位置 | 
 |  |  |             wrkDetl.setWeight(roll.getNetWeight()); // 净重 | 
 |  |  |             wrkDetl.setVolume(roll.getGrossWeight()); // 毛重 | 
 |  |  |             wrkDetl.setPrice(roll.getLength()); | 
 |  |  |             wrkDetl.setSpecs(String.valueOf(roll.getSplices())); | 
 |  |  |             wrkDetl.setAnfme(1.0); | 
 |  |  |             wrkDetl.setIoTime(now); | 
 |  |  |             wrkDetl.setAppeTime(now); | 
 |  |  |             wrkDetl.setModiTime(now); | 
 |  |  |             wrkDetl.setAppeUser(userId); | 
 |  |  |             wrkDetl.setModiUser(userId); | 
 |  |  |             if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                 throw new CoolException("保存工作明细失败"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 更新目标库位状态 | 
 |  |  |         LocMast locMast = locMastService.selectById(dto.getLocNo()); | 
 |  |  |         if (locMast.getLocSts().equals("O")){ | 
 |  |  |             locMast.setLocSts("S"); // S.入库预约 | 
 |  |  |             locMast.setModiTime(now); | 
 |  |  |             if (!locMastService.updateById(locMast)){ | 
 |  |  |                 throw new CoolException("改变库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException(dto.getLocNo()+"目标库位已被占用"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 推送GWCS目标消息 | 
 |  |  |         openServiceImpl.pushStaNoToGwcs(sourceStaNo,dto.getStaNo(),dto.getWorkNo(),barcode,"pda组托立即入库推送gwcs"); | 
 |  |  |         return R.ok("入库启动成功"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public R pdaFxprk(GwmsGenerateInventoryDto param, Long userId) { | 
 |  |  |  | 
 |  |  |         if (Cools.isEmpty(param,param.getMatList())) { | 
 |  |  |             throw new CoolException("请求参数不能为空:" + param); | 
 |  |  |         } | 
 |  |  |         if (Cools.isEmpty(param.getBarcode())) { | 
 |  |  |             throw new CoolException("条码不能为空:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         int zpalletCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode())); | 
 |  |  |         if (zpalletCount > 0) { | 
 |  |  |             throw new CoolException("库存托盘码已存在:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         int barcodeCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode())); | 
 |  |  |         if (barcodeCount > 0) { | 
 |  |  |             throw new CoolException("工作档已存在该托盘码:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         LocTypeDto locTypeDto = new LocTypeDto(); | 
 |  |  |         locTypeDto.setLocType1((short) 1); | 
 |  |  |         int iotype = 1; | 
 |  |  |         if (Cools.isEmpty(param.getMatList())) { | 
 |  |  |             iotype = 10; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 根据源站点寻找库位 | 
 |  |  |         StartupDto dto = commonService.getLocNo(iotype, param.getPalletizingNo(), locTypeDto, 0); | 
 |  |  |  | 
 |  |  |         int workNo = dto.getWorkNo(); | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // 生成工作档 | 
 |  |  |         WrkMast wrkMast = new WrkMast(); | 
 |  |  |         wrkMast.setWrkNo(workNo); | 
 |  |  |         wrkMast.setWhsType(1); // 返修入库标识 | 
 |  |  |         wrkMast.setIoTime(new Date()); | 
 |  |  |         wrkMast.setWrkSts(1L); // 工作状态:设备上走 | 
 |  |  |         wrkMast.setIoType(iotype); // 入出库状态:1.入库 | 
 |  |  |         wrkMast.setIoPri(13D); // 优先级 | 
 |  |  |         wrkMast.setCrnNo(dto.getCrnNo()); | 
 |  |  |         wrkMast.setSourceStaNo(param.getPalletizingNo()); | 
 |  |  |         wrkMast.setStaNo(dto.getStaNo()); | 
 |  |  |         wrkMast.setLocNo(dto.getLocNo()); | 
 |  |  |         wrkMast.setBarcode(param.getBarcode()); // 托盘码 | 
 |  |  |         wrkMast.setFullPlt("Y"); // 满板:Y | 
 |  |  |         wrkMast.setPicking("N"); // 拣料 | 
 |  |  |         wrkMast.setExitMk("N"); // 退出 | 
 |  |  |         wrkMast.setEmptyMk("N"); // 空板 | 
 |  |  |         wrkMast.setLinkMis("Y"); | 
 |  |  |         wrkMast.setCtnType(1); // 容器类型 | 
 |  |  |         // 操作人员数据 | 
 |  |  |         wrkMast.setAppeTime(now); | 
 |  |  |         wrkMast.setAppeUser(userId); | 
 |  |  |         wrkMast.setModiTime(now); | 
 |  |  |         wrkMast.setModiUser(userId); | 
 |  |  |         wrkMastService.insert(wrkMast); | 
 |  |  |  | 
 |  |  |         if (!Cools.isEmpty(param.getMatList())) { | 
 |  |  |             List<GwmsGenerateInventoryDto.MatList> matList = param.getMatList(); | 
 |  |  |             List<String> groupNos = new ArrayList<>(); | 
 |  |  |             for (GwmsGenerateInventoryDto.MatList obj : matList) { | 
 |  |  |                 WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |                 wrkDetl.setWrkNo(wrkMast.getWrkNo()); | 
 |  |  |                 obj.getRolls().forEach(roll -> { | 
 |  |  |                     wrkDetl.setWrkNo(wrkMast.getWrkNo()); | 
 |  |  |                     wrkDetl.setMatnr(roll.getSpecs()); // 规格 | 
 |  |  |                     wrkDetl.setMaktx(roll.getSpecs()); //规格 | 
 |  |  |                     wrkDetl.setUnit(roll.getBoxNo()); // 箱号 | 
 |  |  |                     wrkDetl.setModel(roll.getRollNo()); // 卷号 | 
 |  |  |                     wrkDetl.setBrand(obj.getPackageGroupNo()); // 包装组号 | 
 |  |  |                     wrkDetl.setZpallet(param.getBarcode()); // 托盘码 | 
 |  |  |                     wrkDetl.setBarcode(param.getBarcode()); | 
 |  |  |                     wrkDetl.setOrigin(obj.getBoxPos()); // 木箱在托盘位置 | 
 |  |  |                     wrkDetl.setColor(obj.getBoxType()); // 木箱类型 | 
 |  |  |                     wrkDetl.setManu(obj.getRollType()); // 管芯类型 | 
 |  |  |                     wrkDetl.setSku(obj.getWideInWidth()); // 实测宽幅 | 
 |  |  |                     wrkDetl.setItemNum(obj.getThickness()); // 生箔厚度 | 
 |  |  |                     wrkDetl.setManuDate(roll.getFqTime()); // 分切下料时间 | 
 |  |  |                     wrkDetl.setWeight(roll.getNetWeight()); // 净重 | 
 |  |  |                     wrkDetl.setVolume(roll.getGrossWeight()); // 毛重 | 
 |  |  |                     wrkDetl.setLength(roll.getLength()); // 长度 | 
 |  |  |                     wrkDetl.setSpecs(String.valueOf(roll.getSplices())); // 接头 | 
 |  |  |                     wrkDetl.setAnfme(1.0); | 
 |  |  | //                    wrkDetl.setThreeCode(null); // 通过mes或excel导入检测是否合格 0不合格,1 合格 | 
 |  |  | //                    wrkDetl.setDeadWarn(); // 理货标识 0默认,1理货中,2理货完成w | 
 |  |  | //                    wrkDetl.setInspect(); // 订单明细中用,标识备货的状态 0未备货,1备货中,2备货完成 | 
 |  |  | //                    wrkDetl.setDanger(); // 订单明细中用,标识跨巷道移库 0未移库,1移库中,2移库完成 | 
 |  |  |                     wrkDetl.setIoTime(now); | 
 |  |  |                     wrkDetl.setAppeTime(now); | 
 |  |  |                     wrkDetl.setAppeUser(userId); | 
 |  |  |                     wrkDetl.setModiUser(userId); | 
 |  |  |                     wrkDetl.setModiTime(now); | 
 |  |  |                     if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                         throw new CoolException("保存工作明细失败"); | 
 |  |  |                     } | 
 |  |  |                 }); | 
 |  |  |                 groupNos.add(obj.getPackageGroupNo()); | 
 |  |  |             } | 
 |  |  |             // 一楼反修品入库的木箱通过包装组号需给mes推送待判 | 
 |  |  |             pushDpToMes(groupNos); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 更新目标库位状态 | 
 |  |  |         LocMast locMast = locMastService.selectById(dto.getLocNo()); | 
 |  |  |         if (locMast.getLocSts().equals("O")) { | 
 |  |  |             locMast.setLocSts("S"); // S.入库预约 | 
 |  |  |             locMast.setModiTime(now); | 
 |  |  |             if (!locMastService.updateById(locMast)) { | 
 |  |  |                 throw new CoolException("改变库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException(dto.getLocNo() + "目标库位已被占用"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 一楼返修入库推送mes做记录 | 
 |  |  | //        pushFxrkToMes(param); 改为库存更新完成后上报 | 
 |  |  |  | 
 |  |  |         // 返回GWCS目标信息 | 
 |  |  |         openServiceImpl.pushStaNoToGwcs(param.getPalletizingNo(), dto.getStaNo(), dto.getWorkNo(), param.getBarcode(), "一楼返修入库推送gwcs"); | 
 |  |  |  | 
 |  |  |         return R.ok("反修入库成功"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public R pdaBoxIn(BoxInParam param, Long userId) { | 
 |  |  |  | 
 |  |  |         if (Cools.isEmpty(param.getBarcode())) { | 
 |  |  |             throw new CoolException("条码不能为空:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (Cools.isEmpty(param.getAnfme())) { | 
 |  |  |             throw new CoolException("请输入数量" + param.getAnfme()); | 
 |  |  |         } | 
 |  |  |         if (Cools.isEmpty(param.getMemo())) { | 
 |  |  |             throw new CoolException("请输入备注"); | 
 |  |  |         } | 
 |  |  |         if (Cools.isEmpty(param.getOld())) { | 
 |  |  |             throw new CoolException("请输入新旧" ); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         int zpalletCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode())); | 
 |  |  |         if (zpalletCount > 0) { | 
 |  |  |             throw new CoolException("库存托盘码已存在:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         int barcodeCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode())); | 
 |  |  |         if (barcodeCount > 0) { | 
 |  |  |             throw new CoolException("工作档已存在该托盘码:" + param.getBarcode()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         LocTypeDto locTypeDto = new LocTypeDto(); | 
 |  |  |         locTypeDto.setLocType1((short) 1); | 
 |  |  |         int iotype = 1; //空箱 | 
 |  |  |  | 
 |  |  |         // 根据源站点寻找库位 | 
 |  |  |         StartupDto dto = commonService.getLocNo(iotype, param.getPalletizingNo(), locTypeDto, 0); | 
 |  |  |  | 
 |  |  |         int workNo = dto.getWorkNo(); | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // 生成工作档 | 
 |  |  |         WrkMast wrkMast = new WrkMast(); | 
 |  |  |         wrkMast.setWrkNo(workNo); | 
 |  |  |         wrkMast.setIoTime(new Date()); | 
 |  |  |         wrkMast.setWrkSts(1L); // 工作状态:设备上走 | 
 |  |  |         wrkMast.setIoType(iotype); // 入出库状态:1.入库 | 
 |  |  |         wrkMast.setIoPri(13D); // 优先级 | 
 |  |  |         wrkMast.setCrnNo(dto.getCrnNo()); | 
 |  |  |         wrkMast.setSourceStaNo(param.getPalletizingNo()); | 
 |  |  |         wrkMast.setStaNo(dto.getStaNo()); | 
 |  |  |         wrkMast.setLocNo(dto.getLocNo()); | 
 |  |  |         wrkMast.setBarcode(param.getBarcode()); // 托盘码 | 
 |  |  |         wrkMast.setFullPlt("Y"); // 满板:Y | 
 |  |  |         wrkMast.setPicking("N"); // 拣料 | 
 |  |  |         wrkMast.setExitMk("N"); // 退出 | 
 |  |  |         wrkMast.setEmptyMk("Y"); // 空板 | 
 |  |  |         wrkMast.setLinkMis("Y"); | 
 |  |  |         wrkMast.setCtnType(1); // 容器类型 | 
 |  |  |         // 操作人员数据 | 
 |  |  |         wrkMast.setAppeTime(now); | 
 |  |  |         wrkMast.setAppeUser(userId); | 
 |  |  |         wrkMast.setModiTime(now); | 
 |  |  |         wrkMast.setModiUser(userId); | 
 |  |  |         wrkMastService.insert(wrkMast); | 
 |  |  |  | 
 |  |  |         if (!Cools.isEmpty(param.getBatch())) { | 
 |  |  |                 WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |                 wrkDetl.setMatnr("空箱"); | 
 |  |  |                 wrkDetl.setSuppCode(param.getOld()); | 
 |  |  |                 wrkDetl.setAnfme(param.getAnfme()); | 
 |  |  |                 wrkDetl.setWrkNo(wrkMast.getWrkNo()); | 
 |  |  |                 wrkDetl.setWrkNo(wrkMast.getWrkNo()); | 
 |  |  |                 wrkDetl.setBatch(param.getBatch()); // 尺寸 | 
 |  |  |                 wrkDetl.setZpallet(param.getBarcode()); // 托盘码 | 
 |  |  |                 wrkDetl.setBarcode(param.getBarcode()); | 
 |  |  |                 wrkDetl.setMemo(param.getMemo()); //备注 | 
 |  |  |                 wrkDetl.setAnfme(param.getAnfme()); | 
 |  |  |                 wrkDetl.setIoTime(now); | 
 |  |  |                 wrkDetl.setAppeTime(now); | 
 |  |  |                 wrkDetl.setAppeUser(userId); | 
 |  |  |                 wrkDetl.setModiUser(userId); | 
 |  |  |                 wrkDetl.setModiTime(now); | 
 |  |  |                 if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                     throw new CoolException("保存工作明细失败"); | 
 |  |  |                 } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 更新目标库位状态 | 
 |  |  |         LocMast locMast = locMastService.selectById(dto.getLocNo()); | 
 |  |  |         if (locMast.getLocSts().equals("O")) { | 
 |  |  |             locMast.setLocSts("S"); // S.入库预约 | 
 |  |  |             locMast.setModiTime(now); | 
 |  |  |             if (!locMastService.updateById(locMast)) { | 
 |  |  |                 throw new CoolException("改变库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException(dto.getLocNo() + "目标库位已被占用"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 返回GWCS目标信息 | 
 |  |  |         openServiceImpl.pushStaNoToGwcs(param.getPalletizingNo(), dto.getStaNo(), dto.getWorkNo(), param.getBarcode(), "一楼空箱入库推送gwcs"); | 
 |  |  |  | 
 |  |  |         return R.ok("空箱入库成功"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void pushFxrkToMes(GwmsGenerateInventoryDto param) { | 
 |  |  |  | 
 |  |  |         for (GwmsGenerateInventoryDto.MatList matList : param.getMatList()){ | 
 |  |  |             matList.setOutOrIn("in"); | 
 |  |  |             matList.setStockType("返修入库"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         boolean success = false; | 
 |  |  |         // 获取请求头 | 
 |  |  |         Map<String,Object> headers = new HashMap<>(); | 
 |  |  |         headers.put("Content-Type","application/json;charset=UTF-8"); | 
 |  |  |  | 
 |  |  |         // 构造请求体 | 
 |  |  |         String body = JSON.toJSONString(param); | 
 |  |  |         String response = ""; | 
 |  |  |         try { | 
 |  |  |             response = new HttpHandler.Builder() | 
 |  |  |                     .setUri(MesConstant.MES_CC_IP_PORT) | 
 |  |  |                     .setPath(MesConstant.MES_CC_FXRK_URL) | 
 |  |  |                     .setHeaders(headers) | 
 |  |  |                     .setJson(body) | 
 |  |  |                     .build() | 
 |  |  |                     .doGet(); | 
 |  |  |             if (!Cools.isEmpty(response)) { | 
 |  |  |                 JSONObject jsonObject1 = JSONObject.parseObject(response); | 
 |  |  |                 int code = (int) jsonObject1.get("code"); | 
 |  |  |                 boolean state  = jsonObject1.getBoolean("state"); | 
 |  |  |                 if (code == 200 && state) { | 
 |  |  |                     success = true; | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 log.error("返修入库推送mes记录失败!!!url:{};request:{};response:{}", MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_FXRK_URL, body, response); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("返修入库推送mes记录异常:{}", e.getMessage()); | 
 |  |  |         } finally { | 
 |  |  |             try { | 
 |  |  |                 // 保存接口日志 | 
 |  |  |                 apiLogService.save( | 
 |  |  |                         "返修入库推送mes记录", | 
 |  |  |                         MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_FXRK_URL, | 
 |  |  |                         null, | 
 |  |  |                         "127.0.0.1", | 
 |  |  |                         body, | 
 |  |  |                         response, | 
 |  |  |                         success | 
 |  |  |                 ); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("", e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public R pdtz(PdtzParam param) { | 
 |  |  |  | 
 |  |  |         String barcode = param.getBarcode(); | 
 |  |  |         Integer palletizingNo = param.getPalletizingNo(); | 
 |  |  |         List<PdtzParam.MatList> matList = param.getMatList(); | 
 |  |  |         // 增加冗余字段,给mes推送时结构和入库保存一致 | 
 |  |  |         for (PdtzParam.MatList matList1 : matList) { | 
 |  |  |             matList1.setBarcode(barcode); | 
 |  |  |             matList1.setPalletizingNo(palletizingNo); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", barcode)); | 
 |  |  |         LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  |  | 
 |  |  |         // 实物包装组号 | 
 |  |  |         List<String> groups = matList.stream().map(PdtzParam.MatList::getPackageGroupNo).distinct().collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |         // 库存明细木箱位置集合 | 
 |  |  |         List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("zpallet", barcode)); | 
 |  |  |         List<String> collect1 = locDetls.stream().map(LocDetl::getOrigin).distinct().collect(Collectors.toList()); | 
 |  |  |         // 工作明细木箱位置集合 | 
 |  |  |         List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("zpallet", barcode)); | 
 |  |  |         List<String> collect2 = wrkDetls.stream().map(WrkDetl::getOrigin).distinct().collect(Collectors.toList()); | 
 |  |  |         // 工作的包装组号 | 
 |  |  |         List<String> wrkBrandlist = wrkDetls.stream().map(WrkDetl::getBrand).distinct().collect(Collectors.toList()); | 
 |  |  |         // 工作订单明细 | 
 |  |  |         List<OrderDetl> orderDetlList = orderDetlMapper.selectList(new EntityWrapper<OrderDetl>().in("brand", wrkBrandlist)); | 
 |  |  |  | 
 |  |  |         Date now = new Date(); | 
 |  |  |  | 
 |  |  |         // 判断要调整的木箱所在位置关系 | 
 |  |  |         if (collect1.size() == 0 || collect2.size() == 0){ | 
 |  |  |             return R.parse(barcode+":任务库存异常!"); | 
 |  |  |         } else if(collect1.size() == 2 && collect2.size() == 1) { // 2出1,都是单箱的 | 
 |  |  |             if (matList.size() == 0) { // 实物是空 | 
 |  |  |                 // 把该任务在库明细删除 | 
 |  |  |                 locDetlService.delete(new EntityWrapper<LocDetl>().in("brand",wrkBrandlist)); | 
 |  |  |                 // todo 标记异常,推送mes,回库 | 
 |  |  |                 for(OrderDetl orderDetl:orderDetlList) { | 
 |  |  |                     orderDetl.setSource(1); | 
 |  |  |                     orderDetlMapper.updateById(orderDetl); | 
 |  |  |                 } | 
 |  |  |                 JSONObject jsonObject = new JSONObject(); | 
 |  |  |                 jsonObject.put("delete",wrkBrandlist); | 
 |  |  |                 kctzPushMes(jsonObject); | 
 |  |  |                 kctzReturn(wrkMast); | 
 |  |  |             } else { // 实物不为空 | 
 |  |  |                // 寻找实物的位置 | 
 |  |  |                 List<LocDetl> locDetls1 = locDetlService.selectList(new EntityWrapper<LocDetl>().in("brand", groups).notIn("barcode",barcode)); | 
 |  |  |                 if (locDetls1.size() == 0) { // 实物无库存 | 
 |  |  |                     // 把该任务在库明细删除 | 
 |  |  |                     locDetlService.delete(new EntityWrapper<LocDetl>().in("brand",wrkBrandlist)); | 
 |  |  |                     // 补充木箱位置 | 
 |  |  |                     matList.get(0).setBoxPos(collect2.get(0)); | 
 |  |  |                     // 把实物物料信息放入任务所在库位 | 
 |  |  |                     insertLocDetl(locMast.getLocNo(),barcode,matList); | 
 |  |  |                     // todo 标记异常,推送mes,回库 | 
 |  |  |                     for(OrderDetl orderDetl:orderDetlList) { | 
 |  |  |                         orderDetl.setSource(1); | 
 |  |  |                         orderDetlMapper.updateById(orderDetl); | 
 |  |  |                     } | 
 |  |  |                     JSONObject jsonObject = new JSONObject(); | 
 |  |  |                     jsonObject.put("delete",wrkBrandlist); | 
 |  |  |                     jsonObject.put("insert",matList); | 
 |  |  |                     kctzPushMes(jsonObject); | 
 |  |  |                     kctzReturn(wrkMast); | 
 |  |  |                 }else { // 实物有库存 | 
 |  |  |                     List<String> brandList = locDetls1.stream().map(LocDetl::getBrand).distinct().collect(Collectors.toList()); | 
 |  |  |                     return R.parse(brandList+"库存已存在,请先处理!"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } else if(collect1.size() == 1 && collect2.size() == 1) { | 
 |  |  |             if (matList.size() == 0) { // 实物为空 | 
 |  |  |                 // 把该任务在库明细删除 | 
 |  |  |                 locDetlService.delete(new EntityWrapper<LocDetl>().in("brand",wrkBrandlist)); | 
 |  |  |                 // 完成这条盘点任务:更新订单完成数量,工作主档5 | 
 |  |  |                 for(WrkDetl wrkDetl:wrkDetls) { | 
 |  |  |                     if (!Cools.isEmpty(wrkDetl.getOrderNo())) { | 
 |  |  |                         // 更新订单完成数量 | 
 |  |  |                         orderDetlMapper.updateOrderDetlQtyByGroupNo(wrkDetl.getOrderNo(), wrkDetl.getBrand()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 if (locMast.getLocSts().equals("P")) { | 
 |  |  |                     locMast.setLocSts("O"); | 
 |  |  |                     locMast.setBarcode(""); | 
 |  |  |                     locMast.setSheetNo(""); | 
 |  |  |                     locMast.setIoTime(now); | 
 |  |  |                     locMast.setModiTime(now); | 
 |  |  |                     locMastService.updateById(locMast); | 
 |  |  |                 } | 
 |  |  |                 // 修改工作主档状态 | 
 |  |  |                 wrkMast.setWrkSts(5L); | 
 |  |  |                 wrkMast.setModiTime(now); | 
 |  |  |                 wrkMastService.updateById(wrkMast); | 
 |  |  |  | 
 |  |  |                 // todo 标记异常,不回库,给gwcs下发去叠盘机命令,推送mes | 
 |  |  |                 for(OrderDetl orderDetl:orderDetlList) { | 
 |  |  |                     orderDetl.setSource(1); | 
 |  |  |                     orderDetlMapper.updateById(orderDetl); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 JSONObject jsonObject = new JSONObject(); | 
 |  |  |                 jsonObject.put("delete",wrkBrandlist); | 
 |  |  |                 kctzPushMes(jsonObject); | 
 |  |  |  | 
 |  |  |                 // 推送给gwcs执行命令 | 
 |  |  |                 openServiceImpl.pushStaNoToGwcs(wrkMast.getSourceStaNo(),3013,wrkMast.getWrkNo(),wrkMast.getBarcode(),"盘点异常调整后回叠盘机推送gwcs"); | 
 |  |  |             } else { // 实物不为空 | 
 |  |  |                 // 寻找实物的位置 | 
 |  |  |                 List<LocDetl> locDetls1 = locDetlService.selectList(new EntityWrapper<LocDetl>().in("brand", groups).notIn("barcode",barcode)); | 
 |  |  |                 if (locDetls1.size() == 0) { // 实物无库存 | 
 |  |  |                     // 把该任务在库明细删除 | 
 |  |  |                     locDetlService.delete(new EntityWrapper<LocDetl>().in("brand",wrkBrandlist)); | 
 |  |  |                     // 补充木箱位置 | 
 |  |  |                     for (PdtzParam.MatList matList1:matList) { | 
 |  |  |                         matList1.setBoxPos(collect2.get(0)); | 
 |  |  |                     } | 
 |  |  |                     // 把实物物料信息放入任务所在库位 | 
 |  |  |                     insertLocDetl(locMast.getLocNo(),barcode,matList); | 
 |  |  |                     // todo 标记异常,回库,推送mes | 
 |  |  |                     for(OrderDetl orderDetl:orderDetlList) { | 
 |  |  |                         orderDetl.setSource(1); | 
 |  |  |                         orderDetlMapper.updateById(orderDetl); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     JSONObject jsonObject = new JSONObject(); | 
 |  |  |                     jsonObject.put("delete",wrkBrandlist); | 
 |  |  |                     jsonObject.put("insert",matList); | 
 |  |  |                     kctzPushMes(jsonObject); | 
 |  |  |  | 
 |  |  |                     kctzReturn(wrkMast); | 
 |  |  |                 } else { // 实物有库存 | 
 |  |  |                     List<String> brandList = locDetls1.stream().map(LocDetl::getBrand).distinct().collect(Collectors.toList()); | 
 |  |  |                     return R.parse(brandList+"库存已存在,请先处理!"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }  else if (collect1.size() == 2 && collect2.size() == 2) { | 
 |  |  |             if (matList.size() == 0) { // 实物为空 | 
 |  |  |                 // 把该任务在库明细删除 | 
 |  |  |                 locDetlService.delete(new EntityWrapper<LocDetl>().in("brand",wrkBrandlist)); | 
 |  |  |                 // 完成这条盘点任务:更新订单完成数量,工作主档5 | 
 |  |  |                 for(WrkDetl wrkDetl:wrkDetls) { | 
 |  |  |                     if (!Cools.isEmpty(wrkDetl.getOrderNo())) { | 
 |  |  |                         // 更新订单完成数量 | 
 |  |  |                         orderDetlMapper.updateOrderDetlQtyByGroupNo(wrkDetl.getOrderNo(), wrkDetl.getBrand()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 if (locMast.getLocSts().equals("P")) { | 
 |  |  |                     locMast.setLocSts("O"); | 
 |  |  |                     locMast.setBarcode(""); | 
 |  |  |                     locMast.setSheetNo(""); | 
 |  |  |                     locMast.setIoTime(now); | 
 |  |  |                     locMast.setModiTime(now); | 
 |  |  |                     locMastService.updateById(locMast); | 
 |  |  |                 } | 
 |  |  |                 // 修改工作主档状态 | 
 |  |  |                 wrkMast.setWrkSts(5L); | 
 |  |  |                 wrkMast.setModiTime(now); | 
 |  |  |                 wrkMastService.updateById(wrkMast); | 
 |  |  |  | 
 |  |  |                 // todo 标记异常,推送mes,不回库,给gwcs下发去叠盘机命令 | 
 |  |  |                 for(OrderDetl orderDetl:orderDetlList) { | 
 |  |  |                     orderDetl.setSource(1); | 
 |  |  |                     orderDetlMapper.updateById(orderDetl); | 
 |  |  |                 } | 
 |  |  |                 JSONObject jsonObject = new JSONObject(); | 
 |  |  |                 jsonObject.put("delete",wrkBrandlist); | 
 |  |  |                 jsonObject.put("insert",matList); | 
 |  |  |                 kctzPushMes(jsonObject); | 
 |  |  |  | 
 |  |  |                 // 推送给gwcs执行命令 | 
 |  |  |                 openServiceImpl.pushStaNoToGwcs(wrkMast.getSourceStaNo(),3013,wrkMast.getWrkNo(),wrkMast.getBarcode(),"盘点异常调整后回叠盘机推送gwcs"); | 
 |  |  |             } else { // 实物不为空 | 
 |  |  |                 // 寻找实物的位置 | 
 |  |  |                 List<LocDetl> locDetls1 = locDetlService.selectList(new EntityWrapper<LocDetl>().in("brand", groups).notIn("barcode",barcode)); | 
 |  |  |                 if (locDetls1.size() == 0) { // 实物无库存 | 
 |  |  |                     // 把该任务在库明细删除 | 
 |  |  |                     locDetlService.delete(new EntityWrapper<LocDetl>().in("brand",wrkBrandlist)); | 
 |  |  |                     // 补充木箱位置 | 
 |  |  |                     matList.get(0).setBoxPos("左"); | 
 |  |  |                     matList.get(1).setBoxPos("右"); | 
 |  |  |                     // 把实物物料信息放入任务所在库位 | 
 |  |  |                     insertLocDetl(locMast.getLocNo(),barcode,matList); | 
 |  |  |                     // todo 标记异常,回库,推送mes | 
 |  |  |                     for(OrderDetl orderDetl:orderDetlList) { | 
 |  |  |                         orderDetl.setSource(1); | 
 |  |  |                         orderDetlMapper.updateById(orderDetl); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     JSONObject jsonObject = new JSONObject(); | 
 |  |  |                     jsonObject.put("delete",wrkBrandlist); | 
 |  |  |                     jsonObject.put("insert",matList); | 
 |  |  |                     kctzPushMes(jsonObject); | 
 |  |  |  | 
 |  |  |                     kctzReturn(wrkMast); | 
 |  |  |                 } else { // 实物有库存 | 
 |  |  |                     List<String> brandList = locDetls1.stream().map(LocDetl::getBrand).distinct().collect(Collectors.toList()); | 
 |  |  |                     return R.parse(brandList+"库存已存在,请先处理!"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |        return R.ok("调整成功"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public R pdaFhhd(PdaDhhdParam param, Long userId) { | 
 |  |  |  | 
 |  |  |         String orderNo = param.getOrderNo(); | 
 |  |  |  | 
 |  |  |         Order order = orderService.selectByNo(orderNo); | 
 |  |  |         if (order == null) { | 
 |  |  |             return R.parse("单据编号不存在:" + orderNo); | 
 |  |  |         } else if (!order.getSettle().equals(4L)) { | 
 |  |  |             return R.parse("单据状态不为4.已完成"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         order.setSettle(5L); | 
 |  |  |         order.setUpdateBy(userId); | 
 |  |  |         order.setUpdateTime(new Date()); | 
 |  |  |  | 
 |  |  |         orderService.updateById(order); | 
 |  |  |  | 
 |  |  |         return R.ok("发货核对成功"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 同步盘点异常调整结果给mes | 
 |  |  |     void kctzPushMes(JSONObject jsonObject) { | 
 |  |  |         // 接口请求结果 | 
 |  |  |         boolean success = false; | 
 |  |  |         // 接口记录空间名称 | 
 |  |  |         String message = "同步盘点异常调整结果给mes"; | 
 |  |  |  | 
 |  |  |         // 构造请求体 | 
 |  |  |         String body = jsonObject.toJSONString(); | 
 |  |  |         String response = ""; | 
 |  |  |         try { | 
 |  |  |             response = new HttpHandler.Builder() | 
 |  |  |                     .setUri(MesConstant.MES_CC_IP_PORT) | 
 |  |  |                     .setPath(MesConstant.MES_CC_YCTZ_URL) | 
 |  |  |                     .setJson(body) | 
 |  |  |                     .build() | 
 |  |  |                     .doPost(); | 
 |  |  |             if (!Cools.isEmpty(response)) { | 
 |  |  |                 JSONObject result = JSON.parseObject(response); | 
 |  |  |                 if (result.getInteger("code").equals(200)) { | 
 |  |  |                     success = true; | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 log.error(message + "失败!!!url:{};request:{};response:{}", MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_YCTZ_URL, body, response); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error(message + "异常:{}", e); | 
 |  |  |         } finally { | 
 |  |  |             try { | 
 |  |  |                 // 保存接口日志 | 
 |  |  |                 apiLogService.save( | 
 |  |  |                         message, | 
 |  |  |                         MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_YCTZ_URL, | 
 |  |  |                         null, | 
 |  |  |                         "127.0.0.1", | 
 |  |  |                         body, | 
 |  |  |                         response, | 
 |  |  |                         success | 
 |  |  |                 ); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("", e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 盘点异常回库 | 
 |  |  |     @Transactional | 
 |  |  |     public void kctzReturn(WrkMast wrkMast) { | 
 |  |  |         if (!wrkMastLogService.save(wrkMast.getWrkNo())) { | 
 |  |  |             throw new CoolException("保存工作主档历史档失败"); | 
 |  |  |         } | 
 |  |  |         // 获取目标站 | 
 |  |  |         Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() | 
 |  |  |                 .eq("type_no", wrkMast.getIoType() - 50) | 
 |  |  |                 .eq("stn_no", wrkMast.getStaNo()) | 
 |  |  |                 .eq("crn_no", wrkMast.getCrnNo()); | 
 |  |  |         StaDesc staDesc = staDescService.selectOne(wrapper); | 
 |  |  |         if (Cools.isEmpty(staDesc)) { | 
 |  |  |             throw new CoolException("入库路径不存在"); | 
 |  |  |         } | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // 堆垛机站点(目标站) | 
 |  |  |         Integer staNo = staDesc.getCrnStn(); | 
 |  |  |         // 更新工作档数据状态 | 
 |  |  |         wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 | 
 |  |  |         wrkMast.setWrkSts(14L); // 工作状态: 14.已出库未确认 | 
 |  |  |         wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 | 
 |  |  |         wrkMast.setStaNo(staNo); // 目标站 | 
 |  |  |         wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 | 
 |  |  |         wrkMast.setSourceLocNo(""); // 源库位清空 | 
 |  |  |         wrkMast.setModiTime(now); | 
 |  |  |         if (!wrkMastService.updateById(wrkMast)) { | 
 |  |  |             throw new CoolException("更新工作档数据状态失败"); | 
 |  |  |         } | 
 |  |  |         // 修改库位状态 Q.拣料/盘点/并板再入库 | 
 |  |  |         LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  |         locMast.setLocSts("Q"); | 
 |  |  |         locMast.setModiTime(now); | 
 |  |  |         if (!locMastService.updateById(locMast)) { | 
 |  |  |             throw new CoolException("修改库位状态失败"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 推送给gwcs执行命令 | 
 |  |  |         openServiceImpl.pushStaNoToGwcs(wrkMast.getSourceStaNo(),wrkMast.getStaNo(),wrkMast.getWrkNo(),wrkMast.getBarcode(),"盘点异常调整后推送gwcs"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 调整库存明细 | 
 |  |  |      */ | 
 |  |  |     @Transactional | 
 |  |  |     public void insertLocDetl(String locNo, String barcode, List<PdtzParam.MatList> matList) { | 
 |  |  |         Date now = new Date(); | 
 |  |  |         for (PdtzParam.MatList mat : matList) { | 
 |  |  |             LocDetl locDetl = new LocDetl(); | 
 |  |  |             locDetl.setBatch(""); | 
 |  |  |             locDetl.setLocNo(locNo); | 
 |  |  |             locDetl.setMatnr(mat.getSpecs()); // 规格 | 
 |  |  |             locDetl.setMaktx(mat.getSpecs()); //规格 | 
 |  |  |             locDetl.setUnit(mat.getBoxNo()); // 箱号 | 
 |  |  |             locDetl.setModel(mat.getRollNo()); // 卷号 | 
 |  |  |             locDetl.setBrand(mat.getPackageGroupNo()); // 包装组号 | 
 |  |  |             locDetl.setZpallet(barcode); // 托盘码 | 
 |  |  |             locDetl.setBarcode(barcode); | 
 |  |  |             locDetl.setOrigin(mat.getBoxPos()); // 木箱在托盘位置 | 
 |  |  |             locDetl.setColor(mat.getBoxType()); // 木箱类型 | 
 |  |  |             locDetl.setManu(mat.getRollType()); // 管芯类型 | 
 |  |  |             locDetl.setSku(mat.getWideInWidth()); // 实测宽幅 | 
 |  |  |             locDetl.setItemNum(mat.getThickness()); // 生箔厚度 | 
 |  |  |             locDetl.setManuDate(mat.getFqTime()); // 分切下料时间 | 
 |  |  |             locDetl.setWeight(mat.getNetWeight()); // 净重 | 
 |  |  |             locDetl.setVolume(mat.getGrossWeight()); // 毛重 | 
 |  |  |             locDetl.setLength(mat.getLength()); // 长度 | 
 |  |  |             locDetl.setSpecs(String.valueOf(mat.getSplices())); // 接头 | 
 |  |  |             locDetl.setAnfme(1.0); | 
 |  |  | //                    wrkDetl.setThreeCode(null); // 通过mes或excel导入检测是否合格 0不合格,1 合格 | 
 |  |  |             locDetl.setAppeTime(now); | 
 |  |  |             locDetl.setModiTime(now); | 
 |  |  |             locDetlService.insert(locDetl); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 一楼反修品入库的木箱通过包装组号需给mes推送待判 | 
 |  |  |      */ | 
 |  |  |     private void pushDpToMes(List<String> groupNos) { | 
 |  |  |         boolean success = false; | 
 |  |  |         // 获取请求头 | 
 |  |  |         Map<String,Object> headers = new HashMap<>(); | 
 |  |  |         headers.put("Content-Type","application/json;charset=UTF-8"); | 
 |  |  |  | 
 |  |  |         // 构造请求体 | 
 |  |  |         JSONObject jsonObject = new JSONObject(); | 
 |  |  |         jsonObject.put("groupNos", groupNos); | 
 |  |  |         String body = jsonObject.toJSONString(); | 
 |  |  |  | 
 |  |  |         String response = ""; | 
 |  |  |         try { | 
 |  |  |             response = new HttpHandler.Builder() | 
 |  |  |                     .setUri(MesConstant.MES_CC_IP_PORT) | 
 |  |  |                     .setPath(MesConstant.MES_CC_DP_URL) | 
 |  |  |                     .setHeaders(headers) | 
 |  |  |                     .setJson(body) | 
 |  |  |                     .build() | 
 |  |  |                     .doGet(); | 
 |  |  |             if (!Cools.isEmpty(response)) { | 
 |  |  |                 JSONObject jsonObject1 = JSONObject.parseObject(response); | 
 |  |  |                 int code = (int) jsonObject1.get("code"); | 
 |  |  |                 boolean state  = jsonObject1.getBoolean("state"); | 
 |  |  |                 String msg = (String) jsonObject1.get("message"); | 
 |  |  |                 if (code == 200 && state) { | 
 |  |  |                     success = true; | 
 |  |  |                 } | 
 |  |  |                 throw new CoolException(msg); | 
 |  |  |             } else { | 
 |  |  |                 log.error("返修品入库给mes推送待判失败!!!url:{};request:{};response:{}", MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_DP_URL, body, response); | 
 |  |  |                 throw new CoolException("返修品入库给mes推送待判失败"); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("返修品入库给mes推送待判异常:{}", e.getMessage()); | 
 |  |  |         } finally { | 
 |  |  |             try { | 
 |  |  |                 // 保存接口日志 | 
 |  |  |                 apiLogService.save( | 
 |  |  |                         "返修品入库给mes推送待判", | 
 |  |  |                         MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_DP_URL, | 
 |  |  |                         null, | 
 |  |  |                         "127.0.0.1", | 
 |  |  |                         body, | 
 |  |  |                         response, | 
 |  |  |                         success | 
 |  |  |                 ); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("", e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private Map<String, String> getPackageGroupNoByGwms(List<String> boxNoList) { | 
 |  |  |         Map<String, String> map = null; | 
 |  |  |         Map<String, Object> headers = new HashMap<>(); | 
 |  |  |         headers.put("Content-Type", "application/json;charset=UTF-8"); | 
 |  |  |  | 
 |  |  |         JSONObject jsonObject = new JSONObject(); | 
 |  |  |         jsonObject.put("boxNoList", JSONObject.toJSONString(boxNoList)); | 
 |  |  |         String body = jsonObject.toJSONString(); | 
 |  |  |         boolean success = false; | 
 |  |  |         String response = ""; | 
 |  |  |         try { | 
 |  |  |             response = new HttpHandler.Builder() | 
 |  |  |                     .setUri(MesConstant.GWMS_IP_PORT) | 
 |  |  |                     .setPath(MesConstant.GWMS_GET_GROUP_NO_URL) | 
 |  |  |                     .setHeaders(headers) | 
 |  |  |                     .setJson(body) | 
 |  |  |                     .build() | 
 |  |  |                     .doPost(); | 
 |  |  |             if (!Cools.isEmpty(response)) { | 
 |  |  |                 JSONObject jsonObject1 = JSONObject.parseObject(response); | 
 |  |  |                 int code = (int) jsonObject1.get("code"); | 
 |  |  |                 String msg = (String) jsonObject1.get("msg"); | 
 |  |  |                  if (code != 200) { | 
 |  |  |                      throw new CoolException(msg); | 
 |  |  |                  } | 
 |  |  |                 map = (Map<String, String>) jsonObject1.get("data"); | 
 |  |  |                 success = true; | 
 |  |  |  | 
 |  |  |             } else { | 
 |  |  |                 log.error("pda组托入库请求gwms接口失败!!!url:{};request:{};response:{}", MesConstant.URL + MesConstant.PAKIN_URL, body, response); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("pda组托入库请求gwms接口异常,工作号:{},{}", boxNoList.toString(), e.getMessage()); | 
 |  |  |         } finally { | 
 |  |  |             try { | 
 |  |  |                 // 保存接口日志 | 
 |  |  |                 apiLogService.save( | 
 |  |  |                         "pda组托入库请求gwms接口", | 
 |  |  |                         MesConstant.URL + MesConstant.PAKIN_URL, | 
 |  |  |                         null, | 
 |  |  |                         "127.0.0.1", | 
 |  |  |                         body, | 
 |  |  |                         response, | 
 |  |  |                         success | 
 |  |  |                 ); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("接口日志保存异常", e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (map == null) { | 
 |  |  |             throw new CoolException("请求gwcs查询包装组号异常"); | 
 |  |  |         } | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |          * 比较两个集合的类的属性,相同则抵消,最后判断两个集合是否完全抵消 | 
 |  |  |          */ | 
 |  |  |         public  boolean compareAndCheckCancellation(List<WrkDetl> list1, List<PdckqrParam.Material> list2) { | 
 |  |  |             if (list1.size() != list2.size()) { | 
 |  |  |                 return false; // If lists are not of the same size, cancellation is not possible | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             List<PdckqrParam.Material> remainingList2 = new ArrayList<>(list2); | 
 |  |  |  | 
 |  |  |             // Compare and cancel out elements | 
 |  |  |             for (WrkDetl p1 : list1) { | 
 |  |  |                 boolean cancelled = false; | 
 |  |  |                 for (PdckqrParam.Material p2 : remainingList2) { | 
 |  |  |                     if (p1.getUnit().equals(p2.getBoxNo()) && p1.getModel().equals(p2.getRollNo())) { // 卷号和箱号相同 | 
 |  |  |                         remainingList2.remove(p2); | 
 |  |  |                         cancelled = true; | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 if (!cancelled) { | 
 |  |  |                     return false; // If any element in list1 cannot be cancelled, return false | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return remainingList2.isEmpty(); // Return true if all elements in list1 were cancelled out | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public List<Map<String, Object>> boxTypeComb() { | 
 |  |  |         EntityWrapper<BasBoxType> wrapper = new EntityWrapper<>(); | 
 |  |  |         List<Map<String, Object>> result = new ArrayList<>(); | 
 |  |  | 
 |  |  |         } | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<Map<String, Object>> pdaGetMemo() { | 
 |  |  |         List<Integer> tagIds = Arrays.asList(7, 8,9); | 
 |  |  |         List<Map<String, Object>> raw = matMapper.getBoxMemoMap(tagIds); | 
 |  |  |  | 
 |  |  |         // 用 Map<String, List<String>> 分组 | 
 |  |  |         Map<String, List<String>> grouped = new HashMap<>(); | 
 |  |  |         for (Map<String, Object> row : raw) { | 
 |  |  |             String tagId = String.valueOf(row.get("tag_id")); | 
 |  |  |             String memo = String.valueOf(row.get("memo")); | 
 |  |  |             if (memo == null || "null".equalsIgnoreCase(memo)) continue; | 
 |  |  |  | 
 |  |  |             grouped.computeIfAbsent(tagId, k -> new ArrayList<>()).add(memo); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 转成 List<Map<String, Object>> 结构返回 | 
 |  |  |         List<Map<String, Object>> result = new ArrayList<>(); | 
 |  |  |         for (Map.Entry<String, List<String>> entry : grouped.entrySet()) { | 
 |  |  |             Map<String, Object> item = new HashMap<>(); | 
 |  |  |             item.put("tagId", entry.getKey()); | 
 |  |  |             item.put("memos", entry.getValue()); | 
 |  |  |             result.add(item); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |