1
1 天以前 6acfed532ac67786eb415221b75c6d93c71ca833
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java
@@ -2,19 +2,17 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
import com.vincent.rsf.server.manager.entity.BasContainer;
import com.vincent.rsf.framework.common.SnowflakeIdWorker;
import com.vincent.rsf.server.manager.entity.Loc;
import com.vincent.rsf.server.manager.entity.WarehouseAreas;
import com.vincent.rsf.server.manager.enums.LocStsType;
import com.vincent.rsf.server.manager.service.LocItemService;
import com.vincent.rsf.server.manager.entity.Task;
import com.vincent.rsf.server.manager.enums.TaskStsType;
import com.vincent.rsf.server.manager.enums.TaskType;
import com.vincent.rsf.server.manager.service.LocService;
import com.vincent.rsf.server.manager.service.TaskService;
import com.vincent.rsf.server.manager.service.impl.BasContainerServiceImpl;
import com.vincent.rsf.server.manager.service.impl.WarehouseAreasServiceImpl;
import com.vincent.rsf.server.system.constant.GlobalConfigCode;
import com.vincent.rsf.server.system.entity.Config;
import com.vincent.rsf.server.system.entity.*;
import com.vincent.rsf.server.system.service.ConfigService;
import com.vincent.rsf.server.system.service.impl.*;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -22,6 +20,7 @@
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import routeR.calculationR.RouteWmsStepFlow;
import java.util.ArrayList;
import java.util.List;
@@ -43,13 +42,27 @@
    @Autowired
    private ConfigService configService;
    @Autowired
    private WarehouseAreasServiceImpl warehouseAreasService;
    @Autowired
    private LocService locService;
    @Autowired
    private LocItemService locItemService;
    private TaskPathTemplateMergeServiceImpl taskPathTemplateMergeService;
    @Autowired
    private BasContainerServiceImpl basContainerService;
    private TaskInstanceServiceImpl taskInstanceService;
    @Autowired
    private TaskPathTemplateServiceImpl taskPathTemplateService;
    @Autowired
    private TaskPathTemplateNodeServiceImpl taskPathTemplateNodeService;
    @Autowired
    private SubsystemFlowTemplateServiceImpl subsystemFlowTemplateService;
    @Autowired
    private FlowStepTemplateServiceImpl flowStepTemplateService;
    @Autowired
    private TaskInstanceNodeServiceImpl taskInstanceNodeService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private FlowInstanceServiceImpl flowInstanceService;
    @Autowired
    private FlowStepInstanceServiceImpl flowStepInstanceService;
    /**
     * @author Munch D. Luffy
@@ -57,14 +70,188 @@
     * @description: 初始任务规划路径
     * @version 1.0
     */
    @Scheduled(cron = "0/2 * * * * ?")
    @Scheduled(cron = "0/1 * * * * ?")
    @Transactional(rollbackFor = Exception.class)
    public void missionTemplate() throws Exception {
        Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_TEMPLATE_PLANNING_STEP_FLOW));
        if (!Boolean.parseBoolean(config.getVal())) {
            return;
        }
        List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.MISSION_INITIAL.id));
        if (Objects.isNull(taskList)) {
            return;
        }
        taskList.forEach(task -> {
            String sou = null;
            String end = null;
            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
                sou = task.getOrgSite();
                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()));
                end = loc.getAreaId().toString();
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_OUT.type)) {
                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc()));
                sou = loc.getAreaId().toString();
                end = task.getTargSite();
            }
            List<TaskPathTemplateMerge> taskPathTemplateMergeList = taskPathTemplateMergeService.list(new LambdaQueryWrapper<TaskPathTemplateMerge>().eq(TaskPathTemplateMerge::getSourceType, sou).eq(TaskPathTemplateMerge::getTargetType, end));
            if (Objects.isNull(taskPathTemplateMergeList) || taskPathTemplateMergeList.isEmpty()) {
                List<TaskPathTemplateMerge> list = taskPathTemplateMergeService.list(new LambdaQueryWrapper<TaskPathTemplateMerge>().eq(TaskPathTemplateMerge::getStepSize,1));
                if (!Cools.isEmpty(list)) {
                    List<String[]> stationList = new ArrayList<>();
                    list.forEach(taskPathTemplate -> {
                        stationList.add(taskPathTemplate.route());
                    });
                    List<Long> longs = RouteWmsStepFlow.routeGet(stationList, sou, end);
                    if (longs != null && !longs.isEmpty()) {
                        TaskPathTemplateMerge taskPathTemplateMerge = new TaskPathTemplateMerge();
                        taskPathTemplateMerge.setTemplateCode(sou+"===>"+end);
                        taskPathTemplateMerge.setTemplateName(sou+"===>"+end);
                        taskPathTemplateMerge.setSourceType(sou);
                        taskPathTemplateMerge.setTargetType(end);
                        List<Integer> longList = new ArrayList<>();
                        for (Long id : longs) {
                            TaskPathTemplateMerge one = taskPathTemplateMergeService.getOne(new LambdaQueryWrapper<TaskPathTemplateMerge>().eq(TaskPathTemplateMerge::getId, id));
                            longList.addAll(one.getConditionExpression());
                        }
                        taskPathTemplateMerge.setConditionExpression(longList);
                        taskPathTemplateMerge.setStepSize(longList.size());
                        taskPathTemplateMergeService.save(taskPathTemplateMerge);
                    }
//                    System.out.println("任务:"+task.getTaskCode()+"查询步序为:"+longs);
                }
            } else {
                //生成实际路径
                boolean actualPath = generateActualPath(task, taskPathTemplateMergeList.get(0));
                if (!actualPath) {
                    log.error("生成实际路径失败");
                }
            }
        });
    }
    public boolean generateActualPath(Task task,TaskPathTemplateMerge taskPathTemplateMerge) {
        boolean actualPath = false;
        List<Integer> conditionExpression = taskPathTemplateMerge.getConditionExpression();
        Integer i = 0;//it顺序
        Integer j = 0;//suT顺序
        // 用于存储所有FlowStepTemplate
        List<FlowStepTemplate> allFlowStepTemplates = new ArrayList<>();
        // 第一遍遍历:收集所有的FlowStepTemplate
        for (Integer id : conditionExpression) {
            TaskPathTemplate taskPathTemplate = taskPathTemplateService.getById(id);
            if (taskPathTemplate == null) {
                return false;
            }
            List<TaskPathTemplateNode> taskPathTemplateNodeList = taskPathTemplateNodeService.list(
                    new LambdaQueryWrapper<TaskPathTemplateNode>()
                            .eq(TaskPathTemplateNode::getTemplateId, taskPathTemplate.getId()));
            for (TaskPathTemplateNode taskPathTemplateNode : taskPathTemplateNodeList) {
                List<SubsystemFlowTemplate> subsystemFlowTemplateList = subsystemFlowTemplateService.list(
                        new LambdaQueryWrapper<SubsystemFlowTemplate>()
                                .eq(SubsystemFlowTemplate::getFlowCode, taskPathTemplateNode.getNodeCode())
                                .eq(SubsystemFlowTemplate::getSystemCode, taskPathTemplateNode.getSystemCode()));
                for (SubsystemFlowTemplate subsystemFlowTemplate : subsystemFlowTemplateList) {
                    List<FlowStepTemplate> flowStepTemplateList = flowStepTemplateService.list(
                            new LambdaQueryWrapper<FlowStepTemplate>()
                                    .eq(FlowStepTemplate::getFlowId, subsystemFlowTemplate.getId()));
                    allFlowStepTemplates.addAll(flowStepTemplateList);
                }
            }
        }
        TaskInstance taskInstance = new TaskInstance(taskPathTemplateMerge,task);
        boolean save = taskInstanceService.save(taskInstance);
        if (!save) {
            return false;
        }
        // 当前处理的FlowStepTemplate在全局列表中的索引
        int globalIndex = 0;
        for (Integer id : conditionExpression) {
            TaskPathTemplate taskPathTemplate = taskPathTemplateService.getById(id);
            if (taskPathTemplate == null) {
                return false;
            }
            List<TaskPathTemplateNode> taskPathTemplateNodeList = taskPathTemplateNodeService.list(
                    new LambdaQueryWrapper<TaskPathTemplateNode>()
                            .eq(TaskPathTemplateNode::getTemplateId, taskPathTemplate.getId()));
            for (TaskPathTemplateNode taskPathTemplateNode : taskPathTemplateNodeList) {
                TaskInstanceNode taskInstanceNode = new TaskInstanceNode(taskPathTemplateNode);
                taskInstanceNode.setTaskId(taskInstance.getId());
                taskInstanceNode.setTaskNo(taskInstance.getTaskNo());
                i++;
                taskInstanceNode.setNodeOrder(i);
                taskInstanceNode.setNodeCode(String.valueOf(snowflakeIdWorker.nextId()));
                taskInstanceNodeService.save(taskInstanceNode);
                List<SubsystemFlowTemplate> subsystemFlowTemplateList = subsystemFlowTemplateService.list(
                        new LambdaQueryWrapper<SubsystemFlowTemplate>()
                                .eq(SubsystemFlowTemplate::getFlowCode, taskPathTemplateNode.getNodeCode())
                                .eq(SubsystemFlowTemplate::getSystemCode, taskPathTemplateNode.getSystemCode()));
                for (SubsystemFlowTemplate subsystemFlowTemplate : subsystemFlowTemplateList) {
                    FlowInstance flowInstance = new FlowInstance(subsystemFlowTemplate);
                    flowInstance.setFlowInstanceNo(String.valueOf(snowflakeIdWorker.nextId()));
                    flowInstance.setTaskId(taskInstance.getId());
                    flowInstance.setTaskNo(taskInstance.getTaskNo());
                    flowInstance.setNodeInstanceId(taskInstanceNode.getId());
                    flowInstance.setNodeCode(String.valueOf(snowflakeIdWorker.nextId()));
                    flowInstanceService.save(flowInstance);
                    List<FlowStepTemplate> flowStepTemplateList = flowStepTemplateService.list(
                            new LambdaQueryWrapper<FlowStepTemplate>()
                                    .eq(FlowStepTemplate::getFlowId, subsystemFlowTemplate.getId()));
                    for (FlowStepTemplate flowStepTemplate : flowStepTemplateList) {
                        j++;
                        FlowStepInstance flowStepInstance = new FlowStepInstance(flowStepTemplate);
                        flowStepInstance.setFlowInstanceId(flowInstance.getId());
                        flowStepInstance.setFlowInstanceNo(flowInstance.getFlowInstanceNo());
                        flowStepInstance.setStepOrder(j);
                        flowStepInstance.setStepCode(String.valueOf(snowflakeIdWorker.nextId()));
                        flowStepInstance.setWmsNowTaskStatus(flowStepTemplate.getWmsNowTaskStatus());
                        // 判断是否是最后一个
                        if (globalIndex < allFlowStepTemplates.size() - 1) {
                            // 不是最后一个,取下一个的WmsNowTaskStatus
                            FlowStepTemplate nextFlowStep = allFlowStepTemplates.get(globalIndex + 1);
                            flowStepInstance.setWmsNextTaskStatus(nextFlowStep.getWmsNowTaskStatus());
                            if (globalIndex == 0){
                                task.setTaskStatus(flowStepTemplate.getWmsNowTaskStatus());
                                flowStepInstance.setStatus((short)1);
                            }
                        } else {
                            // 是最后一个,设置为9999
                            flowStepInstance.setWmsNextTaskStatus(9999);
                        }
                        flowStepInstanceService.save(flowStepInstance);
                        globalIndex++; // 更新全局索引
                    }
                }
            }
        }
        task.setDeviceSiteId(taskInstance.getId());
        taskService.updateById(task);
        return actualPath;
    }
}