opt: 二期返收卷下料、虚拟计划管芯重量的绑定
This commit is contained in:
@@ -16,6 +16,7 @@ import org.nl.b_lms.sch.point.dao.StIvtCutpointivt;
|
|||||||
import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService;
|
import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService;
|
||||||
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||||
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
||||||
|
import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil;
|
||||||
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
||||||
import org.nl.common.utils.SecurityUtils;
|
import org.nl.common.utils.SecurityUtils;
|
||||||
import org.nl.common.utils.TaskUtils;
|
import org.nl.common.utils.TaskUtils;
|
||||||
@@ -111,17 +112,22 @@ public class SlitterDownTrussTask extends AbstractAcsTask {
|
|||||||
log.info("起点数据:{}", point1);
|
log.info("起点数据:{}", point1);
|
||||||
log.info("终点数据:{}", point2);
|
log.info("终点数据:{}", point2);
|
||||||
// 更新分切计划
|
// 更新分切计划
|
||||||
// 下来的分切计划状态:06 -> 09
|
// 下来的分切计划状态:06 -> 09, 设置重量
|
||||||
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
|
|
||||||
p.setStatus("09");
|
|
||||||
p.setEnd_time(DateUtil.now());
|
|
||||||
TaskUtils.updateOptMessageBySlitterPlan(p);
|
|
||||||
List<String> downQzzNos = Stream.of(tmpUpQzzNo, tmpDownQzzNo)
|
List<String> downQzzNos = Stream.of(tmpUpQzzNo, tmpDownQzzNo)
|
||||||
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
||||||
log.info("即将下卷的上下轴的气胀轴编码数据:{}", downQzzNos);
|
log.info("即将下卷的上下轴的气胀轴编码数据:{}", downQzzNos);
|
||||||
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
List<PdmBiSlittingproductionplan> downPlans = slittingproductionplanService.getByQzzNos(downQzzNos);
|
||||||
.in(PdmBiSlittingproductionplan::getQzzno, downQzzNos));
|
SlitterTaskUtil.setPaperWeightStr(point1.getRemark(), downPlans);
|
||||||
|
downPlans.forEach(downPlan -> {
|
||||||
|
downPlan.setStatus("09");
|
||||||
|
downPlan.setEnd_time(DateUtil.now());
|
||||||
|
TaskUtils.updateOptMessageBySlitterPlan(downPlan);
|
||||||
|
});
|
||||||
|
slittingproductionplanService.updateBatchById(downPlans);
|
||||||
|
// 设置完了就清空
|
||||||
|
point1.setRemark("");
|
||||||
// 上去的分切计划状态:04 -> 05
|
// 上去的分切计划状态:04 -> 05
|
||||||
|
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
|
||||||
p.setStatus("05");
|
p.setStatus("05");
|
||||||
p.setEnd_time("");
|
p.setEnd_time("");
|
||||||
List<String> upQzzNos = Stream.of(point2.getQzz_no1(), point2.getQzz_no2())
|
List<String> upQzzNos = Stream.of(point2.getQzz_no1(), point2.getQzz_no2())
|
||||||
@@ -130,6 +136,8 @@ public class SlitterDownTrussTask extends AbstractAcsTask {
|
|||||||
if (upQzzNos.size() > 0) {
|
if (upQzzNos.size() > 0) {
|
||||||
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.getByQzzNos(upQzzNos);
|
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.getByQzzNos(upQzzNos);
|
||||||
PdmBiSlittingproductionplan pp = plans.get(0);
|
PdmBiSlittingproductionplan pp = plans.get(0);
|
||||||
|
// 需要把重量记录到分切机上
|
||||||
|
point1.setRemark(SlitterTaskUtil.getPaperWeightStr(plans));
|
||||||
if (pp.getContainer_name().contains("虚拟")) {
|
if (pp.getContainer_name().contains("虚拟")) {
|
||||||
// 如果是虚拟卷,需要执行删除标记,并且清空数据
|
// 如果是虚拟卷,需要执行删除标记,并且清空数据
|
||||||
// 将分切计划删除,设备禁用
|
// 将分切计划删除,设备禁用
|
||||||
@@ -142,7 +150,6 @@ public class SlitterDownTrussTask extends AbstractAcsTask {
|
|||||||
});
|
});
|
||||||
slittingproductionplanService.updateBatchById(plans);
|
slittingproductionplanService.updateBatchById(plans);
|
||||||
// 设备禁用
|
// 设备禁用
|
||||||
point1.setIs_used("0");
|
|
||||||
point1.setUp_qzzno("");
|
point1.setUp_qzzno("");
|
||||||
point1.setDown_qzzno("");
|
point1.setDown_qzzno("");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.nl.b_lms.sch.point.dao.StIvtCutpointivt;
|
|||||||
import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService;
|
import org.nl.b_lms.sch.point.service.IstIvtCutpointivtService;
|
||||||
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||||
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
|
||||||
|
import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil;
|
||||||
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
||||||
import org.nl.common.utils.SecurityUtils;
|
import org.nl.common.utils.SecurityUtils;
|
||||||
import org.nl.common.utils.TaskUtils;
|
import org.nl.common.utils.TaskUtils;
|
||||||
@@ -112,6 +113,7 @@ public class UpShaftTrussTask extends AbstractAcsTask {
|
|||||||
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
|
||||||
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.getByQzzNos(collect);
|
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.getByQzzNos(collect);
|
||||||
PdmBiSlittingproductionplan pp = plans.get(0);
|
PdmBiSlittingproductionplan pp = plans.get(0);
|
||||||
|
String weightStr = SlitterTaskUtil.getPaperWeightStr(plans);
|
||||||
if (pp.getContainer_name().contains("虚拟")) {
|
if (pp.getContainer_name().contains("虚拟")) {
|
||||||
// 如果是虚拟卷,需要执行删除标记,并且清空数据
|
// 如果是虚拟卷,需要执行删除标记,并且清空数据
|
||||||
// 将分切计划删除,设备禁用
|
// 将分切计划删除,设备禁用
|
||||||
@@ -124,7 +126,6 @@ public class UpShaftTrussTask extends AbstractAcsTask {
|
|||||||
});
|
});
|
||||||
slittingproductionplanService.updateBatchById(plans);
|
slittingproductionplanService.updateBatchById(plans);
|
||||||
// 设备禁用
|
// 设备禁用
|
||||||
point2.setIs_used("0");
|
|
||||||
point2.setUp_qzzno("");
|
point2.setUp_qzzno("");
|
||||||
point2.setDown_qzzno("");
|
point2.setDown_qzzno("");
|
||||||
} else {
|
} else {
|
||||||
@@ -134,6 +135,7 @@ public class UpShaftTrussTask extends AbstractAcsTask {
|
|||||||
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||||
.in(PdmBiSlittingproductionplan::getQzzno, collect));
|
.in(PdmBiSlittingproductionplan::getQzzno, collect));
|
||||||
}
|
}
|
||||||
|
point2.setRemark(weightStr);
|
||||||
cutpointivtService.updateById(point2);
|
cutpointivtService.updateById(point2);
|
||||||
point1.setQzz_no1("");
|
point1.setQzz_no1("");
|
||||||
point1.setQzz_no2("");
|
point1.setQzz_no2("");
|
||||||
|
|||||||
@@ -514,19 +514,19 @@ public class SlitterServiceImpl implements SlitterService {
|
|||||||
String area = device.getProduct_area();
|
String area = device.getProduct_area();
|
||||||
// 获取当前分切机的下一组分切计划(最多四条分切计划)
|
// 获取当前分切机的下一组分切计划(最多四条分切计划)
|
||||||
// hint: 获取到的分切可能是不同组的但具有一定时间顺序
|
// hint: 获取到的分切可能是不同组的但具有一定时间顺序
|
||||||
List<PdmBiSlittingproductionplan> timePlans = slittingproductionplanService.list(
|
// List<PdmBiSlittingproductionplan> timePlans = slittingproductionplanService.list(
|
||||||
new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
// new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
|
||||||
.eq(PdmBiSlittingproductionplan::getResource_name, device.getExt_code())
|
// .eq(PdmBiSlittingproductionplan::getResource_name, actualDeviceCode)
|
||||||
.eq(PdmBiSlittingproductionplan::getStatus, "03")
|
// .eq(PdmBiSlittingproductionplan::getStatus, "03")
|
||||||
.eq(PdmBiSlittingproductionplan::getIs_delete, "0")
|
// .eq(PdmBiSlittingproductionplan::getIs_delete, "0")
|
||||||
.orderByAsc(PdmBiSlittingproductionplan::getUpdate_time));
|
// .orderByAsc(PdmBiSlittingproductionplan::getUpdate_time));
|
||||||
log.info("获取下一组分切计划(可能存在脏数据):{}", timePlans);
|
// log.info("获取下一组分切计划(可能存在脏数据):{}", timePlans);
|
||||||
// 寻找备好轴的对接点位
|
// 寻找备好轴的对接点位
|
||||||
List<BstIvtCutpointivt> cutPointList = slitterMapper.getReadyShaftPoint(device.getExt_code());
|
List<BstIvtCutpointivt> cutPointList = slitterMapper.getReadyShaftPoint(actualDeviceCode);
|
||||||
// 任务参数
|
// 任务参数
|
||||||
JSONObject taskParam = new JSONObject();
|
JSONObject taskParam = new JSONObject();
|
||||||
taskParam.put("containers", containers);
|
taskParam.put("containers", containers);
|
||||||
if (timePlans.size() == 0 || cutPointList.size() == 0) {
|
if (cutPointList.size() == 0) {
|
||||||
// 如果没有下一组的分切计划,就只做下卷任务(判断下单/下双)
|
// 如果没有下一组的分切计划,就只做下卷任务(判断下单/下双)
|
||||||
// 获取分切对接位没任务的空位置
|
// 获取分切对接位没任务的空位置
|
||||||
List<BstIvtCutpointivt> emptyPoints = slitterMapper.getEmptyCutPointNotTask(area,
|
List<BstIvtCutpointivt> emptyPoints = slitterMapper.getEmptyCutPointNotTask(area,
|
||||||
@@ -580,19 +580,16 @@ public class SlitterServiceImpl implements SlitterService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PdmBiSlittingproductionplan tmpPlan = timePlans.get(0);
|
// 找到该分切计划的点位
|
||||||
// hint: 以第一条为准,过滤和第一条同组同母卷的分切计划
|
BstIvtCutpointivt newCutPoint = cutPointList.get(0);
|
||||||
List<PdmBiSlittingproductionplan> nextPlans = timePlans.stream()
|
List<String> qzznos = Stream.of(newCutPoint.getQzz_no1(), newCutPoint.getQzz_no2()).filter(ObjectUtil::isNotEmpty)
|
||||||
.filter(plan -> plan.getParent_container_name().equals(tmpPlan.getParent_container_name())
|
|
||||||
&& plan.getRestruct_container_name().equals(tmpPlan.getRestruct_container_name())
|
|
||||||
&& plan.getSplit_group().equals(tmpPlan.getSplit_group()))
|
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
// hint: 以第一条为准,过滤和第一条同组同母卷的分切计划
|
||||||
|
List<PdmBiSlittingproductionplan> nextPlans = slittingproductionplanService.getByQzzNos(qzznos);
|
||||||
log.info("获取下一趟分切计划数据:{}", nextPlans);
|
log.info("获取下一趟分切计划数据:{}", nextPlans);
|
||||||
// 筛选上下轴各一条
|
// 筛选上下轴各一条
|
||||||
PdmBiSlittingproductionplan nextUpPlan = nextPlans.stream().filter(p -> "1".equals(p.getUp_or_down())).findFirst().orElse(null);
|
PdmBiSlittingproductionplan nextUpPlan = nextPlans.stream().filter(p -> "1".equals(p.getUp_or_down())).findFirst().orElse(null);
|
||||||
PdmBiSlittingproductionplan nextDownPlan = nextPlans.stream().filter(p -> "2".equals(p.getUp_or_down())).findFirst().orElse(null);
|
PdmBiSlittingproductionplan nextDownPlan = nextPlans.stream().filter(p -> "2".equals(p.getUp_or_down())).findFirst().orElse(null);
|
||||||
// 找到该分切计划的点位
|
|
||||||
BstIvtCutpointivt newCutPoint = cutPointList.get(0);
|
|
||||||
String binaryExpress = TaskUtils.binaryConvertExpress(currentUpPlan, currentDownPlan, nextUpPlan, nextDownPlan);
|
String binaryExpress = TaskUtils.binaryConvertExpress(currentUpPlan, currentDownPlan, nextUpPlan, nextDownPlan);
|
||||||
switch (binaryExpress) {
|
switch (binaryExpress) {
|
||||||
case "00":
|
case "00":
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingprodu
|
|||||||
import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant;
|
import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant;
|
||||||
import org.nl.modules.common.exception.BadRequestException;
|
import org.nl.modules.common.exception.BadRequestException;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -308,4 +310,103 @@ public class SlitterTaskUtil {
|
|||||||
String[] split = paperStr.replaceAll("\\|[\\u4e00-\\u9fa5]+$", "").split("\\|");
|
String[] split = paperStr.replaceAll("\\|[\\u4e00-\\u9fa5]+$", "").split("\\|");
|
||||||
return split[split.length - 1];
|
return split[split.length - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置重量
|
||||||
|
* @param plans 分切计划
|
||||||
|
* @return 0,0,0,0
|
||||||
|
*/
|
||||||
|
public static void setPaperWeightStr(String weightStr, List<PdmBiSlittingproductionplan> plans) {
|
||||||
|
// 1. 校验输入格式
|
||||||
|
String[] parts = weightStr.split(",");
|
||||||
|
if (parts.length != 4) {
|
||||||
|
// 没有数据则不修改
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 遍历四个位置
|
||||||
|
for (int index = 0; index < 4; index++) {
|
||||||
|
// 解析重量值(自动四舍五入到两位小数)
|
||||||
|
String strValue = parts[index];
|
||||||
|
BigDecimal value;
|
||||||
|
try {
|
||||||
|
value = new BigDecimal(strValue).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
continue; // 跳过无效数值
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 根据索引确定位置规则
|
||||||
|
String expectedUp, expectedLeft;
|
||||||
|
switch (index) {
|
||||||
|
case 0: // 上左
|
||||||
|
expectedUp = "1";
|
||||||
|
expectedLeft = "1";
|
||||||
|
break;
|
||||||
|
case 1: // 上右
|
||||||
|
expectedUp = "1";
|
||||||
|
expectedLeft = "2";
|
||||||
|
break;
|
||||||
|
case 2: // 下左
|
||||||
|
expectedUp = "2";
|
||||||
|
expectedLeft = "1";
|
||||||
|
break;
|
||||||
|
case 3: // 下右
|
||||||
|
expectedUp = "2";
|
||||||
|
expectedLeft = "2";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException("非法索引: " + index);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 在集合中查找匹配项并更新
|
||||||
|
for (PdmBiSlittingproductionplan plan : plans) {
|
||||||
|
if (expectedUp.equals(plan.getUp_or_down()) &&
|
||||||
|
expectedLeft.equals(plan.getLeft_or_right())) {
|
||||||
|
plan.setPaper_weight(value.toString());
|
||||||
|
break; // 找到后跳出循环
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取重量
|
||||||
|
* @param plans 分切计划
|
||||||
|
* @return 0,0,0,0
|
||||||
|
*/
|
||||||
|
public static String getPaperWeightStr(List<PdmBiSlittingproductionplan> plans) {
|
||||||
|
String[] weights = new String[4];
|
||||||
|
Arrays.fill(weights, "0");
|
||||||
|
|
||||||
|
for (PdmBiSlittingproductionplan plan : plans) {
|
||||||
|
// 1. 获取重量并四舍五入
|
||||||
|
String weightStr = plan.getPaper_weight();
|
||||||
|
BigDecimal weight;
|
||||||
|
try {
|
||||||
|
weight = new BigDecimal(weightStr);
|
||||||
|
} catch (Exception e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
BigDecimal rounded = weight.setScale(2, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
// 2. 根据位置确定数组索引
|
||||||
|
String upDown = plan.getUp_or_down();
|
||||||
|
String leftRight = plan.getLeft_or_right();
|
||||||
|
int index = -1;
|
||||||
|
|
||||||
|
if ("1".equals(upDown)) {
|
||||||
|
index = ("1".equals(leftRight)) ? 0 : 1;
|
||||||
|
} else {
|
||||||
|
index = ("1".equals(leftRight)) ? 2 : 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 更新对应位置的重量(格式化为两位小数)
|
||||||
|
if (index >= 0 && index < 4) {
|
||||||
|
weights[index] = rounded.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 拼接结果字符串
|
||||||
|
return String.join(",", weights);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user