| | |
| | | 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; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | |
| | | |
| | | @Resource |
| | | private OrderMapper orderMapper; |
| | | |
| | | @Resource |
| | | private OrderDetlMapper orderDetlMapper; |
| | | |
| | | @Resource |
| | | private BasCrnpMapper basCrnpMapper; |
| | |
| | | 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) { |
| | |
| | | if (wrkMast == null) { |
| | | throw new CoolException("不存在该工作号:" + param.getWorkNo()); |
| | | } |
| | | if (wrkMast.getWrkSts() == 3) { |
| | | if (wrkMast.getWrkSts() == 3||wrkMast.getWrkSts() == 4) { |
| | | throw new CoolException("工作档状态不对:" + param.getWorkNo()); |
| | | } |
| | | wrkMast.setWrkSts(2L); |
| | |
| | | |
| | | private void ckjgsbPushMes(WrkMast wrkMast, List<WrkDetl> wrkDetls) { |
| | | GwmsGenerateInventoryDto gwmsGenerateInventoryDto = new GwmsGenerateInventoryDto(); |
| | | gwmsGenerateInventoryDto.setWarehouseType(4); |
| | | gwmsGenerateInventoryDto.setBarcode(wrkMast.getBarcode()); |
| | | gwmsGenerateInventoryDto.setPalletizingNo(wrkMast.getStaNo()); |
| | | gwmsGenerateInventoryDto.setGroupOrderNumber(wrkMast.getMemo()); |
| | | List<GwmsGenerateInventoryDto.MatList> matLists = new ArrayList<>(); |
| | | for (WrkDetl wrkDetl : wrkDetls) { |
| | | boolean flag = true; |
| | |
| | | return crnStn; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | | public R groupOrderConfirm(GroupOrderConfirmParam param) { |
| | | // 1. 查询单据是否存在 |
| | | Order order = orderMapper.selectOrderByOrderNo(param.getGroupOrderNumber()); |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | | if (order == null) { |
| | | // 1.1 不存在,新建单据 |
| | | order = new Order(); |
| | | order.setOrderNo(param.getGroupOrderNumber()); |
| | | order.setStatus(Integer.valueOf(param.getGroupStatus())); |
| | | order.setOrderTime(sdf.format(new Date())); |
| | | order.setCreateTime(new Date()); |
| | | order.setSettle(1L); |
| | | order.setDocType(25L); |
| | | orderMapper.insert(order); |
| | | } else { |
| | | // 1.2 存在,更新单据状态 |
| | | order.setStatus(Integer.valueOf(param.getGroupStatus())); |
| | | orderMapper.updateById(order); |
| | | } |
| | | |
| | | // 2. 一一对应遍历 |
| | | List<GroupOrderConfirmParam.PackageGroupNo> pkgList = param.getPackageGroupNos(); |
| | | List<GroupOrderConfirmParam.VolumeNumber> volList = param.getVolumeNumbers(); |
| | | |
| | | int size = Math.min(pkgList.size(), volList.size()); // 防止越界 |
| | | for (int i = 0; i < size; i++) { |
| | | GroupOrderConfirmParam.PackageGroupNo pg = pkgList.get(i); |
| | | GroupOrderConfirmParam.VolumeNumber vn = volList.get(i); |
| | | |
| | | // 查询是否已存在该 detl |
| | | OrderDetl detl = orderDetlMapper.selectByOrderNoAndPkgGroupNoAndVolumeNo( |
| | | param.getGroupOrderNumber(), pg.getPackageGroupNo(), vn.getVolumeNumber() |
| | | ); |
| | | |
| | | if (detl == null) { |
| | | detl = new OrderDetl(); |
| | | detl.setOrderId(order.getId()); |
| | | detl.setOrderNo(param.getGroupOrderNumber()); |
| | | detl.setCreateTime(new Date()); |
| | | detl.setAnfme(1.0); |
| | | detl.setBrand(pg.getPackageGroupNo()); // 包装组号 |
| | | detl.setModel(vn.getVolumeNumber()); // 卷号 |
| | | orderDetlMapper.insert(detl); |
| | | } |
| | | } |
| | | |
| | | return R.ok("组货确认成功"); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /*...........................上饶江铜..............以上.............徐工汉云...........................*/ |
| | | } |