Files
2026-10-29 11:34:35 +08:00

109 lines
6.7 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>查询微信业务下的拼多多店铺,保持与 bxx.shop 数据隔离。</summary>
public async Task<ShopPage<ShopInfo>> PddShops(ShopSearchRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
Page(request.Page, request.PageSize);
var actor = await Actor();
var name = actor.UserName;
var member = "," + name + ",";
var query = db.Select<PddLoginShopEntity>().Where(s => s.UserName == name || ("," + s.SubUserName + ",").Contains(member))
.WhereIf(!string.IsNullOrEmpty(request.SearchId), s => s.ShopId.Contains(request.SearchId!))
.WhereIf(!string.IsNullOrEmpty(request.SearchUserName), s => s.UserName.Contains(request.SearchUserName!))
.WhereIf(!string.IsNullOrEmpty(request.SearchLoginName), s => s.LoginName.Contains(request.SearchLoginName!))
.WhereIf(!string.IsNullOrEmpty(request.SearchName), s => s.ShopAccount.Contains(request.SearchName!))
.WhereIf(!string.IsNullOrEmpty(request.SearchNotes), s => s.Notes.Contains(request.SearchNotes!))
.WhereIf(!string.IsNullOrEmpty(request.OperateSubSaName), s => s.OperateSubSaName == request.OperateSubSaName)
.WhereIf(request.ShopIds != null, s => request.ShopIds!.Contains(s.ShopId))
.WhereIf(request.ShopNames != null, s => request.ShopNames!.Contains(s.ShopAccount))
.WhereIf(request.ShopNotes != null, s => request.ShopNotes!.Contains(s.Notes));
var count = await query.CountAsync(ct);
var rows = await query.OrderByDescending(s => s.Id).Page(request.Page, request.PageSize).ToListAsync(ct);
return new(rows.Select(new ShopDetailsMapper().Map).ToList(), count);
}
/// <summary>导入拼多多店铺,重复导入更新资料;已有Cookie只能由专用登录更新接口修改。</summary>
public async Task SavePdd(PddSaveRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
var actor = await Actor();
var name = actor.UserName;
await ValidateAssignments(request.SubUserName, name);
using var work = db.CreateUnitOfWork();
work.IsolationLevel = System.Data.IsolationLevel.Serializable;
work.GetOrBeginTransaction();
var orm = work.Orm;
var rows = await orm.Select<PddLoginShopEntity>().Where(s => s.UserName == name && s.LoginName == request.LoginName)
.WhereIf(!string.IsNullOrEmpty(request.ShopId), s => s.ShopId == request.ShopId).ForUpdate().ToListAsync(ct);
if (rows.Count == 0)
{
await orm.Insert(new PddLoginShopEntity
{
UserName = name, LoginName = request.LoginName, LoginPass = request.LoginPass ?? "",
Cookie = request.Cookie ?? "", Cookie2 = request.Cookie2 ?? "", AntiContents = request.AntiContents ?? "",
ShopId = request.ShopId ?? "", MallId = request.MallId ?? "", ShopAccount = request.ShopAccount ?? "",
SubUserName = request.SubUserName ?? "", GroupName = request.GroupName ?? "", Notes = request.Notes ?? "",
LoginStatus = request.LoginStatus ?? "", AddTime = DateTime.Now, MdyTime = DateTime.Now
}).ExecuteAffrowsAsync(ct);
}
else
{
var ids = rows.Select(s => s.Id).ToArray();
var update = orm.Update<PddLoginShopEntity>().Where(s => ids.Contains(s.Id)).Set(s => s.MdyTime, DateTime.Now);
if (request.LoginPass != null) update.Set(s => s.LoginPass, request.LoginPass);
if (request.AntiContents != null) update.Set(s => s.AntiContents, request.AntiContents);
if (request.NewShopId != null) update.Set(s => s.ShopId, request.NewShopId);
if (request.MallId != null) update.Set(s => s.MallId, request.MallId);
if (request.ShopAccount != null) update.Set(s => s.ShopAccount, request.ShopAccount);
if (request.SubUserName != null) update.Set(s => s.SubUserName, request.SubUserName);
if (request.GroupName != null) update.Set(s => s.GroupName, request.GroupName);
if (request.Notes != null) update.Set(s => s.Notes, request.Notes);
if (request.LoginStatus != null) update.Set(s => s.LoginStatus, request.LoginStatus);
await update.ExecuteAffrowsAsync(ct);
}
ct.ThrowIfCancellationRequested();
work.Commit();
}
/// <summary>刷新本人或已分配拼多多店铺的Cookie、状态及拼多多用户ID。</summary>
public async Task UpdatePddCookies(CookieRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
if (request.Cookie == null && request.Cookie2 == null && request.LoginStatus == null && request.LoginStatus2 == null && request.PddId == null)
throw new ValidationException("至少提供一个登录状态字段");
var actor = await Actor();
var name = actor.UserName;
var member = "," + name + ",";
var update = db.Update<PddLoginShopEntity>().Where(s => s.LoginName == request.LoginName
&& (s.UserName == name || ("," + s.SubUserName + ",").Contains(member))).Set(s => s.MdyTime, DateTime.Now);
if (request.Cookie != null) update.Set(s => s.Cookie, request.Cookie);
if (request.Cookie2 != null) update.Set(s => s.Cookie2, request.Cookie2);
if (request.LoginStatus != null) update.Set(s => s.LoginStatus, request.LoginStatus);
if (request.LoginStatus2 != null) update.Set(s => s.LoginStatus2, request.LoginStatus2);
if (request.PddId != null) update.Set(s => s.PddId, request.PddId);
if (await update.ExecuteAffrowsAsync(ct) == 0 && !await db.Select<PddLoginShopEntity>()
.Where(s => s.LoginName == request.LoginName && (s.UserName == name || ("," + s.SubUserName + ",").Contains(member))).AnyAsync(ct))
throw new AppException("店铺不存在或无操作权限");
}
/// <summary>删除当前账号自己创建的拼多多店铺,分配账号不能删除。</summary>
public async Task DeletePdd(LoginRequest request, CancellationToken ct)
{
RequestValidator.Validate(request);
var actor = await Actor();
var count = await db.Delete<PddLoginShopEntity>().Where(s => s.UserName == actor.UserName && s.LoginName == request.LoginName)
.WhereIf(!string.IsNullOrEmpty(request.ShopId), s => s.ShopId == request.ShopId).ExecuteAffrowsAsync(ct);
if (count == 0) throw new AppException("店铺不存在或无删除权限");
}
}