| | |
| | | WHERE NOT EXISTS ( |
| | | SELECT 1 FROM `man_sta_type` WHERE `uuid` = 'TRANSFER' |
| | | ); |
| | | |
| | | alter table man_sta |
| | | alter column occ_cnt set default 0; |
| | |
| | | return ( |
| | | <> |
| | | <CreateBase |
| | | record={{ stateSource: 'RCS' }} |
| | | record={{ stateSource: 'RCS', capacity: 1 }} |
| | | transform={(data) => { |
| | | return data; |
| | | }} |
| | |
| | | case ORI_STA: |
| | | // load from sta |
| | | sta = staService.getById(currTask.getOriSta()); |
| | | // reserve to be waiting |
| | | if (!staReserveService.waitingStaReserve(sta, currTask, currSeg, 1, StaReserveType.OUT)) { |
| | | break; |
| | | } |
| | | // convey plc valid |
| | | if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.OUT)) { |
| | | // reserve rollback |
| | | staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT); |
| | | break; |
| | | } |
| | | News.info("AGV [{}] load permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo()); |
| | | success = true; |
| | | success = staService.allowAgvWorkAtSta(protocol.getAgvNo(), sta, currTask, currSeg, StaReserveType.OUT); |
| | | break; |
| | | case DEST_STA: |
| | | // place to sta |
| | | sta = staService.getById(currTask.getDestSta()); |
| | | // reserve to be waiting |
| | | if (!staReserveService.waitingStaReserve(sta, currTask, currSeg, 1, StaReserveType.IN)) { |
| | | break; |
| | | } |
| | | // convey plc valid |
| | | if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.IN)) { |
| | | // reserve rollback |
| | | staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN); |
| | | break; |
| | | } |
| | | News.info("AGV [{}] unload permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo()); |
| | | success = true; |
| | | success = staService.allowAgvWorkAtSta(protocol.getAgvNo(), sta, currTask, currSeg, StaReserveType.IN); |
| | | break; |
| | | default: |
| | | News.error("AGV [{}] has wrong posType [{}], segment [{}]", protocol.getAgvNo(), posType.toString(), currSeg.getId()); |
| | |
| | | // segment call back |
| | | segmentService.processNext(segmentList); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | // inbound ------------------- |
| | | |
| | | int tryReserveIn(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | int tryReserveInRoller(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int tryReserveInCommon(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int releaseReserveIn(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int confirmReserveIn(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | int confirmReserveInRoller(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int confirmReserveInCommon(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | // outbound ------------------ |
| | | |
| | | int tryReserveOut(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | int tryReserveOutRoller(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int tryReserveOutCommon(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int releaseReserveOut(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int confirmReserveOut(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | int confirmReserveOutRoller(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | int confirmReserveOutCommon(@Param("staId") Long staId, @Param("qty") Integer qty); |
| | | |
| | | |
| | | // query ------------------ |
| | | |
| | | List<Sta> selectAvailableOutSta(@Param("minAvailableQty") Integer minAvailableQty); |
| | | List<Sta> selectAvailableOutStaRoller(@Param("rollerStaType") Long rollerStaType, |
| | | @Param("minAvailableQty") Integer minAvailableQty); |
| | | |
| | | List<Sta> selectAvailableInSta(@Param("minAvailableQty") Integer minAvailableQty); |
| | | List<Sta> selectAvailableOutStaCommon(@Param("rollerStaType") Long rollerStaType, |
| | | @Param("minAvailableQty") Integer minAvailableQty); |
| | | |
| | | List<Sta> selectAvailableInStaRoller(@Param("rollerStaType") Long rollerStaType, |
| | | @Param("minAvailableQty") Integer minAvailableQty); |
| | | |
| | | List<Sta> selectAvailableInStaCommon(@Param("rollerStaType") Long rollerStaType, |
| | | @Param("minAvailableQty") Integer minAvailableQty); |
| | | |
| | | } |
| | |
| | | package com.zy.acs.manager.manager.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.zy.acs.manager.manager.entity.Segment; |
| | | import com.zy.acs.manager.manager.entity.Sta; |
| | | import com.zy.acs.manager.manager.entity.Task; |
| | | import com.zy.acs.manager.manager.enums.StaReserveType; |
| | | import com.zy.acs.manager.manager.enums.StaTypeType; |
| | | |
| | | import java.util.List; |
| | |
| | | |
| | | boolean isRoller(Long staId); |
| | | |
| | | StaTypeType resolveStaType(Sta sta); |
| | | |
| | | boolean allowAgvWorkAtSta(String agvNo, Sta sta, Task task, Segment seg, StaReserveType type); |
| | | |
| | | Boolean hasWorkingAgv(Long staId); |
| | | |
| | | } |
| | |
| | | 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.enums.TaskTypeType; |
| | | import com.zy.acs.manager.manager.enums.*; |
| | | import com.zy.acs.manager.manager.mapper.StaMapper; |
| | | import com.zy.acs.manager.manager.mapper.StaReserveMapper; |
| | | import com.zy.acs.manager.manager.service.StaReserveService; |
| | |
| | | qty = Optional.ofNullable(qty).orElse(DEFAULT_QTY); |
| | | |
| | | // reserve sta in |
| | | if (staMapper.tryReserveIn(sta.getId(), qty) < qty) { |
| | | int changed; |
| | | StaTypeType staType = staService.resolveStaType(sta); |
| | | if (StaTypeType.ROLLER.equals(staType)) { |
| | | changed = staMapper.tryReserveInRoller(sta.getId(), qty); |
| | | } else { |
| | | changed = staMapper.tryReserveInCommon(sta.getId(), qty); |
| | | } |
| | | if (changed < qty) { |
| | | throw new BusinessException("Sta[" + sta.getStaNo() + "] can't reserve IN"); |
| | | } |
| | | Date now = new Date(); |
| | |
| | | qty = Optional.ofNullable(qty).orElse(DEFAULT_QTY); |
| | | |
| | | // reserve sta out |
| | | if (staMapper.tryReserveOut(sta.getId(), qty) < qty) { |
| | | StaTypeType staType = staService.resolveStaType(sta); |
| | | int changed; |
| | | if (StaTypeType.ROLLER.equals(staType)) { |
| | | changed = staMapper.tryReserveOutRoller(sta.getId(), qty); |
| | | } else { |
| | | changed = staMapper.tryReserveOutCommon(sta.getId(), qty); |
| | | } |
| | | if (changed < qty) { |
| | | throw new BusinessException("Sta[" + sta.getStaNo() + "] can't reserve OUT"); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | int cntOfDealWithReserve = 0; |
| | | StaTypeType staType = staService.resolveStaType(sta); |
| | | switch (type) { |
| | | case IN: |
| | | cntOfDealWithReserve = staMapper.confirmReserveIn(sta.getId(), qty); |
| | | cntOfDealWithReserve = StaTypeType.ROLLER.equals(staType) |
| | | ? staMapper.confirmReserveInRoller(sta.getId(), qty) |
| | | : staMapper.confirmReserveInCommon(sta.getId(), qty); |
| | | break; |
| | | case OUT: |
| | | cntOfDealWithReserve = staMapper.confirmReserveOut(sta.getId(), qty); |
| | | cntOfDealWithReserve = StaTypeType.ROLLER.equals(staType) |
| | | ? staMapper.confirmReserveOutRoller(sta.getId(), qty) |
| | | : staMapper.confirmReserveOutCommon(sta.getId(), qty); |
| | | break; |
| | | default: |
| | | break; |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.zy.acs.common.utils.News; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.manager.core.integrate.conveyor.ConveyorStationService; |
| | | import com.zy.acs.manager.core.domain.TaskPosDto; |
| | | import com.zy.acs.manager.manager.entity.*; |
| | | import com.zy.acs.manager.manager.enums.*; |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Comparator; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | private StaReserveService staReserveService; |
| | | @Autowired |
| | | private TaskService taskService; |
| | | @Autowired |
| | | private ConveyorStationService conveyorStationService; |
| | | |
| | | @Override |
| | | public Sta selectByStaNo(String staNo) { |
| | |
| | | |
| | | @Override |
| | | public List<Sta> queryAvailableOutSta(Integer minAvailableQty) { |
| | | return this.baseMapper.selectAvailableOutSta(minAvailableQty); |
| | | long rollerStaType = StaTypeType.ROLLER.val(); |
| | | List<Sta> list = new ArrayList<>(); |
| | | list.addAll(this.baseMapper.selectAvailableOutStaRoller(rollerStaType, minAvailableQty)); |
| | | list.addAll(this.baseMapper.selectAvailableOutStaCommon(rollerStaType, minAvailableQty)); |
| | | list.sort(Comparator.comparing(Sta::getStaNo, Comparator.nullsLast(String::compareTo))); |
| | | return list; |
| | | } |
| | | |
| | | @Override |
| | | public List<Sta> queryAvailableInSta(Integer minAvailableQty) { |
| | | return this.baseMapper.selectAvailableInSta(minAvailableQty); |
| | | long rollerStaType = StaTypeType.ROLLER.val(); |
| | | List<Sta> list = new ArrayList<>(); |
| | | list.addAll(this.baseMapper.selectAvailableInStaRoller(rollerStaType, minAvailableQty)); |
| | | list.addAll(this.baseMapper.selectAvailableInStaCommon(rollerStaType, minAvailableQty)); |
| | | list.sort(Comparator.comparing(Sta::getStaNo, Comparator.nullsLast(String::compareTo))); |
| | | return list; |
| | | } |
| | | |
| | | @Override |
| | |
| | | return false; |
| | | } |
| | | Sta sta = this.getById(staId); |
| | | return StaTypeType.ROLLER.equals(resolveStaType(sta)); |
| | | } |
| | | |
| | | @Override |
| | | public StaTypeType resolveStaType(Sta sta) { |
| | | if (sta == null || Cools.isEmpty(sta.getStaType())) { |
| | | return null; |
| | | } |
| | | for (StaTypeType value : StaTypeType.values()) { |
| | | if (value.val() == sta.getStaType()) { |
| | | return value; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | public boolean allowAgvWorkAtSta(String agvNo, Sta sta, Task task, Segment seg, StaReserveType type) { |
| | | if (sta == null) { |
| | | return false; |
| | | } |
| | | return StaTypeType.ROLLER.val() == sta.getStaType(); |
| | | if (!staReserveService.waitingStaReserve(sta, task, seg, 1, type)) { |
| | | return false; |
| | | } |
| | | |
| | | StaTypeType staType = resolveStaType(sta); |
| | | if (staType == null) { |
| | | News.warn("AGV [{}] station [{}] has unknown sta type, validation bypassed", |
| | | agvNo, |
| | | sta.getStaNo()); |
| | | return true; |
| | | } |
| | | |
| | | switch (staType) { |
| | | case ROLLER: |
| | | if (!conveyorStationService.allowAgvWork(sta, task, seg, type)) { |
| | | staReserveService.rollbackWaitingToReserved(sta, task, type); |
| | | return false; |
| | | } |
| | | News.info("AGV [{}] work permitted at conveyor station [{}], type=[{}]", |
| | | agvNo, |
| | | sta.getStaNo(), |
| | | type); |
| | | return true; |
| | | case RACK: |
| | | case TRANSFER: |
| | | default: |
| | | News.info("AGV [{}] work permitted at station [{}], staType=[{}], validation bypassed", |
| | | agvNo, |
| | | sta.getStaNo(), |
| | | staType); |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | <!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 id="tryReserveInRoller"> |
| | | UPDATE man_sta |
| | | SET rsv_in_cnt = rsv_in_cnt + #{qty}, |
| | | update_time = NOW() |
| | |
| | | AND status = 1 |
| | | AND (capacity - rsv_in_cnt) >= #{qty} |
| | | </update> |
| | | <!-- UPDATE man_sta |
| | | |
| | | <update id="tryReserveInCommon"> |
| | | 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}--> |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND (capacity - occ_cnt - rsv_in_cnt) >= #{qty} |
| | | </update> |
| | | |
| | | <update id="releaseReserveIn"> |
| | | UPDATE man_sta |
| | |
| | | AND rsv_in_cnt >= #{qty} |
| | | </update> |
| | | |
| | | <update id="confirmReserveIn"> |
| | | <update id="confirmReserveInRoller"> |
| | | UPDATE man_sta |
| | | SET rsv_in_cnt = rsv_in_cnt - #{qty}, |
| | | update_time = NOW() |
| | |
| | | AND status = 1 |
| | | AND rsv_in_cnt >= #{qty} |
| | | </update> |
| | | <!-- UPDATE man_sta |
| | | |
| | | <update id="confirmReserveInCommon"> |
| | | UPDATE man_sta |
| | | SET rsv_in_cnt = rsv_in_cnt - #{qty}, |
| | | occ_cnt = occ_cnt + #{qty}, |
| | | update_time = NOW() |
| | | WHERE id = #{staId} |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND rsv_in_cnt >= #{qty}--> |
| | | AND rsv_in_cnt >= #{qty} |
| | | </update> |
| | | |
| | | <update id="tryReserveOut"> |
| | | <update id="tryReserveOutRoller"> |
| | | UPDATE man_sta |
| | | SET rsv_out_cnt = rsv_out_cnt + #{qty}, |
| | | update_time = NOW() |
| | |
| | | AND status = 1 |
| | | AND (capacity - rsv_out_cnt) >= #{qty} |
| | | </update> |
| | | <!-- UPDATE man_sta |
| | | |
| | | <update id="tryReserveOutCommon"> |
| | | UPDATE man_sta |
| | | SET rsv_out_cnt = rsv_out_cnt + #{qty}, |
| | | update_time = NOW() |
| | | WHERE id = #{staId} |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND (occ_cnt - rsv_out_cnt) >= #{qty}--> |
| | | AND (occ_cnt - rsv_out_cnt) >= #{qty} |
| | | </update> |
| | | |
| | | <update id="releaseReserveOut"> |
| | | UPDATE man_sta |
| | |
| | | AND rsv_out_cnt >= #{qty} |
| | | </update> |
| | | |
| | | <update id="confirmReserveOut"> |
| | | <update id="confirmReserveOutRoller"> |
| | | UPDATE man_sta |
| | | SET rsv_out_cnt = rsv_out_cnt - #{qty}, |
| | | update_time = NOW() |
| | |
| | | AND status = 1 |
| | | AND rsv_out_cnt >= #{qty} |
| | | </update> |
| | | <!-- UPDATE man_sta |
| | | |
| | | <update id="confirmReserveOutCommon"> |
| | | UPDATE man_sta |
| | | SET rsv_out_cnt = rsv_out_cnt - #{qty}, |
| | | occ_cnt = occ_cnt - #{qty}, |
| | | update_time = NOW() |
| | |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND rsv_out_cnt >= #{qty} |
| | | AND occ_cnt >= #{qty}--> |
| | | AND occ_cnt >= #{qty} |
| | | </update> |
| | | |
| | | <select id="selectAvailableOutSta" resultType="com.zy.acs.manager.manager.entity.Sta"> |
| | | <select id="selectAvailableOutStaRoller" resultType="com.zy.acs.manager.manager.entity.Sta"> |
| | | SELECT * |
| | | FROM man_sta |
| | | WHERE 1=1 |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND (IFNULL(capacity, 0) - IFNULL(rsv_out_cnt, 0)) >= #{minAvailableQty} |
| | | AND sta_type = #{rollerStaType} |
| | | AND (capacity - rsv_out_cnt) >= #{minAvailableQty} |
| | | </select> |
| | | <!-- SELECT * |
| | | FROM man_sta |
| | | WHERE 1=1 |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND (IFNULL(occ_cnt, 0) - IFNULL(rsv_out_cnt, 0)) >= #{minAvailableQty}--> |
| | | |
| | | <select id="selectAvailableInSta" resultType="com.zy.acs.manager.manager.entity.Sta"> |
| | | <select id="selectAvailableOutStaCommon" resultType="com.zy.acs.manager.manager.entity.Sta"> |
| | | SELECT * |
| | | FROM man_sta |
| | | WHERE 1=1 |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND (IFNULL(capacity, 0) - IFNULL(rsv_in_cnt, 0)) >= #{minAvailableQty} |
| | | AND sta_type != #{rollerStaType} |
| | | AND (occ_cnt - rsv_out_cnt) >= #{minAvailableQty} |
| | | </select> |
| | | <!-- SELECT * |
| | | |
| | | <select id="selectAvailableInStaRoller" resultType="com.zy.acs.manager.manager.entity.Sta"> |
| | | SELECT * |
| | | FROM man_sta |
| | | WHERE 1=1 |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND (IFNULL(capacity, 0) - IFNULL(occ_cnt, 0) - IFNULL(rsv_in_cnt, 0)) >= #{minAvailableQty}--> |
| | | AND sta_type = #{rollerStaType} |
| | | AND (capacity - rsv_in_cnt) >= #{minAvailableQty} |
| | | </select> |
| | | |
| | | <select id="selectAvailableInStaCommon" resultType="com.zy.acs.manager.manager.entity.Sta"> |
| | | SELECT * |
| | | FROM man_sta |
| | | WHERE 1=1 |
| | | AND deleted = 0 |
| | | AND status = 1 |
| | | AND sta_type != #{rollerStaType} |
| | | AND (capacity - occ_cnt - rsv_in_cnt) >= #{minAvailableQty} |
| | | </select> |
| | | |
| | | <!-- 关联查询sql --> |
| | | <sql id="selectSql"> |