From a59e6c230246caf02e4f2cc639029c8a9de8c4ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=AD=A3=E6=98=93?= Date: Tue, 7 Jan 2025 17:25:08 +0800 Subject: [PATCH] =?UTF-8?q?GP12=E8=A7=A6=E6=91=B8=E5=B1=8F=E7=BC=BA?= =?UTF-8?q?=E9=99=B7=E9=A1=B9=E7=82=B9=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/qc/GP12/QcGp12Controller.cs | 109 ++- ZR.Model/MES/qc/DTO/QcGp12BaseDefectDto.cs | 4 + .../MES/qc/DTO/QcGp12BaseLabelAnalysisDto.cs | 23 +- .../MES/qc/DTO/QcGp12RecordLabelScanDto.cs | 43 +- .../qc/DTO/QcGp12RecordWorkorderDefectDto.cs | 36 + .../MES/qc/DTO/QcGp12ServiceStatisticsDto.cs | 2 + .../MES/qc/DTO/QcGp12ServiceWorkorderDto.cs | 62 ++ ZR.Model/MES/qc/QcGp12ServiceStatistics.cs | 6 + ZR.Model/MES/qc/QcGp12ServiceWorkorder.cs | 12 + ZR.Service/mes/qc/IService/IQcGp12Service.cs | 37 + ZR.Service/mes/qc/QcGp12Service.cs | 687 ++++++++++++++++-- 11 files changed, 946 insertions(+), 75 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs b/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs index eff8bf4f..99f83122 100644 --- a/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs +++ b/ZR.Admin.WebApi/Controllers/mes/qc/GP12/QcGp12Controller.cs @@ -1,9 +1,9 @@ using Microsoft.AspNetCore.Mvc; -using ZR.Model.Dto; -using ZR.Model.Business; -using ZR.Service.Business.IBusinessService; using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; +using ZR.Model.Business; +using ZR.Model.Dto; +using ZR.Service.Business.IBusinessService; //创建时间:2025-01-02 namespace ZR.Admin.WebApi.Controllers @@ -23,6 +23,7 @@ namespace ZR.Admin.WebApi.Controllers { _QcGp12Service = QcGp12Service; } + /// /// 获取班组下拉 /// @@ -34,6 +35,7 @@ namespace ZR.Admin.WebApi.Controllers var response = _QcGp12Service.GetGroupOptions(); return SUCCESS(response); } + /// /// 获取站点下拉 /// @@ -45,6 +47,7 @@ namespace ZR.Admin.WebApi.Controllers var response = _QcGp12Service.GetStieOptions(); return SUCCESS(response); } + /// /// 获取缺陷项初始数据 /// @@ -56,6 +59,7 @@ namespace ZR.Admin.WebApi.Controllers var response = _QcGp12Service.GetDefectInitOptions(); return SUCCESS(response); } + /// /// 解析标签 /// @@ -64,35 +68,94 @@ namespace ZR.Admin.WebApi.Controllers /// [HttpGet("AnalyzeLabel")] [AllowAnonymous] - public IActionResult AnalyzeLabel(string label,int type) + public IActionResult AnalyzeLabel(string label, int type) { - var response = _QcGp12Service.AnalyzeLabelToDto(label,type); + var response = _QcGp12Service.AnalyzeLabelToDto(label, type); return SUCCESS(response); } - /// - /// 查询质量GP12工单业务模块列表 - /// - /// - /// -/* [HttpGet("list")] - public IActionResult QueryQcGp12ServiceWorkorder([FromQuery] QcGp12ServiceWorkorderQueryDto parm) - { - var response = _QcGp12Service.GetList(parm); - return SUCCESS(response); - }*/ /// - /// 添加质量GP12工单业务模块 + /// 开始工单 /// /// -/* [HttpPost("post")] - public IActionResult AddQcGp12ServiceWorkorder([FromBody] QcGp12ServiceWorkorderDto parm) + [HttpPost("StartGP12WorkOrder")] + [AllowAnonymous] + public IActionResult StartGP12WorkOrder([FromBody] QcGp12WorkorderDetailDto parm) { - var modal = parm.Adapt().ToCreate(HttpContext); + var modal = parm.Adapt().ToCreate(HttpContext); - var response = _QcGp12ServiceWorkorderService.AddQcGp12ServiceWorkorder(modal); + var response = _QcGp12Service.StartGP12WorkOrder(modal); return SUCCESS(response); - }*/ + } + + /// + /// 修改缺陷项 + /// + /// + [HttpPost("ChangeWorkOrderDefect")] + [AllowAnonymous] + public IActionResult StartGP12WorkOrder([FromBody] QcGp12WorkorderDefectDto parm) + { + var modal = parm.Adapt().ToCreate(HttpContext); + + var response = _QcGp12Service.ChangeWorkOrderDefect(modal); + + return SUCCESS(response); + } + + /// + /// 获取工单缺陷项 + /// + /// + [HttpGet("GetWorkOrderDefectList")] + [AllowAnonymous] + public IActionResult GetWorkOrderDefectList(string workOrder) + { + var response = _QcGp12Service.GetWorkOrderDefectList(workOrder); + + return SUCCESS(response); + } + + /// + /// 扫描内标签,添加标签记录 + /// + /// + [HttpPost("ScanInnerLabel")] + [AllowAnonymous] + public IActionResult ScanInnerLabel([FromBody] QcGp12LabelScanDto parm) + { + var modal = parm.Adapt().ToCreate(HttpContext); + + var response = _QcGp12Service.ScanInnerLabel(modal); + + return SUCCESS(response); + } + + /// + /// 结束工单,并生成质量报表 + /// + /// + [HttpGet("EndGP12WorkOrderAndCreateStatistics")] + [AllowAnonymous] + public IActionResult EndGP12WorkOrderAndCreateStatistics(string workOrder) + { + var response = _QcGp12Service.EndGP12WorkOrderAndCreateStatistics(workOrder); + + return SUCCESS(response); + } + + /// + /// 更新工单相关信息 + /// + /// + [HttpGet("UpdateWorkOrderDetail")] + [AllowAnonymous] + public IActionResult UpdateWorkOrderDetail(string workOrder) + { + var response = _QcGp12Service.UpdateWorkOrderDetail(workOrder); + + return SUCCESS(response); + } } -} \ No newline at end of file +} diff --git a/ZR.Model/MES/qc/DTO/QcGp12BaseDefectDto.cs b/ZR.Model/MES/qc/DTO/QcGp12BaseDefectDto.cs index c4120154..cab28934 100644 --- a/ZR.Model/MES/qc/DTO/QcGp12BaseDefectDto.cs +++ b/ZR.Model/MES/qc/DTO/QcGp12BaseDefectDto.cs @@ -64,5 +64,9 @@ namespace ZR.Model.Dto /// 缺陷项类别 1-抛光 2-打磨 3-报废 /// public string Type { get; set; } + /// + /// 缺陷项数量 + /// + public int Num { get; set; } = 0; } } \ No newline at end of file diff --git a/ZR.Model/MES/qc/DTO/QcGp12BaseLabelAnalysisDto.cs b/ZR.Model/MES/qc/DTO/QcGp12BaseLabelAnalysisDto.cs index d883f6b2..9280f7c4 100644 --- a/ZR.Model/MES/qc/DTO/QcGp12BaseLabelAnalysisDto.cs +++ b/ZR.Model/MES/qc/DTO/QcGp12BaseLabelAnalysisDto.cs @@ -5,9 +5,7 @@ namespace ZR.Model.Dto /// /// 质量GP12基础标签解析查询对象 /// - public class QcGp12BaseLabelAnalysisQueryDto : PagerInfo - { - } + public class QcGp12BaseLabelAnalysisQueryDto : PagerInfo { } /// /// 质量GP12基础标签解析输入输出对象 @@ -38,8 +36,8 @@ namespace ZR.Model.Dto public string UpdatedBy { get; set; } public DateTime? UpdatedTime { get; set; } - } + /// /// GP12标签解析标准模板 /// @@ -49,30 +47,47 @@ namespace ZR.Model.Dto /// 解析是否成功 /// public bool IsOk { get; set; } + /// /// 解析结果 /// public string Msg { get; set; } + + /// + /// 标签类型 1- 外箱标签 2-内标签 + /// + public string LabelType { get; set; } + + /// + /// 标签内容 + /// + public string LabelCode { get; set; } + /// /// 工单号 /// public string Workorder { get; set; } + /// /// 零件号 /// public string Partnumber { get; set; } + /// /// 规格 /// public string Specification { get; set; } + /// /// 颜色 /// public string Color { get; set; } + /// /// 描述 /// public string Description { get; set; } + /// /// 零件数 /// diff --git a/ZR.Model/MES/qc/DTO/QcGp12RecordLabelScanDto.cs b/ZR.Model/MES/qc/DTO/QcGp12RecordLabelScanDto.cs index 4f94bb41..4e482f6d 100644 --- a/ZR.Model/MES/qc/DTO/QcGp12RecordLabelScanDto.cs +++ b/ZR.Model/MES/qc/DTO/QcGp12RecordLabelScanDto.cs @@ -5,9 +5,7 @@ namespace ZR.Model.Dto /// /// 质量GP12扫码标签记录查询对象 /// - public class QcGp12RecordLabelScanQueryDto : PagerInfo - { - } + public class QcGp12RecordLabelScanQueryDto : PagerInfo { } /// /// 质量GP12扫码标签记录输入输出对象 @@ -49,8 +47,39 @@ namespace ZR.Model.Dto public string UpdatedBy { get; set; } public DateTime? UpdatedTime { get; set; } - - - } -} \ No newline at end of file + + public class QcGp12LabelScanDto + { + public string WorkOrder { get; set; } + + public string PartNumber { get; set; } + + public string Team { get; set; } + + public string SiteNo { get; set; } + + public string ComNo { get; set; } + public string Label { get; set; } + + public int? LabelType { get; set; } + + public int? LabelSort { get; set; } + + public string ScanTime { get; set; } + + public string Type { get; set; } + + public string Status { get; set; } + + public string Remark { get; set; } + + public string CreatedBy { get; set; } + + public DateTime? CreatedTime { get; set; } + + public string UpdatedBy { get; set; } + + public DateTime? UpdatedTime { get; set; } + } +} diff --git a/ZR.Model/MES/qc/DTO/QcGp12RecordWorkorderDefectDto.cs b/ZR.Model/MES/qc/DTO/QcGp12RecordWorkorderDefectDto.cs index aefe722a..49299b1f 100644 --- a/ZR.Model/MES/qc/DTO/QcGp12RecordWorkorderDefectDto.cs +++ b/ZR.Model/MES/qc/DTO/QcGp12RecordWorkorderDefectDto.cs @@ -50,8 +50,44 @@ namespace ZR.Model.Dto public string UpdatedBy { get; set; } public DateTime? UpdatedTime { get; set; } + } + public class QcGp12WorkorderDefectDto + { + public string Id { get; set; } + public string WorkOrder { get; set; } + public string PartNumber { get; set; } + + public string Team { get; set; } + + public string SiteNo { get; set; } + + public string ComNo { get; set; } + + public string DefectCode { get; set; } + + public string DefectName { get; set; } + + public string DefectType { get; set; } + + public int? DefectNum { get; set; } + + public string ClickTime { get; set; } + + public string Type { get; set; } + + public string Status { get; set; } + + public string Remark { get; set; } + + public string CreatedBy { get; set; } + + public DateTime? CreatedTime { get; set; } + + public string UpdatedBy { get; set; } + + public DateTime? UpdatedTime { get; set; } } } \ No newline at end of file diff --git a/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs b/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs index 8cb64eb8..fadad186 100644 --- a/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs +++ b/ZR.Model/MES/qc/DTO/QcGp12ServiceStatisticsDto.cs @@ -53,6 +53,8 @@ namespace ZR.Model.Dto public string QualifiedRate { get; set; } + public int? PolishNumber { get; set; } + public int? DamoNumber { get; set; } public int? BaofeiNumber { get; set; } diff --git a/ZR.Model/MES/qc/DTO/QcGp12ServiceWorkorderDto.cs b/ZR.Model/MES/qc/DTO/QcGp12ServiceWorkorderDto.cs index e8778fc6..cd615727 100644 --- a/ZR.Model/MES/qc/DTO/QcGp12ServiceWorkorderDto.cs +++ b/ZR.Model/MES/qc/DTO/QcGp12ServiceWorkorderDto.cs @@ -19,6 +19,8 @@ namespace ZR.Model.Dto public string WorkOrder { get; set; } + public int SerialNumber { get; set; } + public string PartNumber { get; set; } public string Description { get; set; } @@ -51,6 +53,8 @@ namespace ZR.Model.Dto public int? QualifiedNumber { get; set; } + public int? PolishNumber { get; set; } + public int? DamoNumber { get; set; } public int? BaofeiNumber { get; set; } @@ -68,8 +72,66 @@ namespace ZR.Model.Dto public string UpdatedBy { get; set; } public DateTime? UpdatedTime { get; set; } + } + public class QcGp12WorkorderDetailDto + { + public string Id { get; set; } + public string WorkOrder { get; set; } + public int SerialNumber { get; set; } + + public string PartNumber { get; set; } + + public string Description { get; set; } + + public string Specification { get; set; } + + public string Color { get; set; } + + public string Team { get; set; } + + public string SiteNo { get; set; } + + public string ComNo { get; set; } + + public int? IsOnetime { get; set; } + + public int? IsBack { get; set; } + + public int? IsPolish { get; set; } + + public int? IsOut { get; set; } + + public DateTime? StartTime { get; set; } + + public DateTime? EndTime { get; set; } + + public string Label { get; set; } + + public int? RequireNumber { get; set; } + + public int? QualifiedNumber { get; set; } + + public int? PolishNumber { get; set; } + + public int? DamoNumber { get; set; } + + public int? BaofeiNumber { get; set; } + + public string Type { get; set; } + + public string Status { get; set; } + + public string Remark { get; set; } + + public string CreatedBy { get; set; } + + public DateTime? CreatedTime { get; set; } + + public string UpdatedBy { get; set; } + + public DateTime? UpdatedTime { get; set; } } } \ No newline at end of file diff --git a/ZR.Model/MES/qc/QcGp12ServiceStatistics.cs b/ZR.Model/MES/qc/QcGp12ServiceStatistics.cs index 81404193..0659fcec 100644 --- a/ZR.Model/MES/qc/QcGp12ServiceStatistics.cs +++ b/ZR.Model/MES/qc/QcGp12ServiceStatistics.cs @@ -116,6 +116,12 @@ namespace ZR.Model.Business [SugarColumn(ColumnName = "qualified_rate")] public string QualifiedRate { get; set; } + /// + /// 抛光数 + /// + [SugarColumn(ColumnName = "polish_number")] + public int? PolishNumber { get; set; } + /// /// 打磨数 /// diff --git a/ZR.Model/MES/qc/QcGp12ServiceWorkorder.cs b/ZR.Model/MES/qc/QcGp12ServiceWorkorder.cs index 58320931..b8bfa2f2 100644 --- a/ZR.Model/MES/qc/QcGp12ServiceWorkorder.cs +++ b/ZR.Model/MES/qc/QcGp12ServiceWorkorder.cs @@ -19,6 +19,13 @@ namespace ZR.Model.Business [SugarColumn(ColumnName = "work_order")] public string WorkOrder { get; set; } + + /// + /// 流水号 + /// + [SugarColumn(ColumnName = "serial_number")] + public int SerialNumber { get; set; } + /// /// 零件号 /// @@ -110,6 +117,11 @@ namespace ZR.Model.Business [SugarColumn(ColumnName = "qualified_number")] public int? QualifiedNumber { get; set; } + /// + /// 抛光数 + /// + [SugarColumn(ColumnName = "polish_number")] + public int? PolishNumber { get; set; } /// /// 打磨数 /// diff --git a/ZR.Service/mes/qc/IService/IQcGp12Service.cs b/ZR.Service/mes/qc/IService/IQcGp12Service.cs index ee1f3d33..c7b2516f 100644 --- a/ZR.Service/mes/qc/IService/IQcGp12Service.cs +++ b/ZR.Service/mes/qc/IService/IQcGp12Service.cs @@ -36,5 +36,42 @@ namespace ZR.Service.Business.IBusinessService /// 解析方法 /// QcGp12LabelAnalysisDto AnalyzeLabelToDto(string label,int type); + + /// + /// 开始工单(标签重复则开启旧工单) + /// + /// + QcGp12ServiceWorkorder StartGP12WorkOrder(QcGp12WorkorderDetailDto data); + + /// + /// 工单缺陷项修改 + /// + /// + QcGp12ServiceWorkorder ChangeWorkOrderDefect(QcGp12WorkorderDefectDto data); + + /// + /// 触摸屏工单缺陷项获取 + /// + /// + List GetWorkOrderDefectList(string workorder); + + /// + /// 触摸屏扫内标签零件 + /// + /// + string ScanInnerLabel(QcGp12LabelScanDto data); + + /// + /// 结束工单并生成质量报表 + /// + /// + string EndGP12WorkOrderAndCreateStatistics(string workorder); + + /// + /// 更新工单相关信息 + /// + /// + /// + public QcGp12ServiceWorkorder UpdateWorkOrderDetail(string workorder); } } diff --git a/ZR.Service/mes/qc/QcGp12Service.cs b/ZR.Service/mes/qc/QcGp12Service.cs index 7d36bd5c..e06d0596 100644 --- a/ZR.Service/mes/qc/QcGp12Service.cs +++ b/ZR.Service/mes/qc/QcGp12Service.cs @@ -1,15 +1,23 @@ using System; -using SqlSugar; +using System.Globalization; +using System.Linq; +using System.Text.Json; +using System.Text.RegularExpressions; +using System.Transactions; +using Aliyun.OSS; +using AutoMapper; using Infrastructure.Attribute; using Infrastructure.Extensions; +using JinianNet.JNTemplate; +using Microsoft.AspNetCore.Http.HttpResults; +using SqlSugar; using ZR.Model; -using ZR.Model.Dto; using ZR.Model.Business; +using ZR.Model.Dto; +using ZR.Model.MES.wms; using ZR.Repository; using ZR.Service.Business.IBusinessService; -using System.Linq; -using Aliyun.OSS; -using System.Text.RegularExpressions; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace ZR.Service.Business { @@ -21,63 +29,144 @@ namespace ZR.Service.Business { public QcGp12LabelAnalysisDto AnalyzeLabelToDto(string label, int type) { - QcGp12LabelAnalysisDto labelAnalysisDto = new(); - labelAnalysisDto.IsOk = true; - labelAnalysisDto.Msg = "解析成功!"; - // 零件号抓取 - var predicate = Expressionable.Create() + QcGp12LabelAnalysisDto labelAnalysisDto = + new() + { + IsOk = true, + Msg = "解析成功!", + LabelCode = label, + }; + // 判断内外箱标签 + + // 解析零件号 + labelAnalysisDto.Partnumber = DoAnalyzePartnumber(label); + // 解析数量 + labelAnalysisDto.Number = DoAnalyzeQuantity(label); + if (string.IsNullOrEmpty(labelAnalysisDto.Partnumber)) + { + labelAnalysisDto.IsOk = false; + labelAnalysisDto.Msg = "标签,零件号解析异常!"; + } + + // TYPE === 1 时,同时根据物料清单获取详细信息 + if (type == 1) + { + WmMaterial material = Context + .Queryable() + .Where(it => it.Partnumber == labelAnalysisDto.Partnumber) + .Where(it => it.Type == 1) + .Where(it => it.Status == 1) + .First(); + if (material == null) + { + labelAnalysisDto.IsOk = false; + labelAnalysisDto.Msg = "物料清单内无此零件号!请检查物料清单:" + labelAnalysisDto.Partnumber; + } + else + { + labelAnalysisDto.Color = material.Color; + labelAnalysisDto.Specification = material.Specification; + labelAnalysisDto.Description = !string.IsNullOrEmpty(material.Description) + ? material.Description + : material.ProductName; + } + } + + return labelAnalysisDto; + } + + // 零件号解析 + public string DoAnalyzePartnumber(string label) + { + // 外箱标签零件号抓取 + var predicate = Expressionable + .Create() .And(it => it.Code == "PartNumber") .And(it => it.Status == "1"); - List analysisList = Context.Queryable() + List analysisList = Context + .Queryable() .Where(predicate.ToExpression()) .ToList(); foreach (QcGp12BaseLabelAnalysis analysis in analysisList) { - if(string.IsNullOrEmpty(analysis.Expression)) + if (string.IsNullOrEmpty(analysis.Expression)) { continue; } // 零件号正则表达式 - Regex pattern = new Regex(@analysis.Expression); + Regex pattern = new(@analysis.Expression); Match match = pattern.Match(label); if (match.Success && match.Groups.Count > 1) { - labelAnalysisDto.Partnumber = match.Groups[1].Value; - break; + return match.Groups[1].Value; } } - if (string.IsNullOrEmpty(labelAnalysisDto.Partnumber)) + return ""; + } + + // 数量解析 + public int DoAnalyzeQuantity(string label) + { + int result = 0; + // 外箱标签零件号抓取 + var predicate = Expressionable + .Create() + .And(it => it.Code == "Quantity") + .And(it => it.Status == "1"); + List analysisList = Context + .Queryable() + .Where(predicate.ToExpression()) + .ToList(); + foreach (QcGp12BaseLabelAnalysis analysis in analysisList) { - labelAnalysisDto.IsOk = false; - labelAnalysisDto.Msg = "零件号标签解析异常!"; + if (string.IsNullOrEmpty(analysis.Expression)) + { + continue; + } + // 零件号正则表达式 + Regex pattern = new(@analysis.Expression); + Match match = pattern.Match(label); + if (match.Success && match.Groups.Count > 1) + { + if (Int32.TryParse(match.Groups[1].Value, out result)) + { + return result; + } + else + { + return -1; + } + } } - return labelAnalysisDto; + return -1; } public List GetDefectInitOptions() { List defectList = new(); - var predicate = Expressionable.Create() - .And(it => it.Status == "1"); - List groupList = Context.Queryable() + var predicate = Expressionable.Create().And(it => it.Status == "1"); + List groupList = Context + .Queryable() .Where(predicate.ToExpression()) - .GroupBy(it=>it.Group) + .GroupBy(it => it.Group) .Select(it => it.Group) .ToList(); foreach (string group in groupList) { QcGp12AlterationDefectDto defectDto = new(); defectDto.GroupName = group; - List children = Context.Queryable() - .Where(it=>it.Group == group) - .Where(predicate.ToExpression()) - .Select(it=> new QcGp12ChildrenDefectDto - { - Name = it.Name, - Code = it.Code, - Type = it.Type - }) - .ToList(); + List children = Context + .Queryable() + .Where(it => it.Group == group) + .Where(predicate.ToExpression()) + .Select(it => new QcGp12ChildrenDefectDto + { + Name = it.Name, + Code = it.Code, + Type = it.Type, + Num = 0 + }) + .ToList(); defectDto.Children = children; defectList.Add(defectDto); } @@ -86,26 +175,542 @@ namespace ZR.Service.Business public List GetGroupOptions() { - var predicate = Expressionable.Create() - .And(it=>it.Status == "1"); + var predicate = Expressionable.Create().And(it => it.Status == "1"); - var response = Context.Queryable() + var response = Context + .Queryable() .Where(predicate.ToExpression()) - .Select(it=> new QcGp12BaseGroupDto()) + .Select(it => new QcGp12BaseGroupDto()) .ToList(); return response; } public List GetStieOptions() { - var predicate = Expressionable.Create() - .And(it => it.Status == "1"); + var predicate = Expressionable.Create().And(it => it.Status == "1"); - var response = Context.Queryable() + var response = Context + .Queryable() .Where(predicate.ToExpression()) .Select(it => new QcGp12BaseSiteDto()) .ToList(); return response; } + + public QcGp12ServiceWorkorder StartGP12WorkOrder(QcGp12WorkorderDetailDto data) + { + // 检查是否是已扫过的外箱标签 + QcGp12ServiceWorkorder oldWorkOrder = Context + .Queryable() + .Where(it => it.Label == data.Label) + .First(); + if (oldWorkOrder != null) + { + return oldWorkOrder; + } + // 没有旧记录则开启新的记录 + try + { + Context.Ado.BeginTran(); + DateTime nowTime = DateTime.Now; + // 创建新工单号 + QcGp12WorkorderDetailDto workorderInfo = GetNewWorkOrderCreate(data); + // 赋值 + data.WorkOrder = workorderInfo.WorkOrder; + data.SerialNumber = workorderInfo.SerialNumber; + data.StartTime = nowTime; + QcGp12ServiceWorkorder newModel = GetNewWorkOrderInfo(data); + QcGp12ServiceWorkorder result = Context.Insertable(newModel).ExecuteReturnEntity(); + if (result == null) + { + Context.Ado.RollbackTran(); + throw new Exception("插入新工单异常"); + } + // 工单开始记录 + QcGp12RecordLabelScan newScanLabelRecord = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = result.WorkOrder, + PartNumber = result.PartNumber, + Team = result.Team, + SiteNo = result.SiteNo, + ComNo = result.ComNo, + Label = result.Label, + LabelType = 1, + LabelSort = 1, + ScanTime = $"{nowTime:yyyy-MM-dd HH:mm:ss}", + Type = "1", + Status = "1", + Remark = "新工单创建扫描箱标签", + CreatedBy = "后台系统", + CreatedTime = nowTime, + }; + int res = Context.Insertable(newScanLabelRecord).ExecuteCommand(); + if (res == 0) + { + Context.Ado.RollbackTran(); + throw new Exception("插入标签记录异常"); + } + QcGp12LogWorkorder qcGp12Log = new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + Name = "工单开始", + Content = $"工单:{result.WorkOrder}开始,开始时间{nowTime:yyyy-MM-dd HH:mm:ss}", + Type = "100", + Status = "1", + Remark = "触摸屏操作记录", + CreatedBy = "系统", + CreatedTime = nowTime + }; + Context.Insertable(qcGp12Log).ExecuteCommand(); + Context.Ado.CommitTran(); + return result; + } + catch (Exception ex) + { + Context.Ado.RollbackTran(); + + throw new Exception(ex.Message); + } + } + + // 创建新工单号 + public QcGp12WorkorderDetailDto GetNewWorkOrderCreate(QcGp12WorkorderDetailDto data) + { + QcGp12WorkorderDetailDto result = new(); + string newWorkOrder = ""; + DateTime today = DateTime.Today; + // 检查是否是已扫过的外箱标签 + QcGp12ServiceWorkorder lastWorkOrder = Context + .Queryable() + .Where(it => it.CreatedTime.Value.Date == today) + .OrderByDescending(it => it.SerialNumber) + .First(); + if (lastWorkOrder != null) + { + // 递增序列号 + int sequenceNumber = lastWorkOrder.SerialNumber + 1; + if (data.IsOnetime == 1) + { + newWorkOrder = $"W{today:yyyyMMdd}{sequenceNumber:D3}"; + } + else if (data.IsPolish == 1) + { + newWorkOrder = $"P{today:yyyyMMdd}{sequenceNumber:D3}"; + } + else + { + newWorkOrder = $"{today:yyyyMMdd}{sequenceNumber:D3}"; + } + result.SerialNumber = sequenceNumber; + } + else + { + // 如果今天还没有创建过工单,则从 "001" 开始 + if (data.IsOnetime == 1) + { + newWorkOrder = $"W{today:yyyyMMdd}001"; + } + else if (data.IsPolish == 1) + { + newWorkOrder = $"P{today:yyyyMMdd}001"; + } + else + { + newWorkOrder = $"{today:yyyyMMdd}001"; + } + result.SerialNumber = 1; + } + result.WorkOrder = newWorkOrder; + return result; + } + + public static QcGp12ServiceWorkorder GetNewWorkOrderInfo(QcGp12WorkorderDetailDto data) + { + // 新工单 + + QcGp12ServiceWorkorder model = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = data.WorkOrder, + SerialNumber = data.SerialNumber, + PartNumber = data.PartNumber, + Specification = data.Specification, + Color = data.Color, + Description = data.Description, + Team = data.Team, + SiteNo = data.SiteNo, + ComNo = data.ComNo, + IsOnetime = data.IsOnetime, + IsPolish = data.IsPolish, + IsBack = data.IsBack, + IsOut = data.IsOut, + StartTime = data.StartTime, + EndTime = null, + Label = data.Label, + RequireNumber = 0, + QualifiedNumber = 0, + PolishNumber = 0, + DamoNumber = 0, + BaofeiNumber = 0, + Type = "1", + Status = "1", + Remark = "系统新增工单", + CreatedBy = data.CreatedBy, + CreatedTime = data.CreatedTime, + UpdatedBy = data.UpdatedBy, + UpdatedTime = data.UpdatedTime + }; + return model; + } + + public QcGp12ServiceWorkorder ChangeWorkOrderDefect(QcGp12WorkorderDefectDto data) + { + try + { + Context.Ado.BeginTran(); + DateTime nowTime = DateTime.Now; + // 获取缺陷信息 + QcGp12BaseDefect defect = Context + .Queryable() + .Where(it => it.Code == data.DefectCode && it.Status == "1") + .First(); + if (defect == null) + { + throw new Exception("缺陷项不在缺陷清单中!"); + } + + // 工单信息修改 + QcGp12ServiceWorkorder qcGp12Workorder = Context + .Queryable() + .Where(it => it.WorkOrder == data.WorkOrder) + .First(); + if (qcGp12Workorder == null) + { + throw new Exception("工单不存在!"); + } + + // 获取当前工作单缺陷记录 + QcGp12RecordWorkorderDefect workOrderDefect = Context + .Queryable() + .Where(it => it.WorkOrder == data.WorkOrder && it.DefectCode == data.DefectCode) + .First(); + + if (data.Type == "1") + { + // Type === 1 短按新增 + if (workOrderDefect != null) + { + // 数据库中有记录,DefectNum + 1 + workOrderDefect.DefectNum += 1; + workOrderDefect.UpdatedTime = data.CreatedTime; + workOrderDefect.UpdatedBy = data.CreatedBy; + Context.Updateable(workOrderDefect).ExecuteCommand(); + } + else + { + // 数据库中无记录,新增记录并设置 DefectNum = 1 + workOrderDefect = new QcGp12RecordWorkorderDefect + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = data.WorkOrder, + PartNumber = qcGp12Workorder.PartNumber, + Team = qcGp12Workorder.Team, + SiteNo = qcGp12Workorder.SiteNo, + ComNo = qcGp12Workorder.ComNo, + DefectName = defect.Name, + DefectCode = data.DefectCode, + DefectType = defect.Type, + ClickTime = $"{nowTime:yyyy-MM-dd HH:mm:ss}", + Type = "1", + Status = "1", + Remark = "", + CreatedBy = data.CreatedBy, + CreatedTime = data.CreatedTime, + DefectNum = 1 + }; + Context.Insertable(workOrderDefect).ExecuteCommand(); + } + } + else if (data.Type == "2") + { + // Type == 2 长按修改 + if (workOrderDefect != null) + { + // 数据库中有记录,直接赋值 + workOrderDefect.UpdatedTime = data.CreatedTime; + workOrderDefect.UpdatedBy = data.CreatedBy; + workOrderDefect.DefectNum = data.DefectNum; // 假设 data.DefectNum 存在 + Context.Updateable(workOrderDefect).ExecuteCommand(); + } + else + { + // 数据库中无记录,新增记录 + workOrderDefect = new QcGp12RecordWorkorderDefect + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = data.WorkOrder, + PartNumber = qcGp12Workorder.PartNumber, + Team = qcGp12Workorder.Team, + SiteNo = qcGp12Workorder.SiteNo, + ComNo = qcGp12Workorder.ComNo, + DefectName = defect.Name, + DefectCode = data.DefectCode, + DefectType = defect.Type, + ClickTime = $"{nowTime:yyyy-MM-dd HH:mm:ss}", + Type = "1", + Status = "1", + Remark = "", + CreatedBy = data.CreatedBy, + CreatedTime = data.CreatedTime, + DefectNum = data.DefectNum // 假设 data.DefectNum 存在 + }; + Context.Insertable(workOrderDefect).ExecuteCommand(); + } + } + UpdateWorkOrderDetail(data.WorkOrder); + // 提交事务 + Context.Ado.CommitTran(); + return qcGp12Workorder; + } + catch (Exception ex) + { + // 回滚事务 + Context.Ado.RollbackTran(); + throw new Exception("操作失败!", ex); + } + } + + public List GetWorkOrderDefectList(string workorder) + { + return Context + .Queryable() + .Where(it => it.WorkOrder == workorder) + .ToList(); + } + + public QcGp12ServiceWorkorder UpdateWorkOrderDetail(string workorder) + { + QcGp12ServiceWorkorder qcGp12Workorder = Context + .Queryable() + .Where(it => it.WorkOrder == workorder) + // .Where(it=>it.Status == "1") + .First(); + // 更新工单中的统计数据 + qcGp12Workorder.QualifiedNumber = Context + .Queryable() + .Where(it => it.WorkOrder == workorder) + .Where(it => it.LabelType == 2) + .Count(); + + qcGp12Workorder.PolishNumber = + Context + .Queryable() + .Where(it => it.WorkOrder == workorder && it.DefectType == "抛光") + .Sum(it => it.DefectNum) ?? 0; + + qcGp12Workorder.DamoNumber = + Context + .Queryable() + .Where(it => it.WorkOrder == workorder && it.DefectType == "打磨") + .Sum(it => it.DefectNum) ?? 0; + + qcGp12Workorder.BaofeiNumber = + Context + .Queryable() + .Where(it => it.WorkOrder == workorder && it.DefectType == "报废") + .Sum(it => it.DefectNum) ?? 0; + qcGp12Workorder.RequireNumber = + qcGp12Workorder.PolishNumber + + qcGp12Workorder.DamoNumber + + qcGp12Workorder.BaofeiNumber + + (qcGp12Workorder.QualifiedNumber ?? 0); + + // 更新工单统计信息到数据库 + Context + .Updateable(qcGp12Workorder) + .UpdateColumns(it => new + { + it.RequireNumber, + it.QualifiedNumber, + it.PolishNumber, + it.DamoNumber, + it.BaofeiNumber + }) + .ExecuteCommand(); + return qcGp12Workorder; + } + + public string ScanInnerLabel(QcGp12LabelScanDto data) + { + DateTime nowTime = DateTime.Now; + // 标签防错 + string partNumber = DoAnalyzePartnumber(data.Label); + + if (partNumber != data.PartNumber) + { + return "内标签零件号与外箱标签不一致!"; + } + + int sort = 0; + QcGp12RecordLabelScan labelScan = Context + .Queryable() + .Where(it => it.WorkOrder == data.WorkOrder) + .Where(it => it.LabelType == 2) + .OrderByDescending(it => it.LabelSort) + .First(); + if (labelScan != null) + { + sort = labelScan.LabelSort ?? 0; + } + QcGp12RecordLabelScan newLabelScran = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = data.WorkOrder, + PartNumber = data.PartNumber, + Team = data.Team, + SiteNo = data.SiteNo, + ComNo = data.ComNo, + Label = data.Label, + LabelType = 2, + LabelSort = sort + 1, + ScanTime = $"{nowTime:yyyy-MM-dd HH:mm:ss}", + Type = "1", + Status = "1", + Remark = "扫描标签", + CreatedBy = data.CreatedBy, + CreatedTime = data.CreatedTime, + }; + int res = Context.Insertable(newLabelScran).ExecuteCommand(); + if (res == 0) + { + return "标签录入系统失败!"; + } + return "ok"; + } + + public string EndGP12WorkOrderAndCreateStatistics(string workorder) + { + try + { + Context.Ado.BeginTran(); + DateTime nowTime = DateTime.Now; + // 工单信息修改 + QcGp12ServiceWorkorder qcGp12Workorder = Context + .Queryable() + .Where(it => it.WorkOrder == workorder) + .First(); + if (qcGp12Workorder == null) + { + throw new Exception("工单不存在!"); + } + qcGp12Workorder.EndTime = nowTime; + qcGp12Workorder.Type = "2"; + qcGp12Workorder.Remark += "已生成过报表"; + Context.Updateable(qcGp12Workorder).ExecuteCommand(); + // 生成报表记录 + List addList = new(); + string groupCode = SnowFlakeSingle.Instance.NextId().ToString(); + addList.Add(CreateNewStatistics(qcGp12Workorder, groupCode, 1)); + addList.Add(CreateNewStatistics(qcGp12Workorder, groupCode, 2)); + addList.Add(CreateNewStatistics(qcGp12Workorder, groupCode, 3)); + Context + .Deleteable() + .Where(it => it.WorkOrder == workorder) + .ExecuteCommand(); + Context.Insertable(addList).ExecuteCommand(); + + QcGp12LogWorkorder qcGp12Log = new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + Name = "工单结束", + Content = $"工单:{workorder}结束,结束时间{nowTime:yyyy-MM-dd HH:mm:ss}", + Type = "200", + Status = "1", + Remark = "触摸屏操作记录", + CreatedBy = "系统", + CreatedTime = nowTime + }; + Context.Insertable(qcGp12Log).ExecuteCommand(); + // 提交事务 + Context.Ado.CommitTran(); + return "ok"; + } + catch (Exception ex) + { + // 回滚事务 + Context.Ado.RollbackTran(); + return ex.Message; + } + } + + public QcGp12ServiceStatistics CreateNewStatistics( + QcGp12ServiceWorkorder data, + string groupCode, + int groupSort + ) + { + List defectList = Context + .Queryable() + .Where(it => it.WorkOrder == data.WorkOrder) + .WhereIF(groupSort == 1, it => it.DefectType == "抛光") + .WhereIF(groupSort == 2, it => it.DefectType == "打磨") + .WhereIF(groupSort == 3, it => it.DefectType == "报废") + .ToList(); + string JsonString = JsonSerializer.Serialize(defectList); + // 计算合格率 + string qualifiedRate = CalculateQualifiedRate(data); + DateTime nowTime = DateTime.Now; + QcGp12ServiceStatistics workorderStatistics = + new() + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + WorkOrder = data.WorkOrder, + PartNumber = data.PartNumber, + Specification = data.Specification, + Color = data.Color, + Description = data.Description, + Team = data.Team, + SiteNo = data.SiteNo, + ComNo = data.ComNo, + IsOnetime = data.IsOnetime, + IsPolish = data.IsPolish, + IsBack = data.IsBack, + IsOut = data.IsOut, + StartTime = data.StartTime, + EndTime = data.EndTime, + Label = data.Label, + RequireNumber = data.RequireNumber, + QualifiedNumber = data.QualifiedNumber, + QualifiedRate = qualifiedRate, + PolishNumber = data.PolishNumber, + DamoNumber = data.DamoNumber, + BaofeiNumber = data.BaofeiNumber, + GroupCode = groupCode, + GroupSort = groupSort, + GroupDefectJson = JsonString, + Type = "1", + Status = "1", + Remark = "结束工单系统新增质量报表", + CreatedBy = "后端", + CreatedTime = nowTime, + }; + return workorderStatistics; + } + + public static string CalculateQualifiedRate(QcGp12ServiceWorkorder data) + { + if (data == null || data.RequireNumber <= 0) + { + return "0%"; + } + + double qualifiedRate = + (double)data.QualifiedNumber.Value / data.RequireNumber.Value * 100; + return $"{qualifiedRate:F1}%"; + } } -} \ No newline at end of file +}