add:三线专机任务

This commit is contained in:
zhangzq
2024-02-19 16:41:37 +08:00
parent 7c0a5cfa5a
commit dfc127e6f9
3 changed files with 808 additions and 0 deletions

View File

@@ -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<String,SpeStatusHandler > 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<SchBaseTask>().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<Param>().eq("code", "speemp"));
if (speemp !=null){
return "speemp";
}
String cahceLine = getRouteXmlFlowByWorkprodure(param);
if (cahceLine == null) { return null; }
PdmProduceWorkorder one = workorderService.getOne(new QueryWrapper<PdmProduceWorkorder>()
.eq("workorder_code", param.getString("workorder_code"))
.lt("workorder_status", WorkerOrderEnum.COMPLETE.getCode()));
Assert.notNull(one, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code")));
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>()
.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<String,String> workprodure = basePointService.findDeviceWorkprodure(param.getString("device_code"));
SchBasePoint devicePoint = basePointService.getOne(new QueryWrapper<SchBasePoint>()
.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<String, String>) 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<SchBaseTask>()
.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<String, String> extParam = (Map)param.get("ext_param");
taskService.update(new UpdateWrapper<SchBaseTask>()
.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<PdmBiDevice>()
.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<SchBaseTask>()
.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<SchBaseTask> schedulerTask(List<SchBaseTask> array) {
ArrayList<SchBaseTask> Merge = new ArrayList<>();
if (!CollectionUtils.isEmpty(array)){
String pointCollect = array.stream().map(a->a.getPoint_code1() + "','" + a.getPoint_code2()).collect(Collectors.joining("','"));
List<Map<String,String>> needMergeCollect = new ArrayList<>();
//basePointService.getAllPointRegin("'"+pointCollect+"'");
//区域编号对应point_code pointRegionCollent
Map<String, List<Map<String,String>>> pointRegionCollent = needMergeCollect.stream().collect(Collectors.groupingBy(o -> o.get("point_code")));
Set<String> mergePointCollent = needMergeCollect.stream().map(item -> item.get("point_code")).collect(Collectors.toSet());
//合并下发的任务
List<SchBaseTask> notMerge = new ArrayList<>();//单独下发的任务
List<SchBaseTask> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
Map<String, String> 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<String> 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<SchBaseTask> 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<SchBaseTask> 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<String, List<Map<String,String>>> pointRegionCollent, String start,String end,List<SchBaseTask> tasks,List<String> taskIds) {
String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds);
if (findpoint == null){
findpoint = findpoint(pointRegionCollent, end, tasks, taskIds);
}
return findpoint;
}
private String findpoint(Map<String, List<Map<String,String>>> pointRegionCollent, String start, List<SchBaseTask> tasks, List<String> taskIds) {
List<Map<String,String>> objects = pointRegionCollent.get(start);
if (CollectionUtils.isEmpty(objects)){
return null;
}
Map<String,String> startPointInfo = objects.get(0);
String startPointCollent = startPointInfo.get("pointcollent");
String[] split = startPointCollent.split(",");
for (String s : split) {
Optional<SchBaseTask> 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;
}
}

View File

@@ -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<String,SpeStatusHandler > 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<SchBasePoint>().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<PdmProduceWorkorder>()
.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<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>()
.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<SchBaseTask>()
.set("task_status",StatusEnum.TASK_RUNNING.getCode())
.set("update_name","acs")
.set("update_time",DateUtil.now()).eq("task_id",task.getTask_id()));
Map<String, String> 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<PdmBiDevice>()
.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<SchBaseTask>()
.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<String, String> extParam = (Map)param.get("ext_param");
UpdateWrapper<SchBaseTask> wrapper = new UpdateWrapper<SchBaseTask>()
.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<SchCachelineVehilematerial> list = cacheLineVechileService.list(new QueryWrapper<SchCachelineVehilematerial>().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<PdmProduceWorkorder>().eq("workorder_code", task.getTable_fk_id()));
PdmBiWorkprocedure workprocedure = workprocedureService.getOne(new QueryWrapper<PdmBiWorkprocedure>().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<SchBaseTask>()
.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<String, String> extParam = (Map)param.get("ext_param");
UpdateWrapper<SchBaseTask> wrapper = new UpdateWrapper<SchBaseTask>()
.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<PdmBiDevice>().eq("device_code", task.getPoint_code2()));
if (!("fall_finish"+task.getTask_id()).equals(one.getRemark())){
deviceService.update(new UpdateWrapper<PdmBiDevice>()
.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<SchBaseTask>()
.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<PdmBiDevice>().eq("device_code", task.getPoint_code2()));
if (!("fall_finish"+task.getTask_id()).equals(one.getRemark())){
deviceService.update(new UpdateWrapper<PdmBiDevice>()
.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<SchBaseTask> schedulerTask(List<SchBaseTask> array) {
ArrayList<SchBaseTask> 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<String, List<Object>> pointRegionCollent = needMergeCollect.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("point_code")));
Set<String> mergePointCollent = needMergeCollect.stream().map(item -> ((JSONObject) item).getString("point_code")).collect(Collectors.toSet());
//合并下发的任务
List<SchBaseTask> notMerge = new ArrayList<>();//单独下发的任务
List<SchBaseTask> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
Map<String, String> 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<String> collect = taskGroupMap.keySet().stream().collect(Collectors.toList());
collect.add(taskId);
//相同任务类型的任务
List<SchBaseTask> 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<SchBaseTask> 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<String, List<SchBaseTask>> collect = Merge.stream().collect(Collectors.groupingBy(SchBaseTask::getTask_group_id));
ArrayList<SchBaseTask> result = new ArrayList<>();
for (List<SchBaseTask> value : collect.values()) {
updateAcsTaskType(value);
result.addAll(value);
}
return result;
}
private void updateAcsTaskType(List<SchBaseTask> 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<String, List<Object>> pointRegionCollent, String start,String end,List<SchBaseTask> tasks,List<String> taskIds) {
String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds);
if (findpoint == null){
findpoint = findpoint(pointRegionCollent, end, tasks, taskIds);
}
return findpoint;
}
private String getMergePointBytow(Map<String, List<Object>> pointRegionCollent, String start,String end,List<SchBaseTask> tasks,List<String> taskIds) {
String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds);
if (findpoint == null){
findpoint = findpoint(pointRegionCollent, end, tasks, taskIds);
}
return findpoint;
}
private String findpoint(Map<String, List<Object>> pointRegionCollent, String start, List<SchBaseTask> tasks, List<String> taskIds) {
List<Object> 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<SchBaseTask> 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;
}
}

