using System.Collections.Generic; using System.Threading.Tasks; using MDL.Models; using DAL.Interfaces; using DB.Database; using System; using SqlSugar; namespace DAL.Repositories { /// /// 标签历史扫描记录仓储实现类 /// public class LabelScanRepository : ILabelScanRepository { private readonly ISqlSugarProvider _provider; /// /// 构造函数 /// /// SqlSugar提供程序 public LabelScanRepository(ISqlSugarProvider provider) { _provider = provider; } /// /// 创建标签扫描记录 /// /// 标签扫描记录实体 /// 创建的记录ID public async Task CreateAsync(LabelScanEntity entity) { var db = _provider.GetClient(); // 确保表存在 if (!db.DbMaintenance.IsAnyTable("label_scan_history")) { db.CodeFirst.InitTables(typeof(LabelScanEntity)); } // 设置时间戳 entity.CreatedAt = DateTime.UtcNow; entity.UpdatedAt = DateTime.UtcNow; // 插入数据并返回自增ID return await db.Insertable(entity).ExecuteReturnIdentityAsync(); } /// /// 根据中性面单单号获取标签扫描记录列表 /// /// 中性面单单号 /// 标签扫描记录列表 public async Task> GetByNeutralWaybillNumberAsync(string neutralWaybillNumber) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => x.NeutralWaybillNumber == neutralWaybillNumber) .OrderBy(x => x.CreatedAt) .ToListAsync(); } /// /// 根据多个中性面单单号获取标签扫描记录列表 /// /// 中性面单单号列表 /// 标签扫描记录列表 public async Task> GetByNeutralWaybillNumbersAsync(List neutralWaybillNumbers) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => neutralWaybillNumbers.Contains(x.NeutralWaybillNumber)) .OrderBy(x => x.CreatedAt) .ToListAsync(); } /// /// 根据参考号获取标签扫描记录列表 /// /// 参考号 /// 标签扫描记录列表 public async Task> GetByReferenceNumberAsync(string referenceNumber) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => x.ReferenceNumber == referenceNumber) .OrderBy(x => x.CreatedAt) .ToListAsync(); } /// /// 根据尾程跟踪单号获取标签扫描记录列表 /// /// 尾程跟踪单号 /// 标签扫描记录列表 public async Task> GetByFinalMileTrackingNumberAsync(string finalMileTrackingNumber) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => x.FinalMileTrackingNumber == finalMileTrackingNumber) .OrderBy(x => x.CreatedAt) .ToListAsync(); } /// /// 根据客户ID获取标签扫描记录列表 /// /// 客户ID /// 标签扫描记录列表 public async Task> GetByCustomerIdAsync(int customerId) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => x.CustomerId == customerId) .OrderBy(x => x.CreatedAt) .ToListAsync(); } /// /// 根据客户ID和中性面单单号获取标签扫描记录列表 /// /// 客户ID /// 中性面单单号 /// 标签扫描记录列表 public async Task> GetByCustomerIdAndWaybillNumberAsync(int customerId, string neutralWaybillNumber) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => x.CustomerId == customerId && x.NeutralWaybillNumber == neutralWaybillNumber) .OrderBy(x => x.CreatedAt) .ToListAsync(); } /// /// 统计客户的订单扫描次数 /// /// 客户ID /// 中性面单单号(可选,不提供则统计所有订单) /// 扫描次数 public async Task CountScansByCustomerAndWaybillAsync(int customerId, string neutralWaybillNumber = null) { var db = _provider.GetClient(); var query = db.Queryable().Where(x => x.CustomerId == customerId); if (!string.IsNullOrEmpty(neutralWaybillNumber)) { query = query.Where(x => x.NeutralWaybillNumber == neutralWaybillNumber); } return await query.CountAsync(); } /// /// 获取客户的扫描记录分组统计 /// /// 客户ID /// 按订单分组的扫描统计信息 public async Task> GetScanStatsByCustomerAsync(int customerId) { var db = _provider.GetClient(); var result = await db.Queryable() .Where(x => x.CustomerId == customerId) .GroupBy(x => x.NeutralWaybillNumber) .Select(x => new { WaybillNumber = x.NeutralWaybillNumber, Count = SqlFunc.AggregateCount(x.Id) }) .ToListAsync(); return result.ToDictionary(item => item.WaybillNumber, item => item.Count); } /// /// 更新标签扫描记录 /// /// 标签扫描记录实体 /// 是否更新成功 public async Task UpdateAsync(LabelScanEntity entity) { var db = _provider.GetClient(); entity.UpdatedAt = DateTime.UtcNow; return await db.Updateable(entity).ExecuteCommandAsync() > 0; } /// /// 获取所有标签扫描记录 /// /// 标签扫描记录实体列表 public async Task> GetAllAsync() { var db = _provider.GetClient(); return await db.Queryable() .OrderByDescending(x => x.CreatedAt) .ToListAsync(); } /// /// 分页获取标签扫描记录 /// /// 页码 /// 每页大小 /// 排序字段 /// 排序顺序 /// 客户ID /// 参考号 /// 中性面单单号 /// 尾程跟踪单号 /// 扫描结果 /// 标签扫描记录DTO列表和总记录数 public async Task<(List, int)> GetByPageAsync(int page, int pageSize, string sortBy, string sortOrder, int? customerId, string referenceNumber, string neutralWaybillNumber, string finalMileTrackingNumber, int? result, string startCreatedAt, string endCreatedAt) { var db = _provider.GetClient(); var query = db.Queryable(); // 应用筛选条件 if (customerId.HasValue) { query = query.Where(x => x.CustomerId == customerId); } if (!string.IsNullOrEmpty(referenceNumber)) { query = query.Where(x => x.ReferenceNumber.Contains(referenceNumber)); } if (!string.IsNullOrEmpty(neutralWaybillNumber)) { // 处理多个单号的情况,支持逗号分隔 var waybillNumbers = neutralWaybillNumber.Split(new[] { ',', '\n', '\r', ' ' }, StringSplitOptions.RemoveEmptyEntries); if (waybillNumbers.Length > 1) { query = query.Where(x => waybillNumbers.Contains(x.NeutralWaybillNumber)); } else if (waybillNumbers.Length == 1) { query = query.Where(x => x.NeutralWaybillNumber.Contains(waybillNumbers[0])); } } if (!string.IsNullOrEmpty(finalMileTrackingNumber)) { query = query.Where(x => x.FinalMileTrackingNumber.Contains(finalMileTrackingNumber)); } if (result.HasValue) { query = query.Where(x => (int)x.Result == result); } // 应用时间筛选条件 if (!string.IsNullOrEmpty(startCreatedAt) && DateTime.TryParse(startCreatedAt, out DateTime startCreatedAtDate)) { query = query.Where(x => x.CreatedAt >= startCreatedAtDate); } if (!string.IsNullOrEmpty(endCreatedAt) && DateTime.TryParse(endCreatedAt, out DateTime endCreatedAtDate)) { query = query.Where(x => x.CreatedAt <= endCreatedAtDate); } // 获取总记录数 int totalCount = await query.CountAsync(); // 应用排序 if (!string.IsNullOrEmpty(sortBy)) { if (sortOrder.ToLower() == "asc") { query = query.OrderBy(sortBy); } else { query = query.OrderBy($"{sortBy} DESC"); } } else { query = query.OrderByDescending(x => x.CreatedAt); } // 应用分页 var entities = await query.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync(); // 如果没有数据,直接返回 if (entities.Count == 0) { return (new List(), totalCount); } // 提取所有非null的客户ID,用于批量查询 var customerIds = entities.Select(l => l.CustomerId).Distinct().ToList(); // 批量查询客户信息 var customerList = await db.Queryable() .Where(c => customerIds.Contains(c.Id)) .ToListAsync(); // 手动构建字典,确保类型正确 Dictionary customers = new Dictionary(); foreach (var customer in customerList) { customers[customer.Id] = customer.CustomerCode; } // 构建DTO列表 var dtos = new List(); foreach (var l in entities) { var dto = new MDL.DTOs.LabelScanWithCustomerDto { Id = l.Id, CustomerId = l.CustomerId, ReferenceNumber = l.ReferenceNumber, NeutralWaybillNumber = l.NeutralWaybillNumber, FinalMileTrackingNumber = l.FinalMileTrackingNumber, Result = (int)l.Result, Description = l.Description, CreatedBy = l.CreatedBy, CreatedAt = l.CreatedAt, UpdatedAt = l.UpdatedAt }; // 处理客户代码 if (customers.TryGetValue(l.CustomerId, out var customerCode)) { dto.CustomerCode = customerCode; } dtos.Add(dto); } return (dtos, totalCount); } /// /// 根据中性面单单号获取最新的扫描记录 /// /// 中性面单单号 /// 最新的标签扫描记录 public async Task GetLatestScanByWaybillAsync(string neutralWaybillNumber) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => x.NeutralWaybillNumber == neutralWaybillNumber) .OrderByDescending(x => x.CreatedAt) .FirstAsync(); } /// /// 根据日期范围获取扫描记录 /// /// 开始日期 /// 结束日期 /// 标签扫描记录列表 public async Task> GetByDateRangeAsync(System.DateTime startDate, System.DateTime endDate) { var db = _provider.GetClient(); return await db.Queryable() .Where(x => x.CreatedAt >= startDate && x.CreatedAt <= endDate) .OrderBy(x => x.CreatedAt) .ToListAsync(); } } }