add:三线专机任务
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user