| | |
| | | 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(); // 防止误删他人锁 |
| | | |
| | | // 分布式锁,5秒过期 |
| | | Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockVal, 5, TimeUnit.SECONDS); |
| | | if (locked == null || !locked) { |
| | | return R.error("重复提交:该托盘已在处理,请勿重复操作"); |
| | | // 获取模式为电脑模式,无任务的堆垛机列表:防止分配到堆垛机不可用 |
| | | 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")); |
| | | } |
| | | |
| | | 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")); |
| | | |
| | | // 如果没有空闲堆垛机,尝试所有可用堆垛机 |
| | | 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); |
| | | } |
| | | WrkMast exist = wrkMastService.selectOne( |
| | | new EntityWrapper<WrkMast>() |
| | | .eq("barcode", param.getBarcode()) |
| | | .eq("io_type", 3)); |
| | | if (exist != null) { |
| | | 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"); |
| | | |
| | | return R.ok("空托回流请求成功"); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public R tb(TbParam param) { |