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