Files
LabelChange-server/Bak/DAL/repositories/LabelPdfCacheRepository.cs
2026-06-01 16:30:29 +08:00

181 lines
6.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MDL.Models;
using DAL.Interfaces;
using DB.Database;
using SqlSugar;
namespace DAL.Repositories
{
/// <summary>
/// 面单PDF缓存的数据访问实现类
/// </summary>
public class LabelPdfCacheRepository : ILabelPdfCacheRepository
{
private readonly ISqlSugarProvider _provider;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="provider">SqlSugar数据库提供程序</param>
public LabelPdfCacheRepository(ISqlSugarProvider provider)
{
_provider = provider;
}
/// <summary>
/// 根据中性面单单号获取缓存记录
/// </summary>
/// <param name="waybillNumber">中性面单单号</param>
/// <returns>缓存记录实体</returns>
public async Task<LabelPdfCache?> GetByWaybillNumberAsync(string waybillNumber)
{
var db = _provider.GetClient();
return await db.Queryable<LabelPdfCache>()
.Where(c => c.NeutralWaybillNumber == waybillNumber)
.FirstAsync();
}
/// <summary>
/// 创建缓存记录
/// </summary>
/// <param name="entity">缓存实体</param>
/// <returns>创建的记录ID</returns>
public async Task<long> CreateAsync(LabelPdfCache entity)
{
var db = _provider.GetClient();
// 确保表存在
if (!db.DbMaintenance.IsAnyTable("label_pdf_cache"))
{
db.CodeFirst.InitTables(typeof(LabelPdfCache));
}
// 设置时间戳
entity.CreatedTime = DateTime.UtcNow;
entity.UpdatedTime = DateTime.UtcNow;
// 插入数据并返回自增ID
return await db.Insertable(entity).ExecuteReturnIdentityAsync();
}
/// <summary>
/// 更新缓存记录
/// </summary>
/// <param name="entity">缓存实体</param>
/// <returns>更新是否成功</returns>
public async Task<bool> UpdateAsync(LabelPdfCache entity)
{
var db = _provider.GetClient();
entity.UpdatedTime = DateTime.UtcNow;
return await db.Updateable(entity).ExecuteCommandAsync() > 0;
}
/// <summary>
/// 标记缓存为失效状态
/// </summary>
/// <param name="waybillNumber">中性面单单号</param>
/// <returns>操作是否成功</returns>
public async Task<bool> InvalidateCacheAsync(string waybillNumber)
{
var db = _provider.GetClient();
var existing = await db.Queryable<LabelPdfCache>()
.Where(c => c.NeutralWaybillNumber == waybillNumber)
.FirstAsync();
if (existing == null)
{
return false;
}
existing.Status = 3; // 3=已失效
existing.UpdatedTime = DateTime.UtcNow;
return await db.Updateable(existing).ExecuteCommandAsync() > 0;
}
/// <summary>
/// 获取待处理的缓存任务列表
/// </summary>
/// <param name="maxRetryCount">最大重试次数</param>
/// <param name="limit">最大返回数量</param>
/// <returns>待处理的缓存记录列表</returns>
public async Task<List<LabelPdfCache>> GetPendingTasksAsync(int maxRetryCount, int limit)
{
var db = _provider.GetClient();
return await db.Queryable<LabelPdfCache>()
.Where(c => c.Status == 0 || (c.Status == 2 && c.RetryCount < maxRetryCount))
.Where(c => SqlFunc.Subqueryable<LabelReplaceEntity>()
.Where(l => l.NeutralWaybillNumber == c.NeutralWaybillNumber && !string.IsNullOrEmpty(l.Label))
.Any())
.OrderBy(c => c.CreatedTime, OrderByType.Asc)
.Take(limit)
.ToListAsync();
}
/// <summary>
/// 获取订单表中新的有标签订单(缓存表中不存在的)
/// </summary>
/// <param name="limit">最大返回数量</param>
/// <returns>新订单的面单号列表</returns>
public async Task<List<string>> GetNewOrdersWithLabelsAsync(int limit)
{
var db = _provider.GetClient();
return await db.Queryable<LabelReplaceEntity>()
.Where(o => !string.IsNullOrEmpty(o.Label))
.Where(o => !SqlFunc.Subqueryable<LabelPdfCache>()
.Where(c => c.NeutralWaybillNumber == o.NeutralWaybillNumber)
.Any())
.Select(o => o.NeutralWaybillNumber)
.Take(limit)
.ToListAsync();
}
/// <summary>
/// 获取需要重新处理的失效缓存列表
/// </summary>
/// <param name="limit">最大返回数量</param>
/// <returns>失效的缓存记录列表</returns>
public async Task<List<LabelPdfCache>> GetInvalidCachesAsync(int limit)
{
var db = _provider.GetClient();
return await db.Queryable<LabelPdfCache>()
.Where(c => c.Status == 3)
.Where(c => SqlFunc.Subqueryable<LabelReplaceEntity>()
.Where(l => l.NeutralWaybillNumber == c.NeutralWaybillNumber && !string.IsNullOrEmpty(l.Label))
.Any())
.OrderBy(c => c.UpdatedTime, OrderByType.Asc)
.Take(limit)
.ToListAsync();
}
/// <summary>
/// 异步更新条码信息
/// </summary>
/// <param name="waybillNumber">中性面单单号</param>
/// <param name="barcodeNumber">条码号</param>
/// <param name="barcodeType">条码类型</param>
/// <param name="confidence">识别置信度</param>
/// <returns>更新是否成功</returns>
public async Task<bool> UpdateBarcodeInfoAsync(string waybillNumber, string barcodeNumber, byte barcodeType, int confidence)
{
var db = _provider.GetClient();
var existing = await db.Queryable<LabelPdfCache>()
.Where(c => c.NeutralWaybillNumber == waybillNumber)
.FirstAsync();
if (existing == null)
{
return false;
}
existing.BarcodeNumber = barcodeNumber;
existing.BarcodeType = barcodeType;
existing.BarcodeConfidence = confidence;
existing.BarcodeExtractTime = DateTime.UtcNow;
existing.UpdatedTime = DateTime.UtcNow;
return await db.Updateable(existing).ExecuteCommandAsync() > 0;
}
}
}