2025-09-02 16:16:13 +08:00
|
|
|
|
using Aliyun.OSS;
|
|
|
|
|
|
using DOAN.Model;
|
|
|
|
|
|
using DOAN.Model.Dto;
|
2025-09-30 15:39:20 +08:00
|
|
|
|
using DOAN.Model.MES.dev;
|
|
|
|
|
|
using DOAN.Model.MES.trace;
|
|
|
|
|
|
using DOAN.Model.MES.trace.Dto;
|
2025-09-02 16:16:13 +08:00
|
|
|
|
using DOAN.Repository;
|
|
|
|
|
|
using DOAN.Service.Business.IBusinessService;
|
|
|
|
|
|
using Infrastructure.Attribute;
|
|
|
|
|
|
using Infrastructure.Extensions;
|
2025-09-30 17:03:02 +08:00
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
2025-09-02 16:16:13 +08:00
|
|
|
|
using SqlSugar;
|
2025-09-30 15:39:20 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.ComponentModel.DataAnnotations;
|
|
|
|
|
|
using System.Linq;
|
2025-09-02 16:16:13 +08:00
|
|
|
|
|
|
|
|
|
|
namespace DOAN.Service
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 追溯日志,错误日志,警告日志,调试日志Service业务层处理
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[AppService(ServiceType = typeof(ITraceMainService), ServiceLifetime = LifeTime.Transient)]
|
|
|
|
|
|
public class TraceMainService : BaseService<TraceLog>, ITraceMainService
|
|
|
|
|
|
{
|
2025-09-30 15:39:20 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取产品追溯信息列表
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="query"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public PagedInfo<TracePartSnDto> GetPartSnList(TracePartSnQueryDto query)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (query == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentNullException(nameof(query));
|
|
|
|
|
|
}
|
2025-09-30 17:03:02 +08:00
|
|
|
|
if (!string.IsNullOrEmpty(query.SubPartScanCode))
|
|
|
|
|
|
{
|
|
|
|
|
|
var partSn = Context.Queryable<TraceSnSubScan>()
|
|
|
|
|
|
.Where(t => t.SubCode == query.SubPartScanCode)
|
|
|
|
|
|
.Select(t => t.PartSn)
|
|
|
|
|
|
.ToString();
|
|
|
|
|
|
query.PartSn = partSn;
|
2025-10-10 09:23:34 +08:00
|
|
|
|
}
|
2025-09-30 15:39:20 +08:00
|
|
|
|
var response = Context.Queryable<TraceSnScan>()
|
|
|
|
|
|
.LeftJoin<TraceProductRecord>((s, r) => s.PartSn == r.PartSn)
|
2025-09-30 17:03:02 +08:00
|
|
|
|
.WhereIF(!string.IsNullOrEmpty(query.PartSn), (s, r) => s.PartSn == query.PartSn)
|
|
|
|
|
|
.WhereIF(!string.IsNullOrEmpty(query.ProductionSn), (s, r) => r.ProductionSn == query.ProductionSn)
|
2025-10-10 17:30:43 +08:00
|
|
|
|
.WhereIF(!string.IsNullOrEmpty(query.ProjectCode), (s, r) => s.ProjectCode.Contains(query.ProjectCode))
|
2025-09-30 17:03:02 +08:00
|
|
|
|
.WhereIF(query.StartTime > DateTime.MinValue, (s, r) => s.CreateTime >= query.StartTime)
|
2025-09-30 17:29:48 +08:00
|
|
|
|
.WhereIF(query.EndTime > DateTime.MinValue, (s, r) => s.CreateTime <= query.EndTime)
|
2025-09-30 17:03:02 +08:00
|
|
|
|
.OrderByDescending((s, r) => s.CreateTime)
|
2025-10-10 17:30:43 +08:00
|
|
|
|
.GroupBy((s, r) => new { s.PartSn })
|
2025-09-30 17:03:02 +08:00
|
|
|
|
.Select((s, r) => new TracePartSnDto()
|
2025-09-30 15:39:20 +08:00
|
|
|
|
{
|
|
|
|
|
|
Id = XueHua,
|
|
|
|
|
|
ProjectCode = s.ProjectCode,
|
|
|
|
|
|
ProductionCode = r.ProductionCode,
|
|
|
|
|
|
ProductionName = r.ProductionName,
|
|
|
|
|
|
Specification = s.Specification,
|
|
|
|
|
|
ProductionSn = r.ProductionSn,
|
2025-09-30 17:13:03 +08:00
|
|
|
|
PartSn = s.PartSn,
|
2025-09-30 17:03:02 +08:00
|
|
|
|
Result = r.Result,
|
|
|
|
|
|
CreateTime = r.CreateTime != null ? (DateTime)r.CreateTime : (DateTime)s.CreateTime
|
2025-09-30 15:39:20 +08:00
|
|
|
|
})
|
|
|
|
|
|
.ToPage(query);
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取子零件
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="query"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
/// <exception cref="ArgumentNullException"></exception>
|
|
|
|
|
|
public PagedInfo<TraceSnSubScanDto> GetSnSubScanList(TraceSnSubScanQueryDto query)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (query == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentNullException(nameof(query));
|
|
|
|
|
|
}
|
|
|
|
|
|
var response = Context.Queryable<TraceSnSubScan>()
|
|
|
|
|
|
.Where(t => t.PartSn == query.PartSn)
|
|
|
|
|
|
.Select(t => new TraceSnSubScanDto()
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = t.Id,
|
|
|
|
|
|
SubCode = t.SubCode,
|
|
|
|
|
|
SubName = t.SubName,
|
|
|
|
|
|
Specification = t.Specification,
|
|
|
|
|
|
PartSn = t.PartSn,
|
|
|
|
|
|
SubPartScanCode = t.SubPartScanCode,
|
|
|
|
|
|
IsBack = t.IsBack,
|
|
|
|
|
|
CreateTime = t.CreateTime
|
|
|
|
|
|
})
|
|
|
|
|
|
.ToPage(query);
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取检测平台(折叠:zd/终检:eol)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="query"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
/// <exception cref="ArgumentNullException"></exception>
|
|
|
|
|
|
public PagedInfo<TraceSnQcRecordDto> GetSnQcRecordList(TraceSnQcRecordQueryDto query)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (query == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentNullException(nameof(query));
|
|
|
|
|
|
}
|
|
|
|
|
|
var response = Context.Queryable<TraceSnQcRecord>()
|
|
|
|
|
|
.Where(r => r.PartSn == query.PartSn && r.QcType == query.QcType)
|
|
|
|
|
|
.Select(r => new TraceSnQcRecordDto()
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = r.Id,
|
|
|
|
|
|
ProjectCode = r.ProjectCode,
|
|
|
|
|
|
ProductionCode = r.ProductionCode,
|
|
|
|
|
|
ProductionName = r.ProductionName,
|
|
|
|
|
|
Specification = r.Specification,
|
|
|
|
|
|
PartSn = r.PartSn,
|
|
|
|
|
|
QcType = r.QcType,
|
|
|
|
|
|
IsBack = r.IsBack,
|
|
|
|
|
|
CreateBy = r.CreateBy,
|
|
|
|
|
|
CreateTime = r.CreateTime,
|
|
|
|
|
|
Value01 = r.Value01,
|
|
|
|
|
|
Value02 = r.Value02,
|
|
|
|
|
|
Value03 = r.Value03,
|
|
|
|
|
|
Value04 = r.Value04,
|
|
|
|
|
|
Value05 = r.Value05,
|
|
|
|
|
|
Value06 = r.Value06,
|
|
|
|
|
|
Value07 = r.Value07,
|
|
|
|
|
|
Value08 = r.Value08,
|
|
|
|
|
|
Value09 = r.Value09,
|
|
|
|
|
|
Value10 = r.Value10,
|
|
|
|
|
|
Value11 = r.Value11,
|
|
|
|
|
|
Value12 = r.Value12,
|
|
|
|
|
|
Value13 = r.Value13,
|
|
|
|
|
|
Value14 = r.Value14,
|
|
|
|
|
|
Value15 = r.Value15,
|
|
|
|
|
|
Value16 = r.Value16,
|
|
|
|
|
|
Value17 = r.Value17,
|
|
|
|
|
|
Value18 = r.Value18,
|
|
|
|
|
|
Value19 = r.Value19,
|
|
|
|
|
|
Value20 = r.Value20,
|
|
|
|
|
|
Value21 = r.Value21,
|
|
|
|
|
|
Value22 = r.Value22,
|
|
|
|
|
|
Value23 = r.Value23,
|
|
|
|
|
|
Value24 = r.Value24,
|
|
|
|
|
|
Value25 = r.Value25,
|
|
|
|
|
|
Value26 = r.Value26,
|
|
|
|
|
|
Value27 = r.Value27,
|
|
|
|
|
|
Value28 = r.Value28,
|
|
|
|
|
|
Value29 = r.Value29,
|
|
|
|
|
|
Value30 = r.Value30,
|
|
|
|
|
|
Value31 = r.Value31,
|
|
|
|
|
|
Value32 = r.Value32,
|
|
|
|
|
|
Value33 = r.Value33,
|
|
|
|
|
|
Value34 = r.Value34,
|
|
|
|
|
|
Value35 = r.Value35,
|
|
|
|
|
|
Value36 = r.Value36,
|
|
|
|
|
|
Value37 = r.Value37,
|
|
|
|
|
|
Value38 = r.Value38,
|
|
|
|
|
|
Value39 = r.Value39,
|
|
|
|
|
|
Value40 = r.Value40,
|
|
|
|
|
|
})
|
|
|
|
|
|
.ToPage(query);
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 16:16:13 +08:00
|
|
|
|
public List<TraceConfig> GetConfig(DeviceDownLoadTraceConfigQueryDto parm)
|
|
|
|
|
|
{
|
|
|
|
|
|
var response = Context
|
|
|
|
|
|
.Queryable<TraceConfig>()
|
|
|
|
|
|
.Where(it => it.ProcessCode == parm.ProcessCode)
|
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
|
|
return response;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool AddPartSn(string projectCode, string productionCode, string partSn)
|
|
|
|
|
|
{
|
|
|
|
|
|
TraceSnScan snScan =
|
|
|
|
|
|
new()
|
|
|
|
|
|
{
|
|
|
|
|
|
ProjectCode = projectCode,
|
|
|
|
|
|
ProductionCode = productionCode,
|
|
|
|
|
|
PartSn = partSn,
|
|
|
|
|
|
CreateTime = DateTime.Now
|
|
|
|
|
|
};
|
|
|
|
|
|
return Context.Insertable(snScan).ExecuteCommand() > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool AddPartSnSubScan(TraceSnSubScan scan)
|
|
|
|
|
|
{
|
|
|
|
|
|
scan.CreateTime = DateTime.Now;
|
|
|
|
|
|
return Context.Insertable(scan).ExecuteCommand() > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool AddTraceSnTransit(TraceSnTransit traceSnTransit)
|
|
|
|
|
|
{
|
|
|
|
|
|
traceSnTransit.CreateTime = DateTime.Now;
|
|
|
|
|
|
return Context.Insertable(traceSnTransit).ExecuteCommand() > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool CheckIsTransit(string partSn, string TransitName)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool hasValue = Context
|
|
|
|
|
|
.Queryable<TraceSnTransit>()
|
|
|
|
|
|
.Where(it => it.PartSn == partSn)
|
|
|
|
|
|
.Where(it => it.TransitName == TransitName)
|
|
|
|
|
|
.Where(it => it.IsBack == 0)
|
|
|
|
|
|
.Any();
|
|
|
|
|
|
|
|
|
|
|
|
return hasValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool CheckPartSnIsExist(string partSn)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool hasValue = Context.Queryable<TraceSnScan>().Where(it => it.PartSn == partSn).Any();
|
|
|
|
|
|
|
|
|
|
|
|
return hasValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string GetLastPartSn(string projectCode, string productionCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
string lastPartSn = Context.Queryable<TraceSnScan>()
|
|
|
|
|
|
.Where(it => it.ProjectCode == projectCode)
|
|
|
|
|
|
.Where(it => it.ProductionCode == productionCode)
|
|
|
|
|
|
.OrderByDescending(it => it.Id)
|
|
|
|
|
|
.Select(it => it.PartSn)
|
|
|
|
|
|
.First();
|
|
|
|
|
|
return lastPartSn;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool UploadPartSnAndZdDecord(TraceSnQcRecord traceSnQcRecord)
|
|
|
|
|
|
{
|
|
|
|
|
|
traceSnQcRecord.CreateTime = DateTime.Now;
|
|
|
|
|
|
return Context.Insertable(traceSnQcRecord).ExecuteCommand() > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|