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
+ }
+
}
}