From c477f01f23afed5a239e25668928f8babef269d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=AD=A3=E6=98=93?= Date: Fri, 4 Jul 2025 20:40:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E9=81=93=E6=89=93=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A5=E5=8F=8A=E6=A0=87=E7=AD=BE=E8=BF=BD?= =?UTF-8?q?=E6=BA=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pro/ProPackingDataBackController.cs | 68 ++++ ZR.Model/MES/pro/DTO/ProPackingDataBackDto.cs | 115 ++++++ .../IService/IProPackingDataBackService.cs | 24 ++ .../mes/pro/ProPackingDataBackService.cs | 333 ++++++++++++++++++ ZR.Service/mes/qc/backend/QcBackEndService.cs | 41 ++- 5 files changed, 571 insertions(+), 10 deletions(-) create mode 100644 ZR.Admin.WebApi/Controllers/mes/pro/ProPackingDataBackController.cs create mode 100644 ZR.Model/MES/pro/DTO/ProPackingDataBackDto.cs create mode 100644 ZR.Service/mes/pro/IService/IProPackingDataBackService.cs create mode 100644 ZR.Service/mes/pro/ProPackingDataBackService.cs diff --git a/ZR.Admin.WebApi/Controllers/mes/pro/ProPackingDataBackController.cs b/ZR.Admin.WebApi/Controllers/mes/pro/ProPackingDataBackController.cs new file mode 100644 index 00000000..c2576956 --- /dev/null +++ b/ZR.Admin.WebApi/Controllers/mes/pro/ProPackingDataBackController.cs @@ -0,0 +1,68 @@ +using Microsoft.AspNetCore.Mvc; +using ZR.Admin.WebApi.Extensions; +using ZR.Admin.WebApi.Filters; +using ZR.Model.mes.pro; +using ZR.Model.MES.pro.DTO; +using ZR.Service.mes.pro.IService; + +//创建时间:2024-05-20 +namespace ZR.Admin.WebApi.Controllers +{ + /// + /// 包装记录追溯 + /// + [Route("mes/pro/ProPackingDataBack")] + public class ProPackingDataBackController : BaseController + { + private readonly IProPackingDataBackService _ProPackingDataBackService; + + public ProPackingDataBackController(IProPackingDataBackService ProPackingDataBackService) + { + _ProPackingDataBackService = ProPackingDataBackService; + } + + /// + /// 查询包装记录追溯清单列表 + /// + /// + /// + [HttpGet("list")] + [AllowAnonymous] + public IActionResult QueryPackingDataBackList([FromQuery] ProPackingDataBackQueryDto parm) + { + try + { + var response = _ProPackingDataBackService.GetList(parm); + return SUCCESS(response); + } + catch (Exception ex) + { + + return ToResponse(new ApiResult(500, ex.Message, ex.Message)); + } + + } + /// + /// 查询包装记录追溯清单详细列表 + /// + /// + /// + [HttpGet("record")] + [AllowAnonymous] + public IActionResult QueryPackingDataBackRecord([FromQuery] ProPackingDataBackRecordQueryDto parm) + { + try + { + var response = _ProPackingDataBackService.GetRecords(parm); + return SUCCESS(response); + } + catch (Exception ex) + { + return ToResponse(new ApiResult(500, ex.Message, ex.Message)); + } + + } + + + } +} \ No newline at end of file diff --git a/ZR.Model/MES/pro/DTO/ProPackingDataBackDto.cs b/ZR.Model/MES/pro/DTO/ProPackingDataBackDto.cs new file mode 100644 index 00000000..b2a3b901 --- /dev/null +++ b/ZR.Model/MES/pro/DTO/ProPackingDataBackDto.cs @@ -0,0 +1,115 @@ +using System.ComponentModel.DataAnnotations; + +namespace ZR.Model.MES.pro.DTO +{ + /// + /// 扫码追溯清单搜索条件 + /// + public class ProPackingDataBackQueryDto : PagerInfo + { + // 工单号 + public string WorkOrder { get; set; } + // 实际标签 + public string Label { get; set; } + // 零件号 + public string PartNumber { get; set; } + // 箱条码 + public string PackingCode { get; set; } + public string Machine { get; set; } + public DateTime? StartTime { get; set; } + public DateTime? EndTime { get; set; } + } + + /// + /// 扫码追溯详情数据搜索条件 + /// + public class ProPackingDataBackRecordQueryDto : PagerInfo + { + /// + /// 标签搜索类型 1-产线 2-GP12 3-后道 4-成品入库 + /// + public int SearchType { get; set; } + public DateTime? StartTime { get; set; } + public DateTime? EndTime { get; set; } + public string WorkOrder { get; set; } + public string PatchCode { get; set; } + public string PackingCode { get; set; } + /// + /// 是否满箱 + /// + public int FillType { get; set; } + public string PartNumber { get; set; } + public string Machine { get; set; } + } + /// + /// 扫码追溯清单反馈列表 + /// + public class ProPackageDataBackListDto + { + // 主键 + public string Id { get; set; } + // 模块 + public string Module { get; set; } + /// + /// 标签搜索类型 1-产线 2-GP12 3-后道 4-成品入库 + /// + public int SearchType { get; set; } + // 机器 + public string Machine { get; set; } + // 工单号 + public string WorkOrder { get; set; } + // 零件号 + public string PartNumber { get; set; } + // 零件描述 + public string Description { get; set; } + // 箱条码 + public string PackageLabel { get; set; } + // 内标签条码 + public string InnerLabel { get; set; } + // 是否满箱标签 + public string FullMsg { get; set; } + // 班组 + public string Team { get; set; } + // 站点 + public string SiteNo { get; set; } + // 串口 + public string ComNo { get; set; } + // 备注 + public string Remark { get; set; } + // 创建时间 + public DateTime? CreateTime { get; set; } + } + + /// + /// 扫码追溯详细数据反馈列表 + /// + public class ProPackageDataBackRecordDto + { + // 主键 + public string Id { get; set; } + // 机器 + public string Machine { get; set; } + // 工单号 + public string WorkOrder { get; set; } + // 零件号 + public string PartNumber { get; set; } + // 零件描述 + public string Description { get; set; } + // 箱条码 + public string PackageLabel { get; set; } + // 内标签条码 + public string InnerLabel { get; set; } + // 是否满箱标签 + public string FullMsg { get; set; } + // 班组 + public string Team { get; set; } + // 站点 + public string SiteNo { get; set; } + // 串口 + public string ComNo { get; set; } + // 备注 + public string Remark { get; set; } + // 创建时间 + public DateTime? CreateTime { get; set; } + } +} \ No newline at end of file diff --git a/ZR.Service/mes/pro/IService/IProPackingDataBackService.cs b/ZR.Service/mes/pro/IService/IProPackingDataBackService.cs new file mode 100644 index 00000000..96f3e66d --- /dev/null +++ b/ZR.Service/mes/pro/IService/IProPackingDataBackService.cs @@ -0,0 +1,24 @@ +using ZR.Model; +using ZR.Model.mes.pro; +using ZR.Model.MES.pro.DTO; + +namespace ZR.Service.mes.pro.IService +{ + /// + /// 包装记录service接口 + /// + public interface IProPackingDataBackService : IBaseService + { + + List GetList(ProPackingDataBackQueryDto parm); + PagedInfo GetRecords(ProPackingDataBackRecordQueryDto parm); + //PagedInfo GetList(WmPackingrecordQueryDto parm); + + //WmPackingrecord GetInfo(long Id); + + //WmPackingrecord AddWmPackingrecord(WmPackingrecord parm); + + //int UpdateWmPackingrecord(WmPackingrecord parm); + + } +} diff --git a/ZR.Service/mes/pro/ProPackingDataBackService.cs b/ZR.Service/mes/pro/ProPackingDataBackService.cs new file mode 100644 index 00000000..68c61bea --- /dev/null +++ b/ZR.Service/mes/pro/ProPackingDataBackService.cs @@ -0,0 +1,333 @@ +using System; +using Infrastructure.Attribute; +using Infrastructure.Extensions; +using SqlSugar; +using ZR.Model; +using ZR.Model.Business; +using ZR.Model.mes.pro; +using ZR.Model.MES.pro.DTO; +using ZR.Model.MES.wms; +using ZR.Repository; + +namespace ZR.Service.mes.pro.IService +{ + /// + /// 标签记录追溯Service业务层处理 + /// + [AppService( + ServiceType = typeof(IProPackingDataBackService), + ServiceLifetime = LifeTime.Transient + )] + public class ProPackingDataBackService + : BaseService, + IProPackingDataBackService + { + public List GetList(ProPackingDataBackQueryDto parm) + { + try + { + Context.Ado.BeginTran(); + List newList = new(); + if ( + string.IsNullOrEmpty(parm.Label) + && string.IsNullOrEmpty(parm.WorkOrder) + && string.IsNullOrEmpty(parm.PackingCode) + ) + { + throw new Exception("请输入工单号/产品码/箱码任意一个!"); + } + // 根据包装标签打印记录,找出对应工单 + var predicate = Expressionable.Create(); + predicate + .AndIF( + !string.IsNullOrEmpty(parm.PartNumber), + it => it.PartNum == parm.PartNumber + ) + .AndIF(!string.IsNullOrEmpty(parm.Machine), it => it.Machine == parm.Machine) + .AndIF( + !string.IsNullOrEmpty(parm.WorkOrder), + it => it.WorkOrderNum == parm.WorkOrder + ) + .AndIF( + !string.IsNullOrEmpty(parm.PackingCode), + it => it.PackingCode.Contains(parm.PackingCode) + ) + .AndIF( + !string.IsNullOrEmpty(parm.Label), + it => it.ScannerContent.Contains(parm.Label) + ) + .AndIF( + parm.StartTime > DateTime.MinValue, + it => it.CreateTime >= parm.StartTime + ) + .AndIF(parm.EndTime > DateTime.MinValue, it => it.CreateTime <= parm.EndTime); + var response = Queryable() + .Where(predicate.ToExpression()) + .OrderByDescending(it => it.BFilled) + .First(); + if (response == null) + { + return newList; + } + // 零件号提取 + string _partNumber = response.PartNum ?? ""; + // 工单号提取 + string _workOrder = response.WorkOrderNum ?? ""; + // 产品条码提取 + string _label = response.ScannerContent ?? ""; + WmMaterial material = Context + .Queryable() + .Where(it => it.Partnumber == _partNumber) + .Where(it => it.Type == 1) + .Where(it => it.Status == 1) + .First(); + string _description = material.Description ?? "未知物料,不在物料清单或物料号不明确"; + ProPackageDataBackListDto newPackingRecordItem = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + SearchType = 1, + Module = "产线包装工序", + Machine = response.Machine, + WorkOrder = _workOrder, + PartNumber = _partNumber, + Description = _description, + PackageLabel = response.PackingCode, + InnerLabel = _label, + FullMsg = response.BFilled == true ? "满箱" : "零头箱", + Team = "", + SiteNo = "", + ComNo = "", + Remark = "", + CreateTime = response.CreateTime + }; + newList.Add(newPackingRecordItem); + // GP12 记录追溯 + QcGp12RecordLabelScan gp12LabelRecord = Context + .Queryable() + .Where(it => it.PartNumber == _partNumber) + .Where(it => it.Label.Contains(_workOrder)) + .Where(it => it.Type == "1") + .Where(it => it.Status == "1") + .First(); + if (gp12LabelRecord != null) + { + ProPackageDataBackListDto newGP12RecordItem = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + SearchType = 2, + Module = "GP12检验工序", + Machine = gp12LabelRecord.SiteNo, + WorkOrder = gp12LabelRecord.WorkOrder, + PartNumber = _partNumber, + Description = _description, + PackageLabel = "-", + InnerLabel = gp12LabelRecord.Label, + FullMsg = "-", + Team = gp12LabelRecord.Team, + SiteNo = gp12LabelRecord.SiteNo, + ComNo = gp12LabelRecord.ComNo, + Remark = "", + CreateTime = gp12LabelRecord.CreatedTime + }; + newList.Add(newGP12RecordItem); + } + + // 后道记录追溯 + QcBackEndRecordLabelScan backendLabelRecord = Context + .Queryable() + .Where(it => it.PartNumber == _partNumber) + .Where(it => it.Label.Contains(_workOrder)) + .Where(it => it.Type == "1") + .Where(it => it.Status == "1") + .First(); + if (backendLabelRecord != null) + { + ProPackageDataBackListDto newBackEndRecordItem = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + SearchType = 2, + Module = "GP12检验工序", + Machine = backendLabelRecord.SiteNo, + WorkOrder = backendLabelRecord.WorkOrder, + PartNumber = _partNumber, + Description = _description, + PackageLabel = "-", + InnerLabel = backendLabelRecord.Label, + FullMsg = "-", + Team = backendLabelRecord.Team, + SiteNo = backendLabelRecord.SiteNo, + ComNo = backendLabelRecord.ComNo, + Remark = "", + CreateTime = backendLabelRecord.CreatedTime + }; + newList.Add(newBackEndRecordItem); + } + + Context.Ado.CommitTran(); + return newList; + } + catch (Exception) + { + Context.Ado.RollbackTran(); + throw; + } + } + + public PagedInfo GetRecords( + ProPackingDataBackRecordQueryDto parm + ) + { + try + { + Context.Ado.BeginTran(); + // 工单号提取 + string _workOrder = parm.WorkOrder ?? ""; + // 零件号提取 + string _partNumber = parm.PartNumber ?? ""; + WmMaterial material = Context + .Queryable() + .Where(it => it.Partnumber == _partNumber) + .Where(it => it.Type == 1) + .Where(it => it.Status == 1) + .First(); + string _description = material.Description ?? "未知物料,不在物料清单或物料号不明确"; + PagedInfo newPageRecord = new(); + // 产线 + if (parm.SearchType == 1) + { + // 根据包装标签打印记录,找出对应工单 + var predicate = Expressionable.Create(); + predicate + .And(it => it.PartNum == parm.PartNumber) + .And(it => it.WorkOrderNum == parm.WorkOrder) + .AndIF( + !string.IsNullOrEmpty(parm.PackingCode), + it => it.PackingCode.Contains(parm.PackingCode) + ) + .AndIF( + !string.IsNullOrEmpty(parm.Machine), + it => it.Machine.Contains(parm.Machine) + ) + .AndIF( + parm.FillType != -1, + it => it.BFilled == (parm.FillType == 1) + ) + .AndIF( + parm.StartTime > DateTime.MinValue, + it => it.CreateTime >= parm.StartTime + ) + .AndIF( + parm.EndTime > DateTime.MinValue, + it => it.CreateTime <= parm.EndTime + ); + var response = Queryable() + .Where(predicate.ToExpression()) + .Select(it => new ProPackageDataBackRecordDto + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + Machine = it.Machine, + WorkOrder = it.WorkOrderNum, + PartNumber = it.PartNum, + Description = _description, + PackageLabel = it.PackingCode, + InnerLabel = it.ProductCode, + FullMsg = it.BFilled == true ? "满箱" : "零头箱", + Team = "", + SiteNo = "", + ComNo = "", + Remark = "", + CreateTime = it.CreateTime + }) + .ToPage(parm); + Context.Ado.CommitTran(); + return response; + } + if (parm.SearchType == 2) + { + // 根据包装标签打印记录,找出对应工单 + var predicate = Expressionable.Create(); + predicate + .And(it => it.PartNumber == parm.PartNumber) + .And(it => it.WorkOrder == parm.WorkOrder) + .AndIF( + parm.StartTime > DateTime.MinValue, + it => it.CreatedTime >= parm.StartTime + ) + .AndIF( + parm.EndTime > DateTime.MinValue, + it => it.CreatedTime <= parm.EndTime + ); + var response = Context + .Queryable() + .Where(predicate.ToExpression()) + .Select(it => new ProPackageDataBackRecordDto + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + Machine = "-", + WorkOrder = it.WorkOrder, + PartNumber = it.PartNumber, + Description = _description, + PackageLabel = it.Label, + InnerLabel = it.Label, + FullMsg = "-", + Team = it.Team, + SiteNo = it.SiteNo, + ComNo = it.ComNo, + Remark = "", + CreateTime = it.CreatedTime + }) + .ToPage(parm); + Context.Ado.CommitTran(); + return response; + } + if (parm.SearchType == 3) + { + // 根据包装标签打印记录,找出对应工单 + var predicate = Expressionable.Create(); + predicate + .And(it => it.PartNumber == parm.PartNumber) + .And(it => it.WorkOrder == parm.WorkOrder) + .AndIF( + parm.StartTime > DateTime.MinValue, + it => it.CreatedTime >= parm.StartTime + ) + .AndIF( + parm.EndTime > DateTime.MinValue, + it => it.CreatedTime <= parm.EndTime + ); + var response = Context + .Queryable() + .Where(predicate.ToExpression()) + .Select(it => new ProPackageDataBackRecordDto + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + Machine = "-", + WorkOrder = it.WorkOrder, + PartNumber = it.PartNumber, + Description = _description, + PackageLabel = it.Label, + InnerLabel = it.Label, + FullMsg = "-", + Team = it.Team, + SiteNo = it.SiteNo, + ComNo = it.ComNo, + Remark = "", + CreateTime = it.CreatedTime + }) + .ToPage(parm); + Context.Ado.CommitTran(); + return response; + } + return new PagedInfo(); + } + catch (Exception) + { + Context.Ado.RollbackTran(); + throw; + } + } + } +} diff --git a/ZR.Service/mes/qc/backend/QcBackEndService.cs b/ZR.Service/mes/qc/backend/QcBackEndService.cs index 99dae00d..e53db073 100644 --- a/ZR.Service/mes/qc/backend/QcBackEndService.cs +++ b/ZR.Service/mes/qc/backend/QcBackEndService.cs @@ -1092,19 +1092,32 @@ namespace ZR.Service.Business { batchCode = DateTime.Now.ToString("yyMMdd") + "000"; } - // 提取箱流水号 + int packageSort = 1; - QcBackendRecordLabelPrint labelPrintRecord = Context - .Queryable() - .Where(it => it.PartNumber == newLabelScran.PartNumber) - .Where(it => it.BatchCode.Contains(batchCode)) - .Where(it => it.LabelType == 1) - .OrderByDescending(it => it.SerialNumber) - .First(); - if (labelPrintRecord != null) + + // 使用SqlSugar的事务处理 + Context.Ado.BeginTran(); + try { - packageSort = labelPrintRecord.SerialNumber + 1 ?? 1; + // 查询最新流水号 + QcBackendRecordLabelPrint labelPrintRecord = Context + .Queryable() + .Where(it => it.PartNumber == newLabelScran.PartNumber) + .Where(it => it.BatchCode.Contains(batchCode)) + .Where(it => it.LabelType == 1) + .OrderByDescending(it => it.SerialNumber) + .First(); + + packageSort = labelPrintRecord?.SerialNumber + 1 ?? 1; + + Context.Ado.CommitTran(); } + catch (Exception) + { + Context.Ado.RollbackTran(); + throw; + } + // 提取产品描述 string checkPartnumber = newLabelScran.PartNumber; // 使用正则表达式匹配并移除特殊后缀 @@ -1114,25 +1127,32 @@ namespace ZR.Service.Business "", RegexOptions.IgnoreCase ); + WmMaterial material = Context .Queryable() .Where(it => it.Partnumber == processedPartnumber) .Where(it => it.Type == 1) .Where(it => it.Status == 1) .First(); + if (material == null) { throw new Exception("生成打印后道外箱标签的信息:此零件号不在物料清单内!" + processedPartnumber); } + // 生成工单号 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}^IsFull={isFull}^IsAgain={isAgain}"; + string newPackageCode = $"BOX:PGW{workOrder}{newLabelScran.Team}1"; + QcBackEndPrintMqttEventDto mqttEventDto = new() { @@ -1154,6 +1174,7 @@ namespace ZR.Service.Business LabelType = 1, CreatedTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; + return mqttEventDto; }