using System; using System.Collections.Generic; using System.Linq; using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Modes; using MES.Service.util; using SqlSugar; namespace MES.Service.service.QC { /// /// PCB检测数据服务 /// public class PcbTestDataService { /// /// 保存整板检测数据 /// /// 整板检测数据DTO /// 保存结果 public bool SaveWholeboardData(WholeboardGenerateDto dto) { try { return SqlSugarHelper.UseTransactionWithOracle(db => { var testData = ConvertWholeboardToEntity(dto); testData.CreateTime = DateTime.Now; testData.DataType = "WHOLE"; var testDataId = db.Insertable(testData).ExecuteReturnIdentity(); var affectedRows = 1; if (dto.BoardData != null && dto.BoardData.Count > 0) { var componentDataList = new List(); foreach (var boardData in dto.BoardData) { if (boardData.CompData != null && boardData.CompData.Count > 0) { var componentData = ConvertComponentListToEntity(boardData.CompData, testDataId); componentDataList.AddRange(componentData); } } if (componentDataList.Count > 0) { affectedRows += db.Insertable(componentDataList).ExecuteCommand(); } } return affectedRows; }) > 0; } catch (Exception ex) { throw new Exception($"保存整板检测数据失败: {ex.Message}", ex); } } /// /// 保存单板检测数据 /// /// 单板检测数据DTO /// 保存结果 public bool SaveSingleBoardData(SingleBoardGenerateDto dto) { try { return SqlSugarHelper.UseTransactionWithOracle(db => { var testData = ConvertSingleBoardToEntity(dto); testData.CreateTime = DateTime.Now; testData.DataType = "SINGLE"; var testDataId = db.Insertable(testData).ExecuteReturnIdentity(); var affectedRows = 1; if (dto.CompData != null && dto.CompData.Count > 0) { var componentDataList = ConvertComponentListToEntity(dto.CompData, testDataId); affectedRows += db.Insertable(componentDataList).ExecuteCommand(); } return affectedRows; }) > 0; } catch (Exception ex) { throw new Exception($"保存单板检测数据失败: {ex.Message}", ex); } } /// /// 根据ID获取PCB检测数据 /// /// 数据ID /// PCB检测数据 public MesPcbTestData GetPcbTestDataById(decimal id) { try { var db = SqlSugarHelper.GetInstance(); return db.Queryable() .Where(x => x.Id == id) .First(); } catch (Exception ex) { throw new Exception($"获取PCB检测数据失败: {ex.Message}", ex); } } /// /// 根据条件分页查询PCB检测数据 /// /// 数据类型(WHOLE/SINGLE) /// 设备名称 /// PCB条码 /// 开始时间 /// 结束时间 /// 页码 /// 页大小 /// 分页数据 public (List items, int totalCount) GetPcbTestDataPage( string dataType = null, string deviceName = null, string pcbSn = null, DateTime? startTime = null, DateTime? endTime = null, int pageIndex = 1, int pageSize = 20) { try { var db = SqlSugarHelper.GetInstance(); var totalCount = 0; var data = db.Queryable() .WhereIF(StringUtil.IsNotNullOrEmpty(dataType), x => x.DataType == dataType) .WhereIF(StringUtil.IsNotNullOrEmpty(deviceName), x => x.DeviceName.Contains(deviceName)) .WhereIF(StringUtil.IsNotNullOrEmpty(pcbSn), x => x.PcbSn.Contains(pcbSn)) .WhereIF(startTime.HasValue, x => x.PcbTestTime >= startTime.Value) .WhereIF(endTime.HasValue, x => x.PcbTestTime <= endTime.Value) .OrderBy(x => x.PcbTestTime, OrderByType.Desc) .ToPageList(pageIndex, pageSize, ref totalCount); return (data, totalCount); } catch (Exception ex) { throw new Exception($"查询PCB检测数据失败: {ex.Message}", ex); } } /// /// 根据测试数据ID获取器件数据 /// /// 测试数据ID /// 器件数据列表 public List GetComponentDataByTestDataId(decimal testDataId) { try { var db = SqlSugarHelper.GetInstance(); return db.Queryable() .Where(x => x.TestDataId == testDataId) .OrderBy(x => x.CompDesignator) .ToList(); } catch (Exception ex) { throw new Exception($"获取器件数据失败: {ex.Message}", ex); } } /// /// 根据PCB条码获取检测数据 /// /// PCB条码 /// 检测数据列表 public List GetPcbTestDataByPcbSn(string pcbSn) { try { var db = SqlSugarHelper.GetInstance(); return db.Queryable() .Where(x => x.PcbSn == pcbSn) .OrderBy(x => x.PcbTestTime, OrderByType.Desc) .ToList(); } catch (Exception ex) { throw new Exception($"根据PCB条码获取检测数据失败: {ex.Message}", ex); } } /// /// 删除PCB检测数据(级联删除器件数据) /// /// 数据ID /// 删除结果 public bool DeletePcbTestData(decimal id) { try { return SqlSugarHelper.UseTransactionWithOracle(db => { var affectedRows = 0; // 先删除器件数据 affectedRows += db.Deleteable() .Where(x => x.TestDataId == id) .ExecuteCommand(); // 再删除主数据 affectedRows += db.Deleteable() .Where(x => x.Id == id) .ExecuteCommand(); return affectedRows; }) > 0; } catch (Exception ex) { throw new Exception($"删除PCB检测数据失败: {ex.Message}", ex); } } /// /// 获取检测统计数据 /// /// 数据类型 /// 设备名称 /// 开始时间 /// 结束时间 /// 统计数据 public dynamic GetTestStatistics(string dataType = null, string deviceName = null, DateTime? startTime = null, DateTime? endTime = null) { try { var db = SqlSugarHelper.GetInstance(); var statistics = db.Queryable() .WhereIF(StringUtil.IsNotNullOrEmpty(dataType), x => x.DataType == dataType) .WhereIF(StringUtil.IsNotNullOrEmpty(deviceName), x => x.DeviceName == deviceName) .WhereIF(startTime.HasValue, x => x.PcbTestTime >= startTime.Value) .WhereIF(endTime.HasValue, x => x.PcbTestTime <= endTime.Value) .GroupBy(x => new { x.DataType, x.DeviceName }) .Select(x => new { DataType = x.DataType, DeviceName = x.DeviceName, TotalCount = SqlFunc.AggregateCount(x.Id), PassCount = SqlFunc.AggregateCount(SqlFunc.IIF(x.PcbFinalResult == "PASS", x.Id, 0)), FailCount = SqlFunc.AggregateCount(SqlFunc.IIF(x.PcbFinalResult == "FAIL", x.Id, 0)), AvgCycleTime = SqlFunc.AggregateAvg(x.PcbCycleTime) }) .ToList(); return statistics; } catch (Exception ex) { throw new Exception($"获取检测统计数据失败: {ex.Message}", ex); } } #region 私有方法 - DTO转换 /// /// 将整板DTO转换为实体 /// /// 整板DTO /// 实体对象 private MesPcbTestData ConvertWholeboardToEntity(WholeboardGenerateDto dto) { return new MesPcbTestData { DeviceName = dto.DeviceName, PcbSn = dto.PcbSn, PcbTrackLine = dto.PcbTrackLine, PcbBoardSide = dto.PcbBoardSide, PcbTestTime = StringUtil.IsNotNullOrEmpty(dto.PcbTestTime) ? DateTime.Parse(dto.PcbTestTime) : null, PcbCycleTime = (decimal?)dto.PcbCycleTime, PcbProjectName = dto.PcbProjectName, PcbRobotResult = dto.PcbRobotResult, PcbUserResult = dto.PcbUserResult, PcbFinalResult = dto.PcbFinalResult, PcbRepairUser = dto.PcbRepairUser, PcbBoardNumber = dto.PcbBoardNumber, PcbBoardRobotNgNumber = dto.PcbBoardRobotNgNumber, PcbBoardUserNgNumber = dto.PcbBoardUserNgNumber, PcbBoardRepassNumber = dto.PcbBoardRepassNumber, PcbCompNumber = dto.PcbCompNumber, PcbCompRobotNgNumber = dto.PcbCompRobotNgNumber, PcbCompUserNgNumber = dto.PcbCompUserNgNumber, PcbCompRepassNumber = dto.PcbCompRepassNumber }; } /// /// 将单板DTO转换为实体 /// /// 单板DTO /// 实体对象 private MesPcbTestData ConvertSingleBoardToEntity(SingleBoardGenerateDto dto) { return new MesPcbTestData { DeviceName = dto.DeviceName, PcbSn = dto.PcbSn, PcbTrackLine = dto.PcbTrackLine, PcbBoardSide = dto.PcbBoardSide, PcbTestTime = StringUtil.IsNotNullOrEmpty(dto.PcbTestTime) ? DateTime.Parse(dto.PcbTestTime) : null, PcbCycleTime = (decimal?)dto.PcbCycleTime, PcbProjectName = dto.PcbProjectName, PcbRobotResult = dto.PcbRobotResult, PcbUserResult = dto.PcbUserResult, PcbFinalResult = dto.PcbFinalResult, PcbRepairUser = dto.PcbRepairUser, PcbBoardNumber = dto.PcbBoardNumber, PcbCompNumber = dto.PcbCompNumber, BoardSn = dto.BoardSn, BoardNo = dto.BoardNo, BoardRobotResult = dto.BoardRobotResult, BoardUserResult = dto.BoardUserResult, BoardFinalResult = dto.BoardFinalResult, BoardCompNumber = dto.BoardCompNumber, BoardCompRobotNgNumber = dto.BoardCompRobotNgNumber, BoardCompUserNgNumber = dto.BoardCompUserNgNumber, BoardCompRepassNumber = dto.BoardCompRepassNumber }; } /// /// 将器件DTO列表转换为实体列表 /// /// 器件DTO列表 /// 测试数据ID /// 实体列表 private List ConvertComponentListToEntity(List dtoList, decimal testDataId) { return dtoList.Select(dto => new MesPcbComponentData { TestDataId = testDataId, CompDesignator = dto.CompDesignator, CompPart = dto.CompPart, CompPackage = dto.CompPackage, CompType = dto.CompType, CompRobotCode = dto.CompRobotCode, CompRobotResult = dto.CompRobotResult, CompUserCode = dto.CompUserCode, CompUserResult = dto.CompUserResult, CompImage = dto.CompImage, CreateTime = DateTime.Now }).ToList(); } #endregion } }