GP12触摸屏缺陷项点击

This commit is contained in:
2025-01-07 17:25:08 +08:00
parent 7af537b1cb
commit a59e6c2302
11 changed files with 946 additions and 75 deletions

View File

@@ -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;
}
/// <summary>
/// 获取班组下拉
/// </summary>
@@ -34,6 +35,7 @@ namespace ZR.Admin.WebApi.Controllers
var response = _QcGp12Service.GetGroupOptions();
return SUCCESS(response);
}
/// <summary>
/// 获取站点下拉
/// </summary>
@@ -45,6 +47,7 @@ namespace ZR.Admin.WebApi.Controllers
var response = _QcGp12Service.GetStieOptions();
return SUCCESS(response);
}
/// <summary>
/// 获取缺陷项初始数据
/// </summary>
@@ -56,6 +59,7 @@ namespace ZR.Admin.WebApi.Controllers
var response = _QcGp12Service.GetDefectInitOptions();
return SUCCESS(response);
}
/// <summary>
/// 解析标签
/// </summary>
@@ -64,35 +68,94 @@ namespace ZR.Admin.WebApi.Controllers
/// <returns></returns>
[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);
}
/// <summary>
/// 查询质量GP12工单业务模块列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
/* [HttpGet("list")]
public IActionResult QueryQcGp12ServiceWorkorder([FromQuery] QcGp12ServiceWorkorderQueryDto parm)
{
var response = _QcGp12Service.GetList(parm);
return SUCCESS(response);
}*/
/// <summary>
/// 添加质量GP12工单业务模块
/// 开始工单
/// </summary>
/// <returns></returns>
/* [HttpPost("post")]
public IActionResult AddQcGp12ServiceWorkorder([FromBody] QcGp12ServiceWorkorderDto parm)
[HttpPost("StartGP12WorkOrder")]
[AllowAnonymous]
public IActionResult StartGP12WorkOrder([FromBody] QcGp12WorkorderDetailDto parm)
{
var modal = parm.Adapt<QcGp12ServiceWorkorder>().ToCreate(HttpContext);
var modal = parm.Adapt<QcGp12WorkorderDetailDto>().ToCreate(HttpContext);
var response = _QcGp12ServiceWorkorderService.AddQcGp12ServiceWorkorder(modal);
var response = _QcGp12Service.StartGP12WorkOrder(modal);
return SUCCESS(response);
}*/
}
/// <summary>
/// 修改缺陷项
/// </summary>
/// <returns></returns>
[HttpPost("ChangeWorkOrderDefect")]
[AllowAnonymous]
public IActionResult StartGP12WorkOrder([FromBody] QcGp12WorkorderDefectDto parm)
{
var modal = parm.Adapt<QcGp12WorkorderDefectDto>().ToCreate(HttpContext);
var response = _QcGp12Service.ChangeWorkOrderDefect(modal);
return SUCCESS(response);
}
/// <summary>
/// 获取工单缺陷项
/// </summary>
/// <returns></returns>
[HttpGet("GetWorkOrderDefectList")]
[AllowAnonymous]
public IActionResult GetWorkOrderDefectList(string workOrder)
{
var response = _QcGp12Service.GetWorkOrderDefectList(workOrder);
return SUCCESS(response);
}
/// <summary>
/// 扫描内标签,添加标签记录
/// </summary>
/// <returns></returns>
[HttpPost("ScanInnerLabel")]
[AllowAnonymous]
public IActionResult ScanInnerLabel([FromBody] QcGp12LabelScanDto parm)
{
var modal = parm.Adapt<QcGp12LabelScanDto>().ToCreate(HttpContext);
var response = _QcGp12Service.ScanInnerLabel(modal);
return SUCCESS(response);
}
/// <summary>
/// 结束工单,并生成质量报表
/// </summary>
/// <returns></returns>
[HttpGet("EndGP12WorkOrderAndCreateStatistics")]
[AllowAnonymous]
public IActionResult EndGP12WorkOrderAndCreateStatistics(string workOrder)
{
var response = _QcGp12Service.EndGP12WorkOrderAndCreateStatistics(workOrder);
return SUCCESS(response);
}
/// <summary>
/// 更新工单相关信息
/// </summary>
/// <returns></returns>
[HttpGet("UpdateWorkOrderDetail")]
[AllowAnonymous]
public IActionResult UpdateWorkOrderDetail(string workOrder)
{
var response = _QcGp12Service.UpdateWorkOrderDetail(workOrder);
return SUCCESS(response);
}
}
}

View File

@@ -64,5 +64,9 @@ namespace ZR.Model.Dto
/// 缺陷项类别 1-抛光 2-打磨 3-报废
/// </summary>
public string Type { get; set; }
/// <summary>
/// 缺陷项数量
/// </summary>
public int Num { get; set; } = 0;
}
}

View File

