109 lines
6.7 KiB
C#
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("店铺不存在或无删除权限");
|
|
}
|
|
}
|