ApiServiceImpl.java 7.17 KB
package com.huaheng.control.management.service.impl;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.TreeMap;

import javax.annotation.Resource;

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import com.huaheng.control.management.dto.EquipmentStatus;
import com.huaheng.control.management.dto.EquipmentStatusEnum;
import com.huaheng.control.management.dto.Task;
import com.huaheng.control.management.dto.TaskExecutionOrder;
import com.huaheng.control.management.dto.TaskPackage;
import com.huaheng.control.management.dto.TaskStatusEnum;
import com.huaheng.control.management.service.ApiService;
import com.huaheng.control.management.utils.HuahengRedisUtils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;

@Service
public class ApiServiceImpl implements ApiService {

    @Resource
    private HuahengRedisUtils huahengRedisUtils;

    @Override
    public Boolean saveTask(Task task) {
        long timestamp = System.currentTimeMillis();
        task.setTimestamp(timestamp);
        task.setTimestampFormat(DateUtil.format(new Date(timestamp), DatePattern.NORM_DATETIME_MS_PATTERN));

        // 任务已入历史表,直接返回
        if (!task.getTaskStatus().equals(TaskStatusEnum.WMS_CREATE.getKey())) {
            Map<String, Task> historyTaskDetail = huahengRedisUtils.getHistoryTaskDetail(task.getTaskId());
            if (historyTaskDetail != null) {
                return true;
            }
        }
        if (!huahengRedisUtils.saveTask(task.getTaskId(), task.getTaskStatus(), task)) {
            return false;
        }
        if (task.getTaskStatus().equals(TaskStatusEnum.WMS_CONFIRM_FINISH.getKey()) || task.getTaskStatus().equals(TaskStatusEnum.CANCEL_TASK.getKey())) {
            if (huahengRedisUtils.saveHistoryTaskDetail(task.getTaskId())) {
                huahengRedisUtils.deleteTaskDetail(task.getTaskId());
                huahengRedisUtils.removeTaskExecutionOrders(Arrays.asList(task.getTaskId()));
            }
        }
        return true;
    }

    @Override
    public Boolean saveEquipmentStatus(EquipmentStatus equipmentStatus) {
        long timestamp = System.currentTimeMillis();
        equipmentStatus.setTimestamp(timestamp);
        equipmentStatus.setTimestampFormat(DateUtil.format(new Date(timestamp), DatePattern.NORM_DATETIME_MS_PATTERN));
        if (equipmentStatus.getEquipmentStatus().equals(EquipmentStatusEnum.EXCEPTION.getKey())) {
            equipmentStatus.setExceptionStartTime(DateUtil.format(new Date(timestamp), DatePattern.NORM_DATETIME_MS_PATTERN));
            EquipmentStatus currentEquipmentStatus = huahengRedisUtils.getEquipmentStatus(equipmentStatus.getEquipmentId());
            if (currentEquipmentStatus != null && currentEquipmentStatus.getExceptionStartTime() != null) {
                equipmentStatus.setExceptionStartTime(currentEquipmentStatus.getExceptionStartTime());
            }
        }
        if (!huahengRedisUtils.saveEquipmentStatus(equipmentStatus.getEquipmentId(), equipmentStatus)) {
            return false;
        }
        return true;
    }

    @Override
    public Integer saveTaskExecutionOrders(List<TaskExecutionOrder> taskExecutionOrders) {
        return huahengRedisUtils.saveTaskExecutionOrders(taskExecutionOrders);
    }

    @Override
    public Map<String, Map<String, Task>> queryTaskDetails() {
        return huahengRedisUtils.getAllTaskDetails();
    }

    /**
     * 获取下一个任务
     */
    @Override
    public TaskPackage getNextTaskPackage() {
        Map<String, Integer> topTaskExecutionOrders = huahengRedisUtils.getTopNTaskExecutionOrders(1);
        if (topTaskExecutionOrders == null || topTaskExecutionOrders.size() == 0) {
            return null;
        }
        String firstKey = topTaskExecutionOrders.keySet().stream().findFirst().orElse(null);
        Map<String, Task> taskDetail = huahengRedisUtils.getTaskDetail(firstKey);
        if (taskDetail == null) {
            return null;
        }
        return convertToTaskPackage(null, huahengRedisUtils.getAllEquipmentStatusMap(), taskDetail);
    }

    @Override
    public List<TaskPackage> queryTaskPackages() {
        List<TaskPackage> taskPackageList = new ArrayList<TaskPackage>();
        Map<String, Map<String, Task>> taskDetails = huahengRedisUtils.getAllTaskDetails();
        if (CollectionUtils.isEmpty(taskDetails)) {
            return taskPackageList;
        }
        for (Entry<String, Map<String, Task>> entry : taskDetails.entrySet()) {
            TaskPackage taskPackage =
                convertToTaskPackage(huahengRedisUtils.getAllTaskExecutionOrderMap(), huahengRedisUtils.getAllEquipmentStatusMap(), entry.getValue());
            taskPackageList.add(taskPackage);
        }
        taskPackageList
            .sort(Comparator.comparing(TaskPackage::getTaskExecutionOrder, Comparator.nullsLast(String::compareTo)).thenComparing(TaskPackage::getTaskId));
        return taskPackageList;
    }

    @Override
    public List<TaskPackage> queryHistoryTaskPackages(Long count) {
        List<TaskPackage> historyTaskPackageList = new ArrayList<TaskPackage>();
        Map<String, Map<String, Task>> historyTaskDetails = huahengRedisUtils.getLastNHistoryTaskDetails(count);
        for (Entry<String, Map<String, Task>> entry : historyTaskDetails.entrySet()) {
            TaskPackage taskPackage = convertToTaskPackage(null, null, entry.getValue());
            historyTaskPackageList.add(taskPackage);
        }
        return historyTaskPackageList;
    }

    private TaskPackage convertToTaskPackage(Map<String, Integer> taskExecutionOrders, Map<String, EquipmentStatus> equipmentStatusMap,
        Map<String, Task> taskDetail) {
        TaskPackage taskPackage = new TaskPackage();
        Map<String, String> taskStatusTimestamps = new TreeMap<>();
        // 按时间戳顺序遍历,后面的覆盖前面的
        taskDetail.values().stream().sorted(Comparator.comparingLong(Task::getTimestamp)).forEach(task -> {
            BeanUtils.copyProperties(task, taskPackage);
            taskPackage.setUpdateBy(task.getReporter());
            taskPackage.setUpdateTime(task.getTimestampFormat());
            taskStatusTimestamps.put(task.getTaskStatus(), task.getTimestampFormat());
        });
        // 设置设备信息
        Optional.ofNullable(equipmentStatusMap).map(map -> map.get(taskPackage.getExecutionEquipmentId()))
            .ifPresent(equipmentStatus -> BeanUtils.copyProperties(equipmentStatus, taskPackage));
        // 设置执行顺序
        Optional.ofNullable(taskExecutionOrders).map(orders -> orders.get(taskPackage.getTaskId())).filter(Objects::nonNull).map(Object::toString)
            .ifPresent(taskPackage::setTaskExecutionOrder);
        taskPackage.setTaskStatusTimestamps(taskStatusTimestamps);
        return taskPackage;
    }

    @Override
    public EquipmentStatus queryEquipmentStatus(String equipmentId) {
        return huahengRedisUtils.getEquipmentStatus(equipmentId);
    }
}