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 { /// 查询微信业务下的拼多多店铺,保持与 bxx.shop 数据隔离。 public async Task> 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().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); } /// 导入拼多多店铺,重复导入更新资料;已有Cookie只能由专用登录更新接口修改。 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().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().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(); } /// 刷新本人或已分配拼多多店铺的Cookie、状态及拼多多用户ID。 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().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() .Where(s => s.LoginName == request.LoginName && (s.UserName == name || ("," + s.SubUserName + ",").Contains(member))).AnyAsync(ct)) throw new AppException("店铺不存在或无操作权限"); } /// 删除当前账号自己创建的拼多多店铺,分配账号不能删除。 public async Task DeletePdd(LoginRequest request, CancellationToken ct) { RequestValidator.Validate(request); var actor = await Actor(); var count = await db.Delete().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("店铺不存在或无删除权限"); } }