add:修改调度任务代码

This commit is contained in:
zhangzhiqiang
2023-05-25 19:44:48 +08:00
parent b8da36f71b
commit 87ca2d32d6
12 changed files with 102 additions and 80 deletions

View File

@@ -9,6 +9,7 @@ import org.apache.commons.lang3.StringUtils;
import lombok.extern.slf4j.Slf4j;
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.OptionRecord;
@@ -74,12 +75,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService{
return result;
}
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.forEach(a->{
a.getClass();
});
}
/**
* 更新缓存线的点位实时任务信息
@@ -142,9 +137,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService{
}
// 任务处理类
try {
Class<?> clz = Class.forName(processing_class);
Object obj = clz.newInstance();
// 调用每个任务类的forceFinishInst()强制结束方法
Object obj = SpringContextHolder.getBean(Class.forName(processing_class));
Method m = obj.getClass().getDeclaredMethod("updateTaskStatus", JSONObject.class, String.class);
m.invoke(obj, row, status);
} catch (InvocationTargetException e) {
@@ -210,8 +203,15 @@ public class AcsToWmsServiceImpl implements AcsToWmsService{
PdmProduceWorkorder workorder = new PdmProduceWorkorder();
workorder.setWorkorder_id(orderJson.getString("workorder_id"));
workorder.setWorkorder_status(orderJson.getString("status"));
workorder.setDq_real_qty(orderJson.getBigDecimal("real_qty"));
workorder.setRealproduceend_date(DateUtil.now());
if (orderJson.getBigDecimal("real_qty") != null){
workorder.setDq_real_qty(orderJson.getBigDecimal("real_qty"));
}
if (orderJson.getString("status").equals(WorkerOrderEnum.PRODUCTING.getCode())){
workorder.setRealproducestart_date(DateUtil.now());
}
if (orderJson.getString("status").equals(WorkerOrderEnum.COMPLETE.getCode())){
workorder.setRealproduceend_date(DateUtil.now());
}
workorderService.updateById(workorder);
} catch (Exception e){
result.put("status", 400);

View File

@@ -6,6 +6,7 @@ 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.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
@@ -70,14 +71,17 @@ public class AgvInstService {
String quantity = task.getString("material_qty");
//获取当前生产工序下一道工序
Map<String,String> workprodure = basePointService.findDeviceWorkprodure(task.getString("point_code1"));
FlowElement next = getFlowElement(task,workprodure).next();
FlowElement currentFlow = getFlowElement(task, workprodure);
FlowElement next = currentFlow.next();
Map query = MapOf.of("workprocedure_id", basePointService.getWorkprodureByCode(next.getId()).get("workprocedure_id")
, "qty", quantity);
//判断缓存线是不是去深坑清洗深坑区域15个点判断空的物料坑位
if (next.getName().equals("深坑清洗")){
query.put("material_id",task.getString("material_id"));
// query.put("qty",quantity) 深坑物料需要转重量
}
List<Map<String,String>> list = deviceService.workproceduceDevices(query);
String nextPoint = null;
@@ -85,10 +89,11 @@ public class AgvInstService {
if (!CollectionUtils.isEmpty(list)){
nextPoint = list.get(0).get("point_code");
}else {
if (next.getParams().get("cacheLine") == null){
if (currentFlow.getParams().get("cacheLine") == null){
throw new BadRequestException("当前任务下一道工序无可用设备");
}
nextPoint = getParamByXml(workprodure, next, nextPoint);
nextPoint = getParamByXml(workprodure, currentFlow, nextPoint);
task.put("acs_task_type",AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode());
cacheVehile = getCacheVehile(nextPoint, null);
}
@@ -101,7 +106,7 @@ public class AgvInstService {
.set("lock_type",StatusEnum.LOCK_ON.getCode()).set("task_id",task.getString("task_id")).eq("point_code",nextPoint));
SchBaseTask schBaseTask = task.toJavaObject(SchBaseTask.class);
schBaseTask.setVehicle_code(cacheVehile);
schBaseTask.setBarcodeArr(cacheVehile);
schBaseTask.setPoint_code2(nextPoint);
schBaseTask.setTask_status(StatusEnum.TASK_START_END_P.getCode());
schBaseTask.setUpdate_time(new Date());
@@ -161,8 +166,9 @@ public class AgvInstService {
throw new BadRequestException(String.format("缓存线%s上含物料%s的载具已分配完",startPoint,task.getString("material_id")));
}
SchBaseTask schBaseTask = task.toJavaObject(SchBaseTask.class);
schBaseTask.setVehicle_code(cacheVehile);
schBaseTask.setBarcodeArr(cacheVehile);
schBaseTask.setPoint_code1(startPoint);
schBaseTask.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode());
schBaseTask.setPoint_code3(startPoint);
schBaseTask.setTask_status(StatusEnum.TASK_START_END_P.getCode());
schBaseTask.setUpdate_time(new Date());

View File

@@ -32,8 +32,10 @@ public class WmsToAcsServiceImpl implements WmsToAcsService{
, "next_point_code", task.getString("point_code3")//空盘返回点
, "task_group_id", StringUtils.isBlank(task.getString("task_group_id"))? IdUtil.getStringId():task.getString("task_group_id")
, "priority", task.getString("priority")
, "is_send", task.getString("is_send")
, "is_send", task.getBoolean("is_send")?"1":"0"
, "vehicle_code", task.getString("vehicle_code")
, "barcodeArr", task.getString("barcodeArr")
, "proprity_floor", "2"
, "agv_system_type", task.getString("agv_system_type")
));
form.add(param);

View File

@@ -65,11 +65,11 @@ public class SpeFullTask extends AbstractAcsTask {
@Override
@Transactional
public void updateTaskStatus(JSONObject param,String status) {
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
log.info(InterfaceLogType.ACS_TO_LMS.getDesc());
// 指令执行中
SchBaseTask task = taskService.getById(param.getString("task_id"));
AcsTaskEnum taskType = AcsTaskEnum.getType(task.getTask_type(),"TASK_");
pointService.update(new UpdateWrapper<SchBasePoint>().set("lock_type","0").in("point_code",task.getPoint_code1(),task.getPoint_code2(),task.getPoint_code3()));
try {
SpeHandles.get(taskType.name()).handle(param,status,task);
}catch (Exception ex){

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -14,10 +15,14 @@ import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Method;
import java.util.*;
@@ -34,7 +39,9 @@ import java.util.stream.Collectors;
public class TaskScheduleService {
private ReentrantLock lock = new ReentrantLock();
private final WmsToAcsService wmsToAcsService;
private final ISchBaseTaskService taskService;
@Scheduled(cron = "0/30 * * * * ?")
public void taskPublish(){
@@ -43,64 +50,62 @@ public class TaskScheduleService {
if (islock){
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
//查询所有自动下发的任务
JSONArray all = taskTable.query("is_auto_issue = '1' and task_status < '" + StatusEnum.TASK_PUBLISH.getCode() + "'").getResultJSONArray(0);
List<SchBaseTask> all = taskService.list(new QueryWrapper<SchBaseTask>().eq("is_auto_issue", "1").lt("task_status", StatusEnum.TASK_PUBLISH.getCode()));
//进行起点终点确认:
if (all.size() == 0){
return;
}
log.info("TaskScheduleService#taskPublish all_task:{}",all.size());
Iterator<Object> iterator = all.iterator();
Iterator<SchBaseTask> iterator = all.iterator();
while (iterator.hasNext()){
JSONObject task = (JSONObject)iterator.next();
if (task.getString("task_status").equals(StatusEnum.TASK_START_END_P.getCode())){
SchBaseTask task =iterator.next();
if (task.getTask_status().equals(StatusEnum.TASK_START_END_P.getCode())){
continue;
}
try {
Class<?> clz = Class.forName(task.getString("handle_class"));
Object obj = clz.newInstance();
Object obj = SpringContextHolder.getBean(Class.forName(task.getHandle_class()));
// 调用每个任务类的forceFinishInst()强制结束方法
Method m = obj.getClass().getDeclaredMethod("pointConfirm", JSONObject.class, String.class);
m.invoke(obj,task);
task.put("task_type", StatusEnum.TASK_START_END_P.getCode());
task.setTask_type(StatusEnum.TASK_START_END_P.getCode());
}catch (Exception ex){
task.put("task_type", StatusEnum.TASK_START_ERROR.getCode());
task.put("remark",ex.getMessage());
task.put("update_time",DateUtil.now());
taskTable.update(task);
task.setTask_type(StatusEnum.TASK_START_ERROR.getCode());
task.setRemark(ex.getMessage());
task.setUpdate_time(new Date());
taskService.updateById(task);
iterator.remove();
}
}
//分区域不同区域调用不同acs接口
Map<String, List<Object>> areaCollent = all.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("product_area")));
Map<String, List<SchBaseTask>> areaCollent = all.stream().collect(Collectors.groupingBy(SchBaseTask::getProduct_area));
for (String area : areaCollent.keySet()) {
List<Object> array = areaCollent.get(area);
List<SchBaseTask> array = areaCollent.get(area);
if (array.size()>0){
String pointCollect = array.stream().map(o -> ((JSONObject) o).getString("point_code1") + "','" + ((JSONObject) o).getString("point_code2")).collect(Collectors.joining("','"));
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<Object> notMerge = new ArrayList<>();//单独下发的任务
List<Object> Merge = new ArrayList<>();//单独下发的任务
List<Object> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
Map<String, String> taskGroupMap = array.stream().filter(a-> StringUtils.isNotEmpty(((JSONObject)a).getString("task_group_id"))).collect(HashMap::new, (k, v) -> k.put(((JSONObject)v).getString("task_id"), ((JSONObject)v).getString("task_group_id")), HashMap::putAll);
for (Object o : array) {
List<SchBaseTask> notMerge = new ArrayList<>();//单独下发的任务
List<SchBaseTask> Merge = new ArrayList<>();//单独下发的任务
List<SchBaseTask> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
//Map<String, String> taskGroupMap = array.stream().filter(a-> StringUtils.isNotEmpty(a.getTask_group_id())).collect(HashMap::new, (k, v) -> k.put(v.getTask_id(), v.getTask_group_id()), HashMap::putAll);
Map<String, String> taskGroupMap = new HashMap<>();
for (SchBaseTask task : array) {
String taskGroupId = IdUtil.getStringId();
JSONObject task = (JSONObject) o;
String taskId = task.getString("task_id");
task.put("is_send","1");
String taskId = task.getTask_id();
task.setIs_send(true);
if (taskGroupMap.get(taskId) != null){
task.put("task_group_id",taskGroupMap.get(taskId));
task.put("is_send","0");
task.setTask_group_id(taskGroupMap.get(taskId));
task.setIs_send(false);
Merge.add(task);
continue;
}
String start = task.getString("point_code1");
String end = task.getString("point_code2");
String start = task.getPoint_code1();
String end = task.getPoint_code2();
taskGroupMap.put(taskId,taskGroupId);
task.put("task_group_id",taskGroupId);
task.setTask_group_id(taskGroupId);
//如果点位不属于查询出来可以合并点位集合:则单独下发集合
if (!mergePointCollent.contains(start) && !mergePointCollent.contains(end)){
notMerge.add(task);
@@ -120,27 +125,33 @@ public class TaskScheduleService {
}
//开始下发处理waitingTask如果创建时间>2分钟则改单独下发
if (waitingTask.size()>0){
List<Object> needPublish = waitingTask.stream().filter(a -> DateUtil.between(new Date(),DateUtil.parseDateTime(((JSONObject)a).getString("create_time") ), DateUnit.MINUTE) >2 ).collect(Collectors.toList());
List<SchBaseTask> needPublish = waitingTask.stream().filter(a -> DateUtil.between(new Date(),a.getCreate_time(), DateUnit.MINUTE) >2 ).collect(Collectors.toList());
notMerge.addAll(needPublish);
}
String notMergeID = notMerge.stream().map(a -> ((JSONObject) a).getString("task_id")).collect(Collectors.joining(","));
String waitingTaskId = waitingTask.stream().map(a -> ((JSONObject) a).getString("task_id")).collect(Collectors.joining(","));
String MergeId = Merge.stream().map(a -> ((JSONObject) a).getString("task_id")).collect(Collectors.joining(","));
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->{
((JSONObject)a).put("acs_task_type", AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode());
a.setIs_send(true);
if (a.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_TASK.getCode())){
a.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode());
}
if (a.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode())){
a.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode());
}
});
Merge.addAll(notMerge);
JSONArray jsonArray = new JSONArray(Merge);
//批量更新任务状态is_send,task_group_id
for (Object task : Merge) {
JSONObject task1 = (JSONObject) task;
task1.put("update_name","schedule");
task1.put("update_time",DateUtil.now());
taskTable.update(task1,"task_id = '"+task1.getString("task_id")+"'");
JSONArray arr = new JSONArray();
for (SchBaseTask task : Merge) {
task.setUpdate_name("schedule");
task.setUpdate_time(new Date());
taskService.updateById(task);
arr.add(JSONObject.toJSON(task));
}
//缓存线任务待确认是否生成多个
Map<String, Object> resp = wmsToAcsService.issueTaskToAcs(jsonArray);
Map<String, Object> resp = wmsToAcsService.issueTaskToAcs(arr);
// if (((int)resp.get("status")) == (HttpStatus.BAD_REQUEST.value())){
// Object errArr = resp.get("errArr");
// throw new BadRequestException(String.valueOf(resp.get("message")));
@@ -156,7 +167,7 @@ public class TaskScheduleService {
}
private String getMergePoint(Map<String, List<Object>> pointRegionCollent, String start,String end,List<Object> tasks,List<String> taskIds) {
private String getMergePoint(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);
@@ -164,15 +175,18 @@ public class TaskScheduleService {
return findpoint;
}
private String findpoint(Map<String, List<Object>> pointRegionCollent, String start, List<Object> tasks, List<String> taskIds) {
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<Object> any = tasks.stream().filter(a -> ((JSONObject) a).getString("point_code1").equals(s) && !taskIds.contains(((JSONObject) a).getString("task_id"))).findAny();
Optional<SchBaseTask> any = tasks.stream().filter(a -> a.getPoint_code1().equals(s) && !taskIds.contains((a.getTask_id()))).findAny();
if (any.isPresent()){
return ((JSONObject)any.get()).getString("task_id");
return any.get().getTask_id();
}
}
return null;

View File

@@ -28,7 +28,7 @@
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'
sch_base_point.point_type = '4' and pdm_bi_device.is_used = true and sch_base_point.lock_type = '0'
and workprocedure_id = #{workprocedure_id}
<if test="material_id != null and material_id != ''">
and (pdm_bi_device.material_id = #{material_id} or pdm_bi_device.material_id is null )

View File

@@ -220,10 +220,6 @@ public class PdmProduceWorkorder implements Serializable {
* 完工时间
*/
private String confirm_time;
/**
* 自增序号
*/
private Integer seq_number;
}

