This commit is contained in:
2025-05-15 17:55:59 +08:00
parent fc68f88ca0
commit 3e6c4411b2
2 changed files with 153 additions and 37 deletions

View File

@@ -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<QcBackEndBaseLabelAnalysis>()
.And(it => it.Code == "BatchCode")
.And(it => it.Status == "1");
List<QcBackEndBaseLabelAnalysis> analysisList = Context
.Queryable<QcBackEndBaseLabelAnalysis>()
.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<QcBackEndAlterationDefectDto> GetDefectInitOptions()
{
List<QcBackEndAlterationDefectDto> defectList = new();
@@ -277,6 +307,7 @@ namespace ZR.Service.Business
.Queryable<QcBackEndServiceWorkorder>()
.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}";
}
}
/// <summary>
@@ -716,7 +746,7 @@ namespace ZR.Service.Business
public void CheckAndPrintPackageLabel(QcBackEndRecordLabelScan newLabelScran)
{
DateTime nowTime = DateTime.Now;
// 找到最大箱容量与模板
// 找到最大箱容量与打印模板
QcBackEndServiceWorkorder workorder = Context
.Queryable<QcBackEndServiceWorkorder>()
.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<QcBackEndRecordLabelScan>()
.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
/// </summary>
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
}
}
/// <summary>
/// 生成打印后道外箱标签的mqtt信息
/// </summary>
/// <param name="newLabelScran"></param>
/// <param name="path"></param>
/// <returns></returns>
public QcBackEndPrintMqttEventDto CreateNewQcBackEndPrintMqttEventDto(
QcBackEndRecordLabelScan newLabelScran,
string path,
int maxPackage
)
{
// 提取箱流水号
int packageSort = 0;
QcBackEndRecordLabelScan packagelabelScan = Context
.Queryable<QcBackEndRecordLabelScan>()
.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<WmMaterial>()
.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