fix 出差人员任务生成
This commit is contained in:
@@ -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<DeviceGroupEntity>().Where(x => x.Type == request.Type).Where(x => x.IsBusinessTrip).AnyAsync();
|
||||
exists.ThrowIfTrue("已存在出差分组");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 检查父级分组
|
||||
/// </summary>
|
||||
|
||||
@@ -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
|
||||
/// 出差目的地描述
|
||||
/// </summary>
|
||||
public string DestinationDesc { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据状态
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "varchar(50)", ColumnDescription = "数据状态", SqlParameterDbType = typeof(EnumToStringConvert))]
|
||||
public BusinessTripStatusEnumType Status { get; set; }
|
||||
}
|
||||
28
Src/Dlhis.Entity/Visitor/Enums/BusinessTripStatusEnumType.cs
Normal file
28
Src/Dlhis.Entity/Visitor/Enums/BusinessTripStatusEnumType.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Dlhis.Entity.Visitor.Enums;
|
||||
|
||||
/// <summary>
|
||||
/// 出差数据状态
|
||||
/// </summary>
|
||||
[Description("出差数据状态")]
|
||||
public enum BusinessTripStatusEnumType
|
||||
{
|
||||
/// <summary>
|
||||
/// 待处理
|
||||
/// </summary>
|
||||
[Description("待处理")]
|
||||
Wait = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 已经生成
|
||||
/// </summary>
|
||||
[Description("已经生成")]
|
||||
Generated = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 已删除
|
||||
/// </summary>
|
||||
[Description("已删除")]
|
||||
Deleted = 99
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
/// <inheritdoc />
|
||||
public SyncBusinessTripJob(IServiceProvider serviceProvider) : base(serviceProvider)
|
||||
public SyncBusinessTripJob(IServiceProvider serviceProvider, IDevicePermissionApi devicePermissionApi) : base(serviceProvider)
|
||||
{
|
||||
_devicePermissionApi = devicePermissionApi;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -19,6 +30,7 @@ public class SyncBusinessTripJob : BaseJob
|
||||
{
|
||||
var jipService = serviceProvider.GetService<IJinkoJIPService>();
|
||||
var today = DateTime.Today;
|
||||
var lastDay = today.AddDays(-1);
|
||||
|
||||
var departments = await DbContext.Queryable<DepartmentEntity>().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<BusinessTripEntity>().Where(x => x.Code == tripInfoItem.Code
|
||||
&& x.BeginDate == tripInfoItem.BeginDate
|
||||
@@ -40,6 +52,7 @@ public class SyncBusinessTripJob : BaseJob
|
||||
}
|
||||
|
||||
var entity = tripInfoItem.Adapt<BusinessTripEntity>();
|
||||
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<BusinessTripEntity>()
|
||||
.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<DeviceGroupEntity>()
|
||||
.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<GainfoEntity>().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<string> { 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<DevicePermissionEntity>()
|
||||
.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//************************************************************************************************************************************************
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user