using Admin.NET.Application.Service; using Admin.NET.Core.Service; using Microsoft.AspNetCore.Http; using MongoDB.Bson; using MongoDB.Driver; using System.IO; using Newtonsoft.Json; using MiniExcelLibs; namespace Admin.NET.Application; /// ///专家端服务 /// [ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] public class SysWechatUserMapCartsService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _userRep; private readonly SqlSugarRepository _userExtendRep; private readonly SqlSugarRepository _volunteerRep; private readonly SqlSugarRepository _vtbSpRep; private readonly UserManager _userManager; private readonly SqlSugarRepository _wechatUserExtendrep; private readonly IMongoDBRepository _mongoRepository; public SysWechatUserMapCartsService(SqlSugarRepository rep, SqlSugarRepository userRepository, SqlSugarRepository volunteerRepository, SqlSugarRepository vSpRep, UserManager userManager, IMongoDBRepository mongoRepository, SqlSugarRepository userExtendRep, SqlSugarRepository wechatUserExtendrep) { _rep = rep; _userRep = userRepository; _volunteerRep = volunteerRepository; _vtbSpRep = vSpRep; _userManager = userManager; _mongoRepository = mongoRepository; _userExtendRep = userExtendRep; _wechatUserExtendrep = wechatUserExtendrep; } /// /// 分页查询用户订单关联表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] public async Task> Page(SysWechatUserMapCartsInput input) { var query = _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.Phone.Contains(input.SearchKey.Trim()) || u.OrderId.Contains(input.SearchKey.Trim()) || u.cartId.Contains(input.SearchKey.Trim()) || u.Amount.Contains(input.SearchKey.Trim()) || u.OpenId.Contains(input.SearchKey.Trim()) || u.ZjOpenId.Contains(input.SearchKey.Trim()) ) .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), u => u.Phone.Contains(input.Phone.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.OrderId), u => u.OrderId.Contains(input.OrderId.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.cartId), u => u.cartId.Contains(input.cartId.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Amount), u => u.Amount.Contains(input.Amount.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.OpenId), u => u.OpenId.Contains(input.OpenId.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ZjOpenId), u => u.ZjOpenId.Contains(input.ZjOpenId.Trim())) //处理外键和TreeSelector相关字段的连接 .LeftJoin((u, cartid) => u.cartId == cartid.MajorType.ToString()) .LeftJoin((u, cartid, openid) => u.OpenId == openid.OpenId) .LeftJoin((u, cartid, openid, zjopenid) => u.ZjOpenId == zjopenid.OpenId) .OrderBy(u => u.CreateTime) .Select((u, cartid, openid, zjopenid) => new SysWechatUserMapCartsOutput { Id = u.Id, Phone = u.Phone, OrderId = u.OrderId, cartId = u.cartId, cartName = cartid.Name, Amount = u.Amount, CreateTime = u.CreateTime, UpdateTime = u.UpdateTime, CreateUserId = u.CreateUserId, CreateUserName = u.CreateUserName, UpdateUserId = u.UpdateUserId, UpdateUserName = u.UpdateUserName, IsDelete = u.IsDelete, OpenId = u.OpenId, OpenIdNickName = openid.NickName, ZjOpenId = u.ZjOpenId, ZjOpenIdNickName = zjopenid.NickName, }); return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); } /// /// 获取用户订单关联表列表 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] public async Task> List([FromQuery] SysWechatUserMapCartsInput input) { return await _rep.AsQueryable().Select().ToListAsync(); } /// /// 获取关联专家介绍页面唯一Id列表 /// /// /// [ApiDescriptionSettings(Name = "BusSpecialistGroupcartIdDropdown"), HttpGet] public async Task BusSpecialistGroupcartIdDropdown() { return await _rep.Context.Queryable() .Select(u => new { Label = u.Name, Value = u.Id } ).ToListAsync(); } /// /// 获取OpenId列表 /// /// /// [ApiDescriptionSettings(Name = "SysWechatUserOpenIdDropdown"), HttpGet] public async Task SysWechatUserOpenIdDropdown() { return await _rep.Context.Queryable() .Select(u => new { Label = u.NickName, Value = u.Id } ).ToListAsync(); } /// /// 获取ZjOpenId列表 /// /// /// [ApiDescriptionSettings(Name = "SysWechatUserZjOpenIdDropdown"), HttpGet] public async Task SysWechatUserZjOpenIdDropdown() { return await _rep.Context.Queryable() .Select(u => new { Label = u.NickName, Value = u.Id } ).ToListAsync(); } /// /// 专家订单列表 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "SpecialistGroupOrderList")] public async Task> SpecialistGroupOrderList([FromQuery] SpecialistGroupOrderListInput input) { return await _rep.AsQueryable() .Where(e => e.cartId == input.catId) .WhereIF(!string.IsNullOrWhiteSpace(input.OrderId), s => s.OrderId.Contains(input.OrderId)) .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), s => s.OrderId.Contains(input.Phone)) .Select().ToListAsync(); } /// /// 用户订单列表 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "UserOrderList")] public async Task> UserOrderList([FromQuery] SpecialistGroupOrderListInput input) { return await _rep.AsQueryable() //.Where(e => e.cartId == input.catId) .WhereIF(!string.IsNullOrWhiteSpace(input.OrderId), s => s.OrderId.Contains(input.OrderId)) .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), s => s.Phone.Contains(input.Phone)) .Select().ToListAsync(); } /// /// 获取专家的客户的志愿表列表 /// 详情和导出都可以直接用 VolunTb的原始接口 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "GetCustomerTbList")] public async Task> GetCustomerTbList([FromQuery] SpecialistGroupOrderListInput input) { var customer = await _userRep.AsQueryable().Where(e => e.Mobile == input.Phone).FirstAsync(); if (customer == null) { Oops.Oh("未找到用户信息"); } var provinceCode = (await _userExtendRep.AsQueryable().Where(e => e.WxId == customer.Id).FirstAsync()).ProvinceCode; var tblist = await _volunteerRep.AsQueryable().Where(e => e.CId == customer.Id && e.IsPush == true).Select(c => new VoTableDtoResponse() { BatchName = c.BatchName, CId = c.CId, Score = c.Score, SubjectClaim = c.SubjectClaim, CustomerName = customer.NickName, personlocationCode = provinceCode, TableName = c.TableName, Type = c.Type, VId = c.Id, CreateTime = c.CreateTime }).OrderByDescending(c => c.VId).ToListAsync(); return tblist; } /// /// 复制用户志愿表 /// /// /// [HttpPost] public async Task CopyTbZy([FromBody] CopyTbZyInput input) { var vModel = await _volunteerRep.AsQueryable().FirstAsync(e => e.Id == input.tId); if (vModel == null) Oops.Oh("志愿数据不存在或已删除"); var entity = vModel.Adapt(); entity.SCId = input.SpId; entity.LocationCode = input.locationCode; var wxextend = await _wechatUserExtendrep.GetFirstAsync(e => e.WxId == vModel.CId); entity.Sp = wxextend.sp.Value; if(await _vtbSpRep.IsAnyAsync(e => e.Id == vModel.Id)) { await _vtbSpRep.DeleteAsync(e => e.Id == vModel.Id); } return await _vtbSpRep.InsertAsync(entity); } /// /// 修改我的志愿 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Put")] public async Task Put([FromBody] VoTableDtoRequest request) { if (request.VId <= 0) { throw Oops.Oh("志愿id为必传"); } var model = await _vtbSpRep.GetSingleAsync(c => c.Id == request.VId); if (!string.IsNullOrWhiteSpace(request.TableName)) { model.TableName = request.TableName; } model.Detail = request.vTbDetails.ToJson(); model.UpdateTime = DateTime.Now; model.UpdateUserName = _userManager.RealName; model.UpdateUserId = _userManager.UserId; await _vtbSpRep.UpdateAsync(model); return model.Id; } /// /// 删除我的志愿表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] public async Task Delete(DeleteSysVolunteerTbInput input) { var entity = await _vtbSpRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); await _vtbSpRep.FakeDeleteAsync(entity); //假删除 } /// /// 已添加志愿列表详情 /// /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Get")] public async Task Get([FromQuery] long Id, string location) { var asrespose = new VoTabDetailDto(); var entity = await _vtbSpRep.GetFirstAsync(u => u.Id == Id); var rep = new VoTableDtoResponse(); rep.CId = entity.CId; rep.Sp = entity.Sp; rep.TableName = entity.TableName; rep.BatchName = entity.BatchName; rep.Type = entity.Type; rep.SubjectClaim = entity.SubjectClaim; rep.Score = entity.Score; var userInfo = await _userRep.AsQueryable().FirstAsync(e => e.Id == entity.CId); rep.CustomerName = userInfo?.NickName; asrespose.VoTable = rep; var jsons = JsonConvert.DeserializeObject>(entity.Detail); var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", location)); var filterBuilders = new List>(); filterBuilders.Add(Builders.Filter.In(p => p.pid, pids)); FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var list = await bejson.Find(filter).ToListAsync(); var dtolist = new List(); jsons.ForEach(c => { var vlist = new List(); string educationCategory = string.Empty; var features = new List(); string ownership = string.Empty; string province = string.Empty; string subjectType = string.Empty; string city = string.Empty; string uName = string.Empty; c.vItems.ForEach(a => { var plan = list.FirstOrDefault(f => f.pid == a._pId); uName = plan.universityName; educationCategory = plan.educationCategory; features = plan.features; ownership = plan.ownership; province = plan.province; subjectType = plan.subjectType; city = plan.city; vlist.Add(new VItemDetail { MajorCode = plan.majorCode, percentAge = a.percentAge, _pId = a._pId, Sort = a.Sort, type = a.type, Major = plan.majorName, academic = plan.academicYear, //features = plan.features, fee = plan.fee, nature = plan.nature, // ownership = plan.ownership, planCount = plan.planCount, planItems = plan.items, remark = plan.remark, subjectClam = plan._23subject, // subjectType = plan.subjectType, }); }); dtolist.Add(new TbDetailASDto() { Type = c.type, Sort = c.Sort, UnCode = c.UnCode, UnName = uName, educationCategory = educationCategory, features = features, ownership = ownership, province = province, subjectType = subjectType, city = city, Logo = "https://static-data.ycymedu.com/6.jpg", UnId = c.UnId, vItems = vlist }); }); var university = dbclient.GetCollection("university"); var unfilterBuilders = new List>(); unfilterBuilders.Add(Builders.Filter.In(p => p._id, dtolist.Select(c => c.UnId))); FilterDefinition unfilter = unfilterBuilders.Count > 0 ? Builders.Filter.And(unfilterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var unlist = await university.Find(unfilter).ToListAsync(); dtolist.ForEach(a => { a.Logo = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().logo : "https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/nocontent/empty.png"; }); asrespose.tbDetails = dtolist; return asrespose; } /// /// 导出excel /// /// /// [HttpGet("Export")] [ProducesResponseType(0)] [AllowAnonymous] public async Task Export([FromQuery] ExportExcelDto dto) { var tableDetailItemsViews = new List(); var viewentity = await _vtbSpRep.GetFirstAsync(u => u.Id == dto.Id); var jsons = JsonConvert.DeserializeObject>(viewentity.Detail); var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location)); var filterBuilders = new List>(); filterBuilders.Add(Builders.Filter.In(p => p.pid, pids)); FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var list = await bejson.Find(filter).ToListAsync(); jsons.ForEach(c => { var vlist = new List(); string educationCategory = string.Empty; var features = new List(); string ownership = string.Empty; string province = string.Empty; string subjectType = string.Empty; string city = string.Empty; string uName = string.Empty; c.vItems.ForEach(a => { var plan = list.FirstOrDefault(f => f.pid == a._pId); if (plan.items != null) { var planitems = plan.items; var _23items = planitems.Where(e => e.year == "2023"); var _22items = planitems.Where(e => e.year == "2022"); var _21items = planitems.Where(e => e.year == "2021"); tableDetailItemsViews.Add(new VolunteerItemsViewMinExcelAttr() { AcademicYear = plan.academicYear, AreaName = province, fee = plan.fee, Major = plan.majorName, MajorCode = plan.majorCode, MajorGroup = string.IsNullOrWhiteSpace(plan.majorGroup) ? "" : "(" + plan.majorGroup.Split("(")[1], MajorSubjectClam = plan._24subject, Nature = plan.nature, planCount = plan.planCount, Sort = a.Sort, UniversityCode = c.UnCode, UniversityName = c.UnName, _23Scoreline = _23items.Any() ? _23items.FirstOrDefault().score == 0 ? "--" : _23items.FirstOrDefault().score.ToString() : "--", _22Scoreline = _22items.Any() ? _22items.FirstOrDefault().score == 0 ? "--" : _22items.FirstOrDefault().score.ToString() : "--", _21Scoreline = _21items.Any() ? _21items.FirstOrDefault().score == 0 ? "--" : _21items.FirstOrDefault().score.ToString() : "--", _23PlanCount = _23items.Any() ? _23items.FirstOrDefault().planCount == 0 ? "--" : _23items.FirstOrDefault().planCount.ToString() : "--", _22PlanCount = _22items.Any() ? _22items.FirstOrDefault().planCount == 0 ? "--" : _22items.FirstOrDefault().planCount.ToString() : "--", _21PlanCount = _21items.Any() ? _21items.FirstOrDefault().planCount == 0 ? "--" : _21items.FirstOrDefault().planCount.ToString() : "--", _23RankLine = _23items.Any() ? _23items.FirstOrDefault().rankLine == 0 ? "--" : _23items.FirstOrDefault().rankLine.ToString() : "--", _22RankLine = _22items.Any() ? _22items.FirstOrDefault().rankLine == 0 ? "--" : _22items.FirstOrDefault().rankLine.ToString() : "--", _21RankLine = _21items.Any() ? _21items.FirstOrDefault().rankLine == 0 ? "--" : _21items.FirstOrDefault().rankLine.ToString() : "--", }); } }); }); var memoryStream = new MemoryStream(); //将数据写到内存当中 memoryStream.SaveAs(tableDetailItemsViews, true, string.Format("模拟志愿表:_{0}_选科:{1}|_分数:{2}|_类型_{3}", viewentity.TableName, viewentity.SubjectClaim, viewentity.Score, viewentity.Type)); //从0的位置开始写入 memoryStream.Seek(0, SeekOrigin.Begin); //返回文件流 //格式是Excel格式 return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = string.Format("{0}.xlsx", DateTime.Now.ToString("yyyyMMddhhssfff_")) }; } }