using Furion.DependencyInjection; using Furion.DistributedIDGenerator; using Furion.DynamicApiController; using Microsoft.AspNetCore.Mvc; using Nirvana.Common; using Nirvana.Common.ApiBase; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Waste.Domain; namespace Waste.Application { /// /// 商户管理 /// public class BusinessService : BaseInfoService, IBusinessService, ITransient { private readonly ISqlSugarRepository repository; private readonly SqlSugarClient dbClient; public BusinessService(ISqlSugarRepository sqlSugarRepository) { repository = sqlSugarRepository; dbClient = repository.Context; } /// /// 删除商户 /// /// /// public Task DeleteFormAsync(Guid keyValue) { throw new NotImplementedException(); } /// /// 详情 /// /// /// public async Task DetailAsync(Guid id) { var buss = await dbClient.Queryable().Select(x => new W_Business { Name = x.Name, Address = x.Address, Area = x.Area, City = x.City, Phone = x.Phone, Province = x.Province, Id = x.Id, Remark = x.Remark }).Where(x => x.Id == id).FirstAsync(); var user = await repository.Change().Context.Queryable().FirstAsync(x => x.BusinessId == buss.Id); return new BusinessInfo { AccountType = user.AccountType, Name = buss.Name, Address = buss.Address, Area = buss.Area, City = buss.City, Phone = buss.Phone, Province = buss.Province, Remark = buss.Remark, Id = buss.Id }; } /// /// 获取所有商户 /// /// public async Task> GetAllList(int status = -1) { var tempquery = dbClient.Queryable(); if (status >= 0) { tempquery = tempquery.Where(x => x.Status == status); } if (currentUser.AccountType != (int)AccountType.platform) { var sql = $"code like '{currentUser.BusinessCode}'+'%'"; tempquery = tempquery.Where(sql); } else { tempquery = tempquery.Where(x => SqlFunc.Subqueryable().Where(e => e.AccountType == 1 && e.BusinessId == x.Id).Any()); } return await tempquery.ToListAsync(); } /// /// 商户列表 /// /// /// 是否包含管理员,true-不包含,false-包含 /// public async Task> GetListAsync(QueryParams param, bool noadmin = false) { RefAsync totalnum = 0; var temquery = dbClient.Queryable(); if (param.queryParam != null && param.queryParam.Count > 0) { List conModels = new List(); param.queryParam.ForEach(x => { if (!string.IsNullOrEmpty(x.Value)) { conModels.Add(new ConditionalModel() { FieldName = x.Name, ConditionalType = (ConditionalType)x.Type, FieldValue = x.Value.Trim() }); } }); if (conModels.Count > 0) { temquery = temquery.Where(conModels); } } if (noadmin) { temquery = temquery.Where(x => SqlFunc.Subqueryable().Where(e => e.AccountType == 1 && e.BusinessId == x.Id).Any()); } //针对非平台类型,则可以查看下面所有的子账户设备 if (currentUser.AccountType != (int)AccountType.platform) { var sql = $" code !={currentUser.BusinessCode} and code like '{currentUser.BusinessCode}'+'%' and id = x.id"; temquery = temquery.Where(x => SqlFunc.Subqueryable().Where(sql).Any()); } string sorts = string.Format("{0} {1}", param.sort, param.order); var query = await temquery.OrderBy(sorts) .Select(x => new BusinessList { Id = x.Id, Address = x.Address, CreateTime = x.CreateTime, Status = x.Status, Name = x.Name, Phone = x.Phone }) .Mapper((it, cache) => { if (!noadmin) { var allrealdata = cache.Get(list => { var ids = list.Select(x => x.Id).ToList(); return repository.Change().Context.Queryable().Where(x => ids.Contains(x.BusinessId)).ToList(); }); var realdata = allrealdata.FirstOrDefault(x => x.BusinessId == it.Id); if (realdata != null) { it.BusinessCnt = realdata.BusinessCnt; it.DevCnt = realdata.DevCnt; it.TodayDevActiveCnt = realdata.TodayDevActiveCnt; it.TodayCount = realdata.TodayCount; it.TodayWeight = realdata.TodayWeight; it.TodayPureWeight = realdata.TodayPureWeight; it.TotalCount = realdata.TotalCount; it.TotalWeight = realdata.TotalWeight; it.TotalPureWeight = realdata.TotalPureWeight; } } }) .ToPageListAsync(param.offset, param.limit, totalnum); return new PageParms { page = param.offset, Items = query, totalnum = totalnum, limit = param.limit }; } /// /// 重置密码 /// /// /// /// public async Task ResetPwdAsync(Guid id, string pwd) { if (string.IsNullOrEmpty(pwd)) { pwd = "123456"; } if (!await dbClient.Queryable().AnyAsync(x => x.Id == id)) { return new ResultInfo(ResultState.FAIL, "此商户未找到"); } if (!await repository.Change().Context.Queryable().AnyAsync(x => x.BusinessId == id)) { return new ResultInfo(ResultState.FAIL, "账户未找到"); } var Secret = Md5.md5(Common.CreateNo(), 16).ToLower(); var Password = Md5.md5(DESEncrypt.Encrypt(Md5.md5(pwd, 32).ToLower(), Secret).ToLower(), 32).ToLower(); await repository.Change().Context.Updateable().SetColumns(x => new W_Account { Secret = Secret, Password = Password }).Where(x => x.BusinessId == id).ExecuteCommandAsync(); return new ResultInfo(ResultState.SUCCESS, "密码重置成功"); } /// /// 修改密码 /// /// /// public async Task ChangePwdAsync(BusienssPwd busienssPwd) { if (busienssPwd.NewPwd != busienssPwd.ReNewPwd) { return new ResultInfo(ResultState.FAIL, "两次密码不一致"); } var account = await repository.Change().Context.Queryable().FirstAsync(x => x.Id == currentUser.UserId); if (account == null) { return new ResultInfo(ResultState.FAIL, "账户未找到"); } var oldpassword = Md5.md5(DESEncrypt.Encrypt(Md5.md5(busienssPwd.OldPwd, 32).ToLower(), account.Secret).ToLower(), 32).ToLower(); if (oldpassword != account.Password) { return new ResultInfo(ResultState.FAIL, "旧密码错误"); } var newpassword = Md5.md5(DESEncrypt.Encrypt(Md5.md5(busienssPwd.NewPwd, 32).ToLower(), account.Secret).ToLower(), 32).ToLower(); await dbClient.Updateable().SetColumns(x => new W_Account { Password = newpassword }).Where(x => x.Id == account.Id).ExecuteCommandAsync(); return new ResultInfo(ResultState.SUCCESS, "密码修改成功"); } /// /// 信息提交 /// /// /// public async Task SubmitFormAsync(BusinessInfo buss) { buss.Province = buss.Province.ToStr(); buss.City = buss.City.ToStr(); buss.Area = buss.Area.ToStr(); buss.Remark = buss.Remark.ToStr(); buss.Phone = buss.Phone.ToStr(); buss.Name = buss.Name.ToStr(); buss.Address = buss.Address.ToStr(); if (buss.AccountType <= 0 || buss.AccountType != (int)AccountType.platform) { buss.AccountType = (int)AccountType.agent; } Guid roleid = Guid.Parse("39FC70AA-652F-CE76-98A8-5C32D6E5D619"); if (buss.AccountType == (int)AccountType.platform) { roleid = Guid.Parse("39FC70AA-1CDA-B9CD-5275-3D144841BEDD"); } if (buss.Id != Guid.Empty) { if (await dbClient.Queryable().AnyAsync(x => x.Phone == buss.Phone && x.Id != buss.Id)) { return new ResultInfo() { code = ResultState.FAIL, message = "手机号已注册!" }; } if (await dbClient.Queryable().AnyAsync(x => x.Phone == buss.Phone && x.BusinessId != buss.Id)) { return new ResultInfo() { code = ResultState.FAIL, message = "手机号已注册!" }; } if (!await dbClient.Queryable().AnyAsync(x => x.Id == buss.Id)) { return new ResultInfo() { code = ResultState.FAIL, message = "商户未找到!" }; } await dbClient.Updateable().SetColumns(x => new W_Business { Address = buss.Address, Phone = buss.Phone, Name = buss.Name, Area = buss.Area, City = buss.City, Province = buss.Province, Remark = buss.Remark }).Where(x => x.Id == buss.Id).ExecuteCommandAsync(); //更新登录账户,如果手机号有变动,则登录账户也变动 if (currentUser.AccountType != (int)AccountType.platform) { await dbClient.Updateable().SetColumns(x => new W_Account { Phone = buss.Phone, RealName = buss.Name, UserName = buss.Phone }).Where(x => x.BusinessId == buss.Id).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new W_Account { Phone = buss.Phone, RealName = buss.Name, UserName = buss.Phone, AccountType = buss.AccountType, RoleId = roleid }).Where(x => x.BusinessId == buss.Id).ExecuteCommandAsync(); } return new ResultInfo(ResultState.SUCCESS, "修改成功"); } else { if (await dbClient.Queryable().AnyAsync(x => x.Phone == buss.Phone)) { return new ResultInfo() { code = ResultState.FAIL, message = "手机号已注册!" }; } if (await repository.Change().Context.Queryable().AnyAsync(x => x.Phone == buss.Phone)) { return new ResultInfo() { code = ResultState.FAIL, message = "手机号已注册!" }; } Guid parentid = Guid.Empty; string code = ""; if (currentUser.AccountType != (int)AccountType.platform) { parentid = currentUser.BusinessId; var bcode = currentUser.BusinessCode; var len = bcode.Length; var maxcode = await dbClient.Queryable().Where(x => SqlFunc.StartsWith(x.Code, code) && SqlFunc.Length(x.Code) > len).MaxAsync(x => x.Code); var cnt = maxcode.Substring(maxcode.Length - 4).ToInt(); code = GenCode(bcode, cnt); } else { var cnt = (await dbClient.Queryable().Where(x => SqlFunc.Length(x.Code) == 4).MaxAsync(x => x.Code)).ToInt(); code = GenCode("", cnt); } var business = new W_Business { ParentId = parentid, Code = code, CreateTime = DateTime.Now, Status = (int)StatusType.Enabled, Address = buss.Address, Area = buss.Area, City = buss.City, Name = buss.Name, Phone = buss.Phone, Province = buss.Province, Remark = buss.Remark, Id = IDGen.NextID() }; await dbClient.Insertable(business).ExecuteCommandAsync(); //添加登录账户 if (string.IsNullOrEmpty(buss.Password)) { buss.Password = buss.Phone; } var UserSecretKey = Md5.md5(Common.CreateNo(), 16).ToLower(); var Password = Md5.md5(DESEncrypt.Encrypt(Md5.md5(buss.Password, 32).ToLower(), UserSecretKey).ToLower(), 32).ToLower(); await dbClient.Insertable(new W_Account { UserName = buss.Phone, RealName = buss.Name, Secret = UserSecretKey, BusinessId = business.Id, Password = Password, AccountType = buss.AccountType, CreateTime = DateTime.Now, Id = business.Id, LastVisitIP = "", Status = (int)StatusType.Enabled, LastVisitTime = null, Phone = buss.Phone, RoleId = roleid }).ExecuteCommandAsync(); //插入或者更新实时数据 await InsertOrUpdateRealDataAsync(); if (currentUser.AccountType != (int)AccountType.platform) { await InsertOrUpdateRealDataAsync(currentUser.BusinessId); } return new ResultInfo(ResultState.SUCCESS, "添加成功"); } } /// /// 生成用户code /// /// 当前用户的code /// 名下用户数量 /// private string GenCode(string code, int cnt) { var ccode = "0001"; if (cnt < 9) { ccode = $"000{cnt + 1}"; } else if (cnt >= 9 && cnt < 99) { ccode = $"00{cnt + 1}"; } else if (cnt >= 99 && cnt < 999) { ccode = $"0{cnt + 1}"; } else { ccode = $"{cnt + 1}"; } if (!string.IsNullOrEmpty(code)) { return $"{code}{ccode}"; } return ccode; } /// /// 更新或者插入实时数据 /// /// public async Task InsertOrUpdateRealDataAsync() { //更新总体数据 var tdbClient = repository.Change().Context; int busiensscnt = await repository.Change().Context.Queryable().CountAsync(); int devcnt = await dbClient.Queryable().CountAsync(); int todaydevactivecnt = await dbClient.Queryable().Where(x => SqlFunc.DateIsSame(x.LastHeartTime, DateTime.Now)).CountAsync(); var data = await tdbClient.Queryable().FirstAsync(); if (data == null) { var realdata = new W_RealData { Id = IDGen.NextID(), BusinessCnt = busiensscnt, DevCnt = devcnt, TodayCount = 0, TodayDevActiveCnt = todaydevactivecnt, TodayPureWeight = 0, TodayWeight = 0, TotalCount = 0, TotalPureWeight = 0, TotalWeight = 0 }; await tdbClient.Insertable(realdata).ExecuteCommandAsync(); } else { await tdbClient.Updateable().SetColumns(x => new W_RealData { DevCnt = devcnt, BusinessCnt = busiensscnt, TodayDevActiveCnt = todaydevactivecnt }).Where(x => x.Id == data.Id).ExecuteCommandAsync(); } } /// /// 更新或者插入指定商户实时数据 /// /// public async Task InsertOrUpdateRealDataAsync(Guid BusinessId) { if (BusinessId != Guid.Empty) { var tdbClient = repository.Change().Context; int todaydevactivecnt = await repository.Change().Context.Queryable().Where(x => x.Businessid == BusinessId && SqlFunc.DateIsSame(x.LastHeartTime, DateTime.Now)).CountAsync(); int devcnt = await repository.Change().Context.Queryable().Where(x => x.Businessid == BusinessId).CountAsync(); int businesscnt = await dbClient.Queryable().Where(x => x.ParentId == BusinessId).CountAsync(); if (!await tdbClient.Queryable().AnyAsync(x => x.BusinessId == BusinessId)) { var realdata = new W_BusinessRealData { TodayDevActiveCnt = todaydevactivecnt, DevCnt = devcnt, BusinessId = BusinessId, Id = IDGen.NextID(), TodayCount = 0, TodayPureWeight = 0, TodayWeight = 0, TotalCount = 0, TotalPureWeight = 0, TotalWeight = 0, BusinessCnt = businesscnt }; await tdbClient.Insertable(realdata).ExecuteCommandAsync(); } else { await tdbClient.Updateable().SetColumns(x => new W_BusinessRealData { DevCnt = devcnt, TodayDevActiveCnt = todaydevactivecnt, BusinessCnt = businesscnt }).Where(x => x.BusinessId == BusinessId).ExecuteCommandAsync(); } } } /// /// 更新或者插入指定商户实时数据 /// /// public async Task InsertOrUpdateRealDataAsync(List BusinessId) { if (BusinessId != null && BusinessId.Count > 0) { foreach (var item in BusinessId) { await InsertOrUpdateRealDataAsync(item); } } } /// /// 获取账户统计信息 /// /// public async Task GetTotalInfoAsync() { if (currentUser.AccountType != (int)AccountType.platform) { var data = await repository.Change().Context.Queryable().FirstAsync(x => x.BusinessId == currentUser.BusinessId); if (data == null) return null; return new W_RealData { DevCnt = data.DevCnt, TodayDevActiveCnt = data.TodayDevActiveCnt, BusinessCnt = 0, TodayCount = data.TodayCount, TodayPureWeight = data.TodayPureWeight, TodayWeight = data.TodayWeight, TotalCount = data.TotalCount, TotalPureWeight = data.TotalPureWeight, TotalWeight = data.TotalWeight }; } else { var data = await repository.Change().Context.Queryable().FirstAsync(); return data; } } /// /// 获取商户的昨天汇总信息 /// /// public async Task GetBusinessTotalInfo() { DateTime yestodaytime = DateTime.Now.AddDays(-1); if (currentUser.AccountType != (int)AccountType.platform) { string basesql = $"code like '{currentUser.BusinessCode}'+'%' and id = x.id"; string sql = $" code !={currentUser.BusinessCode} and {basesql}"; string devicesql = $"code like '{currentUser.BusinessCode}'+'%' and id = x.businessid"; int businesscnt = await dbClient.Queryable().Where(x => SqlFunc.Subqueryable().Where(sql).Any()).CountAsync(); int devcnt = await repository.Change().Context.Queryable().Where(x => SqlFunc.Subqueryable().Where(devicesql).Any()).CountAsync(); var tempquery = repository.Change().Context.Queryable().Where(x => SqlFunc.DateIsSame(x.CreateTime, yestodaytime) && SqlFunc.Subqueryable().Where(devicesql).Any()); int count = await tempquery.Clone().SumAsync(x => x.DayCount); decimal weight = await tempquery.Clone().SumAsync(x => x.DayWeight); decimal pureweight = await tempquery.Clone().SumAsync(x => x.DayPureWeight); return new BusinessReport { BusinessCnt = businesscnt, DevCount = devcnt, YestodayCount = count, YestodayPureWeight = pureweight, YestodayWeight = weight }; } else { var tempquery = repository.Change().Where(x => SqlFunc.DateIsSame(x.CreateTime, yestodaytime)); int count = await tempquery.Clone().SumAsync(x => x.DayCount); decimal weight = await tempquery.Clone().SumAsync(x => x.DayWeight); decimal pureweight = await tempquery.Clone().SumAsync(x => x.DayPureWeight); var data = await repository.Change().Context.Queryable().FirstAsync(); return new BusinessReport { DevCount = data.DevCnt, BusinessCnt = data.BusinessCnt, YestodayCount = count, YestodayPureWeight = pureweight, YestodayWeight = weight }; } } } }