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.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 {
|
||||
|
||||
@@ -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("");
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user