View File

@@ -512,7 +512,7 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
//判断该工单状态
PdmProduceWorkorder result = this.getOne(new QueryWrapper<PdmProduceWorkorder>()
.eq("device_code", param.getString("device_code"))
.in("workorder_status", "2", "3", "4")
.in("workorder_status", "3", "4")
.ne("workorder_id", param.getString("workorder_id")));
if (ObjectUtil.isNotEmpty(result)) {
throw new BadRequestException("已有工单选择该设备开工,请更换开工设备!");
@@ -526,7 +526,7 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
PdmProduceWorkorder workOrder = this.getOne(new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
workOrder.setWorkorder_status(WorkerOrderEnum.PRODUCTING.getCode());
if (((int) resp.get("status")) == (HttpStatus.BAD_REQUEST.value())) {
throw new BadRequestException(String.valueOf(resp.get("message")));
throw new BadRequestException(resp.get("message")!=null?String.valueOf(resp.get("message")):"acs反馈异常");
}
workOrder.setReal_qty(null);
this.update(workOrder, new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));

View File

@@ -117,6 +117,10 @@ public class SchBaseTask implements Serializable {
* 载具编码1
*/
private String vehicle_code;
/**
* 缓存线专用字段
*/
private String barcodeArr;
/**
* 载具编码2

View File

@@ -19,8 +19,8 @@
<param id="cacheLine" value="A1_HCX_03"/>
</flow>
<flow id="A1_STLS" name="三通拉伸工序" sourceRef="A1_WXXL" targetRef="A1_TK"></flow>
<flow id="A1_TK" name="镗孔" sourceRef="A1_TK" targetRef="end"></flow>
<flow id="A1_SKQX" name="深坑清洗" sourceRef="A1_TK" targetRef="end"></flow>
<flow id="A1_TK" name="镗孔" sourceRef="A1_TK" targetRef="A1_SKQX"></flow>
<flow id="A1_SKQX" name="深坑清洗" sourceRef="A1_STLS" targetRef="end"></flow>
<end id="end" name="Junior Reject End" sourceRef="A1_SKQX"></end>
</process>
</definitions>