opt: 去掉预分配逻辑\备货区搬运优化(将空托盘自动搬出去)\拔轴桁架任务做完触发半条任务

This commit is contained in:
2025-06-17 14:53:29 +08:00
parent 8dc996bf2c
commit 02cd276f87
11 changed files with 143 additions and 96 deletions

View File

@@ -106,4 +106,6 @@ public interface IBstIvtStockingivtService extends IService<BstIvtStockingivt> {
List<MdPbPapervehicle> showDetail2(Map param);
PdmBiOrderbominfo showBom2(Map param);
List<BstIvtStockingivt> getMoveTaskPoints();
}

View File

@@ -42,4 +42,6 @@ public interface BstIvtStockingivtMapper extends BaseMapper<BstIvtStockingivt> {
List<BhTubePointDto> getNeedPaperTubePoint(String pointType, String tube, String location);
List<BhTubeMovePointDto> getCanMovePointList(String location, String pointType);
List<BstIvtStockingivt> getMoveTaskPoints();
}

View File

@@ -90,4 +90,14 @@
ORDER BY ivt_status ASC,
qty ASC;
</select>
<select id="getMoveTaskPoints" resultType="org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt">
SELECT
s.*
FROM
sch_base_task t
LEFT JOIN bst_ivt_stockingivt s ON s.point_code = t.point_code1 AND s.point_type = '1' AND s.is_used = '1'
WHERE t.task_type = '010816'
AND t.task_status <![CDATA[ <> ]]> '07'
AND t.is_delete = '0'
</select>
</mapper>

View File

@@ -379,4 +379,9 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl<BstIvtStockingivtM
PdmBiOrderbominfo order = pdmBiOrderbominfoService.getOne(lam);
return order;
}
@Override
public List<BstIvtStockingivt> getMoveTaskPoints() {
return bstIvtStockingivtMapper.getMoveTaskPoints();
}
}

View File