@@ -5,9 +5,7 @@ namespace ZR.Model.Dto
/// <summary>
/// 质量GP12基础标签解析查询对象
/// </summary>
public class QcGp12BaseLabelAnalysisQueryDto : PagerInfo
{
}
public class QcGp12BaseLabelAnalysisQueryDto : PagerInfo { }
/// <summary>
/// 质量GP12基础标签解析输入输出对象
@@ -38,8 +36,8 @@ namespace ZR.Model.Dto
public string UpdatedBy { get; set; }
public DateTime? UpdatedTime { get; set; }
}
/// <summary>
/// GP12标签解析标准模板
/// </summary>
@@ -49,30 +47,47 @@ namespace ZR.Model.Dto
/// 解析是否成功
/// </summary>
public bool IsOk { get; set; }
/// <summary>
/// 解析结果
/// </summary>
public string Msg { get; set; }
/// <summary>
/// 标签类型 1- 外箱标签 2-内标签
/// </summary>
public string LabelType { get; set; }
/// <summary>
/// 标签内容
/// </summary>
public string LabelCode { get; set; }
/// <summary>
/// 工单号
/// </summary>
public string Workorder { get; set; }
/// <summary>
/// 零件号
/// </summary>
public string Partnumber { get; set; }
/// <summary>
/// 规格
/// </summary>
public string Specification { get; set; }
/// <summary>
/// 颜色
/// </summary>
public string Color { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 零件数
/// </summary>

View File

@@ -5,9 +5,7 @@ namespace ZR.Model.Dto
/// <summary>
/// 质量GP12扫码标签记录查询对象
/// </summary>
public class QcGp12RecordLabelScanQueryDto : PagerInfo
{
}
public class QcGp12RecordLabelScanQueryDto : PagerInfo { }
/// <summary>
/// 质量GP12扫码标签记录输入输出对象
@@ -49,8 +47,39 @@ namespace ZR.Model.Dto
public string UpdatedBy { get; set; }
public DateTime? UpdatedTime { get; set; }
}
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; }
}
}

View File

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

View File

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

View File

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

View File

@@ -116,6 +116,12 @@ namespace ZR.Model.Business
[SugarColumn(ColumnName = "qualified_rate")]
public string QualifiedRate { get; set; }
/// <summary>
/// 抛光数
/// </summary>
[SugarColumn(ColumnName = "polish_number")]
public int? PolishNumber { get; set; }
/// <summary>
/// 打磨数
/// </summary>

View File

@@ -19,6 +19,13 @@ namespace ZR.Model.Business
[SugarColumn(ColumnName = "work_order")]
public string WorkOrder { get; set; }
/// <summary>
/// 流水号
/// </summary>
[SugarColumn(ColumnName = "serial_number")]
public int SerialNumber { get; set; }
/// <summary>
/// 零件号
/// </summary>
@@ -110,6 +117,11 @@ namespace ZR.Model.Business
[SugarColumn(ColumnName = "qualified_number")]
public int? QualifiedNumber { get; set; }
/// <summary>
/// 抛光数
/// </summary>
[SugarColumn(ColumnName = "polish_number")]
public int? PolishNumber { get; set; }
/// <summary>
/// 打磨数
/// </summary>

View File

@@ -36,5 +36,42 @@ namespace ZR.Service.Business.IBusinessService
/// <param name="type">解析方法</param>
/// <returns></returns>
QcGp12LabelAnalysisDto AnalyzeLabelToDto(string label,int type);
/// <summary>
/// 开始工单(标签重复则开启旧工单)
/// </summary>
/// <returns></returns>
QcGp12ServiceWorkorder StartGP12WorkOrder(QcGp12WorkorderDetailDto data);
/// <summary>
/// 工单缺陷项修改
/// </summary>
/// <returns></returns>
QcGp12ServiceWorkorder ChangeWorkOrderDefect(QcGp12WorkorderDefectDto data);
/// <summary>
/// 触摸屏工单缺陷项获取
/// </summary>
/// <returns></returns>
List<QcGp12RecordWorkorderDefect> GetWorkOrderDefectList(string workorder);
/// <summary>
/// 触摸屏扫内标签零件
/// </summary>
/// <returns></returns>
string ScanInnerLabel(QcGp12LabelScanDto data);
/// <summary>
/// 结束工单并生成质量报表
/// </summary>
/// <returns></returns>
string EndGP12WorkOrderAndCreateStatistics(string workorder);
/// <summary>
/// 更新工单相关信息
/// </summary>
/// <param name="workorder"></param>
/// <returns></returns>
public QcGp12ServiceWorkorder UpdateWorkOrderDetail(string workorder);
}
}

View File

