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