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();
}
}
}