@@ -92,32 +92,44 @@ public class StockAreaSendVehicleTask extends AbstractAcsTask {
String endPoint = task.getPoint_code2();
BstIvtStockingivt startPointObj = stockingivtService.getPointByCode(startPoint, false);
BstIvtStockingivt endPointObj = stockingivtService.getPointByCode(endPoint, false);
// 互换资源 (交换载具号)
endPointObj.setIvt_status("1");
endPointObj.setVehicle_code(task.getVehicle_code());
TaskUtils.updateOptMessageByBStockingPoint(endPointObj);
stockingivtService.update(endPointObj);
startPointObj.setVehicle_code("");
startPointObj.setIvt_status("0");
TaskUtils.updateOptMessageByBStockingPoint(startPointObj);
stockingivtService.update(startPointObj);
// 创建搬运任务, 将所需要的纸管对应的托盘换过来。
String requestParam = task.getRequest_param();
JSONObject jsonObject = JSONObject.parseObject(requestParam);
if (ObjectUtil.isEmpty(requestParam)) {
throw new BadRequestException("任务 code = " + task.getTask_code() + " 参数错误");
if (SlitterEnum.TASK_TYPE.code("备货区单独送空载具").equals(task.getTask_type())) {
// 终点赋值
endPointObj.setIvt_status("1");
endPointObj.setVehicle_code(task.getVehicle_code());
TaskUtils.updateOptMessageByBStockingPoint(endPointObj);
stockingivtService.update(endPointObj);
startPointObj.setVehicle_code("");
startPointObj.setIvt_status("0");
TaskUtils.updateOptMessageByBStockingPoint(startPointObj);
stockingivtService.update(startPointObj);
} else {
// 互换资源 (交换载具号)
endPointObj.setIvt_status("1");
endPointObj.setVehicle_code(task.getVehicle_code());
TaskUtils.updateOptMessageByBStockingPoint(endPointObj);
stockingivtService.update(endPointObj);
startPointObj.setVehicle_code("");
startPointObj.setIvt_status("0");
TaskUtils.updateOptMessageByBStockingPoint(startPointObj);
stockingivtService.update(startPointObj);
// 创建搬运任务, 将所需要的纸管对应的托盘换过来。
String requestParam = task.getRequest_param();
JSONObject jsonObject = JSONObject.parseObject(requestParam);
if (ObjectUtil.isEmpty(requestParam)) {
throw new BadRequestException("任务 code = " + task.getTask_code() + " 参数错误");
}
JSONObject callPoint = jsonObject.getJSONObject("call_point");
JSONObject param = new JSONObject();
param.put("point_code1", callPoint.getString("point_code"));
param.put("point_code2", startPoint);
param.put("vehicle_code", callPoint.getString("vehicle_code"));
param.put("task_type", SlitterEnum.TASK_TYPE.code("备货区送纸管"));
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
List<MdPbPapervehicle> paperList = mdPbPapervehicleService.list(new LambdaQueryWrapper<MdPbPapervehicle>()
.eq(MdPbPapervehicle::getVehicle_code, callPoint.getString("vehicle_code")));
doSavePaperInfos(paperList, param);
stockAreaCallTubeTask.createTask(param);
}
JSONObject callPoint = jsonObject.getJSONObject("call_point");
JSONObject param = new JSONObject();
param.put("point_code1", callPoint.getString("point_code"));
param.put("point_code2", startPoint);
param.put("vehicle_code", callPoint.getString("vehicle_code"));
param.put("task_type", SlitterEnum.TASK_TYPE.code("备货区送纸管"));
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
List<MdPbPapervehicle> paperList = mdPbPapervehicleService.list(new LambdaQueryWrapper<MdPbPapervehicle>()
.eq(MdPbPapervehicle::getVehicle_code, callPoint.getString("vehicle_code")));
doSavePaperInfos(paperList, param);
stockAreaCallTubeTask.createTask(param);
}
// 取消
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {
@@ -138,7 +150,9 @@ public class StockAreaSendVehicleTask extends AbstractAcsTask {
task.setTask_status(TaskStatusEnum.START_AND_POINT.getCode());
task.setPoint_code1(form.getString("point_code1"));
task.setPoint_code2(form.getString("point_code2"));
task.setPoint_code3(callPoint.getString("point_code"));
task.setPoint_code3(ObjectUtil.isNotEmpty(callPoint)
? callPoint.getString("point_code")
: "");
task.setVehicle_code(form.getString("vehicle_code"));
task.setAcs_task_type("3");
task.setIs_delete("0");

View File

@@ -54,6 +54,8 @@ public class TrussCallAirShaftTask extends AbstractAcsTask {
private IBstIvtCutpointivtService bcutpointivtService;
@Autowired
private IBstIvtShafttubeivtService shafttubeivtService;
@Autowired
private TrussSendAirShaftTask trussSendAirShaftTask;
@Override
public List<AcsTaskDto> addTask() {
/*
@@ -117,6 +119,29 @@ public class TrussCallAirShaftTask extends AbstractAcsTask {
.set(BstIvtShafttubeivt::getUpdate_time, DateUtil.now())
.eq(BstIvtShafttubeivt::getPoint_code, task.getPoint_code2());
shafttubeivtService.update(shaftLamUpdate);
if (ObjectUtil.isEmpty(startPointObj.getQzz_no1()) && ObjectUtil.isEmpty(startPointObj.getQzz_no2())) {
// 查找半条任务,并创建下发
List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getTask_type, "010814")
.eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_START.getCode())
.eq(SchBaseTask::getIs_delete, "0")
.orderByAsc(SchBaseTask::getCreate_time));
if (list.size() > 0) {
SchBaseTask schBaseTask = list.get(0);
JSONObject requestParam = JSONObject.parseObject(schBaseTask.getRequest_param());
if (ObjectUtil.isNotEmpty(requestParam.getString("needPosition")) && "A".equals(requestParam.getString("needPosition"))) {
schBaseTask.setPoint_code2(task.getPoint_code1() + "_" + requestParam.getString("needPosition"));
}
if (ObjectUtil.isNotEmpty(requestParam.getString("needPosition")) && "B".equals(requestParam.getString("needPosition"))) {
schBaseTask.setPoint_code2(task.getPoint_code1() + "_" + requestParam.getString("needPosition"));
}
schBaseTask.setRemark("AGV取货完成触发!");
schBaseTask.setUpdate_time(DateUtil.now());
schBaseTask.setTask_status(TaskStatusEnum.START_AND_POINT.getCode());
taskService.updateById(schBaseTask);
trussSendAirShaftTask.immediateNotifyAcs(schBaseTask.getTask_id());
}
}
}
// 取消
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {

View File

@@ -60,6 +60,7 @@ import java.util.stream.Stream;
import static org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil.doSavePaperInfos;
/**
* 定时器呼叫套轴任务
* @Author: lyd
* @Date: 2024/2/1
* @Description: 自动任务 呼叫套轴 根据分切计划来呼叫套轴任务 桁架任务
@@ -105,10 +106,7 @@ public class AutoCallAirShaftTask extends Prun {
public final static String IS_ONLY_PULLING = "IS_ONLY_PULLING";
public final static String TZ_DAY = "TZ_DAY";
public final static String USE_XN = "USE_XN";
public String stepStr = "";
public List<String> stepErrorInfo = new ArrayList<>();
private static final DateTimeFormatter TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Autowired
private RedissonClient redissonClient;
@@ -141,10 +139,9 @@ public class AutoCallAirShaftTask extends Prun {
List<BstIvtShafttubeivt> emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2",
"0", "0");
for (BstIvtShafttubeivt empty : emptyPoints) {
stepStr = "";
stepErrorInfo = new ArrayList<>();
doCallShaft(empty, isOnlyPulling, tzDay, paramObj, useXn);
redisUtils.set("INFO" + empty.getPoint_code(), stepStr);
log.info("--------------------------------------------------");
redisUtils.set("ERROR" + empty.getPoint_code(), stepErrorInfo);
}
} else {
@@ -159,17 +156,16 @@ public class AutoCallAirShaftTask extends Prun {
@Transactional(rollbackFor = Exception.class)
public void doCallShaft(BstIvtShafttubeivt empty, Param isOnlyPulling, Param tzDay, Param paramObj, Param useXn) {
log.info(empty.getPoint_code() + "执行中...");
// 标箔1锂电2 改大小4代5代
String specification = empty.getQzz_generation();
String location = empty.getPoint_location();
stepStr += "1";
if (ObjectUtil.isNotEmpty(isOnlyPulling) && SlitterConstant.SLITTER_YES.equals(isOnlyPulling.getValue())) {
stepErrorInfo.add("系统设置了只做拔轴,详细看参数表:" + IS_ONLY_PULLING);
// 只做拔轴
makePullShaft(empty, specification);
return;
}
stepStr += ",2";
Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue());
// 2、获取分切计划数据 校验代数
List<SlitterPlanDistinctDto> planAll;
@@ -228,13 +224,11 @@ public class AutoCallAirShaftTask extends Prun {
// 查看套轴对接位是否满了
List<BstIvtCutpointivt> emptyShaftPoint = bcutpointivtService.getAreaNotTaskPointByStatus("1",
"1", location, "0");
stepStr += ",6";
// 如果满了就只做拔轴 预留一个货位?,防止套轴直接站满
if (emptyShaftPoint.size() < 1) {
log.info("暂存位没有空位!正在检测是否存在半个点位!");
// 校验是否存在半个位置,且有分切计划
// 获取只有一个位置的点位
stepStr += ",7";
List<BstIvtCutpointivt> halfPlacePoint = bcutpointivtService.getAllHalfPlacePoints("1",
"1", location);
List<String> qzzs = halfPlacePoint.stream()
@@ -247,11 +241,9 @@ public class AutoCallAirShaftTask extends Prun {
makePullShaft(empty, specification);
return;
}
stepStr += ",12";
// 从寻查找分切计划并放在plans, 没有考虑区域问题, 里面会考虑代数
List<PdmBiSlittingproductionplan> tzOKPlans = slittingproductionplanService.getByQzzNos(qzzs, "01");
if (ObjectUtil.isEmpty(tzOKPlans)) {
stepStr += ",13";
log.info("计划找不到");
List<String> collect = halfPlacePoint.stream().map(BstIvtCutpointivt::getPoint_code).collect(Collectors.toList());
stepErrorInfo.add("找不到气胀[" + qzzs + "]对应的计划。请检查点位" + collect);
@@ -273,7 +265,6 @@ public class AutoCallAirShaftTask extends Prun {
}
log.info("找到对应的另一半的计划 - {}", plans);
}
stepStr += ",14";
// 获取一个分切计划的Dto。如果是6寸可以直接使用、如果是3寸需要判断当前位置是否满足
// todo: 需要校验分切设备是在对应的区域中
SlitterPlanDistinctDto planDto = plans.stream()
@@ -316,12 +307,10 @@ public class AutoCallAirShaftTask extends Prun {
String qzz_generation = needPlan.getQzz_generation();
// 从套轴对接位获取相同气涨轴大小
// update: 不需要(同标箔或者锂电分开)
stepStr += ",15";
List<BstIvtCutpointivt> qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, specification);
log.info("查找到满足到对应尺寸的点位-{}", qzzPoint);
if (qzzPoint.size() == 0) {
stepErrorInfo.add("没有可拔轴的点位。");
stepStr += ",16";
//若套轴暂存位没有相同规格的气胀轴,直接去气胀轴库找即可
// 调用ACS滚条气涨轴下来
if (!toAcsOutShaft(qzzSize,location, empty)) {
@@ -332,7 +321,6 @@ public class AutoCallAirShaftTask extends Prun {
toCallAgvMovePaperTube(needPlans, location, empty);
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
saveCutPlanMessage(empty, needPlans, qzzSize);
stepStr += ",97";
return;
}
// 查找一条没任务的点位
@@ -340,10 +328,8 @@ public class AutoCallAirShaftTask extends Prun {
// 当前纸管的规格信息
String oldQzzNo = ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getQzz_no1() : startPoint.getQzz_no2();
stepStr += ",33";
if (oldQzzNo == null) {
log.error("当前气胀轴的编码为空!");
stepStr += ",96";
stepErrorInfo.add(startPoint.getPoint_code() + "的气胀轴编码为空,请检查...");
return;
}
@@ -351,11 +337,9 @@ public class AutoCallAirShaftTask extends Prun {
? startPoint.getTruss_point_code1() : startPoint.getTruss_point_code2();
if (startPointCode == null) {
log.error("当前点位的编码为空!");
stepStr += ",96";
stepErrorInfo.add(startPoint.getPoint_code() + "的点位编码为空检查A或B点位的信息是否正常");
return;
}
stepStr += ",34";
// 如果A6寸 B3寸则需要过滤到精确点位
if (ObjectUtil.isNotEmpty(startPoint.getQzz_no1()) && ObjectUtil.isNotEmpty(startPoint.getQzz_no2())) {
// 获取需要的数据
@@ -378,7 +362,6 @@ public class AutoCallAirShaftTask extends Prun {
}
}
}
stepStr += ",35";
// 创建任务
JSONObject param = new JSONObject();
param.put("point_code1", startPointCode);
@@ -399,7 +382,6 @@ public class AutoCallAirShaftTask extends Prun {
// 最多两条
List<PdmBiSlittingproductionplan> oldPlans = slittingproductionplanService.getByQzzNo(oldQzzNo);
if (oldPlans.size() == 0) {
stepStr += ",96";
log.warn("当前气胀轴编码{},找不到对应的计划", oldQzzNo);
// 把点位禁用
startPoint.setIs_used("0");
@@ -418,16 +400,13 @@ public class AutoCallAirShaftTask extends Prun {
param.put("pullCount", oldPlans.size());
param.put("containers", oldPlans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList()));
toCallAgvMovePaperTube(needPlans, location, empty);
stepStr += ",36";
trussCallAirShaftTask.createTask(param);
stepStr += ",37";
// 将分切计划is_paper_ok 1(纸管已经准备好) -> 2(已经套轴)
needPlans.forEach(p -> {
p.setIs_paper_ok("2");
TaskUtils.updateOptMessageBySlitterPlan(p);
});
slittingproductionplanService.updateBatchById(needPlans);
stepStr += ",97";
}
public List<SlitterPlanDistinctDto> getSlitterPlanByTubesDtos(List<SlitterPlanDistinctDto> filteredList
@@ -516,7 +495,6 @@ public class AutoCallAirShaftTask extends Prun {
// 从套轴对接位获取相同气涨轴大小
// update: 不需要(同标箔或者锂电分开)
// todo: 需要校验区域0/1
stepStr += ",15";
List<BstIvtCutpointivt> qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, qzzGeneration);
log.info("查找可以拔轴的点位数:{}", qzzPoint.size());
if (!judgment1 && !judgment2 && qzzPoint.size() == 0) {
@@ -555,7 +533,6 @@ public class AutoCallAirShaftTask extends Prun {
* @param location 位置
*/
public Boolean toCallAgvMovePaperTube(List<PdmBiSlittingproductionplan> needPlans, String location, BstIvtShafttubeivt empty) {
stepStr += ",17";
// 最多两根
List<String> tubes = needPlans.stream().map(plan -> {
if (SlitterConstant.SLITTER_TYPE_PAPER.equals(plan.getPaper_tube_or_FRP())) {
@@ -571,7 +548,6 @@ public class AutoCallAirShaftTask extends Prun {
.eq(BstIvtShafttubeivt::getPoint_type, empty.getPoint_type())
.eq(BstIvtShafttubeivt::getIs_used, "1"));
log.info("同位置的另一台穿拔轴机构:{}", one);
stepStr += ",18";
// 另一台所需要的数量
int otherDeviceTubeSize = 0;
// 缺省的数量
@@ -590,7 +566,6 @@ public class AutoCallAirShaftTask extends Prun {
}
// 说明三个位置中有包含此纸管的数据。
if (sum >= tubes.size() + otherDeviceTubeSize) {
stepStr += ",19";
return true;
}
// 如果不够,就计算还缺多少个
@@ -598,7 +573,6 @@ public class AutoCallAirShaftTask extends Prun {
// 兜底
needQuantity = needTemp > 0 ? needTemp : 1;
}
stepStr += ",20";
// 查找type=0的位置(待命的托盘)中是否存在(需要判断的是单独一个托盘) 校验了不在搬运中
List<BhTubePointDto> stockingivtList = stockingivtService.getNeedPaperTubePoint("0", tubes.get(0), location);
// 找一个点位: 目的需要的点位
@@ -611,7 +585,6 @@ public class AutoCallAirShaftTask extends Prun {
}
}
if (needPoint == null) {
stepStr += ",21";
// 不存在则站内通知
noticeService.createNotice("备货区找不到[" + tubes.get(0) + "]的纸管信息",
"点位[" + empty.getPoint_name() + "]无法从备货区找到纸管信息",
@@ -624,7 +597,6 @@ public class AutoCallAirShaftTask extends Prun {
List<BhTubeMovePointDto> needMovePointList = stockingivtService.getCanMovePointList(location, "1");
// 空位就直接创建搬过来的任务
BhTubeMovePointDto needMovePoint = needMovePointList.size() > 0 ? needMovePointList.get(0) : null;
stepStr += ",22";
if (ObjectUtil.isEmpty(needMovePoint) || "0".equals(needMovePoint.getIvt_status())) {
// 直接搬过来即可
JSONObject param = new JSONObject();
@@ -638,14 +610,29 @@ public class AutoCallAirShaftTask extends Prun {
.eq(MdPbPapervehicle::getVehicle_code, needPoint.getVehicle_code()));
doSavePaperInfos(paperList, param);
stockAreaCallTubeTask.createTask(param);
stepStr += ",23";
return true;
}
stepStr += ",24";
// 判断是否有单独拉出去的任务,有的话直接拉过来。
List<BstIvtStockingivt> stockingivts = stockingivtService.getMoveTaskPoints();
if (CollectionUtil.isNotEmpty(stockingivts)) {
BstIvtStockingivt bstIvtStockingivt = stockingivts.get(0);
// 直接搬过来即可
JSONObject param = new JSONObject();
param.put("point_code1", needPoint.getPoint_code());
param.put("point_code2", bstIvtStockingivt.getPoint_code());
param.put("vehicle_code", needPoint.getVehicle_code());
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
param.put("task_type", SlitterEnum.TASK_TYPE.code("备货区送纸管"));
// 存储纸管信息
List<MdPbPapervehicle> paperList = mdPbPapervehicleService.list(new LambdaQueryWrapper<MdPbPapervehicle>()
.eq(MdPbPapervehicle::getVehicle_code, needPoint.getVehicle_code()));
doSavePaperInfos(paperList, param);
stockAreaCallTubeTask.createTask(param);
return true;
}
// 查找一个没有任务的空位
List<BstIvtStockingivt> list = stockingivtService.getEmptyPointNotTask(location, "0");
if (list.size() == 0) {
stepStr += ",25";
noticeService.createNotice("备货区找不到空位置搬运",
"点位[" + empty.getPoint_name() + "]无法从备货区找到空位",
NoticeTypeEnum.EXCEPTION.getCode());
@@ -663,7 +650,6 @@ public class AutoCallAirShaftTask extends Prun {
param.put("task_type", SlitterEnum.TASK_TYPE.code("备货区送载具"));
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
stockAreaSendVehicleTask.createTask(param);
stepStr += ",26";
stepErrorInfo.add("备货区交换托盘中...请等待。");
return true;
}
@@ -677,19 +663,15 @@ public class AutoCallAirShaftTask extends Prun {
* @param empty 套拔轴点位
*/
private Boolean toAcsOutShaft(String qzzSize, String location, BstIvtShafttubeivt empty) {
stepStr += ",27";
// 需要区分上下
List<BstIvtShafttubeivt> shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize ,empty.getPoint_code(), location);
stepStr += ",28";
if (shafttubeivts.size() == 0) {
log.error("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位");
stepErrorInfo.add("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位");
stepStr += ",98";
return false;
}
// 气涨轴库
BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0);
stepStr += ",29";
// 判断气胀轴是否有轴
JSONArray device_rows = new JSONArray();
JSONObject device_obj = new JSONObject();
@@ -699,7 +681,6 @@ public class AutoCallAirShaftTask extends Prun {
device_obj.put("product_area", "B1");
JSONObject pointStatus = wmsToAcsService.getPointStatus(device_rows);
if (ObjectUtil.isEmpty(pointStatus) || ObjectUtil.isEmpty(pointStatus.getJSONArray("data"))) {
stepStr += ",98";
log.error("获取气胀轴库信息失败");
stepErrorInfo.add("获取ACS气胀轴库信息失败...");
return false;
@@ -707,7 +688,7 @@ public class AutoCallAirShaftTask extends Prun {
boolean judgment1 = true;
boolean judgment2 = true;
// 获取气涨轴缓存没有任务的点位
List<BstIvtShafttubeivt> qzzCache = bstIvtShafttubeivtService.getNotTaskShaftCache2(qzzSize,
List<BstIvtShafttubeivt> qzzCache = bstIvtShafttubeivtService.getNotTaskShaftCache(qzzSize,
shafttubeivt.getQzz_generation(), location);
if (qzzCache.size() == 0) {
log.warn("未找到气胀轴密集库气涨轴规格「" + qzzSize + "」的暂存位");
@@ -717,20 +698,10 @@ public class AutoCallAirShaftTask extends Prun {
if (data2.getInteger("qty") == 0) {
log.warn("气胀轴库【" + shafttubeivt.getPoint_code() + "】没有气胀轴。");
judgment1 = false;
// 预扣除
if (judgment2) {
BstIvtShafttubeivt waitUsedPoint = qzzCache.get(0);
waitUsedPoint.setPlan("1");
waitUsedPoint.setTube_name1("预分配给" + empty.getPoint_code());
waitUsedPoint.setUpdate_time(DateUtil.now());
bstIvtShafttubeivtService.updateById(waitUsedPoint);
}
}
stepStr += ",30";
if (!judgment1 && !judgment2) {
log.warn("没有气胀轴不给ACS写出轴信息");
stepErrorInfo.add("呼叫气胀轴失败,(密集库/暂存架)没有"+qzzSize+"寸的气胀轴不给ACS写出轴信息。请人工补轴或将对应的分切计划点击入站完成");
stepStr += ",98";
return false;
}
// 判断气胀轴密集库是否有数据
@@ -742,7 +713,6 @@ public class AutoCallAirShaftTask extends Prun {
acsQzz.put("value", "1");
acsQzz.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
acsParam.add(acsQzz);
stepStr += ",31";
log.info("开始给ACS写信号出气胀轴 - {}", acsQzz);
JSONObject action = wmsToAcsService.action(acsParam);
log.info("下发给ACS写信号出气涨轴返回参数{}", action);
@@ -781,7 +751,6 @@ public class AutoCallAirShaftTask extends Prun {
* @param qzzSize 气涨轴尺寸
*/
private void saveCutPlanMessage(BstIvtShafttubeivt empty, List<PdmBiSlittingproductionplan> needPlans, String qzzSize) {
stepStr += ",32";
log.info("正在保存套轴信息 - {} , 尺寸 - {} 到点位 - {}", needPlans, qzzSize, empty);
empty.setHave_qzz(SlitterConstant.SLITTER_YES);
empty.setQzz_size(qzzSize);
@@ -828,19 +797,15 @@ public class AutoCallAirShaftTask extends Prun {
* @param specification 代数4、5
*/
private void makePullShaft(BstIvtShafttubeivt empty, String specification) {
stepStr += ",3";
stepStr += ",8";
log.info("不需要套轴,只做拔轴!");
//查询套轴缓存位哦:point_type=1
List<CutpointAirShhaftDto> notTaskPoints = bcutpointivtService.getAreaNotTaskPointByTcQzzPoint(empty.getPoint_location());
//所有TC暂存位有卷的Truss_point_code1Truss_point_code2有任务的
//根据point_code排序
if (notTaskPoints.size() == 0) {
stepStr += ",99";
stepErrorInfo.add("只进行拔轴,没有可以拔轴的点位。");
return;
}
stepStr += ",9";
// 筛选一个满足的位置3寸看代数4/56寸直接
//判断气胀轴代
CutpointAirShhaftDto cutpointivt = notTaskPoints.stream()
@@ -850,11 +815,9 @@ public class AutoCallAirShaftTask extends Prun {
.findFirst()
.orElse(null);
if (cutpointivt == null) {
stepStr += ",99";
stepErrorInfo.add("只进行拔轴,没有与机构匹配尺寸/代数可以拔轴的点位。");
return;
}
stepStr += ",10";
String pointCode1 = cutpointivt.getQzz_point();
String qzzNo = cutpointivt.getQzz_no();
// 获取对应的分切计划
@@ -862,7 +825,6 @@ public class AutoCallAirShaftTask extends Prun {
.eq(PdmBiSlittingproductionplan::getQzzno, qzzNo)
.eq(PdmBiSlittingproductionplan::getIs_delete, "0"));
if (list.size() == 0) {
stepStr += ",99";
log.warn("气涨轴[{}]对应的分切计划不存在!", qzzNo);
bcutpointivtService.update(new UpdateWrapper<BstIvtCutpointivt>()
.eq("ivt_id",cutpointivt.getIvt_id())
@@ -895,7 +857,6 @@ public class AutoCallAirShaftTask extends Prun {
param.put("is_pulling", SlitterConstant.SLITTER_YES);
trussCallAirShaftTask.createTask(param);
stepErrorInfo.add("只做拔轴,拔轴任务已经创建...");
stepStr += ",11";
}
/**
@@ -912,7 +873,6 @@ public class AutoCallAirShaftTask extends Prun {
}
stepErrorInfo.add("存在为" + dto.getResource_name() + "送轴任务,不会继续套轴...");
log.info("存在任务,不允许套轴{}", dto);
stepStr += ",5";
return false;
}
@@ -947,7 +907,6 @@ public class AutoCallAirShaftTask extends Prun {
&& byContainerName.getSplit_group().equals(dto.getSplit_group())) {
return true;
}
stepStr += ",4";
stepErrorInfo.add("穿拔轴机" + shafttubeivt.getPoint_code() + "已经在为" + dto.getResource_name() + "套轴了...");
return false;
}
@@ -963,7 +922,6 @@ public class AutoCallAirShaftTask extends Prun {
stepErrorInfo.add("设备" + dto.getResource_name() + "检测到暂存架" + stringList + "有套好的管芯,不会进行套轴。");
}
log.info("检查有同母卷不允许套轴:{}", dto);
stepStr += ",4";
// 有就返回true
return false;
}

View File

@@ -22,7 +22,7 @@ public enum SlitterEnum {
TASK_TYPE(MapOf.of("穿拔轴缓存<>穿拔轴位", "010801", "穿拔轴缓存<>分切对接位", "010802", "穿拔轴位<>气胀轴缓存位", "010803"
, "分切机下料AGV任务", "010804", "分切机上气胀轴", "010805", "分切机下气胀轴", "010806", "备货区送载具", "010807"
, "备货区送纸管", "010808", "分切机下料桁架任务", "010809", "分切机下料AGV到内包间", "010810", "套轴异常处理AGV任务", "010811"
, "套轴异常处理桁架任务", "010812", "送气胀轴到分切机任务", "010813", "拔轴完毕出轴", "010814", "穿拔轴缓存<>气胀轴缓存位", "010815"));
, "套轴异常处理桁架任务", "010812", "送气胀轴到分切机任务", "010813", "拔轴完毕出轴", "010814", "穿拔轴缓存<>气胀轴缓存位", "010815", "备货区单独送空载具", "010816"));
private Map<String, String> code;
public String code(String desc) {

View File

@@ -41,6 +41,7 @@ import org.nl.b_lms.sch.tasks.slitter.mapper.dto.CallPlanViewVO;
import org.nl.b_lms.sch.tasks.slitter.mapper.dto.GxQtyDto;
import org.nl.b_lms.sch.tasks.slitter.service.SlitterService;
import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil;
import org.nl.common.enums.NoticeTypeEnum;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.TaskUtils;
import org.nl.modules.common.exception.BadRequestException;
@@ -135,6 +136,8 @@ public class SlitterServiceImpl implements SlitterService {
private RedisUtils redisUtils;
@Autowired
private ClassstandardService classstandardService;
@Autowired
private StockAreaSendVehicleTask stockAreaSendVehicleTask;
@Override
public JSONObject acsRequestShaftLoadTube(JSONObject param) {
@@ -958,12 +961,13 @@ public class SlitterServiceImpl implements SlitterService {
JSONObject res = new JSONObject();
res.put("status", HttpStatus.HTTP_OK);
res.put("message", "请求成功!");
String deviceCode = param.getString("device_code");
// param: device_code row_num
if (ObjectUtil.isEmpty(param.getString("row_num"))) {
log.error("设备:{},排数不能为空", param.getString("device_code"));
throw new BadRequestException("设备:" + param.getString("device_code") + "排数不能为空");
log.error("设备:{},排数不能为空", deviceCode);
throw new BadRequestException("设备:" + deviceCode + "排数不能为空");
}
BstIvtStockingivt device = stockingivtService.getPointByCode(param.getString("device_code"), false);
BstIvtStockingivt device = stockingivtService.getPointByCode(deviceCode, false);
String vehicleCode = device.getVehicle_code();
if (ObjectUtil.isEmpty(vehicleCode)) {
// 如果托盘号为空,那就是任务没完成,需要从任务中获取
@@ -997,7 +1001,33 @@ public class SlitterServiceImpl implements SlitterService {
} else {
papervehicleService.update(mdPbPapervehicle);
}
// todo: 如果qty=0创建AGV送空任务新的task_type、后期优化可以新增诺宝取货完成提前释放货位任务状态变成071
// 如果qty=0创建AGV送空任务新的task_type 010816、后期优化可以新增诺宝取货完成提前释放货位任务状态变成071
List<MdPbPapervehicle> papers = papervehicleService.list(new LambdaQueryWrapper<MdPbPapervehicle>()
.eq(MdPbPapervehicle::getVehicle_code, vehicleCode));
BigDecimal reduce = papers.stream().map(MdPbPapervehicle::getQty).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
if (reduce.intValue() <= 0) {
// 搬走
List<SchBaseTask> tasks = taskService.checkHaveTask(deviceCode);
if (CollectionUtil.isEmpty(tasks)) {
// 查找一个没有任务的空位
List<BstIvtStockingivt> list = stockingivtService.getEmptyPointNotTask(device.getPoint_location(), "0");
if (list.size() == 0) {
noticeService.createNotice("备货区找不到空位置搬运",
"备货区" + deviceCode + "异常",
NoticeTypeEnum.EXCEPTION.getCode());
return res;
}
BstIvtStockingivt moveEmptyPoint = list.get(0);
JSONObject moveTaskParam = new JSONObject();
moveTaskParam.put("point_code1", deviceCode);
moveTaskParam.put("point_code2", moveEmptyPoint.getPoint_code());
moveTaskParam.put("vehicle_code", vehicleCode);
moveTaskParam.put("task_type", SlitterEnum.TASK_TYPE.code("备货区单独送空载具"));
moveTaskParam.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
stockAreaSendVehicleTask.createTask(moveTaskParam);
}
}
}
return res;
}

View File

@@ -108,6 +108,7 @@ public class AcsToWmsController {
return new ResponseEntity<>(acsToWmsService.actionFinishRequest(jo), HttpStatus.OK);
}
/** 二期二楼取货完成上报 */
@PostMapping("/actionFinishRequest2")
@SaIgnore
public ResponseEntity<Object> actionFinishRequest2(@RequestBody JSONObject jo) {

View File

@@ -12,7 +12,7 @@ https://juejin.cn/post/6844903775631572999
<contextName>nlAdmin</contextName>
<property name="log.charset" value="utf-8"/>
<property name="log.pattern"
value="%black(%contextName-) %X{traceId} %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
value="%black(%contextName-) %X{traceId} %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %cyan(%msg%n)"/>
<springProperty scope="context" name="logPath" source="logging.file.path" defaultValue="logs"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${logPath}"/>