opt: 二期返收卷下料、虚拟计划管芯重量的绑定

This commit is contained in:
2025-02-28 17:50:10 +08:00
parent 0d1852f1af
commit 484e0dd1d9
4 changed files with 133 additions and 26 deletions

View File

@@ -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.task.dao.SchBaseTask;
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.common.utils.SecurityUtils;
import org.nl.common.utils.TaskUtils;
@@ -111,17 +112,22 @@ public class SlitterDownTrussTask extends AbstractAcsTask {
log.info("起点数据:{}", point1);
log.info("终点数据:{}", point2);
// 更新分切计划
// 下来的分切计划状态06 -> 09
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
p.setStatus("09");
p.setEnd_time(DateUtil.now());
TaskUtils.updateOptMessageBySlitterPlan(p);
// 下来的分切计划状态06 -> 09, 设置重量
List<String> downQzzNos = Stream.of(tmpUpQzzNo, tmpDownQzzNo)
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
log.info("即将下卷的上下轴的气胀轴编码数据:{}", downQzzNos);
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.in(PdmBiSlittingproductionplan::getQzzno, downQzzNos));
List<PdmBiSlittingproductionplan> downPlans = slittingproductionplanService.getByQzzNos(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
PdmBiSlittingproductionplan p = new PdmBiSlittingproductionplan();
p.setStatus("05");
p.setEnd_time("");
List<String> upQzzNos = Stream.of(point2.getQzz_no1(), point2.getQzz_no2())
@@ -130,6 +136,8 @@ public class SlitterDownTrussTask extends AbstractAcsTask {
if (upQzzNos.size() > 0) {
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.getByQzzNos(upQzzNos);
PdmBiSlittingproductionplan pp = plans.get(0);
// 需要把重量记录到分切机上
point1.setRemark(SlitterTaskUtil.getPaperWeightStr(plans));
if (pp.getContainer_name().contains("虚拟")) {
// 如果是虚拟卷,需要执行删除标记,并且清空数据
// 将分切计划删除,设备禁用
@@ -142,7 +150,6 @@ public class SlitterDownTrussTask extends AbstractAcsTask {
});
slittingproductionplanService.updateBatchById(plans);
// 设备禁用
point1.setIs_used("0");
point1.setUp_qzzno("");
point1.setDown_qzzno("");
} else {

View File

@@ -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.task.dao.SchBaseTask;
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.common.utils.SecurityUtils;
import org.nl.common.utils.TaskUtils;
@@ -112,6 +113,7 @@ public class UpShaftTrussTask extends AbstractAcsTask {
.filter(value -> value != null && !value.isEmpty()).collect(Collectors.toList());
List<PdmBiSlittingproductionplan> plans = slittingproductionplanService.getByQzzNos(collect);
PdmBiSlittingproductionplan pp = plans.get(0);
String weightStr = SlitterTaskUtil.getPaperWeightStr(plans);
if (pp.getContainer_name().contains("虚拟")) {
// 如果是虚拟卷,需要执行删除标记,并且清空数据
// 将分切计划删除,设备禁用
@@ -124,7 +126,6 @@ public class UpShaftTrussTask extends AbstractAcsTask {
});
slittingproductionplanService.updateBatchById(plans);
// 设备禁用
point2.setIs_used("0");
point2.setUp_qzzno("");
point2.setDown_qzzno("");
} else {
@@ -134,6 +135,7 @@ public class UpShaftTrussTask extends AbstractAcsTask {
slittingproductionplanService.update(p, new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.in(PdmBiSlittingproductionplan::getQzzno, collect));
}
point2.setRemark(weightStr);
cutpointivtService.updateById(point2);
point1.setQzz_no1("");
point1.setQzz_no2("");

View File

@@ -514,19 +514,19 @@ public class SlitterServiceImpl implements SlitterService {
String area = device.getProduct_area();
// 获取当前分切机的下一组分切计划(最多四条分切计划)
// hint: 获取到的分切可能是不同组的但具有一定时间顺序
List<PdmBiSlittingproductionplan> timePlans = slittingproductionplanService.list(
new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.eq(PdmBiSlittingproductionplan::getResource_name, device.getExt_code())
.eq(PdmBiSlittingproductionplan::getStatus, "03")
.eq(PdmBiSlittingproductionplan::getIs_delete, "0")
.orderByAsc(PdmBiSlittingproductionplan::getUpdate_time));
log.info("获取下一组分切计划(可能存在脏数据){}", timePlans);
// List<PdmBiSlittingproductionplan> timePlans = slittingproductionplanService.list(
// new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
// .eq(PdmBiSlittingproductionplan::getResource_name, actualDeviceCode)
// .eq(PdmBiSlittingproductionplan::getStatus, "03")
// .eq(PdmBiSlittingproductionplan::getIs_delete, "0")
// .orderByAsc(PdmBiSlittingproductionplan::getUpdate_time));
// log.info("获取下一组分切计划(可能存在脏数据){}", timePlans);
// 寻找备好轴的对接点位
List<BstIvtCutpointivt> cutPointList = slitterMapper.getReadyShaftPoint(device.getExt_code());
List<BstIvtCutpointivt> cutPointList = slitterMapper.getReadyShaftPoint(actualDeviceCode);
// 任务参数
JSONObject taskParam = new JSONObject();
taskParam.put("containers", containers);
if (timePlans.size() == 0 || cutPointList.size() == 0) {
if (cutPointList.size() == 0) {
// 如果没有下一组的分切计划,就只做下卷任务(判断下单/下双)
// 获取分切对接位没任务的空位置
List<BstIvtCutpointivt> emptyPoints = slitterMapper.getEmptyCutPointNotTask(area,
@@ -580,19 +580,16 @@ public class SlitterServiceImpl implements SlitterService {
}
}
}
PdmBiSlittingproductionplan tmpPlan = timePlans.get(0);
// hint: 以第一条为准,过滤和第一条同组同母卷的分切计划
List<PdmBiSlittingproductionplan> nextPlans = timePlans.stream()
.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()))
// 找到该分切计划的点位
BstIvtCutpointivt newCutPoint = cutPointList.get(0);
List<String> qzznos = Stream.of(newCutPoint.getQzz_no1(), newCutPoint.getQzz_no2()).filter(ObjectUtil::isNotEmpty)
.collect(Collectors.toList());
// hint: 以第一条为准,过滤和第一条同组同母卷的分切计划
List<PdmBiSlittingproductionplan> nextPlans = slittingproductionplanService.getByQzzNos(qzznos);
log.info("获取下一趟分切计划数据:{}", nextPlans);
// 筛选上下轴各一条
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);
// 找到该分切计划的点位
BstIvtCutpointivt newCutPoint = cutPointList.get(0);
String binaryExpress = TaskUtils.binaryConvertExpress(currentUpPlan, currentDownPlan, nextUpPlan, nextDownPlan);
switch (binaryExpress) {
case "00":

View File

@@ -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.modules.common.exception.BadRequestException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -308,4 +310,103 @@ public class SlitterTaskUtil {
String[] split = paperStr.replaceAll("\\|[\\u4e00-\\u9fa5]+$", "").split("\\|");
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);
}
}