diff --git a/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs b/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs index 828d34db..11ae4675 100644 --- a/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs +++ b/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs @@ -176,5 +176,28 @@ namespace ZR.Admin.WebApi.Controllers return SUCCESS(response); } + + /// + /// 自动生成标签记录 + /// + /// + [HttpPost("GenerateVirtualLabel")] + [AllowAnonymous] + public IActionResult GenerateVirtualLabel([FromBody] QcGp12WorkorderDetailDto parm) + { + try + { + var modal = parm.Adapt().ToCreate(HttpContext); + + var response = _QcGp12Service.GenerateVirtualLabel(modal); + + return SUCCESS(response); + } + catch (Exception ex) + { + return ToResponse(ApiResult.Error(ex.Message)); + } + + } } } diff --git a/ZR.Admin.WebApi/DataProtection/key-f640f114-5530-4155-93d1-18881f207ae2.xml b/ZR.Admin.WebApi/DataProtection/key-f640f114-5530-4155-93d1-18881f207ae2.xml new file mode 100644 index 00000000..05aa6644 --- /dev/null +++ b/ZR.Admin.WebApi/DataProtection/key-f640f114-5530-4155-93d1-18881f207ae2.xml @@ -0,0 +1,16 @@ + + + 2025-02-10T03:30:32.3322015Z + 2025-02-10T03:30:32.1838996Z + 2025-05-11T03:30:32.1838996Z + + + + + + + REaFIE6cup/0qF8KszWBx7UGvUJ57UOYEZuPcYu50gGn3+pASnFwUdgwwDFLRKozGD0w9lLToqhYT4gEcPT4rA== + + + + \ No newline at end of file diff --git a/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs b/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs index 2597ec24..af017047 100644 --- a/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs +++ b/ZR.Model/MES/wms/WmPolishWorkQualityStatistics.cs @@ -289,6 +289,7 @@ namespace ZR.Model.MES.wms /// 是否是返工件 /// [SugarColumn(ColumnName = "is_return_workpiece")] + //[SugarColumn(IsIgnore = true)] public bool IsReturnWorkpiece { get; set; } = false; /// diff --git a/ZR.Service/mes/qc/IService/IQcGp12Service.cs b/ZR.Service/mes/qc/IService/IQcGp12Service.cs index d7308b9c..36632c7b 100644 --- a/ZR.Service/mes/qc/IService/IQcGp12Service.cs +++ b/ZR.Service/mes/qc/IService/IQcGp12Service.cs @@ -38,8 +38,8 @@ namespace ZR.Service.Business.IBusinessService /// /// 解析标签 /// - /// 标签内容 - /// 解析方法 + /// 标签内容 扫码内容 + /// 解析方法 1-全解析 2-只看零件号 /// QcGp12LabelAnalysisDto AnalyzeLabelToDto(string label,int type); @@ -76,8 +76,15 @@ namespace ZR.Service.Business.IBusinessService /// /// 更新工单相关信息 /// - /// + /// 工单号 /// public QcGp12ServiceWorkorder UpdateWorkOrderDetail(string workorder); + + /// + /// 生成虚拟标签 + /// + /// 工单信息 + /// + public QcGp12ServiceWorkorder GenerateVirtualLabel(QcGp12WorkorderDetailDto workorderDetail); } } diff --git a/ZR.Service/mes/qc/QcGp12Service.cs b/ZR.Service/mes/qc/QcGp12Service.cs index 3bc30602..2a9793c3 100644 --- a/ZR.Service/mes/qc/QcGp12Service.cs +++ b/ZR.Service/mes/qc/QcGp12Service.cs @@ -253,6 +253,16 @@ namespace ZR.Service.Business // 没有旧记录则开启新的记录 try { + // 检查箱标签是否当内标签扫过 + bool isInnerLabelScan = Context + .Queryable() + .Where(it => it.Label == data.Label) + .Where(it => it.LabelType == 2) + .Any(); + if (isInnerLabelScan) + { + throw new Exception("标签异常,该标签已经当内标签扫过!"); + } Context.Ado.BeginTran(); DateTime nowTime = DateTime.Now; // 创建新工单号 @@ -768,5 +778,120 @@ namespace ZR.Service.Business (double)data.QualifiedNumber.Value / data.RequireNumber.Value * 100; return $"{qualifiedRate:F1}%"; } + + public QcGp12ServiceWorkorder GenerateVirtualLabel(QcGp12WorkorderDetailDto workorderDetail) + { + try + { + Context.Ado.BeginTran(); + + // 检查当前工单已扫码合格数 + int qualifiedNumber = workorderDetail.QualifiedNumber ?? -1; + if (qualifiedNumber < 0) + { + throw new ArgumentException("传入合格数异常!", nameof(workorderDetail.QualifiedNumber)); + } + + int labelCount = GetLabelCountForWorkOrder(workorderDetail.WorkOrder); + + if (labelCount < qualifiedNumber) + { + GenerateVirtualLabels(workorderDetail, qualifiedNumber - labelCount); + } + else if (labelCount > qualifiedNumber) + { + DeleteExcessLabels(workorderDetail.WorkOrder, labelCount - qualifiedNumber); + } + + Context.Ado.CommitTran(); + return UpdateWorkOrderDetail(workorderDetail.WorkOrder); + } + catch (Exception e) + { + Context.Ado.RollbackTran(); + throw new Exception($"生成虚拟标签时出错: {e.Message}", e); + } + } + + private int GetLabelCountForWorkOrder(string workOrder) + { + return Context.Queryable() + .Where(it => it.WorkOrder == workOrder && it.LabelType == 2) + .Count(); + } + + private void GenerateVirtualLabels(QcGp12WorkorderDetailDto workOrderDetail, int countToGenerate) + { + List virtualLabels = new List(); + int nextLabelNumber = GetNextLabelNumber(workOrderDetail.WorkOrder); + + for (int i = 0; i < countToGenerate; i++) + { + string uniqueLabel = GenerateUniqueSequentialLabel(workOrderDetail.WorkOrder, nextLabelNumber++); + virtualLabels.Add(new QcGp12RecordLabelScan + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = workOrderDetail.WorkOrder, + PartNumber = workOrderDetail.PartNumber, + Team = workOrderDetail.Team, + SiteNo = workOrderDetail.SiteNo, + ComNo = workOrderDetail.ComNo, + ScanTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"), + Type = "2", + Status = "1", + Remark = "虚拟标签", + CreatedTime = DateTime.UtcNow, + CreatedBy = "系统", + LabelType = 2, + LabelSort = nextLabelNumber, + Label = uniqueLabel + }); + } + + Context.Insertable(virtualLabels).ExecuteCommand(); + } + + private void DeleteExcessLabels(string workOrder, int countToDelete) + { + var labelsToDelete = Context.Queryable() + .Where(it => it.WorkOrder == workOrder && it.LabelType == 2) + .OrderByDescending(it => it.LabelSort) + .Take(countToDelete) + .ToList(); + + Context.Deleteable(labelsToDelete).ExecuteCommand(); + } + + private int GetNextLabelNumber(string workOrder) + { + return Context.Queryable() + .Where(it => it.WorkOrder == workOrder && it.LabelType == 2) + .Max(it => it.LabelSort ?? 0); + } + + private string GenerateUniqueSequentialLabel(string workOrder, int number) + { + const string prefix = "VIRT"; + string baseLabel = $"{prefix}-{GenerateUniqueId()}-{number:D5}"; + string uniqueLabel = baseLabel; + while (IsLabelExists(workOrder, uniqueLabel)) + { + uniqueLabel = $"{baseLabel}-{GenerateUniqueId()}"; + } + + return uniqueLabel; + } + + private bool IsLabelExists(string workOrder, string label) + { + return Context.Queryable() + .Any(it => it.WorkOrder == workOrder && it.LabelType == 2 && it.Label == label); + } + + private string GenerateUniqueId() + { + return Guid.NewGuid().ToString("N").Substring(0, 10); // Generate a 10-character unique ID + } + } }