using Dapper; using Ewide.Core; using Ewide.Core.Extension; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Ewide.Application.Service { /// /// 选房相关 /// [ApiDescriptionSettings(Name = "HouseSelector", Order = 180)] public class HouseSelectorService : IHouseSelectorService, IDynamicApiController, ITransient { private readonly IUserManager _userManager; private readonly IDapperRepository _dapperRep; private readonly IRepository _bsHouseMemberRelationRep; private readonly IRepository _bsHouseCodeRep; private readonly IRepository _bsHouseTaskRep; private readonly IRepository _sysUserRep; private readonly IHouseZoneService _houseZoneService; private readonly IHouseLogService _houseLogService; public HouseSelectorService( IUserManager userManager, IDapperRepository dapperRep, IRepository bsHouseMemberRelationRep, IRepository bsHouseCodeRep, IRepository bsHouseTaskRep, IRepository sysUserRep, IHouseZoneService houseZoneService, IHouseLogService houseLogService ) { _userManager = userManager; _dapperRep = dapperRep; _bsHouseMemberRelationRep = bsHouseMemberRelationRep; _bsHouseCodeRep = bsHouseCodeRep; _bsHouseTaskRep = bsHouseTaskRep; _sysUserRep = sysUserRep; _houseZoneService = houseZoneService; _houseLogService = houseLogService; } /// /// 获取人员允许绑定的房屋编码列表 /// /// /// [HttpPost("/houseSelector/selectorPage")] public async Task HouseSelectorList([FromBody] QueryHouseSelectorInput input) { var sql = @"SELECT HC.*,AA.Name AreaName,RA.Name RoadName,CA.Name CommName,Proj.AreaCode,Proj.Note,CONCAT(Proj.`Name`, IFNULL(CONCAT('(',Proj.Note,')'), '')) FullProjName FROM bs_house_code HC LEFT JOIN bs_house_projectinfo Proj ON Proj.Id=HC.ProjectId LEFT JOIN sys_area_code CA ON CA.Code = Proj.AreaCode LEFT JOIN sys_area_code RA ON RA.AdCode = SUBSTR(CA.AdCode,1,9) LEFT JOIN sys_area_code AA ON AA.AdCode = SUBSTR(CA.AdCode,1,6) LEFT JOIN bs_house_member_relation HM ON HC.Id = HM.HouseCodeId INNER JOIN (SELECT * FROM sys_emp WHERE Id = @UserId) E ON HC.ZoneId = E.OrgId WHERE HM.Id IS NULL"; return await _dapperRep.QueryPageDataDynamic(sql, input, param: new { input.UserId }, filterFields: new[] { nameof(BsHouseCode.Address) , nameof(BsHouseCode.CreatedTime) }); } /// /// 获取人员已经绑定的房屋编码列表 /// /// /// [HttpPost("/houseSelector/selectedPage")] public async Task HouseSelectedList([FromBody] QueryHouseSelectorInput input) { var sql = @"SELECT HC.*,AA.Name AreaName,RA.Name RoadName,CA.Name CommName,Proj.AreaCode,Proj.Note,CONCAT(Proj.`Name`, IFNULL(CONCAT('(',Proj.Note,')'), '')) FullProjName FROM bs_house_code HC LEFT JOIN bs_house_projectinfo Proj ON Proj.Id=HC.ProjectId LEFT JOIN sys_area_code CA ON CA.Code = Proj.AreaCode LEFT JOIN sys_area_code RA ON RA.AdCode = SUBSTR(CA.AdCode,1,9) LEFT JOIN sys_area_code AA ON AA.AdCode = SUBSTR(CA.AdCode,1,6) INNER JOIN (SELECT * FROM bs_house_member_relation WHERE SysUserId = @UserId) HM ON HC.Id = HM.HouseCodeId"; return await _dapperRep.QueryPageDataDynamic(sql, input, param: new { input.UserId }, filterFields: new[] { nameof(BsHouseCode.Address) , nameof(BsHouseCode.CreatedTime) }); } /// /// 从人员选择房屋 /// /// /// [HttpPost("/houseSelector/select")] [UnitOfWork] public async Task Select([FromBody] HouseSelectInput input) { #region 验证房屋是否在当前用户可选范围内 var ids = input.Ids.Distinct().ToList(); if (ids.Count == 0) throw Oops.Oh("没有选中任何房屋"); // 验证当前用户是否安全员 **须补充 // 已经被选中的房屋,从ids中剔除 var houseSelected = await _bsHouseMemberRelationRep.DetachedEntities .Where(p => ids.Contains(p.HouseCodeId)) .Select(p => p.HouseCodeId) .ToListAsync(); if (houseSelected.Count > 0) { houseSelected.ForEach(p => { var index = ids.IndexOf(p); if (index > -1) { ids.RemoveAt(index); } }); } if (ids.Count == 0) throw Oops.Oh("当前房屋在此之前已经全部被选中,请确认"); var selectedUser = await _sysUserRep.DetachedEntities.FirstOrDefaultAsync(p => p.Id.Equals(input.UserId)); // 从用户所在片区中过滤房屋 var zoneId = await _houseZoneService.GetZoneByUser(selectedUser.Id); var house = await _bsHouseCodeRep.DetachedEntities.Where(p => ids.Contains(p.Id) && p.ZoneId == zoneId).Select(p => p.Id).ToListAsync(); if (house.Count == 0) throw Oops.Oh("选中的房屋错误"); #endregion // 选定房屋 house.ForEach(async p => { var originalTask = _bsHouseTaskRep.DetachedEntities.FirstOrDefault(t => t.HouseCodeId == p && t.TaskType == 0 && t.IsEnabled); if (originalTask == null) { new BsHouseTask { Id = System.Guid.NewGuid().ToString(), HouseCodeId = p, UserID = selectedUser.Id, EndTime = System.DateTime.Now.AddMonths(1), Status = 0, TaskType = 0 }.Insert(); await _houseLogService.Done(p); await _houseLogService.Add(p, selectedUser, HouseLogType.CreateInfo); } else { var sort = await _houseLogService.AddThenDone(p, _userManager.User, HouseLogType.SelectMember); if (originalTask.Status != 6)//建档未完成,生成新建档任务分配给新的人员;原建档任务数据保留,有效性设置为false,取消巡查关系 { var newTask = originalTask.Adapt(); newTask.Id = System.Guid.NewGuid().ToString(); newTask.UserID = input.UserId; newTask.EndTime = System.DateTime.Now.AddMonths(1); newTask.Insert(); originalTask.IsEnabled = false; originalTask.Update(); sort = await _houseLogService.Add(p, selectedUser, HouseLogType.CreateInfo, sort: sort); }//已建档完成,不再分配建档任务,仅更换巡查关系 else { var originalRelation = _bsHouseMemberRelationRep.DetachedEntities.FirstOrDefault(r => r.HouseCodeId == p && r.SysUserId == originalTask.UserID); originalRelation.Delete(); } } new BsHouseMemberRelation { SysUserId = selectedUser.Id, HouseCodeId = p }.Insert(); }); } [HttpPost("/houseSelector/revoke")] [UnitOfWork] public async Task Revoke([FromBody] HouseSelectInput input) { var ids = input.Ids.Distinct().ToList(); if (ids.Count == 0) throw Oops.Oh("没有选中任何房屋"); var selected = await _bsHouseMemberRelationRep.Where(p => ids.Contains(p.HouseCodeId) && p.SysUserId == input.UserId).ToListAsync(); selected.ForEach(p => { p.Delete(); }); } public async Task SelectMember() { } } }