SchedulerTask.java 7.65 KB
package com.huaheng.control.management.task;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Collections;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;

import com.alibaba.fastjson.TypeReference;
import com.huaheng.control.management.dto.EquipmentStatus;
import com.huaheng.control.management.dto.Task;
import com.huaheng.control.management.dto.enums.EquipmentStatusEnum;
import com.huaheng.control.management.dto.enums.TaskStatusEnum;
import com.huaheng.control.management.service.ApiService;
import com.huaheng.control.management.utils.HuahengRedisUtils;
import com.huaheng.control.management.utils.OkHttpUtils;
import com.huaheng.control.management.utils.config.ApplicationConfig;
import com.huaheng.control.management.utils.constant.CommonConstant;
import com.huaheng.control.management.vo.Result;
import com.huaheng.control.management.vo.WcsResult;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class SchedulerTask {

    @Resource
    private HuahengRedisUtils huahengRedisUtils;

    @Resource
    private ApiService apiService;

    @Resource
    private ApplicationConfig applicationConfig;

    /**
     * 检查WMS系统状态
     */
    @Scheduled(cron = "30 * * * * ?")
    public void checkWmsEquipmentStatus() {
        try {
            EquipmentStatus equipmentStatus = huahengRedisUtils.getEquipmentStatus(CommonConstant.EQUIPMENT_ID_WMS);
            if (equipmentStatus == null) {
                equipmentStatus = new EquipmentStatus();
                equipmentStatus.setEquipmentId(CommonConstant.EQUIPMENT_ID_WMS);
                equipmentStatus.setEquipmentStatus(EquipmentStatusEnum.FREE.getKey());
                apiService.saveEquipmentStatus(equipmentStatus);
            }
            // 如果WMS设备的运行状态是RUNNING
            if (equipmentStatus.getEquipmentStatus().equals(EquipmentStatusEnum.RUNNING.getKey())) {
                // 时间戳与当前时间差值超过10分钟
                if (DateUtil.between(DateUtil.date(equipmentStatus.getTimestamp()), DateUtil.date(), DateUnit.MINUTE) > 10) {
                    equipmentStatus = new EquipmentStatus();
                    equipmentStatus.setEquipmentId(CommonConstant.EQUIPMENT_ID_WMS);
                    equipmentStatus.setEquipmentStatus(EquipmentStatusEnum.FREE.getKey());
                    apiService.saveEquipmentStatus(equipmentStatus);
                }
            }
            if (equipmentStatus.getEquipmentStatus().equals(EquipmentStatusEnum.EXCEPTION.getKey())
                || equipmentStatus.getEquipmentStatus().equals(EquipmentStatusEnum.FREE.getKey())) {
                Map<String, String> headers = new LinkedHashMap<>();
                headers.put("token", applicationConfig.getWms_token());
                String url = UriComponentsBuilder.fromHttpUrl(applicationConfig.getWms_ip()).path(applicationConfig.getWms_test_url()).build().toUriString();
                Result<?> result = OkHttpUtils.sendPostByJsonStr(url, headers, applicationConfig.getWms_test_request_body(), new TypeReference<Result>() {});
                if (result != null && result.getCode().equals(200)) {
                    equipmentStatus = new EquipmentStatus();
                    equipmentStatus.setEquipmentId(CommonConstant.EQUIPMENT_ID_WMS);
                    equipmentStatus.setEquipmentStatus(EquipmentStatusEnum.FREE.getKey());
                    apiService.saveEquipmentStatus(equipmentStatus);
                }
            }
        } catch (Exception e) {
            log.error("[检查WMS系统状态] 任务异常", e);
        }
    }

    /**
     * 每 5 秒清理已完成或已取消超过 5 秒的任务,并移动到历史任务。
     */
    @Scheduled(fixedRate = 5000)
    public void moveFinishedTaskToHistory() {
        try {
            Map<String, Map<String, Task>> taskDetails = huahengRedisUtils.getAllTaskDetails();
            if (taskDetails == null || taskDetails.isEmpty()) {
                return;
            }
            for (Map.Entry<String, Map<String, Task>> entry : taskDetails.entrySet()) {
                if (entry.getValue() == null || entry.getValue().isEmpty()) {
                    continue;
                }
                Task finishTask = entry.getValue().get(TaskStatusEnum.WMS_CONFIRM_FINISH.getKey());
                if (finishTask == null) {
                    finishTask = entry.getValue().get(TaskStatusEnum.WMS_CANCEL_TASK.getKey());
                }
                if (finishTask != null && finishTask.getTimestamp() != null && StringUtils.isEmpty(finishTask.getExceptionMessage())
                    && DateUtil.between(DateUtil.date(finishTask.getTimestamp()), DateUtil.date(), DateUnit.SECOND) > 5
                    && huahengRedisUtils.saveHistoryTaskDetail(entry.getKey())) {
                    huahengRedisUtils.deleteTaskDetail(entry.getKey());
                    huahengRedisUtils.removeTaskExecutionOrders(Collections.singletonList(entry.getKey()));
                }
            }
        } catch (Exception e) {
            log.error("清理已完成任务定时任务异常", e);
        }
    }

    /**
     * 检查WCS系统状态
     */
    @Scheduled(cron = "30 * * * * ?")
    public void checkWcsEquipmentStatus() {
        try {
            EquipmentStatus equipmentStatus = huahengRedisUtils.getEquipmentStatus(CommonConstant.EQUIPMENT_ID_WCS);
            if (equipmentStatus == null) {
                equipmentStatus = new EquipmentStatus();
                equipmentStatus.setEquipmentId(CommonConstant.EQUIPMENT_ID_WCS);
                equipmentStatus.setEquipmentStatus(EquipmentStatusEnum.FREE.getKey());
                apiService.saveEquipmentStatus(equipmentStatus);
            }
            // 如果WCS设备的运行状态是RUNNING
            if (equipmentStatus.getEquipmentStatus().equals(EquipmentStatusEnum.RUNNING.getKey())) {
                // 时间戳与当前时间差值超过10分钟
                if (DateUtil.between(DateUtil.date(equipmentStatus.getTimestamp()), DateUtil.date(), DateUnit.MINUTE) > 10) {
                    equipmentStatus = new EquipmentStatus();
                    equipmentStatus.setEquipmentId(CommonConstant.EQUIPMENT_ID_WCS);
                    equipmentStatus.setEquipmentStatus(EquipmentStatusEnum.FREE.getKey());
                    apiService.saveEquipmentStatus(equipmentStatus);
                }
            }
            if (equipmentStatus.getEquipmentStatus().equals(EquipmentStatusEnum.EXCEPTION.getKey())
                || equipmentStatus.getEquipmentStatus().equals(EquipmentStatusEnum.FREE.getKey())) {
                Map<String, String> headers = new LinkedHashMap<>();
                String url = UriComponentsBuilder.fromHttpUrl(applicationConfig.getWcs_ip()).path(applicationConfig.getWcs_test_url()).build().toUriString();
                WcsResult<?> result = OkHttpUtils.sendPostByJsonStr(url, headers, applicationConfig.getWcs_test_request_body(), new TypeReference<WcsResult>() {});
                if (result != null && result.getCode().equals("Success")) {
                    equipmentStatus = new EquipmentStatus();
                    equipmentStatus.setEquipmentId(CommonConstant.EQUIPMENT_ID_WCS);
                    equipmentStatus.setEquipmentStatus(EquipmentStatusEnum.FREE.getKey());
                    apiService.saveEquipmentStatus(equipmentStatus);
                }
            }
        } catch (Exception e) {
            log.error("[检查WCS系统状态] 任务异常", e);
        }
    }
}