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()
{
}
}
}