| | |
| | | qty = Optional.ofNullable(qty).orElse(1); |
| | | |
| | | // reserve sta in |
| | | if (qty < staMapper.tryReserveIn(sta.getId(), qty)) { |
| | | if (staMapper.tryReserveIn(sta.getId(), qty) < qty) { |
| | | throw new BusinessException("Sta[" + sta.getStaNo() + "] can't reserve IN"); |
| | | } |
| | | Date now = new Date(); |
| | |
| | | reserve.setQty(qty); |
| | | reserve.setState(StaReserveStateType.RESERVED.toString()); |
| | | |
| | | reserve.setUniqKey(this.generateReserveUniqKey(sta.getId(), task.getId())); |
| | | reserve.setUniqKey(this.generateReserveUniqKey(sta.getId(), task.getId(), StaReserveType.IN)); |
| | | reserve.setExpireTime(new Date(now.getTime() + RESERVE_EXPIRE_TIME)); |
| | | |
| | | reserve.setStatus(StatusType.ENABLE.val); |
| | |
| | | return reserve; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public StaReserve reserveStaOut(Sta sta, Task task, Integer qty) { |
| | | qty = Optional.ofNullable(qty).orElse(1); |
| | | |
| | | private String generateReserveUniqKey(Long staId, Long taskId) { |
| | | return "STA:" + staId + "-TASK:" + taskId + "-T"; |
| | | // reserve sta out |
| | | if (staMapper.tryReserveOut(sta.getId(), qty) < qty) { |
| | | throw new BusinessException("Sta[" + sta.getStaNo() + "] can't reserve OUT"); |
| | | } |
| | | |
| | | Date now = new Date(); |
| | | |
| | | // save staReserve |
| | | StaReserve reserve = new StaReserve(); |
| | | reserve.setStaId(sta.getId()); |
| | | reserve.setTaskId(task.getId()); |
| | | reserve.setType(StaReserveType.OUT.toString()); |
| | | reserve.setQty(qty); |
| | | reserve.setState(StaReserveStateType.RESERVED.toString()); |
| | | |
| | | reserve.setUniqKey(this.generateReserveUniqKey(sta.getId(), task.getId(), StaReserveType.OUT)); |
| | | reserve.setExpireTime(new Date(now.getTime() + RESERVE_EXPIRE_TIME)); |
| | | |
| | | reserve.setStatus(StatusType.ENABLE.val); |
| | | reserve.setCreateTime(now); |
| | | reserve.setUpdateTime(now); |
| | | |
| | | if (!this.save(reserve)) { |
| | | staMapper.releaseReserveOut(sta.getId(), qty); |
| | | throw new BusinessException("reserve record insert failed"); |
| | | } |
| | | |
| | | return reserve; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void confirmStaReserve(Sta sta, Task task, Integer qty, StaReserveType type) { |
| | | qty = Optional.ofNullable(qty).orElse(1); |
| | | |
| | | // update reserve state to be confirmed |
| | | if (0 == this.baseMapper.updateState(task.getId(), sta.getId(), type.toString(), StaReserveStateType.CONFIRMED.toString())) { |
| | | log.error("failed to confirm sta reserve"); |
| | | return; |
| | | } |
| | | |
| | | int cntOfDealWithReserve = 0; |
| | | switch (type) { |
| | | case IN: |
| | | cntOfDealWithReserve = staMapper.confirmReserveIn(sta.getId(), qty); |
| | | break; |
| | | case OUT: |
| | | cntOfDealWithReserve = staMapper.confirmReserveOut(sta.getId(), qty); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | if (cntOfDealWithReserve == 0) { |
| | | throw new BusinessException("Sta[" + sta.getStaNo() + "] confirm failed, type=" + type.toString()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void cancelStaReserve(Sta sta, Task task, Integer qty, StaReserveType type) { |
| | | qty = Optional.ofNullable(qty).orElse(1); |
| | | |
| | | // update reserve state to be canceled |
| | | if (0 == this.baseMapper.updateState(task.getId(), sta.getId(), type.toString(), StaReserveStateType.CANCELLED.toString())) { |
| | | log.error("failed to cancel sta reserve"); |
| | | return; |
| | | } |
| | | |
| | | int cntOfDealWithReserve = 0; |
| | | switch (type) { |
| | | case IN: |
| | | cntOfDealWithReserve = staMapper.releaseReserveIn(sta.getId(), qty); |
| | | break; |
| | | case OUT: |
| | | cntOfDealWithReserve = staMapper.releaseReserveOut(sta.getId(), qty); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | if (cntOfDealWithReserve == 0) { |
| | | throw new BusinessException("Sta[" + sta.getStaNo() + "] cancel failed, type=" + type.toString()); |
| | | } |
| | | } |
| | | |
| | | |
| | | private String generateReserveUniqKey(Long staId, Long taskId, StaReserveType type) { |
| | | return "STA:" + staId + "-TASK:" + taskId + "-T:" + type.toString(); |
| | | } |
| | | |
| | | } |