using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.ScheduledTask.Attributes; using Dlhis.Sys.Api; using Dlhis.Sys.Api.Response; using Kurisu.AspNetCore.Utils.Extensions; using Newtonsoft.Json; namespace Dlhis.ScheduledTask.Jobs; /// /// 创建系统默认分组 /// [RecurringJob(nameof(CreateDefinitelyGroupJob), "0 0 5 * * ?", Name = "创建系统默认分组")] public class CreateDefinitelyGroupJob : BaseJob { private readonly ITenantApi _tenantApi; public CreateDefinitelyGroupJob( ITenantApi tenantApi, IServiceProvider serviceProvider) : base(serviceProvider) { _tenantApi = tenantApi; } private const string _remark = "系统自动生成"; protected override async Task RunAsync(IServiceProvider serviceProvider) { //获取所有基地信息 var tenants = await _tenantApi.GetTenantsInternalAsync(); Logger.LogInformation("获取基地信息:{json}", JsonConvert.SerializeObject(tenants)); //****************************************************系统人员分组**********************************************************/ await CreateGainfoGroupsAsync(tenants); //*****************************************************考勤设备组*********************************************************/ await CreateDeviceGroupAsync(DeviceTypeEnumType.Attendance, new List { "*通用考勤设备组", "*专用考勤设备组" }, tenants); //*****************************************************门禁设备组********************************************************/ await CreateDeviceGroupAsync(DeviceTypeEnumType.Door, new List { "*共用区域", "*非共用区域" }, tenants); } private async Task CreateGainfoGroupsAsync(List tenants) { var groups = new List { "*自定义人员分组", "*督查组", "*X3及以上领导组" }; var searchGroups = await DbContext.Queryable().Where(x => groups.Contains(x.Name)).ToListAsync(); foreach (var grp in groups) { if (searchGroups.All(x => x.Name != grp)) { await DbContext.InsertAsync(new GainfoGroupEntity { PCode = null, Code = Guid.NewGuid(), Name = grp, IsDefault = grp.Equals("*自定义人员分组"), Editable = false, Remark = _remark, TenantId = null }); } } } private async Task CreateDeviceGroupAsync(DeviceTypeEnumType type, List topGroups, List tenants) { foreach (var grp in topGroups) { var topGrp = await DbContext.Queryable().FirstAsync(x => x.Name == grp); if (topGrp == null) { topGrp = new DeviceGroupEntity { PCode = null, Code = Guid.NewGuid(), Type = type, Name = grp, Editable = false, AbleSetNext = false, Remark = _remark, TenantId = null, }; await DbContext.InsertAsync(topGrp); } foreach (var workplace in tenants.Where(x => x.PCode.IsEmpty())) { var workplaceName = $"*{type.GetDescription()}工作地系统组({workplace.Name})"; var workplaceGrp = await DbContext.Queryable().Where(x => x.PCode == topGrp.Code).FirstAsync(x => x.Name == workplaceName); if (workplaceGrp == null) { workplaceGrp = new DeviceGroupEntity { PCode = topGrp.Code, Code = Guid.NewGuid(), Type = type, Name = workplaceName, Editable = false, AbleSetNext = false, Remark = _remark, TenantId = workplace.Code, }; await DbContext.InsertAsync(workplaceGrp); } foreach (var factory in tenants.Where(x => x.PCode == workplace.Code)) { var factoryName = $"*{type.GetDescription()}厂区系统组({factory.Name})"; var factoryGrp = await DbContext.Queryable().Where(x => x.PCode == workplaceGrp.Code).FirstAsync(x => x.Name == factoryName); if (factoryGrp == null) { factoryGrp = new DeviceGroupEntity { PCode = workplaceGrp.Code, Code = Guid.NewGuid(), Type = type, Name = factoryName, Editable = false, AbleSetNext = true, Remark = _remark, TenantId = factory.Code, }; await DbContext.InsertAsync(factoryGrp); } if (type == DeviceTypeEnumType.Door && grp == "*共用区域") { if (!await DbContext.Queryable().Where(x => x.PCode == factoryGrp.Code).AnyAsync(x => x.IsBusinessTrip)) { await DbContext.InsertAsync(new DeviceGroupEntity { PCode = factoryGrp.Code, Code = Guid.NewGuid(), Type = type, Name = "*出差组", Editable = false, AbleSetNext = false, IsBusinessTrip = true, Remark = _remark, TenantId = factory.Code, }); } } } } } } }