using Hncore.Infrastructure.Common; using Hncore.Infrastructure.EntitiesExtension; using Hncore.Infrastructure.Extension; using Hncore.Infrastructure.WebApi; using Hncore.Pass.Vpn.Domain; using Hncore.Pass.Vpn.Model; using Hncore.Pass.Vpn.Request.Product; using Hncore.Pass.Vpn.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; namespace Hncore.Pass.Vpn.Controllers { [ApiVersion("1.0")] [Route("api/course/v{version:apiVersion}/productaccount/[action]")] public class ProductAccountController : HncoreControllerBase { private ProductAccountService m_AccountService; private UserService m_UserService; private AgentService m_agentService; private ProductPackageService m_PackageService; private ProductService m_ProductService; public ProductAccountController(ProductAccountService _AccountServic , UserService _UserService , AgentService _agentService , ProductPackageService _PackageService , ProductService _ProductService) { m_AccountService = _AccountServic; m_UserService = _UserService; m_agentService = _agentService; m_PackageService = _PackageService; m_ProductService = _ProductService; } /// /// 添加 /// /// /// [HttpPost] public async Task Post([FromBody]ProductAccountEntity request) { request.TenantId = this.Request.GetManageUserInfo().TenantId; await m_AccountService.Add(request); return Success(); } /// /// 修改 /// /// /// [HttpPost] public async Task Put([FromBody]ProductAccountEntity request) { await m_AccountService.Update(request); return Success(); } /// /// 删除 /// /// /// [HttpPost] public async Task Delete([FromQuery]int id) { var account = await m_AccountService.Query(m => m.Id == id).FirstOrDefaultAsync(); account.DeleteTag = 1; await m_AccountService.Update(account); return Success(); } /// /// 删除 /// /// /// [HttpPost] public async Task Deletes([FromBody] List ids) { var data= m_AccountService.Query(m => ids.Contains(m.Id)); var flag = await m_AccountService.Deletes(data); if (flag) return Success(); else return Error("删除失败"); } /// /// 详情 /// /// /// [HttpGet] public async Task Get([FromQuery]int id) { var data = await m_AccountService.GetById(id); return Success(data); } /// /// 分页查询 /// /// /// [HttpGet] public async Task Page([FromQuery]AccountPageRequest request) { Expression> expr = m => 1 == 1; expr = expr.And(m => m.DeleteTag == 0); if (request.UserId > 0) { expr = expr.And(m => m.UserId == request.UserId); } if (request.KeyWord.Has()) { expr = expr.And(m => m.UserCode.Contains(request.KeyWord) || m.ProductName.Contains(request.KeyWord) || m.PackageName.Contains(request.KeyWord) || m.Account.Contains(request.KeyWord)); } if (request.ProductIds != null && request.ProductIds.Count > 0) { expr = expr.And(m =>request.ProductIds.Contains((int)m.ProductId)); } if (request.PackageNames != null && request.PackageNames.Count > 0) { expr = expr.And(m =>request.PackageNames.Contains((string)m.PackageName)); } if (request.AccountTypes!=null&&request.AccountTypes.Count>0) { expr = expr.And(m => request.AccountTypes.Contains(m.AccountType)); } if (request.BTime.HasValue && request.ETime.HasValue) { expr = expr.And(m => m.EndTime>=request.BTime&&m.EndTime<=request.ETime); } if (request.BkTime.HasValue && request.EkTime.HasValue) { expr = expr.And(m => m.StartTime>=request.BkTime&&m.StartTime<=request.EkTime); } if (request.ExpirdDay > -100) { if (request.ExpirdDay == 0) { expr = expr.And(m => m.EndTime.Value < DateTime.Now); }else if(request.ExpirdDay == -2){ expr = expr.And(m => m.EndTime.Value > DateTime.Now); } else if (request.ExpirdDay < 0 && request.ExpirdDay>-4) { expr = expr.And(m => Math.Ceiling((DateTime.Now - m.EndTime).Value.TotalDays) <= Math.Abs(request.ExpirdDay) && m.EndTime < DateTime.Now); } else if (request.ExpirdDay==-4) { expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) <= -4); }else if (request.ExpirdDay > 0){ expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) <= request.ExpirdDay && m.EndTime > DateTime.Now); } expr = expr.And(m => m.PackageName != "测试卡"); // expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) == request.ExpirdDay); } var ret = await m_AccountService.PageDesc(request.PageIndex, request.PageSize, expr,true,m=>m.Id); // ret.List.ForEach( // m => {m.UserCode = "***"; // }); var data = ret.ToApiResult(); return data; } /// /// 分页查询 /// /// /// [HttpGet] public async Task Search([FromQuery]AccountPageRequest request) { if (request.KeyWord.Has()) { Expression> expr = m => (m.Account== request.KeyWord||m.UserCode== request.KeyWord) && m.DeleteTag==0; if (request.ProductIds != null && request.ProductIds.Count > 0) { expr = expr.And(m =>request.ProductIds.Contains((int)m.ProductId)); } if (request.ExpirdDay > -100) { if (request.ExpirdDay == 0) { expr = expr.And(m => m.EndTime.Value < DateTime.Now); }else if(request.ExpirdDay == -2){ expr = expr.And(m => m.EndTime.Value > DateTime.Now); } else if (request.ExpirdDay < 0 && request.ExpirdDay>-4) { expr = expr.And(m => Math.Ceiling((DateTime.Now - m.EndTime).Value.TotalDays) <= Math.Abs(request.ExpirdDay) && m.EndTime < DateTime.Now); } else if (request.ExpirdDay==-4) { expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) <= -4); }else if (request.ExpirdDay > 0){ expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) <= request.ExpirdDay && m.EndTime > DateTime.Now); } expr = expr.And(m => m.PackageName != "测试卡"); // expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) == request.ExpirdDay); } var ret = await m_AccountService.PageDesc(request.PageIndex, request.PageSize, expr, true, m => m.Id); var data = ret.ToApiResult(); return data; } return Error("请输入关键字"); } /// /// 迁移 /// /// /// [HttpPost] public async Task BindUser([FromBody]BindUserRequest request) { var entityList = await m_AccountService.Query(m => request.AccountIds.Contains(m.Id)).ToListAsync(); if (entityList == null|| entityList.Count==0) return Error("没有选择账号"); var userEntity= await m_UserService.GetById(request.UserId); if (userEntity == null) return Error("会员不存在"); entityList.ForEach(entity => { entity.UserId = request.UserId; entity.UserCode = userEntity.LoginCode; entity.UserPhone = userEntity.Phone; }); await m_AccountService.Update(entityList); return Success(); } [HttpGet] public async Task GetOrginAccount([FromQuery]string accounts) { var accountList = await m_AccountService.GetAccounts(string.Join(",", accounts)); var originModel = await m_agentService.GetOriginAccounts(accountList); return Success(originModel); } [HttpGet] public async Task UpdateOrginPwd([FromQuery]int productId, string account, string pwd) { var flag = await m_agentService.UpdateAccountPwd(productId, account, pwd); if (flag) return Success(); else return Error("修改密码失败"); } [HttpGet, UserAuth] public async Task ExistAccount([FromQuery]int productId, [FromQuery]string accounts) { var flag =await m_AccountService.CheckAccountExist(productId, accounts.Split(',').ToList()); if (flag) { return Error("账号已经存在"); } return Success(); } [HttpPost, UserAuth] public async Task CreateTestAccount([FromBody]CreateTestAccountRequest request) { if (request.Account.NotHas() || request.Pwd.NotHas()) { return Error("账户和密码不能为空"); } if (request.Account == request.Pwd) { return Error("账户和密码不能一致"); } var userId = this.Request.GetUserInfo().UserId; var packageEntity = await m_PackageService.GetById(request.PackageId); if (packageEntity==null|| packageEntity.Status==0) { return Error("套餐不存在"); } if (packageEntity.IsTest == 0&&packageEntity.Id!=1034&&packageEntity.Id!=1040) { return Error("非测试套餐"); } var flag = await m_AccountService.CheckAccountExist(packageEntity.ProductId, new List { request.Account }); if (flag) { return Error("账号已经存在"); } var restTimes = await m_AccountService.GetRestTestCount(userId); var is_verify = await m_AccountService.GetUserStatus(userId); if (restTimes <= 0) { return Error("没有测试次数了"); } if (is_verify == 0) { return Error("请点击前往实名认证"); } var account_type = 0; if (request.PackageId == 1034) { account_type = 2; } else if (request.PackageId == 1040){ account_type = 3; } else if (request.PackageId == 89){ account_type = 1; } var ret= await m_agentService.NewAccount(0, request.PackageId, request.Account, request.Pwd, accountType:account_type); if (ret.Code == ResultCode.C_SUCCESS) { var ProductEntity = await m_ProductService.GetById(packageEntity.ProductId); var accountEntity = new ProductAccountEntity() { Account = request.Account, AccountType = (int)AccountType.Test, ConnectCount = 1, StartTime = DateTime.Now, EndTime = DateTime.Now.AddHours(packageEntity.DayCount), PackageId = packageEntity.Id, PackageName = packageEntity.Name, ProductId = packageEntity.ProductId, ProductName = ProductEntity.Name, Pwd = request.Pwd, ChargeStatus = AccountChargeStatus.Normal, UserId = this.Request.GetUserInfo().UserId, UserCode = this.Request.GetUserInfo().LoginName, }; await m_AccountService.Add(accountEntity); var userEntity = await m_UserService.GetById(userId); userEntity.UseTestCount++; await m_UserService.Update(userEntity); } return ret; } //api接口,供新开测试使用 [HttpPost,AllowAnonymous] public async Task ApiCreateTestAccount([FromBody]CreateTestAccountRequest request) { if (request.Account.NotHas() || request.Pwd.NotHas()) { return Error("账户和密码不能为空"); } if (request.Account == request.Pwd) { return Error("账户和密码不能一致"); } if (request.apikey.NotHas()) { return Error("非法请求"); } //通过apikey获取用户信息 var userEntity = m_UserService.Query(m => m.apikey == request.apikey).FirstOrDefault(); if (userEntity == null) { return Error("apikey不正确"); } var userId = userEntity.Id; var packageEntity = await m_PackageService.GetById(request.PackageId); if (packageEntity==null|| packageEntity.Status==0) { return Error("套餐不存在"); } if (packageEntity.IsTest == 0&&packageEntity.Id!=1034&&packageEntity.Id!=1040) { return Error("非测试套餐"); } var flag = await m_AccountService.CheckAccountExist(packageEntity.ProductId, new List { request.Account }); if (flag) { return Error("账号已经存在"); } var restTimes = await m_AccountService.GetRestTestCount(userId); var is_verify = await m_AccountService.GetUserStatus(userId); if (restTimes <= 0) { return Error("没有测试次数了"); } if (is_verify == 0) { return Error("请点击前往实名认证"); } var account_type = 0; if (request.PackageId == 1034) { account_type = 2; } else if (request.PackageId == 1040){ account_type = 3; } else if (request.PackageId == 89){ account_type = 1; } var ret= await m_agentService.NewAccount(0, request.PackageId, request.Account, request.Pwd, accountType:account_type); if (ret.Code == ResultCode.C_SUCCESS) { var ProductEntity = await m_ProductService.GetById(packageEntity.ProductId); var accountEntity = new ProductAccountEntity() { Account = request.Account, AccountType = (int)AccountType.Test, ConnectCount = 1, StartTime = DateTime.Now, EndTime = DateTime.Now.AddHours(packageEntity.DayCount), PackageId = packageEntity.Id, PackageName = packageEntity.Name, ProductId = packageEntity.ProductId, ProductName = ProductEntity.Name, Pwd = request.Pwd, ChargeStatus = AccountChargeStatus.Normal, UserId = userEntity.Id, UserCode = userEntity.LoginCode, }; await m_AccountService.Add(accountEntity); //前边已经通过apikey获取到数据--故注释 // var userEntity = await m_UserService.GetById(userId); userEntity.UseTestCount++; await m_UserService.Update(userEntity); } return ret; } /// /// 是否在线 /// /// /// /// // [UserAuth] [AllowAnonymous] public virtual async Task>> OnLine(int productId, string account) { return await m_agentService.OnLine(productId, account); } /// /// 踢号 /// /// /// /// // [UserAuth] [AllowAnonymous] public virtual async Task KillOut(int productId, string id) { var status = await m_agentService.KillOut(productId, id); if (status) { return Success(status); } else { return Error(""); } } [HttpGet] public async Task Export([FromQuery]AccountPageRequest request) { Expression> expr = m => 1 == 1; expr = expr.And(m => m.DeleteTag == 0); if (request.UserId > 0) { expr = expr.And(m => m.UserId == request.UserId); } if (request.KeyWord.Has()) { expr = expr.And(m => m.UserCode.Contains(request.KeyWord) || m.ProductName.Contains(request.KeyWord) || m.PackageName.Contains(request.KeyWord) || m.Account.Contains(request.KeyWord)); } if (request.ProductId != null && request.ProductId > 0) { expr = expr.And(m =>m.ProductId==request.ProductId); } if (request.PackageName != null) { expr = expr.And(m =>request.PackageName==m.PackageName); } if (request.AccountTypes!=null&&request.AccountTypes.Count>0) { expr = expr.And(m => request.AccountTypes.Contains(m.AccountType)); } if (request.BTime.HasValue && request.ETime.HasValue) { expr = expr.And(m => m.EndTime>=request.BTime&&m.EndTime<=request.ETime); } if (request.BkTime.HasValue && request.EkTime.HasValue) { expr = expr.And(m => m.StartTime>=request.BkTime&&m.StartTime<=request.EkTime); } if (request.ExpirdDay > -100) { if (request.ExpirdDay == 0) { expr = expr.And(m => m.EndTime.Value < DateTime.Now); }else if(request.ExpirdDay == -2){ expr = expr.And(m => m.EndTime.Value > DateTime.Now); } else if (request.ExpirdDay < 0 && request.ExpirdDay>-4) { expr = expr.And(m => Math.Ceiling((DateTime.Now - m.EndTime).Value.TotalDays) <= Math.Abs(request.ExpirdDay) && m.EndTime < DateTime.Now); } else if (request.ExpirdDay==-4) { expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) <= -4); }else if (request.ExpirdDay > 0){ expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) <= request.ExpirdDay && m.EndTime > DateTime.Now); } expr = expr.And(m => m.PackageName != "测试卡"); // expr = expr.And(m => Math.Ceiling((m.EndTime - DateTime.Now).Value.TotalDays) == request.ExpirdDay); } var ret = await m_AccountService.PageDesc(request.PageIndex,10000, expr, true, m => m.Id); var data = new ExcelData { SheetName = DateTime.Now.ToString("yyyy-MM-dd"), Data = ret.List }; var title = new List(){ new ExcelTitle { Property = "UserCode", Title = "用户" }, new ExcelTitle { Property = "ProductName", Title = "产品" }, new ExcelTitle { Property = "PackageName", Title = "套餐" }, new ExcelTitle { Property = "Account", Title = "账号" }, new ExcelTitle { Property = "AccountType", Title = "类型" , Format=(val)=>((AccountType)val).GetEnumDisplayName() }, new ExcelTitle { Property = "ConnectCount", Title = "连接数"}, new ExcelTitle { Property = "StartTime", Title = "开通时间" , Format=(val)=>((DateTime) val).ToString("yyyy-MM-dd hh:mm:ss")}, new ExcelTitle { Property = "EndTime", Title = "到期时间" ,Format=(val)=>((DateTime) val).ToString("yyyy-MM-dd hh:mm:ss")}, new ExcelTitle { Property = "RestTime", Title = "剩余时间" }, }; var fileBytes = ExcelHelper.ExportListToExcel(data, title); var fileName = $"{DateTime.Now.ToString("yyyyMMdd")}账号明细.xlsx"; Response.Headers.Add("X-Suggested-Filename", fileName.UrlEncode()); return File(fileBytes, "application/octet-stream", fileName); } } }