From 3e6c4411b2280c18cbbcd557cef7897638e9c370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=AD=A3=E6=98=93?= Date: Thu, 15 May 2025 17:55:59 +0800 Subject: [PATCH] 123 --- .../DTO/backend/QcBackEndPrintMqttEventDto.cs | 44 +++++- ZR.Service/mes/qc/backend/QcBackEndService.cs | 146 ++++++++++++++---- 2 files changed, 153 insertions(+), 37 deletions(-) diff --git a/ZR.Model/MES/qc/DTO/backend/QcBackEndPrintMqttEventDto.cs b/ZR.Model/MES/qc/DTO/backend/QcBackEndPrintMqttEventDto.cs index 6a453019..8e467622 100644 --- a/ZR.Model/MES/qc/DTO/backend/QcBackEndPrintMqttEventDto.cs +++ b/ZR.Model/MES/qc/DTO/backend/QcBackEndPrintMqttEventDto.cs @@ -7,27 +7,55 @@ namespace ZR.Model.Dto /// public class QcBackEndPrintMqttEventDto { - public string Path { get; set; } + // btw文件路径 + public string Path { get; set; } = ""; - public string SiteNo { get; set; } + // 站点号 + public string SiteNo { get; set; } = ""; - public string Name { get; set; } + // 识别内容名称(内部) + public string Name { get; set; } = ""; - public string PartNumber { get; set; } + // 零件号 + public string PartNumber { get; set; } = ""; - public string WorkOrder { get; set; } + // 产品名称 + public string Description { get; set; } = ""; + // 颜色 + public string Color { get; set; } = ""; + + // 规格 + public string Specification { get; set; } = ""; + + // 工单号 + public string WorkOrder { get; set; } = ""; + + // 箱号 + public string PackageCode { get; set; } = ""; + + // 班组 public string Team { get; set; } = "A"; + // 流水号 public int Sort { get; set; } = 1; - public string BatchCode { get; set; } + // 生产时间 + public string ProductionTime { get; set; } = ""; + // 批次号 + public string BatchCode { get; set; } = ""; + + // 满箱数 public int PackageNum { get; set; } = 24; + // 标签内容 + public string LabelCode { get; set; } = ""; + + // 标签区别 public int LabelType { get; set; } = 1; + // 发送时间 public string CreatedTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - } -} \ No newline at end of file +} diff --git a/ZR.Service/mes/qc/backend/QcBackEndService.cs b/ZR.Service/mes/qc/backend/QcBackEndService.cs index 6c9db24f..b64c4d1d 100644 --- a/ZR.Service/mes/qc/backend/QcBackEndService.cs +++ b/ZR.Service/mes/qc/backend/QcBackEndService.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using System.IO; using System.Linq; using System.Text.Json; using System.Text.RegularExpressions; @@ -168,6 +169,35 @@ namespace ZR.Service.Business return -1; } + // 标签的批次号解析 + public string DoAnalyzeBatchCode(string label) + { + // 标签批次号正则抓取 + var predicate = Expressionable + .Create() + .And(it => it.Code == "BatchCode") + .And(it => it.Status == "1"); + List analysisList = Context + .Queryable() + .Where(predicate.ToExpression()) + .ToList(); + foreach (QcBackEndBaseLabelAnalysis analysis in analysisList) + { + if (string.IsNullOrEmpty(analysis.Expression)) + { + continue; + } + // 零件号正则表达式 + Regex pattern = new(@analysis.Expression); + Match match = pattern.Match(label); + if (match.Success && match.Groups.Count > 1) + { + return match.Groups[1].Value; + } + } + return ""; + } + public List GetDefectInitOptions() { List defectList = new(); @@ -277,6 +307,7 @@ namespace ZR.Service.Business .Queryable() .Where(it => it.Label == data.Label) .First(); + // 有旧记录则返回旧记录 if (oldWorkOrder != null) { return oldWorkOrder; @@ -706,7 +737,6 @@ namespace ZR.Service.Business Context.Ado.RollbackTran(); return $"异常:{e.Message}"; } - } /// @@ -716,7 +746,7 @@ namespace ZR.Service.Business public void CheckAndPrintPackageLabel(QcBackEndRecordLabelScan newLabelScran) { DateTime nowTime = DateTime.Now; - // 找到最大箱容量与模板 + // 找到最大箱容量与打印模板 QcBackEndServiceWorkorder workorder = Context .Queryable() .Where(it => it.WorkOrder == newLabelScran.WorkOrder) @@ -727,18 +757,21 @@ namespace ZR.Service.Business .First(); if (workorder == null) { - throw new Exception("工单异常"); + throw new Exception($"工单异常:内标签工单不存在{newLabelScran.WorkOrder}"); } if (packageLabelConfig == null) { - throw new Exception("该标签打印参数未配置"); + throw new Exception($"该产品内标签对应打印参数未配置:{newLabelScran.PartNumber}"); } + // 判断是否需要自动出满箱标签 int checkSort = newLabelScran.LabelSort ?? 0; - int maxPackage = packageLabelConfig.PackageNum ?? 0; if (checkSort >= maxPackage && checkSort % maxPackage == 0) { - int packageSort = 0; + // 需要打外箱标签 + SendPrintPackageLabelAsync(newLabelScran, packageLabelConfig.FileUrl, maxPackage) + .Wait(); + /*int packageSort = 0; QcBackEndRecordLabelScan packagelabelScan = Context .Queryable() .Where(it => it.WorkOrder == newLabelScran.WorkOrder) @@ -769,11 +802,7 @@ namespace ZR.Service.Business CreatedBy = newLabelScran.CreatedBy, CreatedTime = newLabelScran.CreatedTime, }; - int res = Context.Insertable(newPackagePrintLabel).ExecuteCommand(); - if (res > 0) - { - SendPrintPackageLabelAsync(newLabelScran, packageLabelConfig.FileUrl).Wait(); - } + int res = Context.Insertable(newPackagePrintLabel).ExecuteCommand();*/ } } @@ -782,35 +811,27 @@ namespace ZR.Service.Business /// public async Task SendPrintPackageLabelAsync( QcBackEndRecordLabelScan newLabelScran, - string path + string path, + int maxPackage ) { try { - // 构造主题和消息内容 - string topic = $"shgg_mes/backEnd/print/{newLabelScran.SiteNo}"; + // 构造主题和消息内容 (发送给1站点打印 XXX 预留多站点打印的情况) + string topic = $"shgg_mes/backEnd/print/1站点"; - QcBackEndPrintMqttEventDto mqttEventDto = - new() - { - Path = path, - SiteNo = newLabelScran.SiteNo, - Name = newLabelScran.PartNumber, - WorkOrder = newLabelScran.WorkOrder, - Team = newLabelScran.Team, - Sort = (newLabelScran.LabelSort + 1) ?? 1, - BatchCode = DateTime.Now.ToString("yyyyMMdd"), - PackageNum = 24, - LabelType = newLabelScran.LabelType ?? 1, - CreatedTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") - }; + QcBackEndPrintMqttEventDto mqttEventDto = CreateNewQcBackEndPrintMqttEventDto( + newLabelScran, + path, + maxPackage + ); var payload = JsonSerializer.Serialize(mqttEventDto); // 调用MqttService的发布方法(支持异步调用) await _mqttService.PublishAsync( topic, payload, - MqttQualityOfServiceLevel.ExactlyOnce, + MqttQualityOfServiceLevel.AtLeastOnce, // 可选:设置消息保留 retain: false ); @@ -824,6 +845,73 @@ namespace ZR.Service.Business } } + /// + /// 生成打印后道外箱标签的mqtt信息 + /// + /// + /// + /// + public QcBackEndPrintMqttEventDto CreateNewQcBackEndPrintMqttEventDto( + QcBackEndRecordLabelScan newLabelScran, + string path, + int maxPackage + ) + { + // 提取箱流水号 + int packageSort = 0; + QcBackEndRecordLabelScan packagelabelScan = Context + .Queryable() + .Where(it => it.WorkOrder == newLabelScran.WorkOrder) + .Where(it => it.LabelType == 1) + .OrderByDescending(it => it.LabelSort) + .First(); + if (packagelabelScan != null) + { + packageSort = packagelabelScan.LabelSort + 1 ?? 0; + } + // 提取产品描述 + WmMaterial material = Context + .Queryable() + .Where(it => it.Partnumber == newLabelScran.PartNumber) + .Where(it => it.Type == 1) + .Where(it => it.Status == 1) + .First(); + + // 解析产品批次号,如果没有,则生成最新批次号 + string batchCode = DoAnalyzeBatchCode(newLabelScran.Label); + if (string.IsNullOrEmpty(batchCode)) + { + batchCode = DateTime.Now.ToString("yyMMdd") + "000"; + } + // 生成工单号 + string workOrder = $"{batchCode}_{packageSort}{newLabelScran.Team}1"; + string newLabelCode = + $"Code=BNW{workOrder}^ItemNumber={newLabelScran.PartNumber}^Order=W{workOrder}^Qty={maxPackage}^LabelType=1^LabelBy=HD"; + string newPackageCode = $"BOX:BNW{workOrder}"; + QcBackEndPrintMqttEventDto mqttEventDto = + new() + { + Path = path, + SiteNo = "1站点", + Name = "后道外箱标签打印", + PartNumber = newLabelScran.PartNumber, + Description = material.Description ?? "", + Color = material.Color ?? "", + Specification = material.Specification ?? "", + WorkOrder = workOrder, + PackageCode = newPackageCode, + Team = newLabelScran.Team, + Sort = packageSort, + ProductionTime = batchCode.Substring(6), + BatchCode = batchCode, + PackageNum = maxPackage, + LabelCode = newLabelCode, + LabelType = 1, + CreatedTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + }; + return mqttEventDto; + } + public string EndBackEndWorkOrderAndCreateStatistics(string workorder) { try