using DocumentFormat.OpenXml.Drawing; using DocumentFormat.OpenXml.Office2010.Excel; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml.Wordprocessing; using Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.Const; using OpenAuth.App.Interface; using OpenAuth.App.Response; using OpenAuth.App.ServiceApp.FireManagement.Request; using OpenAuth.App.ServiceApp.FireManagement.Response; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using OpenAuth.Repository.Domain.FireManagement; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Yitter.IdGenerator; namespace OpenAuth.App.ServiceApp.FireManagement { public class FireGridApp : SqlSugarBaseApp { public FireGridApp(ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth) : base(unitWork, repository, auth) { _auth = auth; } /// /// 添加打卡点 /// /// /// /// public async Task> AddCheckPoint(CheckPointReq info) { using (SugarDbContext db = base.UnitWork.CreateContext()) { var checkPoint = info.MapTo(); checkPoint.Id = YitIdHelper.NextId(); checkPoint.CreateTime = DateTime.Now; List sflist = info.UserId .Select(item => new FmCheckPointUser { PointId = checkPoint.Id, UserId = item }).ToList(); List fck = info.AreaId .Select(item => new FmCheckArea { PointId = checkPoint.Id, AreaId = item }).ToList(); ////判断是否在巡查范围之内 //string sqlstr = "SELECT \"Id\" FROM fm_hulinyuanguanhufanwei WHERE ST_Contains(ST_SetSRID(geom, 4326), ST_GeomFromText('POINT(" + info.Lng + " " + info.Lat + ")', 4326)) =TRUE"; ; //var dt = await db.Db.Ado.GetDataTableAsync(sqlstr); //if (dt.Rows.Count < 1) //{ // throw new Exception("请在护林员巡查范围内设置打卡点"); //} await db.FmCheckInPoint.InsertAsync(checkPoint); await db.FmCheckPointUser.InsertRangeAsync(sflist); await db.FmCheckArea.InsertRangeAsync(fck); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } //查询打卡点 public async Task>>> GetCheckPointList(string pointName, int pageIndex, int pageSize) { using (SugarDbContext db = base.UnitWork.CreateContext()) { RefAsync totalNumber = 0; var query = await db.FmCheckInPoint.AsQueryable() .LeftJoin((a, b) => a.CreateId == b.Id) .WhereIF(!string.IsNullOrEmpty(pointName), (a, b) => a.PointName.Contains(pointName)) .Select((a, b) => new { a.Id, a.PointName, a.Lat, a.Lng, a.CreateTime, CreateUserName = b.Name }).ToPageListAsync(pageIndex, pageSize, totalNumber); return new Response>> { Result = new PageInfo> { Items = query, Total = totalNumber } }; } } /// /// 删除打卡点 /// /// /// public async Task> DeleteCheckPoint(long id) { using (SugarDbContext db = base.UnitWork.CreateContext()) { await db.FmCheckInPoint.UpdateAsync(r => new FmCheckInPoint { IsDelete = true }, r => r.Id == id); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } //编辑打卡点 public async Task> EditCheckPoint(CheckPointReq info) { using (SugarDbContext db = base.UnitWork.CreateContext()) { ////判断是否在巡查范围之内 //string sqlstr = "SELECT \"Id\" FROM fm_hulinyuanguanhufanwei WHERE ST_Contains(ST_SetSRID(geom, 4326), ST_GeomFromText('POINT(" + info.Lng + " " + info.Lat + ")', 4326)) =TRUE"; ; //var dt = await db.Db.Ado.GetDataTableAsync(sqlstr); //if (dt.Rows.Count < 1) //{ // throw new Exception("请在护林员巡查范围内设置打卡点"); //} await db.FmCheckInPoint.UpdateAsync(r => new FmCheckInPoint { PointName = info.PointName, Lat = info.Lat, Lng = info.Lng }, r => r.Id == info.Id); //添加人员打卡点中间表 await db.FmCheckPointUser.DeleteAsync(r => r.PointId == info.Id); List sflist = info.UserId .Select(item => new FmCheckPointUser { PointId = info.Id, UserId = item }).ToList(); await db.FmCheckPointUser.InsertRangeAsync(sflist); //添加打卡点区域中间表 await db.FmCheckArea.DeleteAsync(r => r.PointId == info.Id); List fck = info.AreaId .Select(item => new FmCheckArea { PointId = info.Id, AreaId = item }).ToList(); await db.FmCheckArea.InsertRangeAsync(fck); if (db.Commit()) { return new Response { Result = true, Message = "操作成功" }; } else { return new Response { Result = false, Message = "操作失败" }; } } } //获取单条打卡点信息 public async Task> GetCheckPointById(long id) { using (SugarDbContext db = base.UnitWork.CreateContext()) { var query = await db.FmCheckInPoint.AsQueryable() .Where(a => a.Id == id) .Select(r => new CheckPointReq { Id = r.Id, Lng = r.Lng, Lat = r.Lat, PointName = r.PointName, UserId = SqlFunc.Subqueryable().Where(a => a.PointId == id).ToList(a => a.UserId), AreaId = SqlFunc.Subqueryable().Where(a => a.PointId == id).ToList(a => a.AreaId), }) .FirstAsync(); return new Response { Result = query }; } } /// /// 获取打卡记录 /// /// /// /// /// public async Task>>> GetCheckPointById(long id, int pageIndex = 1, int pageSize = 10) { using (SugarDbContext db = base.UnitWork.CreateContext()) { RefAsync totalNumber = 0; var query = await db.FmCheckClockOn.AsQueryable() .LeftJoin((a, b) => a.PointId == b.Id) .LeftJoin((a, b, c) => a.UserId == c.Id) .WhereIF(id != 0, (a, b, c) => a.PointId == id) .Select((a, b, c) => new { a.Id, a.Lng, a.Lat, b.PointName, c.Name, a.UserId //UserId = SqlFunc.Subqueryable().Where(a => a.PointId == id).ToList(a => a.UserId), //AreaId = SqlFunc.Subqueryable().Where(a => a.PointId == id).ToList(a => a.AreaId), }).ToPageListAsync(pageIndex, pageSize, totalNumber); return new Response>> { Result = new PageInfo> { Items = query, Total = totalNumber } }; } } /// /// 获取打卡记录 /// /// /// /// /// public async Task>>> GetCheckInfoByUserId(long id, int pageIndex = 1, int pageSize = 10) { using (SugarDbContext db = base.UnitWork.CreateContext()) { RefAsync totalNumber = 0; var query = await db.FmCheckClockOn.AsQueryable() .LeftJoin((a, b) => a.PointId == b.Id) .LeftJoin((a, b, c) => a.UserId == c.Id) .WhereIF(id != 0, (a, b, c) => a.UserId == id) .Select((a, b, c) => new { a.Id, a.Lng, a.Lat, b.PointName, c.Name, a.ClockonTime }).ToPageListAsync(pageIndex, pageSize, totalNumber); return new Response>> { Result = new PageInfo> { Items = query, Total = totalNumber } }; } } /// /// 查询打卡记录 /// /// /// /// /// /// /// public async Task>>> GetClockOnList(long userId, DateTime beginTime, DateTime endTime, int pageIndex, int pageSize) { using (SugarDbContext db = base.UnitWork.CreateContext()) { RefAsync totalNumber = 0; var query = await db.FmCheckClockOn.AsQueryable() .LeftJoin((a, b) => a.PointId == b.Id) .LeftJoin((a, b, c) => a.UserId == c.Id) .WhereIF(userId != 0, (a, b, c) => a.UserId == userId) .Where((a, b, c) => a.ClockonTime >= beginTime && a.ClockonTime <= endTime) .Select((a, b, c) => new { a.Id, a.ClockonTime, a.Lat, a.Lng, b.PointName, c.Name }).ToPageListAsync(pageIndex, pageSize, totalNumber); return new Response>> { Result = new PageInfo> { Items = query, Total = totalNumber } }; } } public async Task> GetStatisticsCount(long areaid, DateTime begintime, DateTime endtime) { using (SugarDbContext db = base.UnitWork.CreateContext()) { var orginfo = await db.SysOrg.AsQueryable().Where(r => r.Id == areaid).FirstAsync(); var chileorg = (await db.SysOrg.AsQueryable().ToChildListAsync(it => it.ParentId, areaid)).Select(it => it.Id).ToList(); JObject obj = new JObject(); //护林员人数 var hu = await db.User.AsQueryable().LeftJoin((a, b) => a.Id == b.UserId) .LeftJoin((a, b, c) => a.Id == c.UserId) .Where((a, b, c) => chileorg.Contains(c.OrgId)) .Where((a, b, c) => b.RoleId == 555252989157446).ToListAsync(); var userId = hu.Select(it => it.Id).Distinct().ToList(); //巡查距离 var xunchazongshu = await db.FmUserPointHistory.AsQueryable().Where(a => a.CreateTime >= begintime && a.CreateTime <= endtime && userId.Contains(a.CreateId)) .SplitTable(begintime, endtime).SumAsync(a => a.Distance); //打卡点 var dakadian = await db.FmCheckInPoint.AsQueryable() .LeftJoin((a, b) => a.Id == b.PointId) .Where((a, b) => a.IsDelete == false && chileorg.Contains(b.AreaId)).CountAsync(); //打卡次数 var dakacishu = await db.FmCheckClockOn.AsQueryable() .Where(a => userId.Contains(a.UserId)) .Where(a => a.ClockonTime >= begintime && a.ClockonTime <= endtime).CountAsync(); obj.Add("hulinyuan", userId.Count); obj.Add("xunchazongshu", xunchazongshu); obj.Add("dakadian", dakadian); obj.Add("dakacishu", dakacishu); return new Response { Result = obj }; } } public async Task> GetstatisticsOld(long areaid, DateTime begintime, DateTime endtime, int pageSize, int pageIndex) { using (SugarDbContext db = base.UnitWork.CreateContext()) { var orginfo = await db.SysOrg.AsQueryable().Where(r => r.Id == areaid).FirstAsync(); var chileorg = (await db.SysOrg.AsQueryable().ToChildListAsync(it => it.ParentId, areaid)).Select(it => it.Id).ToList(); var userlist = db.User.AsQueryable().LeftJoin((a, b) => a.Id == b.UserId) .LeftJoin((a, b, c) => a.Id == c.UserId) .LeftJoin((a, b, c, d) => c.OrgId == d.Id) .Where((a, b, c, d) => chileorg.Contains(c.OrgId)) .Where((a, b, c, d) => b.RoleId == 555252989157446) .Select((a, b, c, d) => new PointstatisticsResp { Id = a.Id, Name = a.Name, Account = a.Account, AreaName = d.Name, dakacishu = SqlFunc.Subqueryable().Where(r => r.UserId == a.Id).Where(r => r.ClockonTime >= begintime && r.ClockonTime <= endtime).Count(), dakadian = SqlFunc.Subqueryable().Where(p => p.UserId == a.Id).Count(), lengths = SqlFunc.Subqueryable().Where(r => r.CreateId == a.Id).Where(r => r.CreateTime >= begintime && r.CreateTime <= endtime).Sum(r => r.Distance), }).ToList(); return new Response { Result = new JObject() }; } } public async Task>>> Getstatistics(long areaid, DateTime begintime, DateTime endtime, int pageIndex, int pageSize) { using (SugarDbContext db = base.UnitWork.CreateContext()) { RefAsync totalPage = 0; var orginfo = await db.SysOrg.AsQueryable().Where(r => r.Id == areaid).FirstAsync(); var chileorg = (await db.SysOrg.AsQueryable().ToChildListAsync(it => it.ParentId, areaid)).Select(it => it.Id).ToList(); var userlist = await db.User.AsQueryable().LeftJoin((a, b) => a.Id == b.UserId) .LeftJoin((a, b, c) => a.Id == c.UserId) .LeftJoin((a, b, c, d) => c.OrgId == d.Id) .Where((a, b, c, d) => chileorg.Contains(c.OrgId)) .Where((a, b, c, d) => b.RoleId == 555252989157446) .Select((a, b, c, d) => new PointstatisticsResp { Id = a.Id, Name = a.Name, Account = a.Account, AreaName = d.Name, }) .ToPageListAsync(pageIndex, pageSize, totalPage); foreach (var item in userlist) { item.dakacishu = await db.FmCheckClockOn.AsQueryable() .Where(r => r.UserId == item.Id) .Where(r => r.ClockonTime >= begintime && r.ClockonTime <= endtime).CountAsync(); item.dakadian = await db.FmCheckPointUser.AsQueryable() .Where(r => r.UserId == item.Id).CountAsync(); var lengths = await db.FmUserPointHistory.AsQueryable() .Where(r => r.CreateId == item.Id && r.Intype == 1) .Where(r => r.CreateTime >= begintime && r.CreateTime <= endtime).SplitTable(begintime, endtime).SumAsync(r => r.Distance); item.xunjian = lengths > 0 ? 1 : 0; } return new Response>> { Result = new PageInfo> { Items = userlist, Total = totalPage } }; } } //导出统计 //public MemoryStream ExportStatisticsNew(long areaid, DateTime begintime, DateTime endtime) //{ // using (SugarDbContext db = base.UnitWork.CreateContext()) // { // var user = _auth.GetCurrentUser().User; // //该用户下包含所有部门 // List deplist = new List(); // long level = 0; // if (user != null && user.Id != -1) // { // var departs = db.SysUserOrg.AsQueryable().Where(r => r.UserId == user.Id).ToList(); // foreach (var item in departs) // { // var list = db.SysOrg.AsQueryable().ToChildList(it => it.ParentId, item.OrgId) // ?.Select(it => it.Id.ToString()).ToList(); // deplist = deplist.Union(list).ToList(); // } // //获取用户分配部门的最高级别 // var uorg = departs.OrderBy(r => r.Level).FirstOrDefault(); // if (uorg != null) // { // level = uorg.Level; // } // } // } //} //上传坐标 //public async Task> UploadLocation(FmUserPoint info) //{ // using (SugarDbContext db = base.UnitWork.CreateContext()) // { // var userPoint = info.MapTo(); // checkPoint.Id = YitIdHelper.NextId(); // checkPoint.ClockonTime = DateTime.Now; // await db.FmCheckClockOn.InsertAsync(checkPoint); // if (db.Commit()) // { // return new Response { Result = true, Message = "操作成功" }; // } // else // { // return new Response { Result = false, Message = "操作失败" }; // } // } //} } }