From 7b546e5979c663ee6f3166e4cdbedd7c4fd63cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=AD=A3=E6=98=93?= Date: Mon, 9 Jun 2025 16:32:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E9=81=93=E5=B7=A5=E5=8D=95=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=89=93=E5=8D=B0=E4=BF=A1=E6=81=AF=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E6=89=93=E6=A0=87=E7=AD=BE=EF=BC=8C=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E9=9B=B6=E5=A4=B4=E6=A0=87=E7=AD=BE=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/qc/backend/QcBackEndController.cs | 44 +++++ ZR.Admin.WebApi/appsettings.json | 17 -- ZR.Admin.WebApi/appsettings.production.json | 20 +- .../backend/QcBackEndServiceWorkorderDto.cs | 13 ++ .../qc/IService/backend/IQcBackEndService.cs | 14 ++ ZR.Service/mes/qc/backend/QcBackEndService.cs | 174 +++++++++++++++++- 6 files changed, 254 insertions(+), 28 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/mes/qc/backend/QcBackEndController.cs b/ZR.Admin.WebApi/Controllers/mes/qc/backend/QcBackEndController.cs index 3bbe9932..28a317ba 100644 --- a/ZR.Admin.WebApi/Controllers/mes/qc/backend/QcBackEndController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/qc/backend/QcBackEndController.cs @@ -250,5 +250,49 @@ namespace ZR.Admin.WebApi.Controllers } } + + /// + /// 打印特殊包装标签 + /// + /// + [HttpPost("PrintSpecialPacakgeLabel")] + [AllowAnonymous] + public IActionResult PrintSpecialPacakgeLabel([FromBody] QcBackEndWorkorderDetailDto parm, int specialPrintType, + int packageNum) + { + try + { + var modal = parm.Adapt().ToCreate(HttpContext); + + var response = _QcBackEndService.PrintSpecialPacakgeLabel(modal, specialPrintType, packageNum); + + return SUCCESS(response); + } + catch (Exception ex) + { + return ToResponse(ApiResult.Error(ex.Message)); + } + + } + + /// + /// 工单标签信息查询 + /// + /// + [HttpGet("SearchWorkOrderLabelDetail")] + [AllowAnonymous] + public IActionResult SearchWorkOrderLabelDetail(string workOrder) + { + try + { + var response = _QcBackEndService.SearchWorkOrderLabelDetail(workOrder); + return SUCCESS(response); + } + catch (Exception ex) + { + return ToResponse(ApiResult.Error(ex.Message)); + } + + } } } diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index 26daa0a4..c5a60bb5 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -1,22 +1,5 @@ { //DOANtech123 - "MqttConfig": { - "ClientId": "shgg-mes-server", - "Server": "192.168.23.165", - "Port": 1883, - "Username": "admin", - "Password": "123456", - "Topics": [ - { - "Topic": "devices/#", - "QualityOfServiceLevel": "AtLeastOnce" - }, - { - "Topic": "system/alert", - "QualityOfServiceLevel": "AtLeastOnce" - } - ] - }, "NacosConfig": { "Listeners": [ { diff --git a/ZR.Admin.WebApi/appsettings.production.json b/ZR.Admin.WebApi/appsettings.production.json index 1ed63606..1a1d9b02 100644 --- a/ZR.Admin.WebApi/appsettings.production.json +++ b/ZR.Admin.WebApi/appsettings.production.json @@ -6,6 +6,7 @@ "Microsoft.Hosting.Lifetime": "Information" } }, + "urls": "http://0.0.0.0:8888", //(app会默认去读)项目启动url,如果改动端口前端对应devServer也需要进行修改 "dbConfigs": [ { @@ -36,7 +37,7 @@ "Expire": 10080 //jwt登录过期时间(分)【7天】 }, "InjectClass": [ "ZR.Repository", "ZR.Service", "ZR.Tasks" ], //自动注入类 - "ShowDbLog": false,//是否打印db日志 + "ShowDbLog": false, //是否打印db日志 "InitDb": false, //是否初始化db "DemoMode": false, //是否演示模式 "Upload": { @@ -142,5 +143,22 @@ //验证码配置 "CaptchaOptions": { "IgnoreCase": true // 比较时是否忽略大小写 + }, + "MqttConfig": { + "ClientId": "shgg-mes-server", + "Server": "192.168.23.165", + "Port": 1883, + "Username": "admin", + "Password": "123456", + "Topics": [ + { + "Topic": "devices/#", + "QualityOfServiceLevel": "AtLeastOnce" + }, + { + "Topic": "system/alert", + "QualityOfServiceLevel": "AtLeastOnce" + } + ] } } diff --git a/ZR.Model/MES/qc/DTO/backend/QcBackEndServiceWorkorderDto.cs b/ZR.Model/MES/qc/DTO/backend/QcBackEndServiceWorkorderDto.cs index 3a294bc9..7cccb3ad 100644 --- a/ZR.Model/MES/qc/DTO/backend/QcBackEndServiceWorkorderDto.cs +++ b/ZR.Model/MES/qc/DTO/backend/QcBackEndServiceWorkorderDto.cs @@ -134,4 +134,17 @@ namespace ZR.Model.Dto public DateTime? UpdatedTime { get; set; } } + public class QcBackEndWorkorderPrintLabelDetailDto + { + // 已扫零件数 + public int? ScannedPartCount { get; set; } + // 已扫箱标签数 + public int? ScannedBoxLabelCount { get; set; } + // 补打数 + public int? RePrintCount { get; set; } + // 零头箱打印数 + public int? RemainderBoxPrintCount { get; set; } + // 箱标签当前序号 + public int? CurrentBoxLabelSequence { get; set; } + } } \ No newline at end of file diff --git a/ZR.Service/mes/qc/IService/backend/IQcBackEndService.cs b/ZR.Service/mes/qc/IService/backend/IQcBackEndService.cs index d4018380..76dc7155 100644 --- a/ZR.Service/mes/qc/IService/backend/IQcBackEndService.cs +++ b/ZR.Service/mes/qc/IService/backend/IQcBackEndService.cs @@ -98,5 +98,19 @@ namespace ZR.Service.Business.IBusinessService /// 工单信息 /// public QcBackEndServiceWorkorder GenerateVirtualLabel(QcBackEndWorkorderDetailDto workorderDetail); + + /// + /// 后道特殊箱标签打印 + /// + /// 工单信息 + /// + public string PrintSpecialPacakgeLabel(QcBackEndWorkorderDetailDto workorderDetail, int specialPrintType,int packageNum); + + /// + /// 工单标签信息查询 + /// + /// 工单信息 + /// + public QcBackEndWorkorderPrintLabelDetailDto SearchWorkOrderLabelDetail(string workOrder); } } diff --git a/ZR.Service/mes/qc/backend/QcBackEndService.cs b/ZR.Service/mes/qc/backend/QcBackEndService.cs index c0eb3cd3..fbbca790 100644 --- a/ZR.Service/mes/qc/backend/QcBackEndService.cs +++ b/ZR.Service/mes/qc/backend/QcBackEndService.cs @@ -11,6 +11,7 @@ using ZR.Model.Business; using ZR.Model.Dto; using ZR.Model.MES.wms; using ZR.Service.Business.IBusinessService; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace ZR.Service.Business { @@ -675,7 +676,7 @@ namespace ZR.Service.Business .Queryable() .Where(it => it.WorkOrder == data.WorkOrder) .First(); - if(workorderInfo == null) + if (workorderInfo == null) { Context.Ado.RollbackTran(); return "工单号不存在!"; @@ -877,7 +878,7 @@ namespace ZR.Service.Business .Queryable() .Where(it => it.WorkOrder == workorder) .First(); - if (workorder == null) + if (workorderInfo == null) { throw new Exception($"异常:工单不存在{workorder}"); } @@ -943,10 +944,12 @@ namespace ZR.Service.Business /// /// 当输入参数为null时抛出 /// 当标签内容无效时抛出 + /// 特殊标签 0-正常 1-补打 2-零头箱 public async Task SendPrintPackageLabelAsync( QcBackEndRecordLabelScan newLabelScran, string path, - int maxPackage + int maxPackage, + int specialPrintType = 0 ) { // 参数验证 @@ -966,7 +969,8 @@ namespace ZR.Service.Business QcBackEndPrintMqttEventDto mqttEventDto = CreateNewQcBackEndPrintMqttEventDto( newLabelScran, path, - maxPackage + maxPackage, + specialPrintType ); var payload = JsonSerializer.Serialize(mqttEventDto); @@ -982,7 +986,7 @@ namespace ZR.Service.Business _logger.LogInformation($"发送后道外箱标签打印成功:{topic}"); // 添加打印记录 - await AddBackendLabelPrintRecordAsync(mqttEventDto, maxPackage); + await AddBackendLabelPrintRecordAsync(mqttEventDto, newLabelScran.WorkOrder, maxPackage, specialPrintType); } catch (JsonException ex) { @@ -998,10 +1002,13 @@ namespace ZR.Service.Business /// /// 异步添加后道箱标签打印记录 + /// 特殊标签 0-正常 1-补打 2-零头箱 /// private async Task AddBackendLabelPrintRecordAsync( QcBackEndPrintMqttEventDto labelScan, - int maxPackage + string workOrder, + int maxPackage, + int specialPrintType = 0 ) { try @@ -1040,7 +1047,7 @@ namespace ZR.Service.Business Id = SnowFlakeSingle.instance.NextId().ToString(), MachineCode = labelScan.SiteNo ?? "未知站点", LabelCode = labelCode, - WorkOrder = labelScan.WorkOrder ?? "未知工单", + WorkOrder = workOrder ?? "未知工单", PartNumber = labelScan.PartNumber ?? "未知零件号", Description = description, Team = labelScan.Team ?? "未知班组", @@ -1049,7 +1056,7 @@ namespace ZR.Service.Business PartNum = maxPackage, LabelType = 1, BoxMaxNum = maxPackage, - IsFull = 1, + IsFull = specialPrintType == 2 ? 0 : 1, IsLcl = 0, CreateBy = "后道标签打印系统", CreateTime = DateTime.Now @@ -1070,11 +1077,13 @@ namespace ZR.Service.Business /// /// /// + /// 特殊标签 0-正常 1-补打 2-零头箱 /// public QcBackEndPrintMqttEventDto CreateNewQcBackEndPrintMqttEventDto( QcBackEndRecordLabelScan newLabelScran, string path, - int maxPackage + int maxPackage, + int specialPrintType = 0 ) { // 解析产品批次号,如果没有,则生成最新批次号 @@ -1117,8 +1126,12 @@ namespace ZR.Service.Business } // 生成工单号 string workOrder = $"{batchCode}_{packageSort}"; + // 是否满箱 0-不满 1-满箱 + int isFull = specialPrintType == 2 ? 0 : 1; + // 是否补打 0-非补打 1-补打 + int isAgain = specialPrintType == 1 ? 1 : 0; string newLabelCode = - $"Code=PGW{workOrder}^ItemNumber={newLabelScran.PartNumber}^Order=W{workOrder}^Qty={maxPackage}^LabelType=1^LabelBy=HD^Team={newLabelScran.Team}"; + $"Code=PGW{workOrder}^ItemNumber={newLabelScran.PartNumber}^Order=W{workOrder}^Qty={maxPackage}^LabelType=1^LabelBy=HD^Team={newLabelScran.Team}^IsFull={isFull}^IsAgain={isAgain}"; string newPackageCode = $"BOX:PGW{workOrder}{newLabelScran.Team}1"; QcBackEndPrintMqttEventDto mqttEventDto = new() @@ -1399,5 +1412,146 @@ namespace ZR.Service.Business { return Guid.NewGuid().ToString("N").Substring(0, 10); // Generate a 10-character unique ID } + + /// + /// 打印特殊包装标签 + /// + /// 工单信息 + /// 特殊打印类别 1-补打标签 2-打印零头箱 + /// + /// + public string PrintSpecialPacakgeLabel( + QcBackEndWorkorderDetailDto workorderDetail, + int specialPrintType = 1, + int packageNum = 0 + ) + { + try + { + Context.Ado.BeginTran(); + DateTime nowTime = DateTime.Now; + // 工单判断 + QcBackEndServiceWorkorder workorderInfo = Context + .Queryable() + .Where(it => it.WorkOrder == workorderDetail.WorkOrder) + .First(); + if (workorderInfo == null) + { + Context.Ado.RollbackTran(); + return $"异常:工单不存在,工单号:[{workorderDetail.WorkOrder}]"; + } + // 打印配置确认 + QcBackendBaseOutpackage packageLabelConfig = Context + .Queryable() + .Where(it => workorderInfo.Description.Contains(it.CheckStr)) + .First(); + if (packageLabelConfig == null) + { + Context.Ado.RollbackTran(); + return $"异常:零件满箱配置不存在,工单号[{workorderDetail.WorkOrder}]"; + } + string remark = specialPrintType == 1 ? "补打标签" : "零头箱"; + // 上一个内标签流水号检查 + int oldInnerLabelSort = 0; + QcBackEndRecordLabelScan labelScan = Context + .Queryable() + .Where(it => it.WorkOrder == workorderDetail.WorkOrder) + .Where(it => it.LabelType == 2) + .OrderByDescending(it => it.LabelSort) + .First(); + if (labelScan != null) + { + oldInnerLabelSort = labelScan.LabelSort ?? 0; + } + // 新内标签流水号 + int newSort = oldInnerLabelSort + 1; + // 新标签生成 + QcBackEndRecordLabelScan newLabelScran = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = workorderInfo.WorkOrder, + PartNumber = workorderInfo.PartNumber, + Team = workorderInfo.Team, + SiteNo = workorderInfo.SiteNo, + ComNo = workorderInfo.ComNo, + Label = workorderInfo.Label, + LabelType = 1, + LabelSort = newSort, + ScanTime = $"{nowTime:yyyy-MM-dd HH:mm:ss}", + Type = "1", + Status = "1", + Remark = remark, + CreatedBy = "特殊标签", + CreatedTime = nowTime, + }; + int _pacakgeNum = packageLabelConfig.PackageNum.Value; + // 1.补打标签 + if (specialPrintType == 1) + { + SendPrintPackageLabelAsync( + newLabelScran, + packageLabelConfig.FileUrl, + _pacakgeNum, + specialPrintType + ) + .Wait(); + } + // 2.打印零头箱 + if (specialPrintType == 2) + { + _pacakgeNum = packageNum; + SendPrintPackageLabelAsync( + newLabelScran, + packageLabelConfig.FileUrl, + _pacakgeNum, + specialPrintType + ) + .Wait(); + //Context.Insertable(newLabelScran).ExecuteCommand(); + } + Context.Ado.CommitTran(); + return "ok"; + } + catch (Exception ex) + { + Context.Ado.RollbackTran(); + return $"系统异常{ex.Message}"; + } + } + + public QcBackEndWorkorderPrintLabelDetailDto SearchWorkOrderLabelDetail(string workOrder) + { + QcBackEndWorkorderPrintLabelDetailDto result = new(); + result.ScannedPartCount = Context + .Queryable() + .Where(it => it.WorkOrder == workOrder) + .Where(it => it.LabelType == 2) + .Count(); + result.ScannedBoxLabelCount = Context + .Queryable() + .Where(it => it.WorkOrder == workOrder) + .Where(it => it.LabelType == 1) + .Where(it => it.LabelSort > 0) + .Count(); + result.RePrintCount = Context + .Queryable() + .Where(it => it.WorkOrder == workOrder) + .Where(it => it.LabelType == 1) + .Where(it => it.LabelCode.Contains("IsAgain=1")) + .Count(); + result.RemainderBoxPrintCount = Context + .Queryable() + .Where(it => it.WorkOrder == workOrder) + .Where(it => it.LabelType == 1) + .Where(it => it.IsFull == 0) + .Count(); + result.CurrentBoxLabelSequence = Context + .Queryable() + .Where(it => it.WorkOrder == workOrder) + .Where(it => it.LabelType == 1) + .Max(it => it.SerialNumber); + return result; + } } }