using Coldairarrow.Business.MDS; using Coldairarrow.Entity.DTO; using Coldairarrow.Entity.Enum; using Coldairarrow.Entity.HuiYan; using Coldairarrow.Entity.MDS; using Coldairarrow.IBusiness; using Coldairarrow.Util; using EFCore.Sharding; using LinqKit; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; using System.Linq.Expressions; using System.Threading.Tasks; namespace Coldairarrow.Business.HuiYan { public class pricetasklogBusiness : BaseBusiness, IpricetasklogBusiness, ITransientDependency { IuserBusiness _iuserBusiness; readonly IOperator _operator; public pricetasklogBusiness(IDbAccessor db, IuserBusiness iuserBusiness, IOperator @operator) : base(db) { _operator=@operator; _iuserBusiness = iuserBusiness; } #region 外部接口 public async Task> GetDataListAsync(PageInput input) { var q = GetIQueryable(); var where = LinqHelper.True(); var search = input.Search; //筛选 if (!search.Condition.IsNullOrEmpty() && !search.Keyword.IsNullOrEmpty()) { var newWhere = DynamicExpressionParser.ParseLambda( ParsingConfig.Default, false, $@"{search.Condition}.Contains(@0)", search.Keyword); where = where.And(newWhere); } return await q.Where(where).GetPageResultAsync(input); } public async Task GetTheDataAsync(string id) { return await GetEntityAsync(id); } public async Task AddDataAsync(pricetasklog data) { await InsertAsync(data); } public async Task UpdateDataAsync(pricetasklog data) { await UpdateAsync(data); } public async Task DeleteDataAsync(List ids) { await DeleteAsync(ids); } #endregion public PageResult GetItems(PageInput input) { Expression> select = (a, b) => new TeamitemDto { GoodsId = b.GoodsId, HasFilter = b.HasFilter, Platform = b.Platform, GoodsUrl = b.GoodsUrl, Extensions = Newtonsoft.Json.JsonConvert.DeserializeObject>(a.ExtensionJson) }; var search = input.Search; select = select.BuildExtendSelectExpre(); var q_titem = Db.GetIQueryable(); var q = from a in q_titem.AsExpandable() join b in Db.GetIQueryable() on a.ItemId equals b.Id into ab from b in ab.DefaultIfEmpty() select @select.Invoke(a, b); //查询对应状态 var where = LinqHelper.True().And(c => c.PriceTaskUserId == _operator.UserId); int state = int.Parse(search.Keyword); where = where.And(c => c.State == state); var list = q.Where(where).GetPageResultAsync(input).Result; return list; } /// /// 获取当天可执行数量 /// /// public AjaxResult GetMyCount() { var nowCount = Db.GetIQueryable().Count(c => c.CreateTime.Date == DateTime.Now.Date || c.CreateTime == DateTime.MinValue && c.UserId == _operator.UserId); var user = Db.GetIQueryable().FirstOrDefault(c => c.Id == _operator.UserId); return Success(new { MaxCount = user.MaxPriceTaskCount, Count = user.MaxPriceTaskCount - nowCount }); } /// /// 添加比价任务 /// /// public AjaxResult AddTask(string teamItemId) { var teamItem = Db.GetIQueryable().FirstOrDefault(c => c.Id == teamItemId&&c.UserId==_operator.UserId); if (teamItem == null) { return Error("任务不存在!"); } var users = _iuserBusiness.GetPriceTaskUserList().ToList(); Expression> select = (a, b) => new PricetaskUser() { UserName = a.UserName, MaxTaskCount = a.MaxPriceTaskCount, Uid=a.Id }; select = select.BuildExtendSelectExpre(); var q_User = Db.GetIQueryable().Where(c => c.CreateTime.Date == DateTime.Now.Date || c.CreateTime == DateTime.MinValue); var q = from a in users join b in q_User on a.Id equals b.UserId into ab from b in ab.DefaultIfEmpty() select @select.Invoke(a, b); //获取当日可分配的一个用户 var user = q.GroupBy(c => c.Uid).Where(c => c.Count() < c.FirstOrDefault()?.MaxTaskCount).Select(c => new { Id = c.Key, Count = c.Count() }).OrderBy(c => c.Count).FirstOrDefault(); if (user == null) { //钉钉推送 return Error("当前任务量已超过任务池可用任务量!"); } var result = Db.RunTransaction(() => { int row= Db.Update(c => c.Id == teamItem.Id, (item) => { item.PriceTaskUserId= user.Id; item.State = (int)TeamItemState.已发布比价; }); if (row <= 0) throw new Exception("系统繁忙!"); row = Db.Insert(new pricetasklog() { CreateTime = DateTime.Now, Id = IdHelper.GetId(), CreatorId = _operator.UserId, Deleted = false, ItemId = teamItem.ItemId, UserId = user.Id, State = PriceTaskState.待比价, TeamItemId = teamItem.Id }); if (row <= 0) throw new Exception("系统任务繁忙!"); }); if (result.Success) { return Success("发布任务成功!"); } return Error(result.ex.Message); } #region 私有成员 #endregion } }