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