Merge remote-tracking branch 'origin/b_lms' into master_merge
This commit is contained in:
@@ -45,7 +45,7 @@ public interface IBstIvtCutpointivtService extends IService<BstIvtCutpointivt> {
|
||||
|
||||
/**
|
||||
* 获取类型状态,没任务的点位
|
||||
* @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位
|
||||
* @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位
|
||||
* @param pointStatus 点位状态:1空位、2有气涨轴、3有子卷
|
||||
* @param area 区域(0上1下)
|
||||
* @param sort 0:不排序,1:正序, 2:倒序
|
||||
@@ -55,7 +55,7 @@ public interface IBstIvtCutpointivtService extends IService<BstIvtCutpointivt> {
|
||||
|
||||
/**
|
||||
* 获取同尺寸的气涨轴
|
||||
* @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位
|
||||
* @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位
|
||||
* @param size 气涨轴尺寸
|
||||
* @param generation 代数(4:小,5:大)
|
||||
* @return /
|
||||
@@ -86,7 +86,7 @@ public interface IBstIvtCutpointivtService extends IService<BstIvtCutpointivt> {
|
||||
|
||||
/**
|
||||
* 获取一半的点位
|
||||
* @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位
|
||||
* @param type 点位类型:1套轴对接位,2分切缓存位,3分切对接位,4套轴异常位
|
||||
* @param pointStatus 点位状态:1空位、2有气涨轴、3有子卷
|
||||
* @param location 区域:0上1下
|
||||
* @return /
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
package org.nl.b_lms.sch.tasks.slitter;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.b_lms.bst.ivt.cutpointivt.service.IBstIvtCutpointivtService;
|
||||
import org.nl.b_lms.bst.ivt.cutpointivt.service.dao.BstIvtCutpointivt;
|
||||
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
||||
import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant;
|
||||
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
||||
import org.nl.common.utils.SecurityUtils;
|
||||
import org.nl.common.utils.TaskUtils;
|
||||
import org.nl.modules.wql.WQL;
|
||||
import org.nl.modules.wql.core.bean.WQLObject;
|
||||
import org.nl.wms.sch.AcsTaskDto;
|
||||
import org.nl.wms.sch.manage.AbstractAcsTask;
|
||||
import org.nl.wms.sch.manage.TaskStatusEnum;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Description: 内包间送到异常位置
|
||||
* @Date: 2024/6/29
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class SendNBJExceptionPointTask extends AbstractAcsTask {
|
||||
private final String THIS_CLASS = SendNBJExceptionPointTask.class.getName();
|
||||
@Autowired
|
||||
private IschBaseTaskService taskService;
|
||||
@Autowired
|
||||
private IBstIvtCutpointivtService bcutpointivtService;
|
||||
@Override
|
||||
public List<AcsTaskDto> addTask() {
|
||||
/*
|
||||
* 下发给ACS时需要特殊处理
|
||||
*/
|
||||
List<SchBaseTask> taskList = taskService.getIssueTasks(THIS_CLASS);
|
||||
|
||||
ArrayList<AcsTaskDto> resultList = new ArrayList<>();
|
||||
String agv_system_type = "2";
|
||||
for (SchBaseTask task : taskList) {
|
||||
AcsTaskDto dto = AcsTaskDto.builder()
|
||||
.ext_task_id(task.getTask_id())
|
||||
.task_code(task.getTask_code())
|
||||
.task_type(task.getAcs_task_type())
|
||||
.start_device_code(task.getPoint_code1())
|
||||
.next_device_code(task.getPoint_code2())
|
||||
.start_device_code2(task.getPoint_code3())
|
||||
.next_device_code2(task.getPoint_code4())
|
||||
.vehicle_code(task.getVehicle_code())
|
||||
.agv_system_type(agv_system_type)
|
||||
.priority(task.getPriority())
|
||||
.remark(task.getRemark())
|
||||
.product_area(task.getProduct_area())
|
||||
.build();
|
||||
resultList.add(dto);
|
||||
}
|
||||
return resultList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTaskStatus(JSONObject taskObj, String status) {
|
||||
SchBaseTask task = taskService.getById(taskObj.getString("task_id"));
|
||||
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
|
||||
// 更新任务状态为执行中
|
||||
task.setTask_status(TaskStatusEnum.EXECUTING.getCode());
|
||||
}
|
||||
|
||||
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
|
||||
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||
// 互换资源
|
||||
// update: 在acs请求取货完成就已经清空点位信息
|
||||
String endPoint = task.getPoint_code2();
|
||||
BstIvtCutpointivt endPointObj = bcutpointivtService.getPintByAgvCode(endPoint, false);
|
||||
TaskUtils.pointMaintenanceInventory(task, endPointObj, "2");
|
||||
bcutpointivtService.updateById(endPointObj);
|
||||
}
|
||||
|
||||
// 取消
|
||||
if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) {
|
||||
task.setTask_status(TaskStatusEnum.FINISHED.getCode());
|
||||
}
|
||||
task.setUpdate_time(DateUtil.now());
|
||||
taskService.updateById(task);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createTask(JSONObject form) {
|
||||
String currentUserId = SecurityUtils.getCurrentUserId();
|
||||
String currentUsername = SecurityUtils.getCurrentUsername();
|
||||
|
||||
SchBaseTask task = new SchBaseTask();
|
||||
task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr());
|
||||
task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr());
|
||||
task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode());
|
||||
task.setPoint_code1(form.getString("point_code1"));
|
||||
task.setPoint_code2(form.getString("point_code2"));
|
||||
task.setVehicle_code(form.getString("vehicle_code1"));
|
||||
task.setVehicle_code2(form.getString("vehicle_code2"));
|
||||
task.setAcs_task_type("3");
|
||||
task.setIs_delete(SlitterConstant.SLITTER_NO);
|
||||
task.setRequest_param(form.toJSONString());
|
||||
task.setTask_type(form.getString("task_type"));
|
||||
task.setProduct_area(form.getString("product_area"));
|
||||
task.setCreate_id(currentUserId);
|
||||
task.setCreate_name(currentUsername);
|
||||
task.setCreate_time(DateUtil.now());
|
||||
task.setHandle_class(THIS_CLASS);
|
||||
//根据类型获取对应的任务优先级
|
||||
JSONObject priority_jo = WQL.getWO("PDA_COOLIN").addParam("flag", "3").addParam("task_type", task.getTask_type()).process().uniqueResult(0);
|
||||
if (ObjectUtil.isEmpty(priority_jo)) {
|
||||
task.setPriority("1");
|
||||
} else {
|
||||
task.setPriority(priority_jo.getString("value"));
|
||||
}
|
||||
taskService.save(task);
|
||||
this.immediateNotifyAcs(null);
|
||||
return task.getTask_id();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forceFinish(String task_id) {
|
||||
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
|
||||
this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void cancel(String task_id) {
|
||||
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
|
||||
this.updateTaskStatus(taskObj, "0");
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingprodu
|
||||
import org.nl.b_lms.sch.point.dao.StIvtCutpointivt;
|
||||
import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService;
|
||||
import org.nl.b_lms.sch.tasks.slitter.SendAirShaftAgvTask;
|
||||
import org.nl.b_lms.sch.tasks.slitter.SendNBJExceptionPointTask;
|
||||
import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant;
|
||||
import org.nl.b_lms.sch.tasks.slitter.constant.SlitterEnum;
|
||||
import org.nl.b_lms.sch.tasks.slitter.mapper.SlitterMapper;
|
||||
@@ -47,6 +48,8 @@ public class AutoSendAirShaftAgvTask {
|
||||
private SlitterMapper slitterMapper;
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
@Autowired
|
||||
private SendNBJExceptionPointTask sendNBJExceptionPointTask;
|
||||
|
||||
@SneakyThrows
|
||||
public void run() {
|
||||
@@ -59,9 +62,25 @@ public class AutoSendAirShaftAgvTask {
|
||||
// 最多4条分切计划
|
||||
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
.in(PdmBiSlittingproductionplan::getQzzno, collect)
|
||||
.eq(PdmBiSlittingproductionplan::getStatus, "01")
|
||||
.eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO));
|
||||
if (plans.size() == 0) {
|
||||
throw new BadRequestException("分切计划不存在");
|
||||
// 不能抛异常,需要通过通知的形式,并且创建agv搬到异常处理位(4)。
|
||||
// 判断套轴暂存位异常点位是否含有任务
|
||||
List<BstIvtCutpointivt> exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("4", "1", "0", "0");
|
||||
if (exceptionPoints.size() > 0) {
|
||||
BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0);
|
||||
// 需要枷锁
|
||||
JSONObject exParam = new JSONObject();
|
||||
exParam.put("point_code1", cutPoint.getPoint_code());
|
||||
exParam.put("point_code2", exceptionPoint.getPoint_code());
|
||||
exParam.put("vehicle_code1", cutPoint.getQzz_no1());
|
||||
exParam.put("vehicle_code2", cutPoint.getQzz_no2());
|
||||
exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理AGV任务"));
|
||||
exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
|
||||
sendNBJExceptionPointTask.createTask(exParam);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// 获取任意一条
|
||||
PdmBiSlittingproductionplan demoPlan = plans.get(0);
|
||||
|
||||
@@ -81,8 +81,11 @@ public class AutoUpShaftTrussTask {
|
||||
List<String> qzzNos = Stream.of(newCutPoint.getQzz_no1(), newCutPoint.getQzz_no2())
|
||||
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
||||
List<PdmBiSlittingproductionplan> nextPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
.in(PdmBiSlittingproductionplan::getQzzno, qzzNos));
|
||||
.in(PdmBiSlittingproductionplan::getQzzno, qzzNos)
|
||||
.eq(PdmBiSlittingproductionplan::getStatus, "03")
|
||||
.eq(PdmBiSlittingproductionplan::getIs_delete, "0"));
|
||||
if (nextPlans.size() == 0) {
|
||||
// notice提示分切计划找不到
|
||||
log.warn("分切机【" + device.getExt_code() + "】未找到套好轴的分切计划");
|
||||
// 未找到分切计划
|
||||
return;
|
||||
|
||||
@@ -21,7 +21,8 @@ public enum SlitterEnum {
|
||||
*/
|
||||
TASK_TYPE(MapOf.of("穿拔轴缓存<>穿拔轴位", "010801", "穿拔轴缓存<>分切对接位", "010802", "穿拔轴位<>气胀轴缓存位", "010803"
|
||||
, "分切机下料AGV任务", "010804", "分切机上气胀轴", "010805", "分切机下气胀轴", "010806", "备货区送载具", "010807"
|
||||
, "备货区送纸管", "010808", "分切机下料桁架任务", "010809", "分切机下料AGV到内包间", "010810"));
|
||||
, "备货区送纸管", "010808", "分切机下料桁架任务", "010809", "分切机下料AGV到内包间", "010810", "套轴异常处理AGV任务", "010811"
|
||||
, "套轴异常处理桁架任务", "010812"));
|
||||
private Map<String, String> code;
|
||||
|
||||
public String code(String desc) {
|
||||
|
||||
@@ -109,6 +109,8 @@ public class SlitterServiceImpl implements SlitterService {
|
||||
private SlitterDownAgvTask slitterDownAgvTask;
|
||||
@Autowired
|
||||
private ISysParamService paramService;
|
||||
@Autowired
|
||||
private SendNBJExceptionPointTask sendNBJExceptionPointTask;
|
||||
|
||||
@Override
|
||||
|
||||
@@ -243,11 +245,43 @@ public class SlitterServiceImpl implements SlitterService {
|
||||
log.error("找不到[{}]对应的分切计划!", deviceCode);
|
||||
throw new BadRequestException("找不到[" + deviceCode + "]对应的分切计划!");
|
||||
}
|
||||
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.list(
|
||||
new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||
.in(PdmBiSlittingproductionplan::getContainer_name, collect)
|
||||
.eq(PdmBiSlittingproductionplan::getStatus, "01")
|
||||
.eq(PdmBiSlittingproductionplan::getIs_delete, "0"));
|
||||
if (plans.size() == 0) {
|
||||
log.error("找不到[{}]对应的分切计划!", collect);
|
||||
log.error("找不到[{}]对应的分切计划,分切计划可能被删除或者拼接!", collect);
|
||||
// 移动到异常处理位
|
||||
List<BstIvtCutpointivt> exceptionPoints = bcutpointivtService.getAreaNotTaskPointByStatus("4", "1", "0", "0");
|
||||
if (exceptionPoints.size() > 0) {
|
||||
BstIvtCutpointivt exceptionPoint = exceptionPoints.get(0);
|
||||
// 枷锁
|
||||
RLock lockPointR = redissonClient.getLock(exceptionPoint.getPoint_code());
|
||||
boolean tryLockPointR = lockPointR.tryLock(0, TimeUnit.SECONDS);
|
||||
try {
|
||||
if (tryLockPointR) {
|
||||
// 需要枷锁
|
||||
JSONObject exParam = new JSONObject();
|
||||
exParam.put("point_code1", startPoint.getPoint_code());
|
||||
exParam.put("point_code2", exceptionPoint.getPoint_code());
|
||||
exParam.put("vehicle_code1", "-");
|
||||
exParam.put("vehicle_code2", "-");
|
||||
exParam.put("task_type", SlitterEnum.TASK_TYPE.code("套轴异常处理桁架任务"));
|
||||
exParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
|
||||
sendNBJExceptionPointTask.createTask(exParam);
|
||||
res.put("status", HttpStatus.HTTP_OK);
|
||||
res.put("message", "创建送至异常处理位!");
|
||||
return res;
|
||||
} else {
|
||||
throw new BadRequestException("系统繁忙,稍后在试!");
|
||||
}
|
||||
} finally {
|
||||
if (tryLockPointR) {
|
||||
lockPointR.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new BadRequestException("找不到[" + collect + "]对应的分切计划!");
|
||||
}
|
||||
// 分切计划设置纸卷重量
|
||||
|
||||
Reference in New Issue
Block a user