|  |  |  | 
|---|
|  |  |  | import com.zy.system.mapper.ConfigMapper; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.data.redis.core.StringRedisTemplate; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | return "入库成功"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private StringRedisTemplate redisTemplate; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @Transactional | 
|---|
|  |  |  | public R kthl(KthlParam param) { | 
|---|
|  |  |  | String barcode = param.getBarcode(); | 
|---|
|  |  |  | String lockKey = "kthl:lock:" + barcode; | 
|---|
|  |  |  | String lockVal = UUID.randomUUID().toString(); // 防止误删他人锁 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取模式为电脑模式,无任务的堆垛机列表:防止分配到堆垛机不可用 | 
|---|
|  |  |  | List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3) | 
|---|
|  |  |  | .eq("wrk_no",0).eq("in_enable","Y").eq("out_enable","Y")); | 
|---|
|  |  |  | if (basCrnps.isEmpty()) { | 
|---|
|  |  |  | // 都有任务则获取电脑模式的堆垛机列表 | 
|---|
|  |  |  | basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3).eq("in_enable","Y") | 
|---|
|  |  |  | .eq("out_enable","Y")); | 
|---|
|  |  |  | // 分布式锁,5秒过期 | 
|---|
|  |  |  | Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockVal, 5, TimeUnit.SECONDS); | 
|---|
|  |  |  | if (locked == null || !locked) { | 
|---|
|  |  |  | return R.error("重复提交:该托盘已在处理,请勿重复操作"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (basCrnps.isEmpty()) { | 
|---|
|  |  |  | throw new CoolException("没有可用堆垛机,堆垛机停止或异常或禁用"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 可用堆垛机列表 | 
|---|
|  |  |  | List<Integer> crnNoList = basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()); | 
|---|
|  |  |  | Integer crnNo = crnNoList.get(0); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int workNo = commonService.getWorkNo(5); | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | // 生成工作档 | 
|---|
|  |  |  | WrkMast wrkMast = new WrkMast(); | 
|---|
|  |  |  | wrkMast.setWrkNo(workNo); | 
|---|
|  |  |  | wrkMast.setIoTime(new Date()); | 
|---|
|  |  |  | wrkMast.setWrkSts(1L); // | 
|---|
|  |  |  | wrkMast.setIoType(3); // 站到站 | 
|---|
|  |  |  | wrkMast.setIoPri(14D); // 优先级 | 
|---|
|  |  |  | wrkMast.setCrnNo(crnNo); | 
|---|
|  |  |  | wrkMast.setSourceStaNo(secondFloorIn[crnNo]); | 
|---|
|  |  |  | wrkMast.setStaNo(secondFloorOut[crnNo]); | 
|---|
|  |  |  | wrkMast.setLocNo(""); | 
|---|
|  |  |  | wrkMast.setBarcode(param.getBarcode()); // 托盘码 | 
|---|
|  |  |  | wrkMast.setFullPlt("N"); // 满板:Y | 
|---|
|  |  |  | wrkMast.setPicking("N"); // 拣料 | 
|---|
|  |  |  | wrkMast.setExitMk("N"); // 退出 | 
|---|
|  |  |  | wrkMast.setEmptyMk("Y"); // 空板 | 
|---|
|  |  |  | wrkMast.setLinkMis("Y"); | 
|---|
|  |  |  | wrkMast.setCtnType(1); // 容器类型 | 
|---|
|  |  |  | // 操作人员数据 | 
|---|
|  |  |  | wrkMast.setAppeTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  | boolean res = wrkMastService.insert(wrkMast); | 
|---|
|  |  |  | if (!res) { | 
|---|
|  |  |  | throw new CoolException("保存工作档失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 返回GWCS目标信息 | 
|---|
|  |  |  | pushStaNoToGwcs(param.getPalletizingNo(),wrkMast.getSourceStaNo(),workNo,param.getBarcode(),"二楼空托回流推送gwcs"); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | // 获取空闲堆垛机(电脑模式、无任务) | 
|---|
|  |  |  | List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>() | 
|---|
|  |  |  | .eq("crn_sts", 3).eq("wrk_no", 0) | 
|---|
|  |  |  | .eq("in_enable", "Y").eq("out_enable", "Y")); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return R.ok("空托回流请求成功"); | 
|---|
|  |  |  | // 如果没有空闲堆垛机,尝试所有可用堆垛机 | 
|---|
|  |  |  | if (basCrnps.isEmpty()) { | 
|---|
|  |  |  | basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>() | 
|---|
|  |  |  | .eq("crn_sts", 3) | 
|---|
|  |  |  | .eq("in_enable", "Y").eq("out_enable", "Y")); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (basCrnps.isEmpty()) { | 
|---|
|  |  |  | throw new CoolException("没有可用堆垛机,堆垛机停止或异常或禁用"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取第一个可用堆垛机 | 
|---|
|  |  |  | List<Integer> crnNoList = basCrnps.stream() | 
|---|
|  |  |  | .map(BasCrnp::getCrnNo) | 
|---|
|  |  |  | .collect(Collectors.toList()); | 
|---|
|  |  |  | Integer crnNo = crnNoList.get(0); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int workNo = commonService.getWorkNo(5); | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 生成工作档 | 
|---|
|  |  |  | WrkMast wrkMast = new WrkMast(); | 
|---|
|  |  |  | wrkMast.setWrkNo(workNo); | 
|---|
|  |  |  | wrkMast.setIoTime(now); | 
|---|
|  |  |  | wrkMast.setWrkSts(1L); | 
|---|
|  |  |  | wrkMast.setIoType(3); // 站到站 | 
|---|
|  |  |  | wrkMast.setIoPri(14D); | 
|---|
|  |  |  | wrkMast.setCrnNo(crnNo); | 
|---|
|  |  |  | wrkMast.setSourceStaNo(secondFloorIn[crnNo]); | 
|---|
|  |  |  | wrkMast.setStaNo(secondFloorOut[crnNo]); | 
|---|
|  |  |  | wrkMast.setLocNo(""); | 
|---|
|  |  |  | wrkMast.setBarcode(barcode); | 
|---|
|  |  |  | wrkMast.setFullPlt("N"); | 
|---|
|  |  |  | wrkMast.setPicking("N"); | 
|---|
|  |  |  | wrkMast.setExitMk("N"); | 
|---|
|  |  |  | wrkMast.setEmptyMk("Y"); | 
|---|
|  |  |  | wrkMast.setLinkMis("Y"); | 
|---|
|  |  |  | wrkMast.setCtnType(1); | 
|---|
|  |  |  | wrkMast.setAppeTime(now); | 
|---|
|  |  |  | wrkMast.setModiTime(now); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | boolean res = wrkMastService.insert(wrkMast); | 
|---|
|  |  |  | if (!res) { | 
|---|
|  |  |  | throw new CoolException("保存工作档失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 推送站点到GWCS | 
|---|
|  |  |  | pushStaNoToGwcs(param.getPalletizingNo(), wrkMast.getSourceStaNo(), workNo, barcode, "二楼空托回流推送gwcs"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return R.ok("空托回流请求成功"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | // 解锁,确保只释放自己加的锁 | 
|---|
|  |  |  | String val = redisTemplate.opsForValue().get(lockKey); | 
|---|
|  |  |  | if (lockVal.equals(val)) { | 
|---|
|  |  |  | redisTemplate.delete(lockKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public R tb(TbParam param) { | 
|---|
|  |  |  | 
|---|
|  |  |  | wrkMastService.updateById(wrkMast); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 出库上报推送mes记录 | 
|---|
|  |  |  | ckjgsbPushMes(wrkMast,wrkDetls); | 
|---|
|  |  |  | if(!wrkDetls.get(0).getMatnr().equals("空箱")){ | 
|---|
|  |  |  | // 出库上报推送mes记录 | 
|---|
|  |  |  | ckjgsbPushMes(wrkMast,wrkDetls); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | wrkMast.setWrkSts(14L); | 
|---|
|  |  |  | wrkMastService.updateById(wrkMast); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return "出库结果上报成功"; | 
|---|
|  |  |  | } | 
|---|