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)); 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,8 +44,9 @@ AgvErrorType errorType = AgvErrorType.query(agv_04_up.getHexFaultId()); Long agvId = agvService.getAgvId(vehicle); VehFaultRec vehFaultRec = new VehFaultRec(); 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())); @@ -59,10 +60,21 @@ 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); @@ -334,8 +340,10 @@ 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()); @@ -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)) { @@ -598,6 +609,7 @@ throw new BusinessException(task.getSeqNum() + " failed to save"); } // generate travel Travel travel = new Travel(); travel.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); @@ -611,13 +623,20 @@ } // generate segment int segSerial = 0; segSerial ++; int segSerial = 0; segSerial++; List<Segment> segmentList = new ArrayList<>(); String posType = ""; 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); @@ -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; @@ -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>