zhang
2025-07-23 b3814333d786324bb81cca7d1bcf5ac8f2f1a7cf
保存一个版本
13个文件已修改
198 ■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataErrorService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataNoCodeService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/FaultProcessor.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/MapDataDispatcher.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Task.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/VehFaultRec.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/VehFaultRecMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/VehFaultRecService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/VehFaultRecServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/resources/mapper/manager/VehFaultRecMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataErrorService.java
@@ -6,9 +6,6 @@
import com.zy.acs.common.domain.protocol.IMessageBody;
import com.zy.acs.common.enums.error.AgvErrorType;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.common.DateUtils;
import com.zy.acs.manager.core.constant.MapDataConstant;
import com.zy.acs.manager.core.domain.VehicleFaultDto;
import com.zy.acs.manager.manager.entity.AgvDetail;
import com.zy.acs.manager.manager.service.*;
@@ -80,8 +77,12 @@
            AgvErrorType errorType = AgvErrorType.query(agv_04_up.getHexFaultId());
            log.info("Agv [{}] 故障数据包 ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_04_up));
            // save
            faultProcessor.execute(new VehicleFaultDto<>(protocol.getAgvNo(), protocol.getTimestamp(), agv_04_up));
            if (agv_04_up.getFaultId() == 12304 && agv_04_up.getData2() == 4 && agv_04_up.getFlag() == 4) {
                faultProcessor.reset(agvId);
            } else {
                // save
                faultProcessor.execute(new VehicleFaultDto<>(protocol.getAgvNo(), protocol.getTimestamp(), agv_04_up));
            }
            // detail
            String errorMSg = errorType != null ? errorType.getMsg() : agv_04_up.getHexFaultId();
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataNoCodeService.java
@@ -95,6 +95,7 @@
            assert detail.getErrorTime() != null;
            if (DateUtils.diffToSeconds(detail.getErrorTime(), new Date()) > 20) {
                detail.setError(MapDataConstant.EMPTY_OF_ERROR);
                faultProcessor.reset(agvId);
            }
        }
        if (!agvDetailService.updateById(detail)) {
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AgvDataService.java
@@ -101,6 +101,7 @@
            assert detail.getErrorTime() != null;
            if (DateUtils.diffToSeconds(detail.getErrorTime(), new Date()) > 20) {
                detail.setError(MapDataConstant.EMPTY_OF_ERROR);
                faultProcessor.reset(agvId);
            }
        }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/FaultProcessor.java
