From 8c4aaee32a9ea59dd9d910c7c4ac4828206ed490 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Fri, 5 Jul 2024 11:59:22 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=87=BA=E5=B7=AE=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Implements/DeviceGroupService.cs | 8 ++ .../Visitor/Entity/BusinessTripEntity.cs | 8 ++ .../Enums/BusinessTripStatusEnumType.cs | 28 +++++ .../Jobs/SyncBusinessTripJob.cs | 118 +++++++++++++++++- Src/Dlhis.ScheduledTask/Program.cs | 2 - 5 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 Src/Dlhis.Entity/Visitor/Enums/BusinessTripStatusEnumType.cs diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index 8e43ca33..2235ace8 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -60,6 +60,7 @@ public class DeviceGroupService : IDeviceGroupService { //检查父级节点 var pGrp = await CheckPCodeAsync(request); + await CheckBusinessTripGroupAsync(request); if (!request.Id.HasValue) { @@ -162,6 +163,13 @@ public class DeviceGroupService : IDeviceGroupService /****************************************************** help methods *********************************************************/ + private async Task CheckBusinessTripGroupAsync(DeviceGroupSaveRequest request) + { + var exists = await _dbContext.Queryable().Where(x => x.Type == request.Type).Where(x => x.IsBusinessTrip).AnyAsync(); + exists.ThrowIfTrue("已存在出差分组"); + } + + /// /// 检查父级分组 /// diff --git a/Src/Dlhis.Entity/Visitor/Entity/BusinessTripEntity.cs b/Src/Dlhis.Entity/Visitor/Entity/BusinessTripEntity.cs index 156a0770..d99762e9 100644 --- a/Src/Dlhis.Entity/Visitor/Entity/BusinessTripEntity.cs +++ b/Src/Dlhis.Entity/Visitor/Entity/BusinessTripEntity.cs @@ -1,5 +1,7 @@ +using Dlhis.Entity.Visitor.Enums; using Kurisu.AspNetCore.DataAccess.SqlSugar; using SqlSugar; +using SqlSugar.DbConvert; namespace Dlhis.Entity.Visitor.Entity; @@ -70,4 +72,10 @@ public class BusinessTripEntity : SugarBaseEntity /// 出差目的地描述 /// public string DestinationDesc { get; set; } + + /// + /// 数据状态 + /// + [SugarColumn(ColumnDataType = "varchar(50)", ColumnDescription = "数据状态", SqlParameterDbType = typeof(EnumToStringConvert))] + public BusinessTripStatusEnumType Status { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Entity/Visitor/Enums/BusinessTripStatusEnumType.cs b/Src/Dlhis.Entity/Visitor/Enums/BusinessTripStatusEnumType.cs new file mode 100644 index 00000000..ee66e12e --- /dev/null +++ b/Src/Dlhis.Entity/Visitor/Enums/BusinessTripStatusEnumType.cs @@ -0,0 +1,28 @@ +using System.ComponentModel; + +namespace Dlhis.Entity.Visitor.Enums; + +/// +/// 出差数据状态 +/// +[Description("出差数据状态")] +public enum BusinessTripStatusEnumType +{ + /// + /// 待处理 + /// + [Description("待处理")] + Wait = 0, + + /// + /// 已经生成 + /// + [Description("已经生成")] + Generated = 1, + + /// + /// 已删除 + /// + [Description("已删除")] + Deleted = 99 +} \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/Jobs/SyncBusinessTripJob.cs b/Src/Dlhis.ScheduledTask/Jobs/SyncBusinessTripJob.cs index f7a0aaf2..af01622f 100644 --- a/Src/Dlhis.ScheduledTask/Jobs/SyncBusinessTripJob.cs +++ b/Src/Dlhis.ScheduledTask/Jobs/SyncBusinessTripJob.cs @@ -1,17 +1,28 @@ +using Dlhis.Basic.Api; using Dlhis.Entity.Basic.Entity; +using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Device.Enums; +using Dlhis.Entity.Sys.Entities; +using Dlhis.Entity.Sys.Enums; using Dlhis.Entity.Visitor.Entity; +using Dlhis.Entity.Visitor.Enums; using Dlhis.ScheduledTask.Attributes; using Dlhis.ScheduledTask.Common.Services; +using Kurisu.AspNetCore.Utils.Extensions; using Mapster; +using SqlSugar; namespace Dlhis.ScheduledTask.Jobs; [RecurringJob(nameof(SyncBusinessTripJob), "0 0 1 1/1 * ? ", Name = "SAP同步出差信息")] public class SyncBusinessTripJob : BaseJob { + private readonly IDevicePermissionApi _devicePermissionApi; + /// - public SyncBusinessTripJob(IServiceProvider serviceProvider) : base(serviceProvider) + public SyncBusinessTripJob(IServiceProvider serviceProvider, IDevicePermissionApi devicePermissionApi) : base(serviceProvider) { + _devicePermissionApi = devicePermissionApi; } /// @@ -19,6 +30,7 @@ public class SyncBusinessTripJob : BaseJob { var jipService = serviceProvider.GetService(); var today = DateTime.Today; + var lastDay = today.AddDays(-1); var departments = await DbContext.Queryable().ToListAsync(); var tops = departments.Where(x => x.PNo == "00001000").ToList(); @@ -30,7 +42,7 @@ public class SyncBusinessTripJob : BaseJob try { var tripResponse = await jipService.GetTravelInfosByDepartmentsAsync(today, today, departmentNos.ToList()); - foreach (var tripInfoItem in tripResponse.Items) + foreach (var tripInfoItem in tripResponse.Items.Where(x => x.Destination.IsPresent())) { if (await DbContext.Queryable().Where(x => x.Code == tripInfoItem.Code && x.BeginDate == tripInfoItem.BeginDate @@ -40,6 +52,7 @@ public class SyncBusinessTripJob : BaseJob } var entity = tripInfoItem.Adapt(); + entity.Status = BusinessTripStatusEnumType.Wait; await DbContext.InsertAsync(entity); } } @@ -48,6 +61,107 @@ public class SyncBusinessTripJob : BaseJob Logger.LogError(e, "获取部门出差数据执行失败:{message}", e.Message); } } + + + var tripInfos = await DbContext.Queryable() + .Where(x => (SqlFunc.DateIsSame(x.BeginDate, today) && SqlFunc.DateIsSame(x.BeginDate, today)) + || (SqlFunc.DateIsSame(x.BeginDate, lastDay) && SqlFunc.DateIsSame(x.BeginDate, lastDay))) + .Where(x => !SqlFunc.IsNullOrEmpty(x.Destination)) + .Where(x => x.Status == BusinessTripStatusEnumType.Wait) + .ToListAsync(); + + var factoryIds = tripInfos.Select(x => x.Destination).Distinct().ToList(); + var tripGroups = await DbContext.Queryable() + .Where(x => x.Type == DeviceTypeEnumType.Door) + .Where(x => factoryIds.Contains(x.TenantId)).Where(x => x.IsBusinessTrip) + .ToListAsync(); + + var userCodes = tripInfos.Select(x => x.Code).Distinct().ToList(); + var gainfos = await DbContext.Queryable().Where(x => userCodes.Contains(x.Code)).ToListAsync(); + + foreach (var code in userCodes) + { + var gainfo = gainfos.FirstOrDefault(x => x.Code == code); + if (gainfo == null) + { + continue; + } + + foreach (var factoryTripInfos in tripInfos.Where(x => x.Code == code).GroupBy(x => x.Destination)) + { + var tripGroup = tripGroups.FirstOrDefault(x => x.TenantId == factoryTripInfos.Key); + if (tripGroup == null) + { + continue; + } + + var todayTripInfo = factoryTripInfos.FirstOrDefault(x => x.BeginDate == today && x.EndDate == today); + var lastDayTripInfo = factoryTripInfos.FirstOrDefault(x => x.BeginDate == lastDay && x.EndDate == lastDay); + + bool isGenerateOrDeleted = false; + + if (lastDayTripInfo != null && todayTripInfo != null) + { + todayTripInfo.Status = BusinessTripStatusEnumType.Generated; + await DbContext.UpdateAsync(todayTripInfo); + continue; + } + + + if (lastDayTripInfo == null && todayTripInfo != null) + { + isGenerateOrDeleted = true; + todayTripInfo.Status = BusinessTripStatusEnumType.Generated; + } + + if (todayTripInfo == null && lastDayTripInfo != null) + { + isGenerateOrDeleted = false; + lastDayTripInfo.Status = BusinessTripStatusEnumType.Deleted; + } + + try + { + var beforeResult = await _devicePermissionApi.GetPermissionUsersInfoAsync(new List { code }); + + if (isGenerateOrDeleted) + { + await DbContext.InsertAsync(new DevicePermissionEntity + { + AssignType = AssignTypeEnumType.User, + AssignValue = gainfo.No, + UniqueType = DeviceAssignmentTypeEnumType.Group, + UniqueValue = tripGroup.Code, + TenantId = factoryTripInfos.Key, + IsDeleted = false + }); + } + else + { + await DbContext.Updateable() + .SetColumns(x => x.IsDeleted == true) + .Where(x => x.AssignType == AssignTypeEnumType.User) + .Where(x => x.AssignValue == gainfo.No) + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + .Where(x => x.UniqueValue == tripGroup.Code) + .Where(x => x.TenantId == factoryTripInfos.Key) + .ExecuteCommandAsync(); + } + + await _devicePermissionApi.RePermissionUsersInfoAsync(beforeResult.Data); + + if (lastDayTripInfo != null) + await DbContext.UpdateAsync(lastDayTripInfo); + + if (todayTripInfo != null) + await DbContext.UpdateAsync(todayTripInfo); + } + catch (Exception e) + { + Logger.LogError(e, "出差自动下发任务失败:{message}", e.Message); + } + } + } } //************************************************************************************************************************************************ diff --git a/Src/Dlhis.ScheduledTask/Program.cs b/Src/Dlhis.ScheduledTask/Program.cs index 1a6d8cd5..f275e167 100644 --- a/Src/Dlhis.ScheduledTask/Program.cs +++ b/Src/Dlhis.ScheduledTask/Program.cs @@ -1,5 +1,4 @@ using Kurisu.AspNetCore.Startup; -using Kurisu.AspNetCore.Utils; using Kurisu.AspNetCore.Utils.Extensions; class Program @@ -25,6 +24,5 @@ public class Startup : DefaultStartup public override void Configure(IApplicationBuilder app, IWebHostEnvironment env) { base.Configure(app, env); - SnowFlakeHelper.Initialize(2, 1); } } \ No newline at end of file