#
vincentlu
2026-04-27 dcf49806e12b014cf6471910814fdbcb6f494c44
#
8个文件已修改
243 ■■■■ 已修改文件
version/db/new.sql 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/page/sta/StaCreate.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/StaMapper.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaReserveServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/mapper/manager/StaMapper.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/db/new.sql
@@ -132,3 +132,6 @@
WHERE NOT EXISTS (
    SELECT 1 FROM `man_sta_type` WHERE `uuid` = 'TRANSFER'
);
alter table man_sta
    alter column occ_cnt set default 0;
zy-acs-flow/src/page/sta/StaCreate.jsx
@@ -63,7 +63,7 @@
    return (
        <>
            <CreateBase
                record={{ stateSource: 'RCS' }}
                record={{ stateSource: 'RCS', capacity: 1 }}
                transform={(data) => {
                    return data;
                }}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -1904,34 +1904,12 @@
                            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());
@@ -2040,5 +2018,4 @@
        // segment call back
        segmentService.processNext(segmentList);
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/StaMapper.java
@@ -10,25 +10,41 @@
    // 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);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaService.java
@@ -1,8 +1,10 @@
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;
@@ -21,6 +23,10 @@
    boolean isRoller(Long staId);
    StaTypeType resolveStaType(Sta sta);
    boolean allowAgvWorkAtSta(String agvNo, Sta sta, Task task, Segment seg, StaReserveType type);
    Boolean hasWorkingAgv(Long staId);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaReserveServiceImpl.java
@@ -9,10 +9,7 @@
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;
@@ -45,7 +42,14 @@
        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();
@@ -79,7 +83,14 @@
        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");
        }
@@ -172,12 +183,17 @@
        }
        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;
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaServiceImpl.java
@@ -2,7 +2,9 @@
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.*;
@@ -11,6 +13,8 @@
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;
@@ -29,6 +33,8 @@
    private StaReserveService staReserveService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private ConveyorStationService conveyorStationService;
    @Override
    public Sta selectByStaNo(String staNo) {
@@ -48,12 +54,22 @@
    @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
@@ -78,10 +94,59 @@
            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
zy-acs-manager/src/main/resources/mapper/manager/StaMapper.xml
@@ -2,7 +2,7 @@
<!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()
@@ -11,13 +11,16 @@
          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
@@ -29,7 +32,7 @@
        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()
@@ -38,16 +41,19 @@
        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()
@@ -56,13 +62,16 @@
        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
@@ -74,7 +83,7 @@
        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()
@@ -83,7 +92,9 @@
        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()
@@ -91,37 +102,48 @@
        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">