@@ -44,25 +44,37 @@
            AgvErrorType errorType = AgvErrorType.query(agv_04_up.getHexFaultId());
            Long agvId = agvService.getAgvId(vehicle);
            VehFaultRec vehFaultRec = vehFaultRecService.getTopVehFaultRec(agvId, String.valueOf(agv_04_up.getFaultId()));
            if (null == vehFaultRec) {
                vehFaultRec = new VehFaultRec();
                vehFaultRec.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
                vehFaultRec.setAgvId(agvId);
                vehFaultRec.setFaultNo(String.valueOf(agv_04_up.getFaultId()));
                vehFaultRec.setFaultHex(agv_04_up.getHexFaultId());
                vehFaultRec.setFaultName(null != errorType ? errorType.desc : "undefined");
                vehFaultRec.setFaultLev(agv_04_up.getFaultLevel());
                vehFaultRec.setFaultData(GsonUtils.toJson(Cools.add("data1", agv_04_up.getData1()).add("data2", agv_04_up.getData2())));
                vehFaultRec.setHappenTime(new Date());
                vehFaultRec.setProtocol(RadixTools.bytesToHexStr(agv_04_up.writeToBytes()));
            VehFaultRec vehFaultRec = new VehFaultRec();
            vehFaultRec.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
            vehFaultRec.setAgvId(agvId);
            vehFaultRec.setFaultNo(String.valueOf(agv_04_up.getFaultId()));
            vehFaultRec.setFaultHex(agv_04_up.getHexFaultId());
            vehFaultRec.setFaultName(null != errorType ? errorType.desc : "undefined");
            vehFaultRec.setFaultLev(agv_04_up.getFaultLevel());
            vehFaultRec.setFaultData(GsonUtils.toJson(Cools.add("data1", agv_04_up.getData1()).add("data2", agv_04_up.getData2())));
            vehFaultRec.setHappenTime(new Date());
            vehFaultRec.setProtocol(RadixTools.bytesToHexStr(agv_04_up.writeToBytes()));
            if (!vehFaultRecService.save(vehFaultRec)) {
                log.error("{}号车辆故障!记录故障信息失败......", dto.getVehicle());
                if (!vehFaultRecService.save(vehFaultRec)) {
                    log.error("{}号车辆故障!记录故障信息失败......", dto.getVehicle());
                }
            } else {
                vehFaultRec.setUpdateTime(new Date());
                if (!vehFaultRecService.updateById(vehFaultRec)) {
                    log.error("{}号车辆故障!更新故障信息失败......", dto.getVehicle());
                }
            }
        } catch (Exception e) {
            log.error("FaultProcessor", e);
        }
    }
    @Async
    public void reset(Long agvId) {
        vehFaultRecService.resetError(agvId);
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -96,6 +96,10 @@
    private LaneService laneService;
    @Autowired
    private ActionSorter actionSorter;
    @Autowired
    private TaskReportService taskReportService;
    @Autowired
    private AgvDurationService agvDurationService;
    @SuppressWarnings("all")
    @Transactional
@@ -286,7 +290,9 @@
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void buildMajorTask(Long agvId, List<Task> taskList) {
        if (Cools.isEmpty(agvId, taskList)) { return; }
        if (Cools.isEmpty(agvId, taskList)) {
            return;
        }
        try {
            // valid -----------------------------------------------
            Agv agv = agvService.getById(agvId);
@@ -326,16 +332,18 @@
             * val: new TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType)
             */
            Map<String, List<TaskPosDto>> groups = new HashMap<>();
            final String sameGroupXy = configService.getVal( "sameGroupXy", String.class);
            final String sameGroupXy = configService.getVal("sameGroupXy", String.class);
            int backpackLev = 0;
            for (Task task : taskList) {
                backpackLev ++;
                backpackLev++;
                Code startCode = null;
                Code endCode = null;
                Loc oriLoc = null; Loc destLoc = null;
                Sta oriSta = null; Sta destSta = null;
                Loc oriLoc = null;
                Loc destLoc = null;
                Sta oriSta = null;
                Sta destSta = null;
                switch (Objects.requireNonNull(TaskTypeType.get(task.getTaskTypeEl()))) {
                    case LOC_TO_LOC:
                        oriLoc = locService.getById(task.getOriLoc());
@@ -438,7 +446,7 @@
            // re-order by agv current position
            Code currCode = codeService.getCacheById(agvDetail.getRecentCode());
            Double[] currPosition = new Double[] {currCode.getX(), currCode.getY()};
            Double[] currPosition = new Double[]{currCode.getX(), currCode.getY()};
            List<List<TaskPosDto>> pickGroups = new ArrayList<>();
            List<List<TaskPosDto>> dropGroups = new ArrayList<>();
@@ -484,7 +492,7 @@
            List<Segment> segmentList = new ArrayList<>();
            for (List<TaskPosDto> dtoList : list) {
                for (TaskPosDto taskPosDto : dtoList) {
                    segSerial ++;
                    segSerial++;
                    AgvBackpackType backpackType = AgvBackpackDto.find(backpackDtoList, taskPosDto.getTaskId());
                    assert null != backpackType;
@@ -532,9 +540,12 @@
    /**
     * 充电 回待机位任务
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW) // although there is a Transactional here that the lock is isolated, but we can't join the caller's Transactional
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    // although there is a Transactional here that the lock is isolated, but we can't join the caller's Transactional
    public boolean buildMinorTask(Long agvId, TaskTypeType taskType, String destination, Jam jam) {
        if (Cools.isEmpty(agvId, taskType)) { return false; }
        if (Cools.isEmpty(agvId, taskType)) {
            return false;
        }
        try {
            String agvNo = agvService.getAgvNo(agvId);
            if (!agvService.judgeEnable(agvId)) {
@@ -581,7 +592,7 @@
            task.setAgvId(agvId);
            task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
            List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
            task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
            task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks) ? null : lastTasks.get(0).getSeqNum()));
            task.setOriCode(agvDetail.getCode());
            task.setDestCode(endCode.getId());
            // lane
@@ -589,7 +600,7 @@
            if (null != destLane) {
                task.setDestLaneHash(destLane.getHashCode());
            }
            task.setPriority(taskType.equals(TaskTypeType.TO_CHARGE)?2:1);
            task.setPriority(taskType.equals(TaskTypeType.TO_CHARGE) ? 2 : 1);
            task.setTaskSts(TaskStsType.ASSIGN.val());
            task.setTaskType(taskType.val());
            task.setIoTime(now);
@@ -597,6 +608,7 @@
            if (!taskService.save(task)) {
                throw new BusinessException(task.getSeqNum() + " failed to save");
            }
            // generate travel
            Travel travel = new Travel();
@@ -611,13 +623,20 @@
            }
            // generate segment
            int segSerial = 0;     segSerial ++;
            int segSerial = 0;
            segSerial++;
            List<Segment> segmentList = new ArrayList<>();
            String posType = "";
            switch (taskType){
            switch (taskType) {
                case TO_CHARGE:
                    posType = TaskPosDto.PosType.TO_CHARGE.toString();
                    //插入充电任务
                    AgvDuration agvDuration = new AgvDuration();
                    agvDuration.setHappenTime(now);
                    agvDuration.setAgvId(agvId);
                    agvDuration.setTaskNo(task.getId());
                    agvDurationService.save(agvDuration);
                    break;
                case TO_STANDBY:
                    posType = TaskPosDto.PosType.TO_STANDBY.toString();
@@ -687,7 +706,9 @@
    @Transactional
    public synchronized void generateAction(Long agvId, List<Segment> segmentList, List<String> pathList, Date algoStartTime) {
        try {
            if (Cools.isEmpty(agvId, segmentList)) { return; }
            if (Cools.isEmpty(agvId, segmentList)) {
                return;
            }
            Date now = new Date();
            long actionPrepareSts = ActionStsType.PREPARE.val();
//            JSONObject storeDirection = configService.getVal("storeDirection", JSONObject.class);
@@ -729,7 +750,9 @@
                    List<String> pathListPart = pathList.subList(pathList.indexOf(lastCode.getData()), pathList.indexOf(code.getData()) + 1);
                    for (int i = 0; i < pathListPart.size(); i++) {
                        if (i == 0) { continue; }
                        if (i == 0) {
                            continue;
                        }
                        String next = pathListPart.get(i);
@@ -938,7 +961,7 @@
                                task.getBusId(),    // 总线
                                task.getId(),    // 任务
                                null,    // 动作号
                                 null,    // 优先级
                                null,    // 优先级
                                ActionTypeType.ReadyReleaseToShelvesLoc.desc,    // 名称
                                (double) agvDirectionType.val,    // 属性值
                                lastCode.getData(),    // 地面码
@@ -1439,9 +1462,9 @@
                // segment list
                List<Segment> segmentList = segmentService.list(new LambdaQueryWrapper<Segment>()
                        .eq(Segment::getGroupId, serialNo)
                                .eq(Segment::getGroupId, serialNo)
//                        .eq(Segment::getState, SegmentStateType.RUNNING.toString())
                        .orderByAsc(Segment::getSerial)
                                .orderByAsc(Segment::getSerial)
                );
                // settlement
@@ -1471,8 +1494,10 @@
        for (Segment segment : segmentList) {
            boolean taskComplete = false;
            Task task = taskService.getById(segment.getTaskId());   assert null != task;
            TaskTypeType typeType = TaskTypeType.get(task.getTaskTypeEl());     assert null != typeType;
            Task task = taskService.getById(segment.getTaskId());
            assert null != task;
            TaskTypeType typeType = TaskTypeType.get(task.getTaskTypeEl());
            assert null != typeType;
            TaskPosDto.PosType posType = TaskPosDto.queryPosType(segment.getPosType());
            switch (Objects.requireNonNull(posType)) {
@@ -1508,6 +1533,21 @@
                    log.error("Task [{}] 更新失败 !!!", task.getSeqNum());
                } else {
                    log.info("Task [{}] 作业完毕 ==========>> ", task.getSeqNum());
                    // TODO 插入一条上报记录
                    TaskReport taskReport = new TaskReport();
                    taskReport.setAgvId(task.getAgvId());
                    taskReport.setBusNo(task.getBusId$());
                    taskReport.setCreateTime(new Date());
                    taskReport.setDestLoc(task.getDestLoc());
                    taskReport.setDestSta(task.getDestSta());
                    taskReport.setSeqNum(task.getSeqNum());
                    taskReport.setTaskSts(task.getTaskSts());
                    taskReport.setOriLoc(task.getOriLoc());
                    taskReport.setOriSta(task.getOriSta());
                    taskReport.setZpallet(task.getZpallet());
                    if (!taskReportService.save(taskReport)) {
                        log.info("TaskReport [{}] 插入失败 ==========>> ", JSON.toJSONString(taskReport));
                    }
                }
            }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/MapDataDispatcher.java
@@ -16,8 +16,6 @@
import com.zy.acs.manager.manager.service.RouteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@@ -309,11 +307,20 @@
                            turnMatrix[i][j] = TurnNodeType.STRAIGHT.val;
                            break;
                        case 2:
                            String firstCode = neighborCodeList.get(0); assert !Cools.isEmpty(firstCode);
                            String secondCode = neighborCodeList.get(1); assert !Cools.isEmpty(secondCode);
                            String firstCode = neighborCodeList.get(0);
                            assert !Cools.isEmpty(firstCode);
                            String secondCode = neighborCodeList.get(1);
                            assert !Cools.isEmpty(secondCode);
                            int[] firstIdx = this.getCodeMatrixIdx(lev, firstCode);
                            int[] secondIdx = this.getCodeMatrixIdx(lev, secondCode);
                            if (firstIdx == null) {
                                throw new CoolException("不存在点位:" + firstCode);
                            }
                            if (secondIdx == null) {
                                throw new CoolException("不存在点位:" + secondCode);
                            }
                            if (firstIdx[0] != secondIdx[0] && firstIdx[1] != secondIdx[1]) {
                                turnMatrix[i][j] = TurnNodeType.TURN.val;
@@ -335,7 +342,7 @@
        return turnMatrix;
    }
    public synchronized int[][] initMapMatrix(Integer lev) {
        log.info("There is initializing Map Matrix......");
@@ -418,7 +425,9 @@
        for (Code code : codeList) {
            Double x = code.getX();
            Double y = code.getY();
            if (null == x || null == y) { continue; }
            if (null == x || null == y) {
                continue;
            }
            if (!xIdxList.contains(x)) {
                xIdxList.add(x);
            }
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Task.java
@@ -74,7 +74,7 @@
    private Long agvId;
    /**
     * 工作时间
     * 工作时间、任务分配时间
     */
    @ApiModelProperty(value= "工作时间")
    private Date ioTime;
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/VehFaultRec.java
@@ -98,6 +98,12 @@
    private Date resetTime;
    /**
     * 持续时间
     */
    @ApiModelProperty(value= "持续时间")
    private Long duration;
    /**
     * 进度
     */
    @ApiModelProperty(value= "进度")
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/VehFaultRecMapper.java
@@ -5,4 +5,7 @@
public interface VehFaultRecMapper extends BaseMapper<VehFaultRec> {
    VehFaultRec getTopVehFaultRec(Long agvId, String faultNo);
    int resetError(Long agvId);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/VehFaultRecService.java
@@ -5,4 +5,7 @@
public interface VehFaultRecService extends IService<VehFaultRec> {
    VehFaultRec getTopVehFaultRec(Long agvId, String faultNo);
    int resetError(Long agvId);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/VehFaultRecServiceImpl.java
@@ -9,4 +9,13 @@
@Service("vehFaultRecService")
public class VehFaultRecServiceImpl extends ServiceImpl<VehFaultRecMapper, VehFaultRec> implements VehFaultRecService {
    @Override
    public VehFaultRec getTopVehFaultRec(Long agvId, String faultNo) {
        return baseMapper.getTopVehFaultRec(agvId, faultNo);
    }
    @Override
    public int resetError(Long agvId) {
        return baseMapper.resetError(agvId);
    }
}
zy-acs-manager/src/main/resources/application.yml
@@ -7,7 +7,7 @@
    static-path-pattern: /**
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jbly?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://10.10.10.200:3306/jbly?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: xltys1995
    type: com.alibaba.druid.pool.DruidDataSource
@@ -42,7 +42,7 @@
    enabled: false
redis:
  host: localhost
  host: 10.10.10.200
  password: xltys1995
  port: 6379
  max: 30
zy-acs-manager/src/main/resources/mapper/manager/VehFaultRecMapper.xml
@@ -23,4 +23,21 @@
        </where>
    </sql>
    <update id="resetError">
        UPDATE man_veh_fault_rec
        SET reset_time = now(),
            duration = (UNIX_TIMESTAMP(reset_time) - UNIX_TIMESTAMP(happen_time))
        WHERE agv_id = #{agvId}
          and reset_time is null
    </update>
    <select id="getTopVehFaultRec" resultType="com.zy.acs.manager.manager.entity.VehFaultRec">
        SELECT *
        FROM man_veh_fault_rec
        WHERE agv_id = #{agvId}
          and fault_no = #{faultNo}
          and reset_time is null
        ORDER BY happen_time DESC LIMIT 1
    </select>
</mapper>