Files
StoreWeb/Modules/Store.Shops/Services/ShopService.Optimize.cs
T
2026-10-29 11:34:35 +08:00

103 lines
5.0 KiB
C#

using System.ComponentModel.DataAnnotations;
using MAX.Framework.Commons;
using MAX.Framework.Validation;
using Store.Shops.Dtos;
using Store.Shops.Entities;
using Store.Shops.Mappers;
namespace Store.Shops.Services;
public sealed partial class ShopService
{
/// <summary>保存授权店铺的物流优化结果;订单已关联其他店铺时拒绝覆盖。</summary>
public async Task SaveOptimizeResult(OptimizeResultRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
var actor = await Actor();
using var work = db.CreateUnitOfWork();
work.IsolationLevel = System.Data.IsolationLevel.Serializable;
work.GetOrBeginTransaction();
var orm = work.Orm;
await RequireShop(orm, actor, request.ShopId, ct);
var row = await orm.Select<OptimizeResultEntity>().Where(r => r.OrderId == request.OrderId).ForUpdate().FirstAsync(ct);
if (row != null && row.ShopId != request.ShopId)
throw new AppException("订单属于其他店铺,不能覆盖记录");
if (row == null)
await orm.Insert(new OptimizeResultEntity
{
ShopId = request.ShopId, OrderId = request.OrderId, OptimizeRst = request.OptimizeRst!,
WaybillId = request.WaybillId ?? "", DeliveryName = request.DeliveryName ?? "",
AddTime = DateTime.Now, MdyTime = DateTime.Now
}).ExecuteAffrowsAsync(ct);
else
{
var update = orm.Update<OptimizeResultEntity>().Where(r => r.Id == row.Id)
.Set(r => r.OptimizeRst, request.OptimizeRst!).Set(r => r.MdyTime, DateTime.Now);
if (request.WaybillId != null) update.Set(r => r.WaybillId, request.WaybillId);
if (request.DeliveryName != null) update.Set(r => r.DeliveryName, request.DeliveryName);
await update.ExecuteAffrowsAsync(ct);
}
ct.ThrowIfCancellationRequested();
work.Commit();
}
/// <summary>分页查询可见店铺的物流优化结果,统计与数据使用相同范围。</summary>
public async Task<ShopPage<OptimizeResultInfo>> OptimizeResults(OrderSearchRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
Page(request.Page, request.PageSize);
var actor = await Actor();
var ids = await VisibleIds(actor, ct);
var query = db.Select<OptimizeResultEntity>().Where(r => ids.Contains(r.ShopId))
.WhereIf(request.OrderIds != null, r => request.OrderIds!.Contains(r.OrderId));
var count = request.NotCount ? -1 : await query.CountAsync(ct);
var rows = await query.OrderByDescending(r => r.Id).Page(request.Page, request.PageSize).ToListAsync(ct);
return new(rows.Select(new ShopDetailsMapper().Map).ToList(), count);
}
/// <summary>保存授权店铺的物流优化备注;订单已关联其他店铺时拒绝覆盖。</summary>
public async Task SaveOptimizeRemark(OptimizeRemarkRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
var actor = await Actor();
using var work = db.CreateUnitOfWork();
work.IsolationLevel = System.Data.IsolationLevel.Serializable;
work.GetOrBeginTransaction();
var orm = work.Orm;
await RequireShop(orm, actor, request.ShopId, ct);
var row = await orm.Select<OptimizeRemarkEntity>().Where(r => r.OrderId == request.OrderId).ForUpdate().FirstAsync(ct);
if (row != null && row.ShopId != request.ShopId)
throw new AppException("订单属于其他店铺,不能覆盖记录");
if (row == null)
await orm.Insert(new OptimizeRemarkEntity
{
ShopId = request.ShopId, OrderId = request.OrderId, Remark = request.Remark!,
AddTime = DateTime.Now, MdyTime = DateTime.Now
}).ExecuteAffrowsAsync(ct);
else
{
var update = orm.Update<OptimizeRemarkEntity>().Where(r => r.Id == row.Id)
.Set(r => r.Remark, request.Remark!).Set(r => r.MdyTime, DateTime.Now);
await update.ExecuteAffrowsAsync(ct);
}
ct.ThrowIfCancellationRequested();
work.Commit();
}
/// <summary>分页查询可见店铺的物流优化备注,统计与数据使用相同范围。</summary>
public async Task<ShopPage<OptimizeRemarkInfo>> OptimizeRemarks(OrderSearchRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
Page(request.Page, request.PageSize);
var actor = await Actor();
var ids = await VisibleIds(actor, ct);
var query = db.Select<OptimizeRemarkEntity>().Where(r => ids.Contains(r.ShopId))
.WhereIf(request.OrderIds != null, r => request.OrderIds!.Contains(r.OrderId));
var count = request.NotCount ? -1 : await query.CountAsync(ct);
var rows = await query.OrderByDescending(r => r.Id).Page(request.Page, request.PageSize).ToListAsync(ct);
return new(rows.Select(new ShopDetailsMapper().Map).ToList(), count);
}
}