@@ -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<QcGp12BaseLabelAnalysis>()
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<WmMaterial>()
.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<QcGp12BaseLabelAnalysis>()
.And(it => it.Code == "PartNumber")
.And(it => it.Status == "1");
List<QcGp12BaseLabelAnalysis> analysisList = Context.Queryable<QcGp12BaseLabelAnalysis>()
List<QcGp12BaseLabelAnalysis> analysisList = Context
.Queryable<QcGp12BaseLabelAnalysis>()
.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<QcGp12BaseLabelAnalysis>()
.And(it => it.Code == "Quantity")
.And(it => it.Status == "1");
List<QcGp12BaseLabelAnalysis> analysisList = Context
.Queryable<QcGp12BaseLabelAnalysis>()
.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<QcGp12AlterationDefectDto> GetDefectInitOptions()
{
List<QcGp12AlterationDefectDto> defectList = new();
var predicate = Expressionable.Create<QcGp12BaseDefect>()
.And(it => it.Status == "1");
List<string> groupList = Context.Queryable<QcGp12BaseDefect>()
var predicate = Expressionable.Create<QcGp12BaseDefect>().And(it => it.Status == "1");
List<string> groupList = Context
.Queryable<QcGp12BaseDefect>()
.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<QcGp12ChildrenDefectDto> children = Context.Queryable<QcGp12BaseDefect>()
.Where(it=>it.Group == group)
.Where(predicate.ToExpression())
.Select(it=> new QcGp12ChildrenDefectDto
{
Name = it.Name,
Code = it.Code,
Type = it.Type
})
.ToList();
List<QcGp12ChildrenDefectDto> children = Context
.Queryable<QcGp12BaseDefect>()
.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<QcGp12BaseGroupDto> GetGroupOptions()
{
var predicate = Expressionable.Create<QcGp12BaseGroup>()
.And(it=>it.Status == "1");
var predicate = Expressionable.Create<QcGp12BaseGroup>().And(it => it.Status == "1");
var response = Context.Queryable<QcGp12BaseGroup>()
var response = Context
.Queryable<QcGp12BaseGroup>()
.Where(predicate.ToExpression())
.Select(it=> new QcGp12BaseGroupDto())
.Select(it => new QcGp12BaseGroupDto())
.ToList();
return response;
}
public List<QcGp12BaseSiteDto> GetStieOptions()
{
var predicate = Expressionable.Create<QcGp12BaseSite>()
.And(it => it.Status == "1");
var predicate = Expressionable.Create<QcGp12BaseSite>().And(it => it.Status == "1");
var response = Context.Queryable<QcGp12BaseSite>()
var response = Context
.Queryable<QcGp12BaseSite>()
.Where(predicate.ToExpression())
.Select(it => new QcGp12BaseSiteDto())
.ToList();
return response;
}
public QcGp12ServiceWorkorder StartGP12WorkOrder(QcGp12WorkorderDetailDto data)
{
// 检查是否是已扫过的外箱标签
QcGp12ServiceWorkorder oldWorkOrder = Context
.Queryable<QcGp12ServiceWorkorder>()
.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<QcGp12ServiceWorkorder>()
.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<QcGp12BaseDefect>()
.Where(it => it.Code == data.DefectCode && it.Status == "1")
.First();
if (defect == null)
{
throw new Exception("缺陷项不在缺陷清单中!");
}
// 工单信息修改
QcGp12ServiceWorkorder qcGp12Workorder = Context
.Queryable<QcGp12ServiceWorkorder>()
.Where(it => it.WorkOrder == data.WorkOrder)
.First();
if (qcGp12Workorder == null)
{
throw new Exception("工单不存在!");
}
// 获取当前工作单缺陷记录
QcGp12RecordWorkorderDefect workOrderDefect = Context
.Queryable<QcGp12RecordWorkorderDefect>()
.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<QcGp12RecordWorkorderDefect> GetWorkOrderDefectList(string workorder)
{
return Context
.Queryable<QcGp12RecordWorkorderDefect>()
.Where(it => it.WorkOrder == workorder)
.ToList();
}
public QcGp12ServiceWorkorder UpdateWorkOrderDetail(string workorder)
{
QcGp12ServiceWorkorder qcGp12Workorder = Context
.Queryable<QcGp12ServiceWorkorder>()
.Where(it => it.WorkOrder == workorder)
// .Where(it=>it.Status == "1")
.First();
// 更新工单中的统计数据
qcGp12Workorder.QualifiedNumber = Context
.Queryable<QcGp12RecordLabelScan>()
.Where(it => it.WorkOrder == workorder)
.Where(it => it.LabelType == 2)
.Count();
qcGp12Workorder.PolishNumber =
Context
.Queryable<QcGp12RecordWorkorderDefect>()
.Where(it => it.WorkOrder == workorder && it.DefectType == "抛光")
.Sum(it => it.DefectNum) ?? 0;
qcGp12Workorder.DamoNumber =
Context
.Queryable<QcGp12RecordWorkorderDefect>()
.Where(it => it.WorkOrder == workorder && it.DefectType == "打磨")
.Sum(it => it.DefectNum) ?? 0;
qcGp12Workorder.BaofeiNumber =
Context
.Queryable<QcGp12RecordWorkorderDefect>()
.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<QcGp12RecordLabelScan>()
.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<QcGp12ServiceWorkorder>()
.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<QcGp12ServiceStatistics> 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<QcGp12ServiceStatistics>()
.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<QcGp12RecordWorkorderDefect> defectList = Context
.Queryable<QcGp12RecordWorkorderDefect>()
.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}%";
}
}
}