zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -96,6 +96,8 @@ private LaneService laneService; @Autowired private ActionSorter actionSorter; @Autowired private StaReserveService staReserveService; @SuppressWarnings("all") @Transactional @@ -175,15 +177,19 @@ throw new BusinessException("oriLoc:" + task.getOriLoc$() + " failed to update"); } // reserver station inbound, qty: 1 destSta = staService.getById(task.getDestSta()); if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) { throw new BusinessException("destSta:" + task.getDestSta$() + " is not in IDLE status"); if (null == staReserveService.reserveStaIn(destSta, task, 1)) { throw new BusinessException("destSta:" + task.getDestSta$() + " failed to reserve"); } destSta.setStaSts(StaStsType.READY_RELEASE.val()); destSta.setUpdateTime(now); if (!staService.updateById(destSta)) { throw new BusinessException("destSta:" + task.getDestSta$() + " failed to update"); } // if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) { // throw new BusinessException("destSta:" + task.getDestSta$() + " is not in IDLE status"); // } // destSta.setStaSts(StaStsType.READY_RELEASE.val()); // destSta.setUpdateTime(now); // if (!staService.updateById(destSta)) { // throw new BusinessException("destSta:" + task.getDestSta$() + " failed to update"); // } break; case STA_TO_LOC: oriSta = staService.getById(task.getOriSta()); zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/StaReserveStateType.java
New file @@ -0,0 +1,12 @@ package com.zy.acs.manager.manager.enums; public enum StaReserveStateType { RESERVED, WAITING, CONFIRMED, CANCELLED, TIMEOUT, ; } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/StaReserveType.java
New file @@ -0,0 +1,9 @@ package com.zy.acs.manager.manager.enums; public enum StaReserveType { IN, OUT, ; } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/StaStsType.java
@@ -10,12 +10,12 @@ public enum StaStsType { IDLE, STOCK, READY_RELEASE, READY_TAKE, DISABLED, OTHER, // IDLE, // STOCK, // READY_RELEASE, // READY_TAKE, // DISABLED, // OTHER, ; StaStsType() { zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/TaskStsType.java
@@ -20,6 +20,8 @@ PROGRESS(4), COMPLETE(5), CANCEL(6), EXPIRED(2), FAILED(3), ; public int dataSort; zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/StaMapper.java
@@ -1,13 +1,13 @@ package com.zy.acs.manager.manager.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zy.acs.manager.manager.controller.param.StaParam; import com.zy.acs.manager.manager.entity.Sta; import org.apache.ibatis.annotations.Param; import java.util.List; public interface StaMapper extends BaseMapper<Sta> { int tryReserveIn(@Param("staId") Long staId, @Param("qty") Integer qty); int releaseReserveIn(@Param("staId") Long staId, @Param("qty") Integer qty); } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/StaReserveMapper.java
@@ -1,7 +1,7 @@ package com.zy.acs.manager.manager.mapper; import com.zy.acs.manager.manager.entity.StaReserve; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zy.acs.manager.manager.entity.StaReserve; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @@ -9,4 +9,5 @@ @Repository public interface StaReserveMapper extends BaseMapper<StaReserve> { } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaReserveService.java
@@ -1,8 +1,12 @@ package com.zy.acs.manager.manager.service; import com.baomidou.mybatisplus.extension.service.IService; import com.zy.acs.manager.manager.entity.Sta; import com.zy.acs.manager.manager.entity.StaReserve; import com.zy.acs.manager.manager.entity.Task; public interface StaReserveService extends IService<StaReserve> { StaReserve reserveStaIn(Sta sta, Task task, Integer qty); } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaReserveServiceImpl.java
@@ -1,12 +1,71 @@ package com.zy.acs.manager.manager.service.impl; import com.zy.acs.manager.manager.mapper.StaReserveMapper; import com.zy.acs.manager.manager.entity.StaReserve; import com.zy.acs.manager.manager.service.StaReserveService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zy.acs.manager.common.exception.BusinessException; import com.zy.acs.manager.manager.entity.Sta; import com.zy.acs.manager.manager.entity.StaReserve; import com.zy.acs.manager.manager.entity.Task; import com.zy.acs.manager.manager.enums.StaReserveStateType; import com.zy.acs.manager.manager.enums.StaReserveType; import com.zy.acs.manager.manager.enums.StatusType; import com.zy.acs.manager.manager.mapper.StaMapper; import com.zy.acs.manager.manager.mapper.StaReserveMapper; import com.zy.acs.manager.manager.service.StaReserveService; import com.zy.acs.manager.manager.service.StaService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.Optional; @Service("staReserveService") public class StaReserveServiceImpl extends ServiceImpl<StaReserveMapper, StaReserve> implements StaReserveService { public static final Long RESERVE_EXPIRE_TIME = 30 * 60 * 1000L; @Autowired private StaService staService; @Autowired private StaMapper staMapper; @Override @Transactional(rollbackFor = Exception.class) public StaReserve reserveStaIn(Sta sta, Task task, Integer qty) { qty = Optional.ofNullable(qty).orElse(1); // reserve sta in if (qty < staMapper.tryReserveIn(sta.getId(), qty)) { throw new BusinessException("Sta[" + sta.getStaNo() + "] can't reserve IN"); } Date now = new Date(); // save staReserve StaReserve reserve = new StaReserve(); reserve.setStaId(sta.getId()); reserve.setTaskId(task.getId()); reserve.setType(StaReserveType.IN.toString()); reserve.setQty(qty); reserve.setState(StaReserveStateType.RESERVED.toString()); reserve.setUniqKey(this.generateReserveUniqKey(sta.getId(), task.getId())); 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.releaseReserveIn(sta.getId(), qty); throw new BusinessException("reserve record insert failed"); } return reserve; } private String generateReserveUniqKey(Long staId, Long taskId) { return "STA:" + staId + "-TASK:" + taskId + "-T"; } } zy-acs-manager/src/main/resources/mapper/manager/StaMapper.xml
@@ -2,6 +2,26 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.acs.manager.manager.mapper.StaMapper"> <update id="tryReserveIn"> UPDATE man_sta SET rsv_in_cnt = rsv_in_cnt + #{qty}, update_time = NOW() WHERE id = #{staId} AND deleted = 0 AND status = 1 AND (capacity - occ_cnt - rsv_in_cnt) >= #{qty} </update> <update id="releaseReserveIn"> UPDATE man_sta SET rsv_in_cnt = rsv_in_cnt - #{qty}, update_time = NOW() WHERE id = #{staId} AND deleted = 0 AND status = 1 AND rsv_in_cnt > #{qty} </update> <!-- 关联查询sql --> <sql id="selectSql"> SELECT a.* zy-acs-manager/src/main/resources/mapper/manager/StaReserveMapper.xml
@@ -2,4 +2,5 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.acs.manager.manager.mapper.StaReserveMapper"> </mapper>