From dfc127e6f917617972690725dde009897692f795 Mon Sep 17 00:00:00 2001 From: zhangzq Date: Mon, 19 Feb 2024 16:41:37 +0800 Subject: [PATCH] =?UTF-8?q?add:=E4=B8=89=E7=BA=BF=E4=B8=93=E6=9C=BA?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/extendtask/a3/A3SpeEmpTask.java | 339 ++++++++++++++ .../service/extendtask/a3/A3SpeFullTask.java | 433 ++++++++++++++++++ .../src/main/resources/scheduler.xml | 36 ++ 3 files changed, 808 insertions(+) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeEmpTask.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeFullTask.java diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeEmpTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeEmpTask.java new file mode 100644 index 00000000..d3a78544 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeEmpTask.java @@ -0,0 +1,339 @@ +package org.nl.wms.scheduler_manage.service.extendtask.a3; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Nullable; +import org.nl.common.enums.AcsTaskEnum; +import org.nl.common.enums.StatusEnum; +import org.nl.common.enums.WorkerOrderEnum; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.MapOf; +import org.nl.common.utils.RedissonUtils; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.wms.ext_manage.acs.service.impl.AgvInstService; +import org.nl.wms.product_manage.service.device.IPdmBiDeviceService; +import org.nl.wms.product_manage.service.device.dao.PdmBiDevice; +import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService; +import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder; +import org.nl.wms.scheduler_manage.service.cacheline.ISchCachelineVehilematerialService; +import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial; +import org.nl.wms.scheduler_manage.service.extendtask.manage.AbstractAcsTask; +import org.nl.wms.scheduler_manage.service.extendtask.manage.TaskStatusEnum; +import org.nl.wms.scheduler_manage.service.point.ISchBasePointService; +import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint; +import org.nl.wms.scheduler_manage.service.scheduler.ISchProcessRouteService; +import org.nl.wms.scheduler_manage.service.scheduler.labelConverter.impl.FlowElement; +import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService; +import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask; +import org.nl.wms.system_manage.service.param.ISysParamService; +import org.nl.wms.system_manage.service.param.dao.Param; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 专机任务 + */ +@Slf4j +@Service +public class A3SpeEmpTask extends AbstractAcsTask { + @Autowired + private IPdmProduceWorkorderService workorderService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private IPdmBiDeviceService iDeviceService; + @Autowired + private AgvInstService agvInstService; + @Autowired + private ISchBasePointService basePointService; + @Autowired + private ISchCachelineVehilematerialService vehilematerialService; + @Autowired + private ISchProcessRouteService schProcessRouteService; + @Autowired + private ISysParamService sysParamService; + + private final Map SpeHandles= new HashMap<>(); + + + public A3SpeEmpTask() { + SpeHandles.put(AcsTaskEnum.TASK_CACHELINE_OUT.getDesc() ,new Cache2Spe()); + } + + @Override + public void updateTaskStatus(JSONObject param,String status) { + SchBaseTask task = taskService.getOne(new QueryWrapper().eq("task_id", param.getString("task_id"))); + try { + RedissonUtils.lock(()->{ + SpeHandles.get(task.getTask_name()).handle(param,status,task); + },param.getString("task_id")+status,2); + }catch (Exception ex){ + log.error("更新状态异常updateTaskStatus param:{},status:{},ex:{}",param,status,ex); + throw ex; + } + } + + @Override + @Transactional + public String createTask(JSONObject param) { + Param speemp = sysParamService.getOne(new QueryWrapper().eq("code", "speemp")); + if (speemp !=null){ + return "speemp"; + } + String cahceLine = getRouteXmlFlowByWorkprodure(param); + if (cahceLine == null) { return null; } + PdmProduceWorkorder one = workorderService.getOne(new QueryWrapper() + .eq("workorder_code", param.getString("workorder_code")) + .lt("workorder_status", WorkerOrderEnum.COMPLETE.getCode())); + Assert.notNull(one, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code"))); + List list = taskService.list(new QueryWrapper() + .eq("point_code2", param.getString("device_code")).lt("task_status", StatusEnum.TASK_FINISH.getCode()) + ); + if (!CollectionUtils.isEmpty(list)){ + throw new BadRequestException(String.format("设备%s存在未完成任务:"+list.stream().map(SchBaseTask::getTask_id).collect(Collectors.toList()).toString(), param.getString("device_code"))); + } + JSONObject form = new JSONObject(MapOf.of("start_point_code",cahceLine, + "next_point_code",param.getString("device_code"),"return_point_code", cahceLine,"vehicle_code", + "","product_area",one.getProduct_area(),"quantity", param.getString("quantity"),"type",AcsTaskEnum.TASK_CACHELINE_OUT.getCode(),"material_id", one.getMaterial_id())); + String taskId = IdUtil.getStringId(); + JSONObject task = packageParam(form, taskId); + task.put("table_fk_id",param.getString("workorder_code")); + taskService.save(task.toJavaObject(SchBaseTask.class)); + return taskId; + } + + @Nullable + private String getRouteXmlFlowByWorkprodure(JSONObject param) { + Map workprodure = basePointService.findDeviceWorkprodure(param.getString("device_code")); + SchBasePoint devicePoint = basePointService.getOne(new QueryWrapper() + .eq("point_code", param.getString("device_code")) + .eq("is_delete", "0") + .eq("is_used", "1") + ); + FlowElement flowElement = schProcessRouteService.checkWorkprodure(workprodure.get("workprocedure_code"), devicePoint.getRegion_code()); + if (flowElement == null){ + log.error("SpeEmpTask#createTask 没有对应路由线路{},{}",workprodure.get("workprocedure_code"),devicePoint.getRegion_code()); + throw new BadRequestException("缺料请求没有配置对应路由线路"+workprodure.get("workprocedure_code")+"——"+devicePoint.getRegion_code()); + } + FlowElement pre = flowElement.pre(); + if (pre == null || ObjectUtil.isEmpty(pre.getParams().get("cacheLine"))){ + log.error("SpeEmpTask#createTask 没有配置缓存线{},{}",workprodure.get("workprocedure_code"),devicePoint.getRegion_code()); + return null; + } + Object tmp_cahceLine = pre.getParams().get("cacheLine"); + String cahceLine = null; + if (tmp_cahceLine instanceof String){ + cahceLine = (String) tmp_cahceLine; + } + if (tmp_cahceLine instanceof Map){ + cahceLine = ((Map) tmp_cahceLine).get(workprodure.get("spec")); } + return cahceLine; + } + + private JSONObject packageParam(JSONObject form, String task_id) { + JSONObject task = new JSONObject(); + 参数封装:{ + task.put("task_id", task_id); + task.put("task_name", AcsTaskEnum.TASK_CACHELINE_OUT.getDesc()); + task.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + task.put("task_type", form.getString("type")); + task.put("acs_task_type", AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode()); + task.put("task_status", TaskStatusEnum.CREATED.getCode()); + task.put("point_code1", form.getString("start_point_code")); + task.put("point_code2", form.getString("next_point_code")); + task.put("point_code3", form.getString("return_point_code")); + task.put("vehicle_code2", form.getString("vehicle_code2")); + task.put("vehicle_code", form.getString("vehicle_code")); + task.put("material_id", form.getString("material_id")); + task.put("material_qty", form.getString("quantity")); + task.put("handle_class", this.getClass().getName()); + task.put("finished_type", "1"); + task.put("is_delete", StatusEnum.LOCK_OFF.getCode()); + task.put("create_id", SecurityUtils.getCurrentUserId()); + task.put("create_name", SecurityUtils.getCurrentNickName()); + task.put("update_optid", SecurityUtils.getCurrentUserId()); + task.put("update_optname", SecurityUtils.getCurrentNickName()); + task.put("create_time", DateUtil.now()); + task.put("update_time", DateUtil.now()); + task.put("agv_system_type", AcsTaskEnum.AGV_SYSTEM_NB.getCode()); + task.put("priority", "1");} + return task; + } + + @Override + public void cancel(String taskId) { + taskService.update(new UpdateWrapper() + .set("task_status",StatusEnum.TASK_CANNEL.getCode()).eq("task_id",taskId)); + } + interface SpeStatusHandler{ + void handle(JSONObject param,String status,SchBaseTask task); + } + class Cache2Spe implements SpeStatusHandler{ + @Override + public void handle(JSONObject param, String sta,SchBaseTask task) { + AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); + switch (status){ + case STATUS_START: + Map extParam = (Map)param.get("ext_param"); + taskService.update(new UpdateWrapper() + .set("task_status",StatusEnum.TASK_RUNNING.getCode()) + .set("update_name","acs") + .set("update_time", DateUtil.now()) + .eq("task_id",task.getTask_id())); + if (extParam.get("fall_finish") != null){ + //TODO:添加任务唯一性校验防止重复更新 + PdmBiDevice device = iDeviceService.getDeviceByPointCode(task.getPoint_code2()); + if (!("fall_finish"+task.getTask_id()).equals(device.getRemark())){ + iDeviceService.update(new UpdateWrapper() + .set("material_id", task.getMaterial_id()) + .set("deviceinstor_qty",device.getDeviceinstor_qty().add(task.getMaterial_qty())) + .set("remark","fall_finish"+task.getTask_id()) + .eq("device_code", device.getDevice_code())); + } + } + break; + case STATUS_FINISH: + taskService.update(new UpdateWrapper() + .set("task_status",StatusEnum.TASK_FINISH.getCode()) + .set("update_name","acs") + .set("update_time", DateUtil.now()) + .eq("task_id",task.getTask_id())); + String vehicle_code = param.getString("vehicle_code"); + if (StringUtils.isNotEmpty(vehicle_code)){ + SchCachelineVehilematerial vehilematerial = new SchCachelineVehilematerial(); + vehilematerial.setCreate_time(DateUtil.now()); + vehilematerial.setVehmaterial_id(IdUtil.getStringId()); + vehilematerial.setVehicle_code(vehicle_code); + vehilematerial.setVehicle_status(StatusEnum.CACHE_VEL_EMT.getCode()); + vehilematerial.setErr_type(StatusEnum.STATUS_FLASE.getCode()); + vehilematerial.setCacheLine_code(task.getPoint_code1()); + vehilematerialService.save(vehilematerial); + } + break; + case STATUS_CANNEL: + cancel(param.getString("task_id")); + break; + default: + throw new BadRequestException("未定义任务状态:"+sta); + } + } + } + + @Override + public void pointConfirm(JSONObject param) { + agvInstService.empMatter(param); + } + + + @Override + public List schedulerTask(List array) { + ArrayList Merge = new ArrayList<>(); + if (!CollectionUtils.isEmpty(array)){ + String pointCollect = array.stream().map(a->a.getPoint_code1() + "','" + a.getPoint_code2()).collect(Collectors.joining("','")); + List> needMergeCollect = new ArrayList<>(); + //basePointService.getAllPointRegin("'"+pointCollect+"'"); + //区域编号对应point_code pointRegionCollent + Map>> pointRegionCollent = needMergeCollect.stream().collect(Collectors.groupingBy(o -> o.get("point_code"))); + Set mergePointCollent = needMergeCollect.stream().map(item -> item.get("point_code")).collect(Collectors.toSet()); + //合并下发的任务 + List notMerge = new ArrayList<>();//单独下发的任务 + List waitingTask = new ArrayList<>();//可合并,但是只有单条任务 + Map taskGroupMap = new HashMap<>(); + for (SchBaseTask task : array) { + String taskGroupId = IdUtil.getStringId(); + String taskId = task.getTask_id(); + task.setIs_send(true); + if (taskGroupMap.get(taskId) != null){ + task.setTask_group_id(taskGroupMap.get(taskId)); + task.setIs_send(false); + Merge.add(task); + continue; + } + String start = task.getPoint_code1(); + String end = task.getPoint_code2(); + taskGroupMap.put(taskId,taskGroupId); + task.setTask_group_id(taskGroupId); + //如果点位不属于查询出来可以合并点位集合:则单独下发集合 + if (!mergePointCollent.contains(start) && !mergePointCollent.contains(end)){ + notMerge.add(task); + continue; + } + //起点点位是否有多个合并任务点,如果没有则判断终点是否有多个合并任务点;都没有则说明当前起点终点对应区域只有一个任务:放入等待下发集合中 + List collect = taskGroupMap.keySet().stream().collect(Collectors.toList()); + collect.add(taskId); + String mergeTargetId = getMergePoint(pointRegionCollent, start,end,array,collect); + if (mergeTargetId == null){ + waitingTask.add(task); + continue; + } + //查询到相同区域可以合并的点位集合 + taskGroupMap.put(mergeTargetId,taskGroupId); + Merge.add(task); + } + //开始下发:处理waitingTask:如果创建时间>2分钟:则改单独下发 + if (waitingTask.size()>0){ + List needPublish = waitingTask.stream().filter(a -> DateUtil.between(new Date(),a.getCreate_time(), DateUnit.MINUTE) >1 ).collect(Collectors.toList()); + notMerge.addAll(needPublish); + } + String notMergeID = notMerge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(",")); + String waitingTaskId = waitingTask.stream().map(a -> a.getTask_id()).collect(Collectors.joining(",")); + String MergeId = Merge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(",")); + log.info("TaskScheduleService#taskPublish notMerge:{},waitingTask:{},merge:{}",notMergeID,waitingTaskId,MergeId); + notMerge.forEach(a->{ + a.setIs_send(true); + }); + Merge.addAll(notMerge); + } + updateAcsTaskType(Merge); + return Merge; + } + + private void updateAcsTaskType(List value) { + for (SchBaseTask task : value) { + task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode()); + task.setIs_send(true); + } + } + + + private String getMergePoint(Map>> pointRegionCollent, String start,String end,List tasks,List taskIds) { + String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds); + if (findpoint == null){ + findpoint = findpoint(pointRegionCollent, end, tasks, taskIds); + } + return findpoint; + } + + private String findpoint(Map>> pointRegionCollent, String start, List tasks, List taskIds) { + List> objects = pointRegionCollent.get(start); + if (CollectionUtils.isEmpty(objects)){ + return null; + } + Map startPointInfo = objects.get(0); + String startPointCollent = startPointInfo.get("pointcollent"); + String[] split = startPointCollent.split(","); + for (String s : split) { + Optional any = tasks.stream().filter(a -> a.getPoint_code1().equals(s) && !taskIds.contains((a.getTask_id()))).findAny(); + if (any.isPresent()){ + return any.get().getTask_id(); + } + } + return null; + } + +} + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeFullTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeFullTask.java new file mode 100644 index 00000000..00d58f42 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/scheduler_manage/service/extendtask/a3/A3SpeFullTask.java @@ -0,0 +1,433 @@ +package org.nl.wms.scheduler_manage.service.extendtask.a3; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.enums.AcsTaskEnum; +import org.nl.common.enums.InterfaceLogType; +import org.nl.common.enums.StatusEnum; +import org.nl.common.enums.WorkerOrderEnum; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.MapOf; +import org.nl.common.utils.RedissonUtils; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.ext_manage.acs.service.impl.AgvInstService; +import org.nl.wms.product_manage.service.device.IPdmBiDeviceService; +import org.nl.wms.product_manage.service.device.dao.PdmBiDevice; +import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService; +import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder; +import org.nl.wms.product_manage.service.workprocedure.IPdmBiWorkprocedureService; +import org.nl.wms.product_manage.service.workprocedure.dao.PdmBiWorkprocedure; +import org.nl.wms.scheduler_manage.service.cacheline.ISchCachelineVehilematerialService; +import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial; +import org.nl.wms.scheduler_manage.service.extendtask.manage.AbstractAcsTask; +import org.nl.wms.scheduler_manage.service.extendtask.manage.TaskStatusEnum; +import org.nl.wms.scheduler_manage.service.point.ISchBasePointService; +import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint; +import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService; +import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 专机任务 + */ +@Slf4j +@Service +public class A3SpeFullTask extends AbstractAcsTask { + @Autowired + private IPdmProduceWorkorderService workorderService; + @Autowired + private IPdmBiDeviceService deviceService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchCachelineVehilematerialService cacheLineVechileService; + @Autowired + private IPdmBiWorkprocedureService workprocedureService; + @Autowired + private AgvInstService agvInstService; + + private final Map SpeHandles= new HashMap<>(); + private static String OPT_NAME = "ACS回调# "; + + + public A3SpeFullTask() { + SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.getDesc() ,new Spe2Spe()); + SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.getDesc() ,new Spe2Cache()); + SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_WASH.getDesc() ,new Spe2Wash()); + } + + @Override + @Transactional + public void updateTaskStatus(JSONObject param,String status) { + log.info(InterfaceLogType.ACS_TO_LMS.getDesc()); + // 指令执行中 + SchBaseTask task = taskService.getById(param.getString("task_id")); + pointService.update(new UpdateWrapper().set("lock_type","0").in("point_code",task.getPoint_code1(),task.getPoint_code2(),task.getPoint_code3())); + try { + RedissonUtils.lock(()->{ + SpeHandles.get(task.getTask_name()).handle(param,status,task); + },param.getString("task_id")+status,2); + }catch (Exception ex){ + log.error(OPT_NAME+"updateStatus error:{}",ex); + throw ex; + } + } + + @Override + @Transactional + public String createTask(JSONObject param) { + String point_code = param.getString("device_code"); + String quantity = param.getString("quantity"); + PdmProduceWorkorder order = workorderService.getOne(new QueryWrapper() + .eq("workorder_code", param.getString("workorder_code")) + .eq("is_delete", false) + .lt("workorder_status", WorkerOrderEnum.COMPLETE.getCode())); + Assert.notNull(order, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code"))); + List list = taskService.list(new QueryWrapper() + .eq("point_code1", point_code).lt("task_status", StatusEnum.TASK_FINISH.getCode()) + ); + if (!CollectionUtils.isEmpty(list)){ + throw new BadRequestException(String.format("设备%s存在未完成任务"+list.stream().map(SchBaseTask::getTask_id).collect(Collectors.toList()).toString(), param.getString("device_code"))); + } + JSONObject empPoint = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "2", "point_code", point_code, "point_type", StatusEnum.POINT_LOCATION_EMP.getCode())).process().uniqueResult(0); + JSONObject form = new JSONObject(MapOf.of("start_point_code",point_code, + "next_point_code","","return_point_code", empPoint.getString("point_code"),"vehicle_code", + "","product_area",order.getProduct_area(),"quantity", quantity,"type",AcsTaskEnum.TASK_PRODUCT_MAC.getCode(),"material_id", order.getMaterial_id())); + String taskId = IdUtil.getStringId(); + JSONObject task = packageParam(form, taskId); + task.put("table_fk_id",param.getString("workorder_code")); + taskService.save(task.toJavaObject(SchBaseTask.class)); + return taskId; + } + + private JSONObject packageParam(JSONObject form, String task_id) { + JSONObject task = new JSONObject(); + 参数封装:{ + AcsTaskEnum taskEnum = AcsTaskEnum.getType(form.getString("type"), "TASK_"); + task.put("task_id", task_id); + task.put("task_name", taskEnum.getDesc()); + task.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + task.put("task_type", form.getString("type")); + task.put("acs_task_type", AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_TASK.getCode()); + task.put("task_status", TaskStatusEnum.CREATED.getCode()); + task.put("point_code1", form.getString("start_point_code")); + task.put("point_code2", form.getString("next_point_code")); + task.put("point_code3", form.getString("return_point_code")); + task.put("vehicle_code2", form.getString("vehicle_code2")); + task.put("vehicle_code", form.getString("vehicle_code")); + task.put("material_id", form.getString("material_id")); + task.put("material_qty", form.getString("quantity")); + task.put("handle_class", this.getClass().getName()); + task.put("finished_type", "1"); + task.put("is_delete", StatusEnum.LOCK_OFF.getCode()); + task.put("create_id", SecurityUtils.getCurrentUserId()); + task.put("create_name", SecurityUtils.getCurrentNickName()); + task.put("update_optid", SecurityUtils.getCurrentUserId()); + task.put("update_optname", SecurityUtils.getCurrentNickName()); + task.put("create_time", DateUtil.now()); + task.put("update_time", DateUtil.now()); + task.put("agv_system_type", AcsTaskEnum.AGV_SYSTEM_NB.getCode()); + task.put("priority", "1"); + if (task.getString("point_code1").contains("WXXL")&&form.getString("type").equals(AcsTaskEnum.TASK_PRODUCT_MAC.getCode())){ + task.put("priority", "5"); + } + } + return task; + } + + @Override + public void cancel(String taskId) { + log.info(OPT_NAME+"cancel taskID:{}",taskId); + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + //专机-专机 + //专机-缓存线 + //缓存线出库 + taskTable.update(MapOf.of("task_status",StatusEnum.TASK_CANNEL.getCode()),"task_id = '"+taskId+"'"); + } + interface SpeStatusHandler{ + void handle(JSONObject param,String status,SchBaseTask task); + } + class Spe2Spe implements SpeStatusHandler{ + @Override + public void handle(JSONObject param, String sta,SchBaseTask task) { + AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); + switch (status){ + case STATUS_START: + taskService.update(new UpdateWrapper() + .set("task_status",StatusEnum.TASK_RUNNING.getCode()) + .set("update_name","acs") + .set("update_time",DateUtil.now()).eq("task_id",task.getTask_id())); + Map extParam = (Map)param.get("ext_param"); + //take_finish 取满 fall_finish 倒料 put_finish放空 + if (extParam.get("fall_finish") != null){ + //TODO:添加任务唯一性校验防止重复更新 + PdmBiDevice one = deviceService.getDeviceByPointCode(task.getPoint_code2()); + if (!("fall_finish"+task.getTask_id()).equals(one.getRemark())){ + deviceService.update(new UpdateWrapper() + .set("material_id", task.getMaterial_id()) + .set("deviceinstor_qty",one.getDeviceinstor_qty().add(task.getMaterial_qty())) + .set("remark","fall_finish"+task.getTask_id()) + .eq("device_code", one.getDevice_code())); + } + } + break; + case STATUS_FINISH: + taskService.update(new UpdateWrapper() + .set("task_status",StatusEnum.TASK_FINISH.getCode()) + .set("update_name","acs") + .set("update_time",DateUtil.now()).eq("task_id",task.getTask_id())); + break; + case STATUS_CANNEL: + cancel(param.getString("task_id")); + break; + default: + log.error(OPT_NAME+"未定义任务状态:{}",sta); + throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); + } + } + } + class Spe2Cache implements SpeStatusHandler{ + @Override + public void handle(JSONObject param, String sta,SchBaseTask task) { + AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); + switch (status){ + case STATUS_START: + Map extParam = (Map)param.get("ext_param"); + UpdateWrapper wrapper = new UpdateWrapper() + .set("task_status", StatusEnum.TASK_RUNNING.getCode()) + .set("update_name", "acs") + .set("update_time", DateUtil.now()).eq("task_id", task.getTask_id()); + if (extParam.get("outbox")!= null){ wrapper.set("vehicle_code2",extParam.get("outbox")); } + taskService.update(wrapper); + //outboxt箱子更新到任务表vechile_code2? + if (extParam.get("inbox") != null){ + List list = cacheLineVechileService.list(new QueryWrapper().eq("vehicle_code", extParam.get("inbox"))); + if (!CollectionUtils.isEmpty(list)){ + cacheLineVechileService.removeByIds(list.stream().map(SchCachelineVehilematerial::getVehmaterial_id).collect(Collectors.toList())); + } + PdmProduceWorkorder workorder = workorderService.getOne(new QueryWrapper().eq("workorder_code", task.getTable_fk_id())); + PdmBiWorkprocedure workprocedure = workprocedureService.getOne(new QueryWrapper().eq("workprocedure_id", workorder.getWorkprocedure_id())); + SchCachelineVehilematerial vehilematerial = new SchCachelineVehilematerial(); + vehilematerial.setCreate_time(DateUtil.now()); + vehilematerial.setVehmaterial_id(IdUtil.getStringId()); + vehilematerial.setVehicle_code(extParam.get("inbox")); + vehilematerial.setVehicle_status(StatusEnum.CACHE_VEL_FULL.getCode()); + vehilematerial.setErr_type(StatusEnum.STATUS_FLASE.getCode()); + vehilematerial.setCacheLine_code(task.getPoint_code1()); + vehilematerial.setMaterial_id(task.getMaterial_id()); + vehilematerial.setQuantity(task.getMaterial_qty()); + vehilematerial.setWorkprocedure_code(workprocedure.getWorkprocedure_code()); + vehilematerial.setWorkprocedure_id(workprocedure.getWorkprocedure_id()); + cacheLineVechileService.save(vehilematerial); + } + break; + case STATUS_FINISH: + taskService.update(new UpdateWrapper() + .set("task_status",StatusEnum.TASK_FINISH.getCode()) + .set("update_name","acs") + .set("update_time",DateUtil.now()).eq("task_id",task.getTask_id())); + break; + case STATUS_CANNEL: + cancel(param.getString("task_id")); + break; + default: + throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); + } + } + } + class Spe2Wash implements SpeStatusHandler{ + @Override + public void handle(JSONObject param, String sta,SchBaseTask task) { + AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); + switch (status){ + case STATUS_START: + Map extParam = (Map)param.get("ext_param"); + UpdateWrapper wrapper = new UpdateWrapper() + .set("task_status", StatusEnum.TASK_RUNNING.getCode()) + .set("update_name", "acs") + .set("update_time", DateUtil.now()).eq("task_id", task.getTask_id()); + log.info("生坑到料完成:"+param.toString()); + taskService.update(wrapper); + if (extParam.get("fall_finish") != null){ + //TODO:添加任务唯一性校验防止重复更新 + PdmBiDevice one = deviceService.getOne(new QueryWrapper().eq("device_code", task.getPoint_code2())); + if (!("fall_finish"+task.getTask_id()).equals(one.getRemark())){ + deviceService.update(new UpdateWrapper() + .set("material_id", task.getMaterial_id()) + .set("deviceinstor_qty",one.getDeviceinstor_qty().add(task.getMaterial_qty())) + .set("remark","fall_finish"+task.getTask_id()) + .eq("device_code", task.getPoint_code2())); + } + } + break; + case STATUS_FINISH: + taskService.update(new UpdateWrapper() + .set("task_status",StatusEnum.TASK_FINISH.getCode()) + .set("update_name","acs") + .set("update_time",DateUtil.now()).eq("task_id",task.getTask_id())); + PdmBiDevice one = deviceService.getOne(new QueryWrapper().eq("device_code", task.getPoint_code2())); + if (!("fall_finish"+task.getTask_id()).equals(one.getRemark())){ + deviceService.update(new UpdateWrapper() + .set("material_id", task.getMaterial_id()) + .set("deviceinstor_qty",one.getDeviceinstor_qty().add(task.getMaterial_qty())) + .set("remark","fall_finish"+task.getTask_id()) + .eq("device_code", task.getPoint_code2())); + } + break; + case STATUS_CANNEL: + cancel(param.getString("task_id")); + break; + default: + throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); + } + } + } + + @Override + public void pointConfirm(JSONObject param) { + agvInstService.fullMaster(param); + } + + @Override + public List schedulerTask(List array) { + ArrayList Merge = new ArrayList<>(); + if (!CollectionUtils.isEmpty(array)){ + String pointCollect = array.stream().map(a->a.getPoint_code1() + "','" + a.getPoint_code2()).collect(Collectors.joining("','")); + JSONArray needMergeCollect = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "5", "point_codes", "'" + pointCollect + "'")).process().getResultJSONArray(0); + //区域编号对应point_code + Map> pointRegionCollent = needMergeCollect.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("point_code"))); + Set mergePointCollent = needMergeCollect.stream().map(item -> ((JSONObject) item).getString("point_code")).collect(Collectors.toSet()); + //合并下发的任务 + List notMerge = new ArrayList<>();//单独下发的任务 + List waitingTask = new ArrayList<>();//可合并,但是只有单条任务 + Map taskGroupMap = new HashMap<>(); + for (SchBaseTask task : array) { + String taskGroupId = IdUtil.getStringId(); + String taskId = task.getTask_id(); + if (taskGroupMap.get(taskId) != null){ + task.setTask_group_id(taskGroupMap.get(taskId)); + Merge.add(task); + continue; + } + String start = task.getPoint_code1(); + String end = task.getPoint_code2(); + taskGroupMap.put(taskId,taskGroupId); + task.setTask_group_id(taskGroupId); + //如果点位不属于查询出来可以合并点位集合:则单独下发集合 + if (!mergePointCollent.contains(start) || !mergePointCollent.contains(end)){ + notMerge.add(task); + continue; + } + //起点点位是否有多个合并任务点,如果没有则判断终点是否有多个合并任务点;都没有则说明当前起点终点对应区域只有一个任务:放入等待下发集合中 + List collect = taskGroupMap.keySet().stream().collect(Collectors.toList()); + collect.add(taskId); + //相同任务类型的任务 + List tasks = array.stream().filter(a -> a.getAcs_task_type().equals(task.getAcs_task_type())).collect(Collectors.toList()); + String mergeTargetId = getMergePointByone(pointRegionCollent, start,end,tasks,collect); + if (mergeTargetId == null){ + waitingTask.add(task); + continue; + } + //查询到相同区域可以合并的点位集合 + taskGroupMap.put(mergeTargetId,taskGroupId); + Merge.add(task); + } + //开始下发:处理waitingTask:如果创建时间>2分钟:则改单独下发 + if (waitingTask.size()>0){ + List needPublish = waitingTask.stream().filter(a -> DateUtil.between(new Date(),a.getCreate_time(), DateUnit.MINUTE) >1 ).collect(Collectors.toList()); + notMerge.addAll(needPublish); + } + String notMergeID = notMerge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(",")); + String waitingTaskId = waitingTask.stream().map(a -> a.getTask_id()).collect(Collectors.joining(",")); + String MergeId = Merge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(",")); + log.info("TaskScheduleService#taskPublish notMerge:{},waitingTask:{},merge:{}",notMergeID,waitingTaskId,MergeId); + Merge.addAll(notMerge); + } + Map> collect = Merge.stream().collect(Collectors.groupingBy(SchBaseTask::getTask_group_id)); + + ArrayList result = new ArrayList<>(); + for (List value : collect.values()) { + updateAcsTaskType(value); + result.addAll(value); + } + return result; + } + + private void updateAcsTaskType(List value) { + if (value.size() > 1){ + boolean tag = true; + for (SchBaseTask task : value) { + if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode())){ + task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode()); + } + if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode())){ + task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_TASK.getCode()); + } + if (tag){task.setIs_send(true);tag = false;}else {task.setIs_send(false); } + } + } + if (value.size() == 1){ + for (SchBaseTask task : value) { + if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode())){ + task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode()); + } + if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_TASK.getCode())){ + task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode()); + } + task.setIs_send(true); + } + } + } + + private String getMergePointByone(Map> pointRegionCollent, String start,String end,List tasks,List taskIds) { + String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds); + if (findpoint == null){ + findpoint = findpoint(pointRegionCollent, end, tasks, taskIds); + } + return findpoint; + } + private String getMergePointBytow(Map> pointRegionCollent, String start,String end,List tasks,List taskIds) { + String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds); + if (findpoint == null){ + findpoint = findpoint(pointRegionCollent, end, tasks, taskIds); + } + return findpoint; + } + + private String findpoint(Map> pointRegionCollent, String start, List tasks, List taskIds) { + List objects = pointRegionCollent.get(start); + if (CollectionUtils.isEmpty(objects)){ + return null; + } + JSONObject startPointInfo = (JSONObject) objects.get(0); + String startPointCollent = startPointInfo.getString("pointcollent"); + String[] split = startPointCollent.split(","); + for (String s : split) { + Optional any = tasks.stream().filter(a -> a.getPoint_code1().equals(s) && !taskIds.contains((a.getTask_id()))).findAny(); + if (any.isPresent()){ + return any.get().getTask_id(); + } + } + return null; + } + +} + diff --git a/mes/hd/nladmin-system/src/main/resources/scheduler.xml b/mes/hd/nladmin-system/src/main/resources/scheduler.xml index d344492b..96c502c7 100644 --- a/mes/hd/nladmin-system/src/main/resources/scheduler.xml +++ b/mes/hd/nladmin-system/src/main/resources/scheduler.xml @@ -31,4 +31,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +