137 lines
7.6 KiB
C#
137 lines
7.6 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 SaveDefaultAddress(AddressRequest 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<DefaultAddressEntity>()
|
|
.Where(a => a.UserId == actor.UserName && a.ShopId == request.ShopId).ForUpdate().FirstAsync(ct);
|
|
if (row == null)
|
|
await orm.Insert(new DefaultAddressEntity
|
|
{
|
|
UserId = actor.UserName, ShopId = request.ShopId, ProvinceName = request.ProvinceName,
|
|
CityName = request.CityName, CountyName = request.CountyName, DetailInfo = request.DetailInfo,
|
|
Receiver = request.Receiver, TelNumber = request.TelNumber, AddTime = DateTime.Now, MdyTime = DateTime.Now
|
|
}).ExecuteAffrowsAsync(ct);
|
|
else
|
|
await orm.Update<DefaultAddressEntity>().Where(a => a.Id == row.Id)
|
|
.Set(a => a.ProvinceName, request.ProvinceName).Set(a => a.CityName, request.CityName)
|
|
.Set(a => a.CountyName, request.CountyName).Set(a => a.DetailInfo, request.DetailInfo)
|
|
.Set(a => a.Receiver, request.Receiver).Set(a => a.TelNumber, request.TelNumber)
|
|
.Set(a => a.MdyTime, DateTime.Now).ExecuteAffrowsAsync(ct);
|
|
ct.ThrowIfCancellationRequested();
|
|
work.Commit();
|
|
}
|
|
|
|
/// <summary>按当前账号和可见店铺范围查询默认地址。</summary>
|
|
public async Task<ShopPage<DefaultAddressInfo>> DefaultAddresses(AddressSearchRequest 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<DefaultAddressEntity>().Where(a => a.UserId == actor.UserName && ids.Contains(a.ShopId))
|
|
.WhereIf(request.ShopIds != null, a => request.ShopIds!.Contains(a.ShopId));
|
|
var count = request.NotCount ? -1 : await query.CountAsync(ct);
|
|
var rows = await query.OrderByDescending(a => a.Id).Page(request.Page, request.PageSize).ToListAsync(ct);
|
|
return new(rows.Select(new ShopDetailsMapper().Map).ToList(), count);
|
|
}
|
|
|
|
/// <summary>删除本人指定店铺的默认地址,不影响其他账号保存的地址。</summary>
|
|
public async Task DeleteDefaultAddresses(ShopIdsRequest request, CancellationToken ct)
|
|
{
|
|
RequestValidator.Validate(request);
|
|
Ids(request.ShopIds);
|
|
var actor = await Actor();
|
|
var ids = await VisibleIds(actor, ct);
|
|
if (request.ShopIds.Except(ids).Any()) throw new AppException("包含无权访问的店铺");
|
|
await db.Delete<DefaultAddressEntity>().Where(a => a.UserId == actor.UserName && request.ShopIds.Contains(a.ShopId)).ExecuteAffrowsAsync(ct);
|
|
}
|
|
|
|
/// <summary>以店铺及订单为键保存解密地址,禁止跨店覆盖。</summary>
|
|
public async Task SaveOrderAddress(OrderAddressRequest 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<OrderAddressEntity>().Where(a => a.ShopId == request.ShopId && a.OrderId == request.OrderId).ForUpdate().FirstAsync(ct);
|
|
if (row == null)
|
|
await orm.Insert(new OrderAddressEntity { ShopId = request.ShopId, OrderId = request.OrderId,
|
|
OrderAddress = request.OrderAddress, AddTime = DateTime.Now, MdyTime = DateTime.Now }).ExecuteAffrowsAsync(ct);
|
|
else
|
|
await orm.Update<OrderAddressEntity>().Where(a => a.Id == row.Id).Set(a => a.OrderAddress, request.OrderAddress)
|
|
.Set(a => a.MdyTime, DateTime.Now).ExecuteAffrowsAsync(ct);
|
|
ct.ThrowIfCancellationRequested();
|
|
work.Commit();
|
|
}
|
|
|
|
/// <summary>查询订单解密地址,先限制当前用户可见店铺,再按订单过滤。</summary>
|
|
public async Task<ShopPage<OrderAddressInfo>> OrderAddresses(OrderSearchRequest request, CancellationToken ct)
|
|
{
|
|
RequestValidator.Validate(request);
|
|
Page(request.Page, request.PageSize);
|
|
if (request.OrderIds == null) throw new ValidationException("订单编号不能为空");
|
|
Ids(request.OrderIds);
|
|
var actor = await Actor();
|
|
var ids = await VisibleIds(actor, ct);
|
|
var query = db.Select<OrderAddressEntity>().Where(a => ids.Contains(a.ShopId) && request.OrderIds.Contains(a.OrderId));
|
|
var count = request.NotCount ? -1 : await query.CountAsync(ct);
|
|
var rows = await query.OrderByDescending(a => a.Id).Page(request.Page, request.PageSize).ToListAsync(ct);
|
|
return new(rows.Select(new ShopDetailsMapper().Map).ToList(), count);
|
|
}
|
|
|
|
/// <summary>采购备注按可信主账号归属保存,直属子账号共享主账号的备注。</summary>
|
|
public async Task SaveBuyNote(NoteRequest request, CancellationToken ct)
|
|
{
|
|
RequestValidator.Validate(request);
|
|
var owner = MainName(await Actor());
|
|
if (request.MainUserName != null && request.MainUserName != owner) throw new AppException("无权修改其他主账号备注");
|
|
using var work = db.CreateUnitOfWork();
|
|
work.IsolationLevel = System.Data.IsolationLevel.Serializable;
|
|
work.GetOrBeginTransaction();
|
|
var orm = work.Orm;
|
|
var row = await orm.Select<BuyUrlNoteEntity>().Where(n => n.UserName == owner && n.SpuCode == request.SpuCode).ForUpdate().FirstAsync(ct);
|
|
if (row == null)
|
|
await orm.Insert(new BuyUrlNoteEntity { UserName = owner, SpuCode = request.SpuCode,
|
|
BuyUrlNotes = request.BuyUrlNotes, AddTime = DateTime.Now, MdyTime = DateTime.Now }).ExecuteAffrowsAsync(ct);
|
|
else
|
|
await orm.Update<BuyUrlNoteEntity>().Where(n => n.Id == row.Id).Set(n => n.BuyUrlNotes, request.BuyUrlNotes)
|
|
.Set(n => n.MdyTime, DateTime.Now).ExecuteAffrowsAsync(ct);
|
|
ct.ThrowIfCancellationRequested();
|
|
work.Commit();
|
|
}
|
|
|
|
/// <summary>分页查询当前主账号的采购备注。</summary>
|
|
public async Task<ShopPage<BuyUrlNoteInfo>> BuyNotes(NoteSearchRequest request, CancellationToken ct)
|
|
{
|
|
RequestValidator.Validate(request);
|
|
Page(request.Page, request.PageSize);
|
|
Ids(request.SpuCodes);
|
|
var owner = MainName(await Actor());
|
|
if (request.MainUserName != null && request.MainUserName != owner) throw new AppException("无权查询其他主账号备注");
|
|
var query = db.Select<BuyUrlNoteEntity>().Where(n => n.UserName == owner && request.SpuCodes.Contains(n.SpuCode));
|
|
var count = request.NotCount ? -1 : await query.CountAsync(ct);
|
|
var rows = await query.OrderByDescending(n => n.Id).Page(request.Page, request.PageSize).ToListAsync(ct);
|
|
return new(rows.Select(new ShopDetailsMapper().Map).ToList(), count);
|
|
}
|
|
}
|