From 16f4bb3c28fc85cffcc511718c903ada9fdab134 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期五, 26 十二月 2025 16:59:45 +0800
Subject: [PATCH] 调用mes导入工程参数修改,Excel表数据流程卡号一致;增加读取层号/工程号方法; 工程号一致覆盖更新
---
mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java | 451 +++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 380 insertions(+), 71 deletions(-)
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java
index 6c26414..3e04c93 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java
@@ -14,10 +14,13 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
-
-import static java.util.stream.IntStream.range;
/**
* 鐜荤拑淇℃伅鏈嶅姟瀹炵幇绫�
@@ -230,8 +233,18 @@
return result;
}
- // 宸ョ▼鍙风敓鎴愶細浣跨敤鏁版嵁搴撹嚜澧炲簭鍙凤紝閬垮厤閲嶅
- final String engineerId = engineeringSequenceService.generateAndSaveEngineeringId(new Date());
+ // 宸ョ▼鍙凤細浠h〃鏁翠釜Excel琛紝浼樺厛浣跨敤Excel涓殑宸ョ▼鍙凤紙浠庣涓�琛屾垨浠绘剰涓�琛岃幏鍙栵級锛屽鏋滄墍鏈夎閮芥病鏈夊垯鑷姩鐢熸垚
+ String engineerIdFromExcel = null;
+ for (Map<String, Object> row : excelRows) {
+ String engineeringId = str(row.get("engineeringId"));
+ if (engineeringId != null && !engineeringId.trim().isEmpty()) {
+ engineerIdFromExcel = engineeringId.trim();
+ break; // 鎵惧埌绗竴涓潪绌虹殑宸ョ▼鍙峰氨浣跨敤
+ }
+ }
+ final String engineerId = engineerIdFromExcel != null
+ ? engineerIdFromExcel
+ : engineeringSequenceService.generateEngineeringId(new Date());
final String filmsIdDefault = firstValue(excelRows, "filmsId", "鐧界幓");
final double thicknessDefault = parseDouble(firstValue(excelRows, "thickness"), 0d);
@@ -240,68 +253,146 @@
final String filmsIdDefaultFinal = filmsIdDefault;
final double thicknessDefaultFinal = thicknessDefault;
- List<Map<String, Object>> glassInfolList = excelRows.stream()
- .flatMap(row -> {
- int qty = (int) parseDouble(row.getOrDefault("quantity", 1), 1);
- if (qty <= 0) qty = 1;
- String glassId = str(row.get("glassId"));
- String filmsId = strOrDefault(row.get("filmsId"), filmsIdDefaultFinal);
+ // 鐢熸垚鏃ユ湡瀛楃涓诧紙yyMMdd鏍煎紡锛夛紝鐢ㄤ簬娴佺▼鍗D鐢熸垚
+ LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+ String dateStr = localDate.format(DateTimeFormatter.ofPattern("yyMMdd"));
+
+ // 妫�鏌ユ槸鍚︽湁娴佺▼鍗D锛氬鏋滄墍鏈夎鐨勬祦绋嬪崱ID閮戒负绌猴紝鍒欐墍鏈夎褰曞叡浜悓涓�涓祦绋嬪崱ID
+ boolean allFlowCardIdEmpty = excelRows.stream()
+ .allMatch(row -> {
String flowCardId = str(row.get("flowCardId"));
- String productName = str(row.get("productName"));
- String customerName = str(row.get("customerName"));
- double width = parseDouble(row.get("width"), 0d);
- double height = parseDouble(row.get("height"), 0d);
- double thickness = parseDouble(row.get("thickness"), thicknessDefaultFinal);
+ return flowCardId == null || flowCardId.trim().isEmpty();
+ });
+ // 濡傛灉鎵�鏈夋祦绋嬪崱ID閮戒负绌猴紝鐢熸垚涓�涓叡浜殑娴佺▼鍗D
+ String sharedFlowCardId = allFlowCardIdEmpty ? "NG" + dateStr + "01A001" : null;
+
+ // 鐢ㄤ簬瀛樺偍姣忎釜鐜荤拑ID瀵瑰簲鐨勬祦绋嬪崱ID锛堝悓涓�鐜荤拑ID鐨勫涓幓鐠冨叡浜悓涓�涓祦绋嬪崱ID锛�
+ Map<String, String> glassIdFlowCardIdMap = new HashMap<>();
+
+ // 鐢ㄤ簬鎸� flowCardId 璁℃暟 temperingFeedSequence
+ Map<String, Integer> temperingFeedSequenceCounter = new HashMap<>();
+ // 鐢ㄤ簬鎸� flowCardId 鍒嗛厤 temperingLayoutId
+ Map<String, Integer> temperingLayoutIdMap = new HashMap<>();
+ AtomicInteger nextTemperingLayoutId = new AtomicInteger(1);
+
+ // 鍏堝缓绔嬪師鐗囨槧灏勶紝鐢ㄤ簬鍚庣画鍖归厤 rawSequence
+ Map<String, Integer> rawSequenceMap = new HashMap<>();
+ for (Map<String, Object> row : excelRows) {
+ double width = parseDouble(row.get("width"), 0d);
+ double height = parseDouble(row.get("length"), 0d);
+ double thickness = parseDouble(row.get("thickness"), thicknessDefaultFinal);
+ String filmsId = strOrDefault(row.get("filmsId"), filmsIdDefaultFinal);
+ String key = width + "_" + height + "_" + thickness + "_" + filmsId;
+ if (!rawSequenceMap.containsKey(key)) {
+ rawSequenceMap.put(key, rawSequenceMap.size() + 1);
+ }
+ }
- int finalQty = qty;
- return range(0, qty).mapToObj(idx -> {
- String finalGlassId = finalQty > 1 ? glassId + "_" + (idx + 1) : glassId;
- String finalFlowCardId = flowCardId.isEmpty() ? finalGlassId : flowCardId;
- Map<String, Object> m = new HashMap<>();
- m.put("xAxis", 0);
- m.put("xCoordinate", 0);
- m.put("yAxis", 0);
- m.put("yCoordinate", 0);
- m.put("glassId", finalGlassId);
- m.put("engineerId", engineerIdFinal);
- m.put("flowCardId", finalFlowCardId);
- m.put("productSortNumber", idx + 1);
- m.put("hollowCombineDirection", "0");
- m.put("width", width);
- m.put("height", height);
- m.put("thickness", thickness);
- m.put("filmsId", filmsId);
- m.put("layer", 0);
- m.put("totalLayer", 0);
- m.put("edgWidth", width);
- m.put("edgHeight", height);
- m.put("isMultiple", 0);
- m.put("maxWidth", width);
- m.put("maxHeight", height);
- m.put("isHorizontal", 0);
- m.put("rawSequence", 0);
- m.put("temperingLayoutId", 0);
- m.put("temperingFeedSequence", 0);
- m.put("angle", 0);
- m.put("ruleId", 0);
- m.put("combine", 0);
- m.put("markIcon", "");
- m.put("filmRemove", 0);
- m.put("flowCardSequence", flowCardId + "/" + (idx + 1));
- m.put("process", "");
- m.put("rawAngle", 0);
- m.put("graphNo", 0);
- m.put("processParam", "");
- return m;
- });
- })
- .collect(Collectors.toList());
+ List<Map<String, Object>> glassInfolList = new ArrayList<>();
+ for (Map<String, Object> row : excelRows) {
+ Object qtyObj = row.getOrDefault("quantity", 1);
+ int qty = parseDouble(qtyObj, 1) > 0 ? (int) parseDouble(qtyObj, 1) : 1;
+
+ String glassId = str(row.get("glassId"));
+ String filmsId = strOrDefault(row.get("filmsId"), filmsIdDefaultFinal);
+ // 娴佺▼鍗D锛氬鏋淓xcel涓湁锛屼娇鐢‥xcel鐨勶紱濡傛灉涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D
+ String flowCardIdFromExcel = str(row.get("flowCardId"));
+ String flowCardId;
+ if (flowCardIdFromExcel != null && !flowCardIdFromExcel.trim().isEmpty()) {
+ // Excel涓湁娴佺▼鍗D锛屼娇鐢‥xcel鐨�
+ flowCardId = flowCardIdFromExcel.trim();
+ } else {
+ // Excel涓祦绋嬪崱ID涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D
+ flowCardId = sharedFlowCardId != null ? sharedFlowCardId : getOrGenerateFlowCardId(glassId, dateStr, glassIdFlowCardIdMap);
+ }
+ // 鍘绘帀灏鹃儴 "/鏁板瓧"锛堝鏋滄湁锛�
+ String baseFlowCardId = flowCardId.replaceFirst("/\\d+$", "");
+
+ // 灞傚彿锛氬鏋淓xcel涓湁锛屼娇鐢‥xcel鐨勶紱濡傛灉娌℃湁锛岄粯璁�1
+ Object layerObj = row.get("layer");
+ int layer = layerObj != null ? (int) parseDouble(layerObj, 1) : 1;
+ if (layer <= 0) {
+ layer = 1;
+ }
+
+ // orderNumber 鏄暣鍨嬶紙鐜荤拑绫诲瀷锛夛紝浠� Excel 璇诲彇鎴栦娇鐢ㄩ粯璁ゅ�� 1
+ Object orderNumberObj = row.get("orderNumber");
+ final Integer finalOrderNumber = orderNumberObj != null
+ ? (int) parseDouble(orderNumberObj, 1)
+ : 1;
+ String productName = str(row.get("productName"));
+ String customerName = str(row.get("customerName"));
+ double width = parseDouble(row.get("width"), 0d);
+ double height = parseDouble(row.get("length"), 0d);
+ double thickness = parseDouble(row.get("thickness"), thicknessDefaultFinal);
+
+ // 璁$畻 rawSequence
+ String rawKey = width + "_" + height + "_" + thickness + "_" + filmsId;
+ Integer rawSequence = rawSequenceMap.get(rawKey);
+
+ int finalQty = qty;
+ log.info("瑙f瀽鍒版暟閲忥細row={}, quantity={}, 鏈�缁坬ty={}", row, qtyObj, finalQty);
+
+ // 鎸� flowCardId 鍒嗛厤 temperingLayoutId
+ Integer temperingLayoutId = temperingLayoutIdMap.computeIfAbsent(baseFlowCardId, k -> nextTemperingLayoutId.getAndIncrement());
+
+ // 涓哄悓涓�琛岀殑澶氫釜鐜荤拑鐢熸垚鏁版嵁
+ for (int idx = 0; idx < qty; idx++) {
+ String baseGlassId = engineerIdFinal + glassId;
+ String finalGlassId = finalQty > 1 ? baseGlassId + (idx + 1) : baseGlassId;
+
+ // 鎸� flowCardId 閫掑 temperingFeedSequence
+ int temperingFeedSequence = temperingFeedSequenceCounter.compute(baseFlowCardId, (k, v) -> (v == null ? 0 : v) + 1);
+ String finalFlowCardSequence = baseFlowCardId + "/" + 1;
+
+ log.debug("鐢熸垚鐜荤拑淇℃伅: glassId={}, idx={}, baseFlowCardId={}, finalFlowCardSequence={}, temperingLayoutId={}, temperingFeedSequence={}",
+ glassId, idx, baseFlowCardId, finalFlowCardSequence, temperingLayoutId, temperingFeedSequence);
+
+ Map<String, Object> m = new HashMap<>();
+ m.put("xAxis", 0);
+ m.put("xCoordinate", 0);
+ m.put("yAxis", 0);
+ m.put("yCoordinate", 0);
+ m.put("glassId", finalGlassId);
+ m.put("engineerId", engineerIdFinal);
+ m.put("flowCardId", baseFlowCardId);
+ m.put("orderNumber", finalOrderNumber);
+ m.put("productSortNumber", 1);
+ m.put("hollowCombineDirection", "");
+ m.put("width", width);
+ m.put("height", height);
+ m.put("thickness", thickness);
+ m.put("filmsId", filmsId);
+ m.put("layer", layer);
+ m.put("totalLayer", 1);
+ m.put("edgWidth", width);
+ m.put("edgHeight", height);
+ m.put("isMultiple", finalQty > 1 ? 1 : 0);
+ m.put("maxWidth", width);
+ m.put("maxHeight", height);
+ m.put("isHorizontal", 0);
+ m.put("rawSequence", rawSequence != null ? rawSequence : 0);
+ m.put("temperingLayoutId", temperingLayoutId);
+ m.put("temperingFeedSequence", temperingFeedSequence);
+ m.put("angle", 0);
+ m.put("ruleId", 0);
+ m.put("combine", 0);
+ m.put("markIcon", "");
+ m.put("filmRemove", 0);
+ m.put("flowCardSequence", finalFlowCardSequence);
+ m.put("process", "");
+ m.put("rawAngle", 0);
+ m.put("graphNo", 0);
+ m.put("processParam", "");
+ glassInfolList.add(m);
+ }
+ }
// 鍘熺墖淇℃伅鍘婚噸
Map<String, Map<String, Object>> rawGlassMap = new HashMap<>();
for (Map<String, Object> row : excelRows) {
double width = parseDouble(row.get("width"), 0d);
- double height = parseDouble(row.get("height"), 0d);
+ double height = parseDouble(row.get("length"), 0d);
double thickness = parseDouble(row.get("thickness"), thicknessDefaultFinal);
String filmsId = strOrDefault(row.get("filmsId"), filmsIdDefaultFinal);
String key = width + "_" + height + "_" + thickness + "_" + filmsId;
@@ -320,19 +411,33 @@
List<Map<String, Object>> engineeringRawQueueList = rawGlassMap.values().stream().collect(Collectors.toList());
- // 娴佺▼鍗′俊鎭�
+ // 娴佺▼鍗′俊鎭紙闇�瑕佺粺璁℃瘡涓� flowCardId 鐨勫疄闄呯幓鐠冩暟閲忥紝鑰冭檻 quantity锛�
Map<String, Map<String, Object>> flowCardMap = new HashMap<>();
for (Map<String, Object> row : excelRows) {
String glassId = str(row.get("glassId"));
- String flowCardId = str(row.get("flowCardId"));
- if (flowCardId.isEmpty()) {
- flowCardId = glassId;
+ // 娴佺▼鍗D锛氬鏋淓xcel涓湁锛屼娇鐢‥xcel鐨勶紱濡傛灉涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D锛堜笌glassInfolList閫昏緫涓�鑷达級
+ String flowCardIdFromExcel = str(row.get("flowCardId"));
+ String flowCardId;
+ if (flowCardIdFromExcel != null && !flowCardIdFromExcel.trim().isEmpty()) {
+ // Excel涓湁娴佺▼鍗D锛屼娇鐢‥xcel鐨�
+ flowCardId = flowCardIdFromExcel.trim();
+ } else {
+ // Excel涓祦绋嬪崱ID涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D
+ flowCardId = sharedFlowCardId != null ? sharedFlowCardId : getOrGenerateFlowCardId(glassId, dateStr, glassIdFlowCardIdMap);
}
+ // 鍘绘帀灏鹃儴 "/鏁板瓧"锛堝鏋滄湁锛�
+ flowCardId = flowCardId.replaceFirst("/\\d+$", "");
+ // orderNumber 鏄暣鍨嬶紙鐜荤拑绫诲瀷锛夛紝浠� Excel 璇诲彇鎴栦娇鐢ㄩ粯璁ゅ�� 1
+ Object orderNumberObj = row.get("orderNumber");
+ Integer orderNumber = orderNumberObj != null
+ ? (int) parseDouble(orderNumberObj, 1)
+ : 1;
+ Object qtyObj = row.getOrDefault("quantity", 1);
+ int qty = parseDouble(qtyObj, 1) > 0 ? (int) parseDouble(qtyObj, 1) : 1;
double width = parseDouble(row.get("width"), 0d);
- double height = parseDouble(row.get("height"), 0d);
+ double height = parseDouble(row.get("length"), 0d);
double thickness = parseDouble(row.get("thickness"), thicknessDefaultFinal);
String filmsId = strOrDefault(row.get("filmsId"), filmsIdDefaultFinal);
-
String productName = str(row.get("productName"));
String customerName = str(row.get("customerName"));
@@ -344,15 +449,16 @@
m.put("height", height);
m.put("thickness", thickness);
m.put("filmsId", filmsId);
- m.put("totalLayer", 0);
- m.put("layer", 0);
- m.put("glassTotal", 1);
+ m.put("totalLayer", 1);
+ m.put("layer", 1);
+ m.put("glassTotal", qty); // 浣跨敤瀹為檯鏁伴噺
+ m.put("orderNumber", orderNumber);
m.put("productName", productName);
m.put("customerName", customerName);
flowCardMap.put(flowCardId, m);
} else {
- int count = (int) exist.getOrDefault("glassTotal", 1);
- exist.put("glassTotal", count + 1);
+ int count = (int) exist.getOrDefault("glassTotal", 0);
+ exist.put("glassTotal", count + qty); // 绱姞鏁伴噺
}
}
List<Map<String, Object>> flowCardInfoList = flowCardMap.values().stream().collect(Collectors.toList());
@@ -366,8 +472,33 @@
.mapToDouble(m -> parseDouble(m.get("rawGlassWidth"), 0d) * parseDouble(m.get("rawGlassHeight"), 0d) / 1_000_000d)
.sum();
+ // 璁$畻鏈�澶ц礋杞藉昂瀵革紙鐢ㄤ簬閽㈠寲鍙傛暟锛�
+ double maxLoadWidth = glassInfolList.stream()
+ .mapToDouble(m -> parseDouble(m.get("width"), 0d))
+ .max().orElse(2000);
+ double maxLoadLength = glassInfolList.stream()
+ .mapToDouble(m -> parseDouble(m.get("height"), 0d))
+ .max().orElse(3000);
+
+ // 鐢熸垚閽㈠寲鍙傛暟
+ List<Map<String, Object>> temperingParameterList = new ArrayList<>();
+ Map<String, Object> temperingParam = new HashMap<>();
+ temperingParam.put("engineerId", engineerIdFinal);
+ temperingParam.put("heatMode", 1);
+ temperingParam.put("chaosPct", 50);
+ temperingParam.put("maxLoadPct", 100);
+ temperingParam.put("loadWidth", (int) Math.round(maxLoadWidth));
+ temperingParam.put("loadLength", (int) Math.round(maxLoadLength));
+ temperingParam.put("xSpace", 50);
+ temperingParam.put("ySpace", 50);
+ temperingParam.put("rotateMode", 0);
+ temperingParam.put("allowRotate", 0);
+ temperingParam.put("tempering", 1);
+ temperingParam.put("curtainWall", 0);
+ temperingParameterList.add(temperingParam);
+
result.put("engineerId", engineerIdFinal);
- result.put("engineerName", "宸ョ▼_" + engineerIdFinal);
+ result.put("engineerName", thicknessDefaultFinal + "mm" + filmsIdDefaultFinal);
result.put("avgAvailability", "90");
result.put("validAvailability", "90");
result.put("lastAvailability", "90");
@@ -462,6 +593,40 @@
return def;
}
}
+
+ /**
+ * 鑾峰彇鎴栫敓鎴愭祦绋嬪崱ID
+ * 濡傛灉宸插瓨鍦ㄥ垯杩斿洖锛屽惁鍒欑敓鎴愭柊鐨勬祦绋嬪崱ID骞剁紦瀛�
+ * 鍓嶇鏍煎紡锛氬師濮媑lassId + 涓や綅搴忓彿锛堝"101"銆�"102"銆�"201"锛夛紝閫氳繃闄や互100鍘绘帀鏈�鍚庝袱浣嶆彁鍙栧師濮媑lassId
+ *
+ * @param glassId 鐜荤拑ID锛堝"101"銆�"102"銆�"201"锛�
+ * @param dateStr 鏃ユ湡瀛楃涓诧紙yyMMdd鏍煎紡锛�
+ * @param glassIdFlowCardIdMap 鐜荤拑ID鍒版祦绋嬪崱ID鐨勬槧灏勭紦瀛�
+ * @return 娴佺▼鍗D锛堟牸寮忥細NG + yyMMdd + 搴忓彿锛堜袱浣嶏級 + A001锛�
+ */
+ private String getOrGenerateFlowCardId(String glassId, String dateStr, Map<String, String> glassIdFlowCardIdMap) {
+ String flowCardId = glassIdFlowCardIdMap.get(glassId);
+ if (flowCardId == null) {
+ // 浠巊lassId涓彁鍙栧師濮嬫暟瀛楋細101 -> 1, 102 -> 1, 201 -> 2
+ int sequence = 1;
+ if (glassId != null && !glassId.trim().isEmpty()) {
+ try {
+ String cleaned = glassId.trim().split("[\\r\\n\\t\\s]+")[0];
+ if (cleaned.matches("\\d+")) {
+ int num = Integer.parseInt(cleaned);
+ // 濡傛灉闀垮害>=3锛岄櫎浠�100鍘绘帀鏈�鍚庝袱浣嶏紙鍓嶇杩藉姞鐨勫簭鍙凤級
+ sequence = (cleaned.length() >= 3 && num >= 100) ? num / 100 : (num > 0 ? num : 1);
+ }
+ } catch (Exception e) {
+ log.error("浠巊lassId涓彁鍙栧師濮嬫暟瀛楀け璐�: glassId={}", glassId, e);
+ }
+ }
+ flowCardId = "NG" + dateStr + String.format("%02d", sequence) + "A001";
+ glassIdFlowCardIdMap.put(glassId, flowCardId);
+ log.info("涓虹幓鐠僆D {} 鐢熸垚娴佺▼鍗D: flowCardId={}", glassId, flowCardId);
+ }
+ return flowCardId;
+ }
/**
* 淇濈暀涓や綅灏忔暟锛堝洓鑸嶄簲鍏ワ級
@@ -473,5 +638,149 @@
return Math.round(v * 100.0) / 100.0;
}
+ @Override
+ public List<GlassInfo> getGlassInfosByEngineeringId(String engineeringId) {
+ if (engineeringId == null || engineeringId.trim().isEmpty()) {
+ return Collections.emptyList();
+ }
+ try {
+ return baseMapper.selectByEngineeringId(engineeringId.trim());
+ } catch (Exception e) {
+ log.error("鏍规嵁宸ョ▼鍙锋煡璇㈢幓鐠冧俊鎭け璐�, engineeringId={}", engineeringId, e);
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ public void saveGlassInfosFromExcel(List<Map<String, Object>> excelRows, String engineeringId) {
+ if (excelRows == null || excelRows.isEmpty() || engineeringId == null || engineeringId.trim().isEmpty()) {
+ return;
+ }
+
+ // 濡傛灉宸ョ▼鍙峰凡瀛樺湪锛屽厛鍒犻櫎璇ュ伐绋嬪彿涓嬬殑鏃ф暟鎹紝瀹炵幇瑕嗙洊鏇存柊
+ List<GlassInfo> existingGlassInfos = getGlassInfosByEngineeringId(engineeringId.trim());
+ if (!existingGlassInfos.isEmpty()) {
+ log.info("妫�娴嬪埌宸ョ▼鍙� {} 宸插瓨鍦� {} 鏉¤褰曪紝灏嗗垹闄ゆ棫鏁版嵁骞舵洿鏂�", engineeringId, existingGlassInfos.size());
+ deleteGlassInfosByEngineeringId(engineeringId.trim());
+ }
+
+ List<GlassInfo> glassInfos = new ArrayList<>();
+ Date now = new Date();
+
+ for (Map<String, Object> row : excelRows) {
+ String glassId = str(row.get("glassId"));
+ if (glassId == null || glassId.trim().isEmpty()) {
+ continue;
+ }
+
+ int qty = (int) parseDouble(row.getOrDefault("quantity", 1), 1);
+ if (qty <= 0) qty = 1;
+
+ double width = parseDouble(row.get("width"), 0d);
+ double length = parseDouble(row.get("length"), 0d);
+ double thickness = parseDouble(row.get("thickness"), 0d);
+
+ // 涓庡鍏ヨ鍒欎繚鎸佷竴鑷达細glassId 鍓嶅姞宸ョ▼鍙峰墠缂�锛屾暟閲�>1鏃惰拷鍔犲簭鍙�
+ String baseGlassId = engineeringId.trim() + glassId;
+ for (int idx = 0; idx < qty; idx++) {
+ String finalGlassId = qty > 1 ? baseGlassId + (idx + 1) : baseGlassId;
+
+ GlassInfo glassInfo = new GlassInfo();
+ glassInfo.setGlassId(finalGlassId);
+ glassInfo.setEngineeringId(engineeringId.trim());
+ glassInfo.setGlassLength((int) Math.round(length));
+ glassInfo.setGlassWidth((int) Math.round(width));
+ glassInfo.setGlassThickness(BigDecimal.valueOf(thickness));
+ glassInfo.setStatus(GlassInfo.Status.ACTIVE);
+ glassInfo.setState(0);
+ glassInfo.setCreatedTime(now);
+ glassInfo.setUpdatedTime(now);
+ glassInfo.setCreatedBy("system");
+ glassInfo.setUpdatedBy("system");
+
+ glassInfos.add(glassInfo);
+ }
+ }
+
+ if (!glassInfos.isEmpty()) {
+ batchSaveOrUpdateGlassInfo(glassInfos);
+ log.info("宸蹭繚瀛� {} 鏉$幓鐠冧俊鎭埌鏈湴鏁版嵁搴擄紝宸ョ▼鍙�: {}", glassInfos.size(), engineeringId);
+ }
+ }
+
+ @Override
+ public boolean updateGlassStateAfterScan(String glassId, Integer width, Integer height, Integer workLine) {
+ if (glassId == null || glassId.trim().isEmpty()) {
+ return false;
+ }
+
+ try {
+ // 鏌ヨ宸插瓨鍦ㄧ殑鐜荤拑淇℃伅
+ GlassInfo existing = baseMapper.selectByGlassId(glassId.trim());
+ if (existing == null) {
+ log.debug("鐜荤拑淇℃伅涓嶅瓨鍦紝鏃犳硶鏇存柊鐘舵��: glassId={}", glassId);
+ return false;
+ }
+
+ // 鏇存柊鐘舵�佷负1锛堝凡鎵爜浜や簰锛�
+ LambdaUpdateWrapper<GlassInfo> wrapper = new LambdaUpdateWrapper<>();
+ wrapper.eq(GlassInfo::getGlassId, glassId.trim())
+ .eq(GlassInfo::getIsDeleted, 0)
+ .set(GlassInfo::getState, 1)
+ .set(GlassInfo::getUpdatedTime, new Date())
+ .set(GlassInfo::getUpdatedBy, "system");
+
+ // 濡傛灉鎻愪緵浜嗗昂瀵镐俊鎭紝涔熸洿鏂板昂瀵�
+ if (width != null) {
+ wrapper.set(GlassInfo::getGlassWidth, width);
+ }
+ if (height != null) {
+ wrapper.set(GlassInfo::getGlassLength, height);
+ }
+ if (workLine != null) {
+ wrapper.set(GlassInfo::getWorkLine, workLine);
+ }
+
+ boolean updated = this.update(wrapper);
+ if (updated) {
+ log.info("宸叉洿鏂扮幓鐠冧俊鎭姸鎬佷负宸叉壂鐮佷氦浜�: glassId={}, state=1", glassId);
+ }
+ return updated;
+ } catch (Exception e) {
+ log.error("鏇存柊鐜荤拑淇℃伅鐘舵�佸け璐�: glassId={}", glassId, e);
+ return false;
+ }
+ }
+
+ @Override
+ public int deleteGlassInfosByEngineeringId(String engineeringId) {
+ if (engineeringId == null || engineeringId.trim().isEmpty()) {
+ return 0;
+ }
+
+ try {
+ // 鍏堟煡璇㈣鍒犻櫎鐨勬暟閲忥紙鍒犻櫎鍓嶏級
+ LambdaQueryWrapper<GlassInfo> countWrapper = new LambdaQueryWrapper<>();
+ countWrapper.eq(GlassInfo::getEngineeringId, engineeringId.trim())
+ .eq(GlassInfo::getIsDeleted, 0); // 鏌ヨ鏈垹闄ょ殑璁板綍
+ long count = this.count(countWrapper);
+
+ // 浣跨敤MyBatis-Plus鐨剅emove鏂规硶锛屼細鏍规嵁@TableLogic鑷姩杩涜閫昏緫鍒犻櫎
+ LambdaQueryWrapper<GlassInfo> removeWrapper = new LambdaQueryWrapper<>();
+ removeWrapper.eq(GlassInfo::getEngineeringId, engineeringId.trim())
+ .eq(GlassInfo::getIsDeleted, 0); // 鍙垹闄ゆ湭鍒犻櫎鐨勮褰�
+
+ boolean result = this.remove(removeWrapper);
+ if (result) {
+ log.info("宸插垹闄ゅ伐绋嬪彿涓嬬殑鐜荤拑淇℃伅: engineeringId={}, count={}", engineeringId, count);
+ return (int) count;
+ }
+ return 0;
+ } catch (Exception e) {
+ log.error("鍒犻櫎宸ョ▼鍙蜂笅鐨勭幓鐠冧俊鎭け璐�: engineeringId={}", engineeringId, e);
+ return 0;
+ }
+ }
+
}
--
Gitblit v1.8.0