using Ewide.Core.Util; using Furion.DatabaseAccessor; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Vote.Services.Dto; using Vote.Services.Entities; using static Vote.Services.Dto.ProjectsList2Output; namespace Vote.Services.ApiController { /// /// 项目 /// [ApiDescriptionSettings("Vote", Order = 0)] [Route("/gb/yjb/api/projects")] public class ProjectsService : IDynamicApiController { private readonly IRepository rep_Projects; private readonly IRepository rep_Experts; private readonly IRepository rep_VoteRecords; public ProjectsService(IRepository _rep_Projects, IRepository _rep_Experts, IRepository _rep_VoteRecords) { rep_Projects = _rep_Projects; rep_Experts = _rep_Experts; rep_VoteRecords = _rep_VoteRecords; } /// /// 列表 /// /// [HttpPost] [Microsoft.AspNetCore.Authorization.AllowAnonymous] public async Task List(ProjectsInput args) { var typeList = new List { "房建工程", "市政工程", "轨道工程", "电力工程", "交通工程", "水利工程" }; var data = await rep_Projects.DetachedEntities.Where(p => !p.IsDeleted) .Where(args.type != null, a => (int)a.type == args.type) .ProjectToType() .OrderBy(a => a.serial_number) .ToListAsync(); return new { typeList, data }; } /// /// 检验提交码 /// /// [HttpPost] [Microsoft.AspNetCore.Authorization.AllowAnonymous] public async Task CheckSubmitCode(CheckSubmitCodeInput args) { var data = await rep_Experts.DetachedEntities.Where(p => !p.IsDeleted) .Where(a => a.login_code == args.code) .FirstOrDefaultAsync(); return data != null; } /// /// 提交 /// /// [HttpPost] [UnitOfWork] [Microsoft.AspNetCore.Authorization.AllowAnonymous] public async Task SubmitSubmitVote(SubmitInput args) { var data = await rep_Experts.DetachedEntities.Where(p => !p.IsDeleted) .Where(a => a.login_code == args.code) .FirstOrDefaultAsync(); _ = (data == null) ? throw Oops.Oh("提交码错误") : 1; //var list = args.projects.Adapt>(); //删除这个专家上次提交的结果 //或者提示不能再次提交 _ = (await rep_VoteRecords.DetachedEntities.Where(a => !a.IsDeleted && a.expert_login_code == args.code).CountAsync() > 0) ? throw Oops.Oh("已提交,无需再次提交") : 1; var now = DateTime.Now; args.projects.ForEach(async a => { var model = new Entities.VoteRecords { expert_login_code = args.code, project_id = a.id, is_agree = a.vote, vote_time = now }; await model.InsertOrUpdate(); }); return true; } private async Task> GetVoteData() { var query = from a in rep_Projects.DetachedEntities join b in rep_VoteRecords.DetachedEntities on a.Id equals b.project_id into grouping from p in grouping.DefaultIfEmpty() group new { a, p } by new { a.Id, a.name, a.serial_number, a.type } into pp select new ProjectsList2Output { serial_number = pp.Key.serial_number, id = pp.Key.Id, name = pp.Key.name, yes_count = pp.Where(a => a.p.is_agree).Count(), no_count = pp.Where(a => !a.p.is_agree).Count(), type = pp.Key.type }; return await query.OrderBy(a => a.serial_number).ToListAsync(); } /// /// 列表 /// /// [HttpPost] public async Task List2() { //var data = rep_Projects.DetachedEntities.Where(p => !p.IsDeleted) // //.Where(args.type != null, a => (int)a.type == args.type) // .Join(rep_VoteRecords.DetachedEntities, a => a.Id, a => a.project_id, (a, b) => // new // { // //a.Id, // //type = (int)a.type, // //serial_number = a.serial_number, // //name = a.name, // //no_count = b.Where(bb => !bb.is_agree).Count(), // //yes_count = b.Where(bb => bb.is_agree).Count(), // }).ToList(); ////.ProjectToType() ////.OrderBy(a => a.serial_number) ////.ToListAsync(); var data = await GetVoteData(); //var data0 = data.Where(a => a.type == Entities.EnumProjectType.FangJian).ToList(); //var data1 = data.Where(a => a.type == Entities.EnumProjectType.ShiZheng).ToList(); //var data2 = data.Where(a => a.type == Entities.EnumProjectType.GuiDaoGongCheng).ToList(); //var data3 = data.Where(a => a.type == Entities.EnumProjectType.DianLiGongCheng).ToList(); //var data4 = data.Where(a => a.type == Entities.EnumProjectType.JiaoTongGongCheng).ToList(); //var data5 = data.Where(a => a.type == Entities.EnumProjectType.ShuiLiGongCheng).ToList(); //return new //{ // data0, // data1, // data2, // data3, // data4, // data5 //}; var typeList = new List { "房建工程", "市政工程", "轨道工程", "电力工程", "交通工程", "水利工程" }; return new { data, typeList }; } /// /// /// /// public async Task Download() { var data = await GetVoteData(); var filepath = Tools.ExcelHelper.WriteTemplate(data, 5, "C"); return new FileStreamResult(new FileStream(filepath, FileMode.Open), "application/octet-stream") { FileDownloadName = filepath }; } /// /// /// /// public async Task ExpertVote() { var list = await rep_Experts.DetachedEntities.GroupJoin(rep_VoteRecords.DetachedEntities, a => a.login_code, a => a.expert_login_code, (a, b) => new { a, b }) .SelectMany(a => a.b.DefaultIfEmpty(), (a, b) => new { a.a.Id, a.a.login_code, is_vote = b != null }) .Distinct() .OrderBy(a => a.Id) .ToListAsync(); return list; //var query = from a in rep_Experts.DetachedEntities // join b in rep_VoteRecords.DetachedEntities on a.login_code equals b.expert_login_code into temp // from tt in temp.DefaultIfEmpty() // select new // { // a.Id, // a.login_code, // is_vote = tt == null // }; //return await query.ToListAsync(); } /// /// 新增专家 /// /// [HttpPost] public async Task AddExpert(AddExpertInput args) { if (args == null || args.expertnum <= 0) throw Oops.Oh("参数异常"); var list = new List(); for (int i = 0; i < args.expertnum; i++) { var newid = Ulid.NewUlid().ToString(); var newidsimple = newid.ToUpper().Replace("I", "").Replace("L", "").Replace("0", "").Replace("O", "").Replace("1", ""); list.Add(new Experts { Id = newid, login_code = newidsimple.Substring(newidsimple.Length - 6, 6), CreatedTime = DateTime.Now }); } await rep_Experts.InsertAsync(list); } } }