From 6a345582999c17017beb11e901ef64179b323147 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang Date: Mon, 29 May 2023 13:23:28 +0800 Subject: [PATCH] =?UTF-8?q?rev:=E4=BF=AE=E6=94=B9=E8=B0=83=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/acs/service/impl/AgvInstService.java | 3 + .../sch/tasks/SpeMachinery/SpeEmpTask.java | 312 ++++++++++------ .../sch/tasks/SpeMachinery/SpeFullTask.java | 351 +++++++++++++----- .../device/dao/mapper/PdmBiDeviceMapper.xml | 5 +- 4 files changed, 469 insertions(+), 202 deletions(-) diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java index c80ef419..0f036b19 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java @@ -81,6 +81,8 @@ public class AgvInstService { query.put("material_id",task.getString("material_id")); // query.put("qty",quantity) 深坑物料需要转重量 task.put("task_type",AcsTaskEnum.TASK_PRODUCT_WASH.getCode()); + task.put("task_name",AcsTaskEnum.TASK_PRODUCT_WASH.getDesc()); + } List> collect = deviceService.workproceduceDevices(query); List> list = collect.stream().filter(stringStringMap -> stringStringMap.get("tasks") == null || stringStringMap.get("materials").contains(task.getString("material_id"))).collect(Collectors.toList()); @@ -96,6 +98,7 @@ public class AgvInstService { } nextPoint = getParamByXml(workprodure, currentFlow, nextPoint); task.put("task_type",AcsTaskEnum.TASK_PRODUCT_CACHE.getCode()); + task.put("task_name",AcsTaskEnum.TASK_PRODUCT_CACHE.getDesc()); task.put("acs_task_type",AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode()); cacheVehile = getCacheVehile(nextPoint, null); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeEmpTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeEmpTask.java index 8aae9977..c5fce2a6 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeEmpTask.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeEmpTask.java @@ -1,12 +1,16 @@ package org.nl.wms.product_manage.sch.tasks.SpeMachinery; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.InterfaceLogType; import org.nl.common.enums.StatusEnum; @@ -14,16 +18,31 @@ import org.nl.common.utils.MapOf; 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.acs.service.impl.AgvInstService; import org.nl.wms.product_manage.sch.manage.AbstractAcsTask; import org.nl.wms.product_manage.sch.manage.TaskStatusEnum; +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.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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 专机任务 @@ -31,16 +50,25 @@ import java.util.Map; @Slf4j @Service public class SpeEmpTask extends AbstractAcsTask { + @Autowired + private IPdmProduceWorkorderService workorderService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private AgvInstService agvInstService; + @Autowired + private ISchBasePointService basePointService; + @Autowired + private ISchCachelineVehilematerialService cacheLineVechileService; @Autowired - AgvInstService agvInstService; + private ISchProcessRouteService schProcessRouteService; + private final Map SpeHandles= new HashMap<>(); - private static String OPT_NAME = "ACS回调# "; + private static String OPT_NAME = "ACS回调# "; public SpeEmpTask() { - SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.name() ,new Spe2Spe()); - SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.name() ,new Spe2Cache()); SpeHandles.put(AcsTaskEnum.TASK_CACHELINE_OUT.name() ,new Cache2Spe()); } @@ -59,42 +87,75 @@ public class SpeEmpTask extends AbstractAcsTask { } } - @Override - @Transactional - public String createTask(JSONObject param) { - - String point_code = param.getString("device_code"); - String quantity = param.getString("quantity"); - String type = param.getString("type"); - JSONObject order = WQLObject.getWQLObject("PDM_produce_workOrder").query("workorder_code = '" + param.getString("workorder_code") + "' and is_delete = 0 and workorder_status != "+StatusEnum.TASK_FINISH.getCode()).uniqueResult(0); - Assert.notNull(order, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code"))); - JSONArray chectIndDatabase = WQLObject.getWQLObject("SCH_BASE_Task").query((AcsTaskEnum.REQUEST_CALLTYPE_FULL.getCode().equals(type) ? "point_code1" : "point_code2") + "= '" + point_code + "' and task_status < " + StatusEnum.TASK_FINISH.getCode()).getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(chectIndDatabase)){ - Assert.notNull(order, String.format("设备%s存在未完成任务", param.getString("point_code"))); - - } - JSONObject form = new JSONObject(MapOf.of("start_point_code","", - "next_point_code",point_code,"return_point_code", "","vehicle_code", - "","product_area",order.getString("product_area"),"quantity", quantity,"type",type,"material_id", order.getString("material_id"))); - String taskId = IdUtil.getSnowflake(1, 1).nextId() + ""; - - JSONObject task = packageParam(form, taskId); - WQLObject.getWQLObject("SCH_BASE_Task").insert(task); - try { - pointConfirm(task); - //下发 - }catch (Exception ex){ - task.put("task_status", TaskStatusEnum.SURE_START_ERROR.getCode()); - task.put("remark",ex.getMessage()); - WQLObject.getWQLObject("sch_base_task").update(task); + @Override + @Transactional + public String createTask(JSONObject param) { + //{"workorder_code":230523019,"device_code":"A1_TW_15_6_D","type":"1"} + 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", StatusEnum.TASK_FINISH.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存在未完成任务", param.getString("device_code"))); } - return taskId; - } + + JSONObject form = new JSONObject(MapOf.of("start_point_code","", + "next_point_code",param.getString("device_code"),"return_point_code", "","vehicle_code", + "","product_area",one.getProduct_area(),"quantity", param.getString("quantity"),"type",param.getString("type"),"material_id", one.getMaterial_id())); + String taskId = IdUtil.getSnowflake(1, 1).nextId() + ""; + JSONObject task = packageParam(form, taskId); + taskService.save(task.toJavaObject(SchBaseTask.class)); + task.put("cacheLine",cahceLine); +// try { +// pointConfirm(task); +// //下发 +// }catch (Exception ex){ +// log.error("SpeEmpTask#点位确认异常:{}",ex.getMessage()); +// task.put("task_status", TaskStatusEnum.SURE_START_ERROR.getCode()); +// task.put("remark",ex.getMessage()); +// WQLObject.getWQLObject("sch_base_task").update(task); +// } + 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(); 参数封装:{ - AcsTaskEnum taskEnum = AcsTaskEnum.getType(form.getString("type"), "REQUEST_"); + 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")); @@ -118,7 +179,7 @@ public class SpeEmpTask extends AbstractAcsTask { task.put("create_time", DateUtil.now()); task.put("update_time", DateUtil.now()); task.put("priority", "1");} - return task; + return task; } @Override @@ -134,72 +195,6 @@ public class SpeEmpTask extends AbstractAcsTask { interface SpeStatusHandler{ void handle(JSONObject param,String status,JSONObject task); } - class Spe2Spe implements SpeStatusHandler{ - @Override - public void handle(JSONObject param, String sta,JSONObject task) { - AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device"); - - switch (status){ - case STATUS_START: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - break; - case STATUS_FINISH: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - //到专机:更新设备上料位物料数量 - String point_code2 = task.getString("point_code2"); - JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0); - task.getDouble("material_qty"); - double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty"); - deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'"); - 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,JSONObject task) { - AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial"); - String workprocedureCode = param.getString("workorder_code"); - String inboxtxm = param.getString("inboxtxm"); - String outboxtxm = param.getString("outboxtxm"); - switch (status){ - case STATUS_START: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); - break; - case STATUS_FINISH: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"), - "material_id", task.getString("material_id"), - "vehicle_code", inboxtxm, - "vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(), - //工单,工序? - "workorder_code", workprocedureCode, - "create_time", DateUtil.now(), - "update_time", DateUtil.now() - //物料规格,物料名称 从物料信息表关联查询 - )); - break; - case STATUS_CANNEL: - cancel(param.getString("task_id")); - break; - default: - throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); - } - } - } class Cache2Spe implements SpeStatusHandler{ @Override public void handle(JSONObject param, String sta,JSONObject task) { @@ -208,12 +203,10 @@ public class SpeEmpTask extends AbstractAcsTask { WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial"); WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point"); WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device"); - String outboxtxm = param.getString("outboxtxm"); switch (status){ case STATUS_START: taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); break; case STATUS_FINISH: taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); @@ -238,4 +231,115 @@ public class SpeEmpTask extends AbstractAcsTask { 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("','")); + 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 = org.nl.common.utils.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); + } + 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); } + } + } + } + + + 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; + } + 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/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeFullTask.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeFullTask.java index 92eee538..2ec30c1a 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeFullTask.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeFullTask.java @@ -1,15 +1,17 @@ package org.nl.wms.product_manage.sch.tasks.SpeMachinery; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; 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.utils.IdUtil; import org.nl.common.utils.MapOf; import org.nl.common.utils.SecurityUtils; import org.nl.modules.common.exception.BadRequestException; @@ -19,12 +21,26 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.ext.acs.service.impl.AgvInstService; import org.nl.wms.product_manage.sch.manage.AbstractAcsTask; import org.nl.wms.product_manage.sch.manage.TaskStatusEnum; +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.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.HashMap; +import java.util.List; import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 专机任务 @@ -32,26 +48,41 @@ import java.util.Map; @Slf4j @Service public class SpeFullTask extends AbstractAcsTask { - @Autowired - AgvInstService agvInstService; + private IPdmProduceWorkorderService workorderService; + @Autowired + private IPdmBiDeviceService deviceService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchCachelineVehilematerialService cacheLineVechileService; + @Autowired + private AgvInstService agvInstService; + private final Map SpeHandles= new HashMap<>(); - private static String OPT_NAME = "ACS回调# "; + private static String OPT_NAME = "ACS回调# "; public SpeFullTask() { SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.name() ,new Spe2Spe()); SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.name() ,new Spe2Cache()); - SpeHandles.put(AcsTaskEnum.TASK_CACHELINE_OUT.name() ,new Cache2Spe()); + SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_WASH.name() ,new Spe2Wash()); } @Override + @Transactional public void updateTaskStatus(JSONObject param,String status) { - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); log.info(InterfaceLogType.ACS_TO_LMS.getDesc()); // 指令执行中 - JSONObject task = taskTable.query("task_id = '" + param.getString("task_id") + "'").uniqueResult(0); - AcsTaskEnum taskType = AcsTaskEnum.getType(task.getString("task_type"),"TASK_"); + SchBaseTask task = taskService.getById(param.getString("task_id")); + AcsTaskEnum taskType = AcsTaskEnum.getType(task.getTask_type(),"TASK_"); + pointService.update(new UpdateWrapper().set("lock_type","0").in("point_code",task.getPoint_code1(),task.getPoint_code2(),task.getPoint_code3())); + taskService.update(new UpdateWrapper() + .set("task_status",status) + .set("update_name","acs") + .set("update_time",DateUtil.now()).eq("task_id",task.getTask_id())); try { SpeHandles.get(taskType.name()).handle(param,status,task); }catch (Exception ex){ @@ -60,43 +91,45 @@ public class SpeFullTask extends AbstractAcsTask { } } - @Override - @Transactional - public String createTask(JSONObject param) { - - String point_code = param.getString("device_code"); - String quantity = param.getString("quantity"); - String type = param.getString("type"); - JSONObject order = WQLObject.getWQLObject("PDM_produce_workOrder").query("workorder_code = '" + param.getString("workorder_code") + "' and is_delete = 0 and workorder_status != "+StatusEnum.TASK_FINISH.getCode()).uniqueResult(0); - Assert.notNull(order, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code"))); - JSONArray chectIndDatabase = WQLObject.getWQLObject("SCH_BASE_Task").query((AcsTaskEnum.REQUEST_CALLTYPE_FULL.getCode().equals(type) ? "point_code1" : "point_code2") + "= '" + point_code + "' and task_status < " + StatusEnum.TASK_FINISH.getCode()).getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(chectIndDatabase)){ - Assert.notNull(order, String.format("设备%s存在未完成任务", param.getString("point_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.getString("product_area"),"quantity", quantity,"type",type,"material_id", order.getString("material_id"))); - - String taskId = IdUtil.getSnowflake(1, 1).nextId() + ""; - JSONObject task = packageParam(form, taskId); - WQLObject.getWQLObject("SCH_BASE_Task").insert(task); - - try { - pointConfirm(task); - //下发 - }catch (Exception ex){ - task.put("task_status", TaskStatusEnum.SURE_START_ERROR.getCode()); - task.put("remark",ex.getMessage()); - WQLObject.getWQLObject("sch_base_task").update(task); + @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", StatusEnum.TASK_FINISH.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存在未完成任务", param.getString("device_code"))); } - return taskId; - } + 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); + taskService.save(task.toJavaObject(SchBaseTask.class)); +// try { +// pointConfirm(task); +// //下发 +// }catch (Exception ex){ +// task.put("task_status", TaskStatusEnum.SURE_START_ERROR.getCode()); +// task.put("remark",ex.getMessage()); +// WQLObject.getWQLObject("sch_base_task").update(task); +// } + return taskId; + } private JSONObject packageParam(JSONObject form, String task_id) { JSONObject task = new JSONObject(); 参数封装:{ - AcsTaskEnum taskEnum = AcsTaskEnum.getType(form.getString("type"), "REQUEST_"); + 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")); @@ -120,7 +153,7 @@ public class SpeFullTask extends AbstractAcsTask { task.put("create_time", DateUtil.now()); task.put("update_time", DateUtil.now()); task.put("priority", "1");} - return task; + return task; } @Override @@ -131,32 +164,53 @@ public class SpeFullTask extends AbstractAcsTask { //专机-缓存线 //缓存线出库 taskTable.update(MapOf.of("task_status",StatusEnum.TASK_CANNEL.getCode()),"task_id = '"+taskId+"'"); - } interface SpeStatusHandler{ - void handle(JSONObject param,String status,JSONObject task); + void handle(JSONObject param,String status,SchBaseTask task); } class Spe2Spe implements SpeStatusHandler{ @Override - public void handle(JSONObject param, String sta,JSONObject task) { + public void handle(JSONObject param, String sta,SchBaseTask task) { AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device"); - switch (status){ case STATUS_START: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); + 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"); + if (extParam.get("put_finish") != null){ + pointService.update(new UpdateWrapper() + .set("vehicle_code",task.getVehicle_code2()) + .eq("point_code",task.getPoint_code3())); + } + if (extParam.get("take_finish") != null){ + pointService.update(new UpdateWrapper() + .set("vehicle_code","") + .eq("point_code",task.getPoint_code3())); + pointService.update(new UpdateWrapper() + .set("vehicle_code",task.getVehicle_code2()) + .eq("point_code",task.getPoint_code1())); + } +// if (extParam.get("put_finish") != null){ +// pointService.update(new UpdateWrapper() +// .set("vehicle_code",task.getVehicle_code2()) +// .eq("point_code",task.getPoint_code3())); +// } +// if (extParam.get("take_finish") != null){ +// pointService.update(new UpdateWrapper() +// .set("vehicle_code","") +// .eq("point_code",task.getPoint_code3())); +// pointService.update(new UpdateWrapper() +// .set("vehicle_code",task.getVehicle_code2()) +// .eq("point_code",task.getPoint_code1())); +// } break; case STATUS_FINISH: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - //到专机:更新设备上料位物料数量 - String point_code2 = task.getString("point_code2"); - JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0); - task.getDouble("material_qty"); - double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty"); - deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'"); + 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")); @@ -169,30 +223,37 @@ public class SpeFullTask extends AbstractAcsTask { } class Spe2Cache implements SpeStatusHandler{ @Override - public void handle(JSONObject param, String sta,JSONObject task) { + public void handle(JSONObject param, String sta,SchBaseTask task) { AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial"); - String workprocedureCode = param.getString("workorder_code"); - String inboxtxm = param.getString("inboxtxm"); - String outboxtxm = param.getString("outboxtxm"); switch (status){ case STATUS_START: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); + 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("outboxt")!= null){ wrapper.set("vehicle_code2",extParam.get("outboxt")); } + taskService.update(wrapper); + + //outboxt箱子更新到任务表vechile_code2? + if (extParam.get("inboxt") != null){ + SchCachelineVehilematerial vehilematerial = new SchCachelineVehilematerial(); + vehilematerial.setVehmaterial_id(IdUtil.getStringId()); + vehilematerial.setVehicle_code(extParam.get("inboxt")); + vehilematerial.setMaterial_id(task.getMaterial_id()); + vehilematerial.setErr_type("0"); + vehilematerial.setCreate_time(DateUtil.now()); + vehilematerial.setQuantity(task.getMaterial_qty()); + cacheLineVechileService.save(vehilematerial); + } + break; case STATUS_FINISH: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"), - "material_id", task.getString("material_id"), - "vehicle_code", inboxtxm, - "vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(), - //工单,工序? - "workorder_code", workprocedureCode, - "create_time", DateUtil.now(), - "update_time", DateUtil.now() - //物料规格,物料名称 从物料信息表关联查询 - )); + 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")); @@ -202,33 +263,25 @@ public class SpeFullTask extends AbstractAcsTask { } } } - class Cache2Spe implements SpeStatusHandler{ + class Spe2Wash implements SpeStatusHandler{ @Override - public void handle(JSONObject param, String sta,JSONObject task) { + public void handle(JSONObject param, String sta,SchBaseTask task) { AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_"); - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial"); - WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device"); - String outboxtxm = param.getString("outboxtxm"); - switch (status){ case STATUS_START: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'"); + Map extParam = (Map)param.get("ext_param"); + log.info("生坑到料完成:"+param.toString()); + if (extParam.get("fall_finish") != null){ + PdmBiDevice one = deviceService.getOne(new QueryWrapper().eq("device_code", task.getPoint_code2())); + deviceService.update(new UpdateWrapper() + .set("material_id", task.getMaterial_id()) + .set("deviceinstor_qty",one.getDeviceinstor_qty().add(task.getMaterial_qty())) + .eq("device_code", task.getPoint_code2())); + } break; case STATUS_FINISH: - taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'"); - - String point_code2 = task.getString("point_code2"); - JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0); - task.getDouble("material_qty"); - double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty"); - deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'"); break; case STATUS_CANNEL: - cancel(param.getString("task_id")); break; default: throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta); @@ -239,6 +292,110 @@ public class SpeFullTask extends AbstractAcsTask { @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); + 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); + 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); } + } + } + } + + 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; + } + 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/java/org/nl/wms/product_manage/service/device/dao/mapper/PdmBiDeviceMapper.xml b/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/device/dao/mapper/PdmBiDeviceMapper.xml index 538b6401..c3b3b678 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/device/dao/mapper/PdmBiDeviceMapper.xml +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/device/dao/mapper/PdmBiDeviceMapper.xml @@ -28,11 +28,14 @@ left join pdm_bi_device on pdm_bi_device.device_code = sch_base_point.device_code left JOIN sch_base_task ON sch_base_point.point_code = point_code2 and '7' > task_status where - sch_base_point.point_type = '4' and pdm_bi_device.is_used = true and sch_base_point.lock_type = '0' + sch_base_point.point_type = '4' and pdm_bi_device.is_used = true and workprocedure_id = #{workprocedure_id} and (pdm_bi_device.material_id = #{material_id} or pdm_bi_device.material_id is null ) + + and pdm_bi_device.spec = #{spec} + GROUP BY pdm_bi_device.device_code HAVING currentQty > #{qty}