View File

@@ -31,4 +31,40 @@
<flow id="A1_SKQX" name="深坑清洗" sourceRef="A1_XYXL" targetRef="end"></flow>
<end id="end" name="Junior Reject End" sourceRef="A1_SKQX"></end>
</process>
<process id="A3XY" name="旋压下料">
<start id="start" name="Starter" targetRef="A3_XY"></start>
<flow id="A3_XY" name="三线旋压工序" has="1" sourceRef="starter" targetRef="A3_BCPRK01"></flow>
<flow id="A3_BCPRK01" name="三线半成品入库" sourceRef="A3_XY" targetRef="end"></flow>
<end id="end" name="Junior Reject End" sourceRef="A3_BCPRK01"></end>
</process>
<process id="A3JGXL" name="激光下料">
<start id="start" name="Starter" targetRef="A3_JGXL"></start>
<flow id="A3_JGXL" name="三线激光下料工序" has="1" sourceRef="starter" targetRef="A3_JGQX"></flow>
<flow id="A3_JGQX" name="三线激光清洗" sourceRef="A3_JGXL" targetRef="end"></flow>
<end id="end" name="Junior Reject End" sourceRef="A3_JGQX"></end>
</process>
<process id="A3TW" name="推弯一体">
<start id="start" name="Starter" targetRef="A3_TW"></start>
<flow id="A3_TW" name="三线推弯一体" has="1" sourceRef="starter" targetRef="A3_BCPRK01"></flow>
<flow id="A3_BCPRK01" name="三线半成品入库" sourceRef="A3_TW" targetRef="end"></flow>
<end id="end" name="Junior Reject End" sourceRef="A3_BCPRK01"></end>
</process>
<process id="A3WXXL" name="无屑下料">
<start id="start" name="Starter" targetRef="A3_WXXL"></start>
<flow id="A3_WXXL" name="无屑下料工序" has="1" sourceRef="starter" targetRef="A3_ST">
<param id="cacheLine" value="A3_BCPRK01"/>
</flow>
<flow id="A3_ST" name="三线三通" sourceRef="A3_WXXL" targetRef="A1_TK"></flow>
<flow id="A3_TK" name="三线镗孔" sourceRef="A3_ST" targetRef="A3_BCPRK01"></flow>
<flow id="A3_BCPRK01" name="三线半成品入库" sourceRef="A3_TK" targetRef="end"></flow>
<end id="end" name="Junior Reject End" sourceRef="A3_BCPRK01"></end>
</process>
<process id="A3THXL" name="铜环下料">
<start id="start" name="Starter" targetRef="A3_THXL"></start>
<flow id="A3_THXL" name="三线旋压工序" has="1" sourceRef="starter" targetRef="A3_FHQX"></flow>
<flow id="A3_FHQX" name="三线发黑清洗" sourceRef="A3_THXL" targetRef="end"></flow>
<end id="end" name="Junior Reject End" sourceRef="A3_FHQX"></end>
</process>
</definitions>