From 6db871f99bec9fabfc32fc24b8ac7feb876ada4f Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Tue, 3 Feb 2026 14:48:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E4=BF=A1=E6=95=B0=E6=8D=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/comm/OPC/OpcMessageSend.java | 49 +++---------------- .../constants/enums/L1OperateMatEnum.java | 9 ++++ .../service/impl/LogDataServiceImpl.java | 36 -------------- .../service/impl/OpcDataServiceImpl.java | 35 ++++++++++++- .../service/impl/TrackServiceImpl.java | 10 ---- .../service/strip/SegmentTrackerService.java | 42 ++++++---------- 6 files changed, 64 insertions(+), 117 deletions(-) diff --git a/business/src/main/java/com/fizz/business/comm/OPC/OpcMessageSend.java b/business/src/main/java/com/fizz/business/comm/OPC/OpcMessageSend.java index 45bf250..dbe7b97 100644 --- a/business/src/main/java/com/fizz/business/comm/OPC/OpcMessageSend.java +++ b/business/src/main/java/com/fizz/business/comm/OPC/OpcMessageSend.java @@ -4,6 +4,7 @@ import com.fizz.business.domain.msg.OpcMessage; import com.fizz.business.domain.msg.PdiSetup; import com.kangaroohy.milo.model.ReadWriteEntity; import com.kangaroohy.milo.service.MiloService; +import com.fizz.business.service.LogDataService; import lombok.extern.log4j.Log4j2; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; @@ -25,6 +26,9 @@ public class OpcMessageSend { @Resource private MiloService miloService; + @Resource + private LogDataService logDataService; + private void sendPdiSetup(PdiSetup pdiSetup) { try { List entities = getWriteEntities(pdiSetup, pdiSetupIds); @@ -111,43 +115,6 @@ public class OpcMessageSend { } } - /** - * 批量写数据方法:通过字段名向多个点位写入数据 - * @param fieldDataMap 字段名和值的映射,key 为 fieldName,value 为要写入的值 - * @return 是否全部写入成功 - */ - public boolean batchWriteDataByFieldName(Map fieldDataMap) { - try { - if (fieldDataMap == null || fieldDataMap.isEmpty()) { - log.warn("批量写数据:数据映射为空,跳过写入"); - return false; - } - List entities = new ArrayList<>(); - for (Map.Entry entry : fieldDataMap.entrySet()) { - String fieldName = entry.getKey(); - String identifier = findIdentifierByFieldName(fieldName); - if (identifier == null) { - log.warn("未找到字段名对应的 OPC 节点路径,fieldName={},跳过该字段", fieldName); - continue; - } - entities.add(ReadWriteEntity.builder() - .identifier(identifier) - .value(entry.getValue()) - .build()); - } - if (entities.isEmpty()) { - log.warn("批量写数据:没有有效的字段映射,跳过写入"); - return false; - } - miloService.writeToOpcUa(entities); - log.info("批量写入 OPC 数据成功,共 {} 个点位", entities.size()); - return true; - } catch (Exception e) { - log.error("批量写入 OPC 数据失败,原因:{}", e.getMessage(), e); - return false; - } - } - /** * 批量写数据方法:向多个点位写入数据(直接使用节点路径) * @param dataMap 点位标识符和值的映射,key 为 identifier,value 为要写入的值 @@ -155,10 +122,6 @@ public class OpcMessageSend { */ public boolean batchWriteData(Map dataMap) { try { - if (dataMap == null || dataMap.isEmpty()) { - log.warn("批量写数据:数据映射为空,跳过写入"); - return false; - } List entities = new ArrayList<>(); for (Map.Entry entry : dataMap.entrySet()) { entities.add(ReadWriteEntity.builder() @@ -167,10 +130,10 @@ public class OpcMessageSend { .build()); } miloService.writeToOpcUa(entities); - log.info("批量写入 OPC 数据成功,共 {} 个点位", entities.size()); + logDataService.logInfo("WRITE","批量写入 OPC 数据成功,共"+ entities.size()+ "个点位"); return true; } catch (Exception e) { - log.error("批量写入 OPC 数据失败,原因:{}", e.getMessage(), e); + logDataService.logInfo("WRITE","批量写入 OPC 数据失败,原因:"+ e.getMessage()+","+ e); return false; } } diff --git a/business/src/main/java/com/fizz/business/constants/enums/L1OperateMatEnum.java b/business/src/main/java/com/fizz/business/constants/enums/L1OperateMatEnum.java index 9776a45..68cc24e 100644 --- a/business/src/main/java/com/fizz/business/constants/enums/L1OperateMatEnum.java +++ b/business/src/main/java/com/fizz/business/constants/enums/L1OperateMatEnum.java @@ -10,6 +10,7 @@ import com.fizz.business.service.CrmPdiPlanService; import com.fizz.business.comm.OPC.OpcMessageSend; import com.fizz.business.service.client.RedisCacheManager; import com.fizz.business.service.impl.BeanFactory; +import com.fizz.business.service.strip.SegmentTrackerService; import com.fizz.business.utils.MatmapUtil; import com.fizz.business.utils.WebSocketUtil; import com.fizz.business.vo.CrmPdiPlanVO; @@ -40,6 +41,14 @@ public enum L1OperateMatEnum implements IEnum, IOperateMat impl @Override public void logInfo(String module, String content, Object... args) { try { - if (args.length > 0) { - content = formatMessage(content, args); - } saveLogData("INFORMATION", module, content); } catch (Exception e) { log.error("没存进去,没事,{}",e); @@ -88,9 +85,6 @@ public class LogDataServiceImpl extends ServiceImpl impl @Override public void logWarn(String module, String content, Object... args) { - if (args.length > 0) { - content = formatMessage(content, args); - } saveLogData("WARN", module, content); } @@ -105,34 +99,4 @@ public class LogDataServiceImpl extends ServiceImpl impl save(logData); } - private String formatMessage(String pattern, Object[] arguments) { - if (pattern == null) { - return null; - } - if (arguments == null || arguments.length == 0) { - return pattern; - } - - StringBuilder sb = new StringBuilder(); - int argIndex = 0; - int i = 0; - - while (i < pattern.length()) { - char c = pattern.charAt(i); - if (c == '{' && i + 1 < pattern.length() && pattern.charAt(i + 1) == '}') { - if (argIndex < arguments.length) { - sb.append(String.valueOf(arguments[argIndex++])); - } else { - sb.append("{}"); - } - i += 2; - } else { - sb.append(c); - i++; - } - } - - return sb.toString(); - } - } diff --git a/business/src/main/java/com/fizz/business/service/impl/OpcDataServiceImpl.java b/business/src/main/java/com/fizz/business/service/impl/OpcDataServiceImpl.java index db4d49f..2ee6df2 100644 --- a/business/src/main/java/com/fizz/business/service/impl/OpcDataServiceImpl.java +++ b/business/src/main/java/com/fizz/business/service/impl/OpcDataServiceImpl.java @@ -3,6 +3,7 @@ package com.fizz.business.service.impl; import com.fizz.business.comm.OPC.OpcMessageSend; import com.fizz.business.form.OpcBatchWriteDataForm; import com.fizz.business.form.OpcWriteDataForm; +import com.fizz.business.service.LogDataService; import com.fizz.business.service.OpcDataService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -22,6 +23,7 @@ import java.util.stream.Collectors; public class OpcDataServiceImpl implements OpcDataService { private final OpcMessageSend opcMessageSend; + private final LogDataService logDataService; @Override public boolean writeData(OpcWriteDataForm form) { @@ -36,13 +38,44 @@ public class OpcDataServiceImpl implements OpcDataService { @Override public boolean batchWriteData(OpcBatchWriteDataForm form) { try { + + int rawSize = form.getDataList().size(); + + int nullItemCount = 0; + int nullFieldNameCount = 0; + int nullValueCount = 0; + StringBuilder nullValueFields = new StringBuilder(); + + for (int i = 0; i < form.getDataList().size(); i++) { + OpcWriteDataForm d = form.getDataList().get(i); + if (d == null) { + nullItemCount++; + continue; + } + if (d.getFieldName() == null) { + nullFieldNameCount++; + continue; + } + if (d.getValue() == null) { + nullValueCount++; + if (nullValueFields.length() < 1500) { + if (nullValueFields.length() > 0) { + nullValueFields.append(","); + } + nullValueFields.append(d.getFieldName()); + } + } + } + Map fieldDataMap = form.getDataList().stream() + .filter(d -> d != null && d.getFieldName() != null) .collect(Collectors.toMap( OpcWriteDataForm::getFieldName, OpcWriteDataForm::getValue, (v1, v2) -> v2 // 如果有重复的 key,保留后面的值 )); - return opcMessageSend.batchWriteDataByFieldName(fieldDataMap); + + return opcMessageSend.batchWriteData(fieldDataMap); } catch (Exception e) { log.error("批量写入 OPC 数据异常", e); return false; diff --git a/business/src/main/java/com/fizz/business/service/impl/TrackServiceImpl.java b/business/src/main/java/com/fizz/business/service/impl/TrackServiceImpl.java index 6b814c5..4826c4a 100644 --- a/business/src/main/java/com/fizz/business/service/impl/TrackServiceImpl.java +++ b/business/src/main/java/com/fizz/business/service/impl/TrackServiceImpl.java @@ -73,16 +73,6 @@ public class TrackServiceImpl implements TrackService { public void l1OperateMat(L1OperateMatForm form) { log.info("l1 operate mat: {}", JSON.toJSONString(form)); - - // NEW/READY -> ONLINE:下发张力下一设定值 - if (form.getOperation() == com.fizz.business.constants.enums.L1OperateMatEnum.ONLINE) { - try { - segmentTrackerService.sendAllPdiOnOnline(form.getEntryMatId(), form.getPorIdx()); - } catch (Exception e) { - log.error("张力Next下发异常, coilId={} err={}", form.getEntryMatId(), e.toString(), e); - } - } - form.getOperation().operate(form); proMatmapService.flushMatmap(); } diff --git a/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java b/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java index a216f25..5683daf 100644 --- a/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java +++ b/business/src/main/java/com/fizz/business/service/strip/SegmentTrackerService.java @@ -3,6 +3,7 @@ package com.fizz.business.service.strip; import cn.hutool.json.JSONUtil; import com.fizz.business.constants.enums.DeviceEnum; import com.fizz.business.constants.enums.L1OperateMatEnum; +import com.fizz.business.domain.PdiSetups; import com.fizz.business.domain.msg.AppMeasureCoatMessage; import com.fizz.business.domain.msg.AppMeasureEntryMessage; import com.fizz.business.domain.msg.AppMeasureExitMessage; @@ -22,6 +23,7 @@ import com.fizz.business.service.TrackService; import com.fizz.business.service.impl.SegmentService; import com.fizz.business.utils.MatmapUtil; import com.fizz.business.utils.WebSocketUtil; +import com.fizz.business.vo.CrmPdiPlanVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; @@ -454,22 +456,21 @@ public class SegmentTrackerService { } - - private com.fizz.business.domain.PdiSetups loadPdiSetup(String coilId, String planId) { + private PdiSetups loadPdiSetup(String coilId, String planId) { if (planId == null) { return null; } com.fizz.business.domain.PdiSetups query = new com.fizz.business.domain.PdiSetups(); query.setCoilid(coilId); query.setPlanid(planId); - java.util.List setups = pdiSetupService.selectPdiSetupList(query); + List setups = pdiSetupService.selectPdiSetupList(query); return (setups != null && !setups.isEmpty()) ? setups.get(0) : null; } /** * NEW/READY -> ONLINE:下发全线张力“下一设定值”(Next) */ - private void addDriveTensionNextFields(java.util.List dataList, Integer porIdx, com.fizz.business.domain.PdiSetups setup) { + private void addDriveTensionNextFields(List dataList, Integer porIdx, PdiSetups setup) { if (setup == null) { return; } @@ -490,7 +491,7 @@ public class SegmentTrackerService { dataList.add(buildOpcWrite("tensionTrNext", setup.getTrTension())); } - private void addEntryPdiFields(java.util.List dataList, String coilId, com.fizz.business.vo.CrmPdiPlanVO plan) { + private void addEntryPdiFields(List dataList, String coilId, CrmPdiPlanVO plan) { dataList.add(buildOpcWrite("coilId", coilId)); dataList.add(buildOpcWrite("entryCoilWeight", plan.getEntryWeight())); dataList.add(buildOpcWrite("entryCoilLength", plan.getEntryLength())); @@ -499,37 +500,24 @@ public class SegmentTrackerService { dataList.add(buildOpcWrite("entryCoilInnerDia", plan.getEntryInnerDiameter())); dataList.add(buildOpcWrite("entryCoilOuterDia", plan.getEntryOuterDiameter())); dataList.add(buildOpcWrite("alloyCode", plan.getSteelGrade())); - dataList.add(buildOpcWrite("splitNum", plan.getSplitNum())); } /** * NEW/READY -> ONLINE:入口卷参数 + 全线张力“下一设定值”(Next) 一次性下发 */ public void sendAllPdiOnOnline(String coilId, Integer porIdx) { - try { - com.fizz.business.vo.CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(coilId); - if (plan == null) { - logDataService.logWarn("MATMAP-TRACK", "ONLINE下发跳过:未找到计划信息, coilId=" + coilId); - return; - } - com.fizz.business.domain.PdiSetups setup = loadPdiSetup(coilId, plan.getPlanid()); - if (setup == null) { - logDataService.logWarn("MATMAP-TRACK", "ONLINE下发跳过:未找到pdi_setup, coilId=" + coilId); - return; - } + CrmPdiPlanVO plan = crmPdiPlanService.getByCoilIdAndOperId(coilId); - java.util.List dataList = new java.util.ArrayList<>(); - addEntryPdiFields(dataList, coilId, plan); - addDriveTensionNextFields(dataList, porIdx, setup); + PdiSetups setup = loadPdiSetup(coilId, plan.getPlanid()); + List dataList = new ArrayList<>(); + addEntryPdiFields(dataList, coilId, plan); + addDriveTensionNextFields(dataList, porIdx, setup); + OpcBatchWriteDataForm opcForm = new OpcBatchWriteDataForm(); + opcForm.setDataList(dataList); + boolean ok = opcDataService.batchWriteData(opcForm); + logDataService.logInfo("MATMAP-TRACK", "ONLINE下发完成(入口参数+张力Next), coilId=" + coilId + ", ok=" + ok); - OpcBatchWriteDataForm opcForm = new OpcBatchWriteDataForm(); - opcForm.setDataList(dataList); - boolean ok = opcDataService.batchWriteData(opcForm); - logDataService.logInfo("MATMAP-TRACK", "ONLINE下发完成(入口参数+张力Next), coilId=" + coilId + ", ok=" + ok); - } catch (Exception ex) { - logDataService.logWarn("MATMAP-TRACK", "ONLINE下发异常(入口参数+张力Next), coilId=" + coilId + ", err=" + String.valueOf(ex)); - } }