diff --git a/Src/Dlhis.Basic.Api/IDingTalkApi.cs b/Src/Dlhis.Basic.Api/IDingTalkApi.cs
index 23f0da6c..3b3ca984 100644
--- a/Src/Dlhis.Basic.Api/IDingTalkApi.cs
+++ b/Src/Dlhis.Basic.Api/IDingTalkApi.cs
@@ -10,4 +10,8 @@ public interface IDingTalkApi
{
[Post("/api/messages/dingtalk/workmessage")]
Task SendWorkMessageAsync(JinkoSendWorkMessageRequest request);
+
+ [Post("dingtalk/workgrid/workmessage")]
+ Task SendWorkMessageByWorkGridAsync(JinkoSendWorkMessageRequest request);
+
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic.Api/IFactorySettingApi.cs b/Src/Dlhis.Basic.Api/IFactorySettingApi.cs
new file mode 100644
index 00000000..cd7637f8
--- /dev/null
+++ b/Src/Dlhis.Basic.Api/IFactorySettingApi.cs
@@ -0,0 +1,20 @@
+using Kurisu.RemoteCall.Attributes;
+
+namespace Dlhis.Basic.Api;
+
+[RequestResultHandler]
+[EnableRemoteClient(Name = "basic-service", BaseUrl = "${InternalRequest:BasicRequestUrl}")]
+public interface IFactorySettingApi
+{
+ ///
+ ///
+ ///
+ ///
+ ///
+ [Get("/api/factorySetting/enableBirthdayVoucherFactories")]
+ Task> GetEnableBirthdayVoucherFactoriesAsync();
+
+
+ [Get("/api/factorySetting/enableUseBirthdayVoucherFactories")]
+ Task> GetEnableUseBirthdayVoucherFactoriesAsync(string factory);
+}
diff --git a/Src/Dlhis.Basic.Api/ISyncApi.cs b/Src/Dlhis.Basic.Api/ISyncApi.cs
index 98a45921..0bc69b52 100644
--- a/Src/Dlhis.Basic.Api/ISyncApi.cs
+++ b/Src/Dlhis.Basic.Api/ISyncApi.cs
@@ -9,22 +9,43 @@ namespace Dlhis.Basic.Api;
[EnableRemoteClient(Name = "longRun-service", BaseUrl = "${InternalRequest:BasicRequestUrl}", PolicyHandler = typeof(LongRunClientHandler))]
public interface ISyncApi
{
+ ///
+ /// 根据人事范围获取员工信息
+ ///
+ ///
+ ///
[Post("/api/sync/gainfo/werk")]
[RequestContentHandler(typeof(CodeContentHandler))]
Task SyncGainfoByWerkAsync(string code);
+ ///
+ /// 根据工号获取员工信息
+ ///
+ ///
+ ///
[Post("/api/sync/gainfo/user")]
[RequestContentHandler(typeof(CodeContentHandler))]
Task SyncGainfoByUserCodeAsync(string code);
+ ///
+ /// 获取组织架构数据
+ ///
+ ///
[Get("/api/sync/orgs")]
Task SyncOrganizationsAsync();
-
+ ///
+ /// 获取职位数据
+ ///
+ ///
[Get("/api/sync/positions")]
Task GetPositionsAsync();
-
+ ///
+ /// 差旅数据处理
+ ///
+ ///
+ ///
[Post("/api/sync/businessTrips")]
[RequestContentHandler(typeof(CodeContentHandler))]
Task HandlerBusinessTripsAsync(string code);
diff --git a/Src/Dlhis.Basic.Api/Response/SapOrganizationItem.cs b/Src/Dlhis.Basic.Api/Response/SapOrganizationItem.cs
index e26fe528..47dbe600 100644
--- a/Src/Dlhis.Basic.Api/Response/SapOrganizationItem.cs
+++ b/Src/Dlhis.Basic.Api/Response/SapOrganizationItem.cs
@@ -41,6 +41,37 @@ public class SapOrganizationItem
/// 事业部
///
public string ORGID02 { get; set; }
+
+ ///
+ /// 一级部门
+ ///
+ public string ORGID03 { get; set; }
+
+ ///
+ /// 二级部门
+ ///
+ public string ORGID04 { get; set; }
+
+
+ ///
+ /// 三级部门
+ ///
+ public string ORGID05 { get; set; }
+
+ ///
+ /// 四级部门
+ ///
+ public string ORGID06 { get; set; }
+
+ ///
+ /// 五级部门
+ ///
+ public string ORGID07 { get; set; }
+
+ ///
+ /// 六级部门
+ ///
+ public string ORGID08 { get; set; }
}
diff --git a/Src/Dlhis.Basic/Device/Request/DevicePermissionManuallyAddRequest.cs b/Src/Dlhis.Basic/Device/Request/DevicePermissionManuallyAddRequest.cs
index 2ae23a8e..09672c95 100644
--- a/Src/Dlhis.Basic/Device/Request/DevicePermissionManuallyAddRequest.cs
+++ b/Src/Dlhis.Basic/Device/Request/DevicePermissionManuallyAddRequest.cs
@@ -8,4 +8,9 @@ public class DevicePermissionManuallyAddRequest
[Required]
public string UserNo { get; set; }
+
+ ///
+ /// ÓÐЧÆÚʱ¼ä
+ ///
+ public DateTime? ValidDateTime { get; set; }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Response/DevicePermissionManuallyResponse.cs b/Src/Dlhis.Basic/Device/Response/DevicePermissionManuallyResponse.cs
index d421f4c4..b32a3f8b 100644
--- a/Src/Dlhis.Basic/Device/Response/DevicePermissionManuallyResponse.cs
+++ b/Src/Dlhis.Basic/Device/Response/DevicePermissionManuallyResponse.cs
@@ -14,6 +14,8 @@ public class DevicePermissionManuallyResponse
public DeviceTypeEnumType? Type { get; set; }
+ public DateTime? ValidDateTime { get; set; }
+
public string TypeDesc
{
get
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs
index 3e7dae5b..6e119501 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs
@@ -1,6 +1,7 @@
using Dlhis.Basic.Device.Dtos;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
+using Dlhis.Basic.Utils;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Dlhis.Entity.Device.Enums;
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
index f4668515..4fecfc39 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs
@@ -2,6 +2,7 @@
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Organization.Dto;
+using Dlhis.Basic.Utils;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Basic.Enums;
using Dlhis.Entity.Device.Entities;
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs
index f6da70f8..5502fcae 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs
@@ -3,6 +3,7 @@ using Dlhis.Basic.DataPermissions;
using Dlhis.Basic.Device.Dtos;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Organization.Dto;
+using Dlhis.Basic.Utils;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Basic.Enums;
using Dlhis.Entity.Device.Entities;
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionManuallyService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionManuallyService.cs
index a2c3e0c6..4666b5a5 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionManuallyService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionManuallyService.cs
@@ -39,7 +39,8 @@ public class DevicePermissionManuallyService : IDevicePermissionManuallyService
DeployPlace = d.DeployPlace,
UserNo = x.UserNo,
UserName = g.Code + " " + g.Name,
- Type = d.Type
+ Type = d.Type,
+ ValidDateTime = x.ValidDateTime
});
return await query.ToPageListAsync(requestDto);
@@ -59,7 +60,8 @@ public class DevicePermissionManuallyService : IDevicePermissionManuallyService
await _dbContext.InsertAsync(new DevicePermissionManuallyEntity
{
DeviceCode = request.DeviceCode,
- UserNo = request.UserNo
+ UserNo = request.UserNo,
+ ValidDateTime = request.ValidDateTime,
});
await _dbContext.InsertAsync(new DeviceTaskEntity
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
index f6620c07..40165cc1 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
@@ -3,6 +3,7 @@ using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Organization.Dto;
using Dlhis.Basic.Organization.Services;
+using Dlhis.Basic.Utils;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Basic.Enums;
using Dlhis.Entity.Device.Entities;
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs
index 17b8130c..6f2560c8 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/DepartmentPermissionAnalyzeService.cs
@@ -1,4 +1,5 @@
using Dlhis.Basic.Organization.Dto;
+using Dlhis.Basic.Utils;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Enums;
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs
index f510cbf5..6e967e32 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/PermissionAnalyze/GroupPermissionAnalyzeService.cs
@@ -1,3 +1,4 @@
+using Dlhis.Basic.Utils;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Enums;
diff --git a/Src/Dlhis.Basic/Organization/Controllers/FactorySettingController.cs b/Src/Dlhis.Basic/Organization/Controllers/FactorySettingController.cs
index 3495f1b1..fdfdd380 100644
--- a/Src/Dlhis.Basic/Organization/Controllers/FactorySettingController.cs
+++ b/Src/Dlhis.Basic/Organization/Controllers/FactorySettingController.cs
@@ -55,4 +55,20 @@ public class FactorySettingController : ControllerBase
{
return await _factorySettingService.GetFactorySettingAsync(factory, false);
}
+
+ [IgnoreTenant]
+ [AllowAnonymous]
+ [HttpGet("enableBirthdayVoucherFactories")]
+ public async Task> GetEnableBirthdayVoucherFactoriesAsync()
+ {
+ return await _factorySettingService.GetEnableBirthdayVoucherFactoriesAsync();
+ }
+
+ [IgnoreTenant]
+ [AllowAnonymous]
+ [HttpGet("enableUseBirthdayVoucherFactories")]
+ public async Task> GetEnableBirthdayVoucherFactoriesAsync(string factory)
+ {
+ return await _factorySettingService.GetEnableUseBirthdayVoucherFactoriesAsync(factory);
+ }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoOutsourceController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoOutsourceController.cs
index 510d579d..58849dfc 100644
--- a/Src/Dlhis.Basic/Organization/Controllers/GainfoOutsourceController.cs
+++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoOutsourceController.cs
@@ -1,7 +1,10 @@
using System.ComponentModel.DataAnnotations;
+using Dlhis.Basic.Organization.Dto;
using Dlhis.Basic.Organization.Request;
using Dlhis.Basic.Organization.Response;
using Dlhis.Basic.Organization.Services;
+using Dlhis.Basic.Organization.Services.Implements;
+using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
using Kurisu.AspNetCore.Utils.Extensions;
using Microsoft.AspNetCore.Authorization;
@@ -18,10 +21,12 @@ namespace Dlhis.Basic.Organization.Controllers;
public class GainfoOutsourceController : ControllerBase
{
private readonly IGainfoOutsourceService _gainfoOutSourceService;
+ private readonly IOutsourceWhiteListService _outsourceWhiteList;
- public GainfoOutsourceController(IGainfoOutsourceService gainfoOutSourceService)
+ public GainfoOutsourceController(IGainfoOutsourceService gainfoOutSourceService, IOutsourceWhiteListService outsourceWhiteList)
{
_gainfoOutSourceService = gainfoOutSourceService;
+ _outsourceWhiteList = outsourceWhiteList;
}
///
@@ -66,7 +71,6 @@ public class GainfoOutsourceController : ControllerBase
///
///
///
- [AllowAnonymous]
[HttpGet("info")]
public async Task GetExternalInfoAsync([Required] string userNo)
{
@@ -83,4 +87,37 @@ public class GainfoOutsourceController : ControllerBase
{
await _gainfoOutSourceService.AutoResignAsync();
}
+
+ ///
+ /// 获取外包白名单分页数据
+ ///
+ ///
+ ///
+ [HttpPost("whiteListPage")]
+ public async Task> GetPageAsync(OutsourceWhiteListPageRequest request)
+ {
+ return await _outsourceWhiteList.GetPageAsync(request);
+ }
+
+ ///
+ /// 添加外包白名单
+ ///
+ ///
+ ///
+ [HttpPost("setWhiteList")]
+ public async Task AddAsync(OutsourceWhiteListAddAndRemoveRequest request)
+ {
+ await _outsourceWhiteList.AddAsync(request.UserCode);
+ }
+
+ ///
+ /// 移除外包白名单
+ ///
+ ///
+ ///
+ [HttpPost("removeWhiteList")]
+ public async Task RemoveAsync(OutsourceWhiteListAddAndRemoveRequest request)
+ {
+ await _outsourceWhiteList.RemoveAsync(request.UserCode);
+ }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Request/FactorySettingSaveRequest.cs b/Src/Dlhis.Basic/Organization/Request/FactorySettingSaveRequest.cs
index d9676105..a757080e 100644
--- a/Src/Dlhis.Basic/Organization/Request/FactorySettingSaveRequest.cs
+++ b/Src/Dlhis.Basic/Organization/Request/FactorySettingSaveRequest.cs
@@ -32,4 +32,11 @@ public class FactorySettingSaveRequest
/// 访客自动离职天数(无通行记录)
///
public int NoRecordAutoResignExternalDays { get; set; }
+
+ ///
+ /// 是否启用生日电子餐券
+ ///
+ public bool EnableBirthdayVoucher { get; set; }
+
+ public List EnableUseBirthdayVoucherFactories { get; set; }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Request/OutsourceWhiteListAddAndRemoveRequest.cs b/Src/Dlhis.Basic/Organization/Request/OutsourceWhiteListAddAndRemoveRequest.cs
new file mode 100644
index 00000000..91996a60
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Request/OutsourceWhiteListAddAndRemoveRequest.cs
@@ -0,0 +1,12 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Dlhis.Basic.Organization.Request;
+
+public class OutsourceWhiteListAddAndRemoveRequest
+{
+ ///
+ /// 工号
+ ///
+ [Required]
+ public string UserCode { get; set; }
+}
diff --git a/Src/Dlhis.Basic/Organization/Request/OutsourceWhiteListPageRequest.cs b/Src/Dlhis.Basic/Organization/Request/OutsourceWhiteListPageRequest.cs
new file mode 100644
index 00000000..612ba548
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Request/OutsourceWhiteListPageRequest.cs
@@ -0,0 +1,7 @@
+using Kurisu.AspNetCore.DataAccess.Dto;
+
+namespace Dlhis.Basic.Organization.Request;
+
+public class OutsourceWhiteListPageRequest : PageDto
+{
+}
diff --git a/Src/Dlhis.Basic/Organization/Response/FactorySettingResponse.cs b/Src/Dlhis.Basic/Organization/Response/FactorySettingResponse.cs
index 22951946..d5957ccd 100644
--- a/Src/Dlhis.Basic/Organization/Response/FactorySettingResponse.cs
+++ b/Src/Dlhis.Basic/Organization/Response/FactorySettingResponse.cs
@@ -32,4 +32,11 @@ public class FactorySettingResponse
/// 外部人员自动离职天数(无通行记录)
///
public int NoRecordAutoResignExternalDays { get; set; }
+
+ ///
+ /// 是否启用生日电子餐券
+ ///
+ public bool EnableBirthdayVoucher { get; set; }
+
+ public List EnableUseBirthdayVoucherFactories { get; set; }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs
index 59bbc99e..8027b12e 100644
--- a/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs
+++ b/Src/Dlhis.Basic/Organization/Response/GainfoDetailResponse.cs
@@ -1,4 +1,5 @@
-using Dlhis.Entity.Basic.Enums;
+using Dlhis.Basic.Utils;
+using Dlhis.Entity.Basic.Enums;
using Kurisu.AspNetCore.Utils.Converters;
using Kurisu.AspNetCore.Utils.Extensions;
using Newtonsoft.Json;
diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs
index 7076a426..609e3015 100644
--- a/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs
+++ b/Src/Dlhis.Basic/Organization/Response/GainfoOutSourceExternalInfoResponse.cs
@@ -6,6 +6,8 @@ namespace Dlhis.Basic.Organization.Response;
public class GainfoOutSourceExternalInfoResponse : GainfoOutSourceExternalInfoDto
{
+ public string UserCode { get; set; }
+
///
/// 对接人姓名
///
@@ -27,4 +29,6 @@ public class GainfoOutSourceExternalInfoResponse : GainfoOutSourceExternalInfoDt
/// 厂区
///
public string Factory { get; set; }
+
+ public bool IsWhiteListInAutoResign { get; set; }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Response/GainfoPageResponse.cs b/Src/Dlhis.Basic/Organization/Response/GainfoPageResponse.cs
index 06ddc9c6..1538450a 100644
--- a/Src/Dlhis.Basic/Organization/Response/GainfoPageResponse.cs
+++ b/Src/Dlhis.Basic/Organization/Response/GainfoPageResponse.cs
@@ -1,4 +1,5 @@
-using Dlhis.Entity.Basic.Enums;
+using Dlhis.Basic.Utils;
+using Dlhis.Entity.Basic.Enums;
using Kurisu.AspNetCore.Utils.Converters;
using Kurisu.AspNetCore.Utils.Extensions;
using Newtonsoft.Json;
diff --git a/Src/Dlhis.Basic/Organization/Services/IFactorySettingService.cs b/Src/Dlhis.Basic/Organization/Services/IFactorySettingService.cs
index e004fd5e..bb201977 100644
--- a/Src/Dlhis.Basic/Organization/Services/IFactorySettingService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/IFactorySettingService.cs
@@ -14,6 +14,12 @@ public interface IFactorySettingService : IScopeDependency
Task GetWorkGridSetLimitAsync();
Task CheckWorkGridSetLimitAsync(DateOnly date);
-
+
Task IsWorkGridSetLimitAsync(DateOnly date);
+
+ Task IsEnableBirthdayVoucherAsync(string factory, bool usePermission);
+
+ Task> GetEnableBirthdayVoucherFactoriesAsync();
+
+ Task> GetEnableUseBirthdayVoucherFactoriesAsync(string currentFactory);
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Services/IOutsourceWhiteListService.cs b/Src/Dlhis.Basic/Organization/Services/IOutsourceWhiteListService.cs
new file mode 100644
index 00000000..8a3c0f3d
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Services/IOutsourceWhiteListService.cs
@@ -0,0 +1,12 @@
+using Dlhis.Basic.Organization.Dto;
+using Dlhis.Basic.Organization.Request;
+using Kurisu.AspNetCore.DataAccess.Dto;
+
+namespace Dlhis.Basic.Organization.Services;
+
+public interface IOutsourceWhiteListService : IScopeDependency
+{
+ Task> GetPageAsync(OutsourceWhiteListPageRequest request);
+ Task AddAsync(string userCode);
+ Task RemoveAsync(string userCode);
+}
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/FactorySettingService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/FactorySettingService.cs
index 32fb28a8..ce9648d1 100644
--- a/Src/Dlhis.Basic/Organization/Services/Implements/FactorySettingService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/FactorySettingService.cs
@@ -38,6 +38,7 @@ public class FactorySettingService : IFactorySettingService
if (setting == null)
{
setting = request.Adapt();
+ setting.EnableUseBirthdayVoucherFactories = request.EnableUseBirthdayVoucherFactories.ToJson();
setting.TenantId = request.Factory;
await _dbContext.InsertAsync(setting);
@@ -45,12 +46,19 @@ public class FactorySettingService : IFactorySettingService
else
{
request.Adapt(setting);
+ setting.EnableUseBirthdayVoucherFactories = request.EnableUseBirthdayVoucherFactories.ToJson();
setting.TenantId = request.Factory;
await _dbContext.UpdateAsync(setting);
}
}
+ public async Task IsEnableBirthdayVoucherAsync(string factory, bool usePermission)
+ {
+ var setting = await GetFactorySettingAsync(factory, usePermission);
+ return setting.EnableBirthdayVoucher;
+ }
+
public async Task GetFactorySettingAsync(string factory, bool usePermission)
{
@@ -102,6 +110,20 @@ public class FactorySettingService : IFactorySettingService
return now >= setting;
}
+
+ public async Task> GetEnableBirthdayVoucherFactoriesAsync()
+ {
+ var settings = await GetListAsync(false);
+ return settings.Where(x => x.EnableBirthdayVoucher).Select(x => x.Factory).ToList();
+ }
+
+ public async Task> GetEnableUseBirthdayVoucherFactoriesAsync(string currentFactory)
+ {
+ var settings = await GetFactorySettingsAsync(currentFactory, false);
+ var setting = settings.Where(x => x.EnableBirthdayVoucher).FirstOrDefault();
+ return setting.EnableUseBirthdayVoucherFactories;
+ }
+
//************************************************************************************************************************************************************
private async Task> GetFactorySettingsAsync(string factory, bool usePermission)
@@ -150,8 +172,11 @@ public class FactorySettingService : IFactorySettingService
}).ToList()
},
NoRecordAutoResignOutsourceDays = currentSetting?.NoRecordAutoResignOutsourceDays ?? 30,
- NoRecordAutoResignExternalDays = currentSetting?.NoRecordAutoResignExternalDays ?? 0
+ NoRecordAutoResignExternalDays = currentSetting?.NoRecordAutoResignExternalDays ?? 0,
+ EnableBirthdayVoucher = currentSetting?.EnableBirthdayVoucher ?? false,
+ EnableUseBirthdayVoucherFactories = (currentSetting?.EnableUseBirthdayVoucherFactories ?? "[]").ToObject>()
};
}).ToList();
}
+
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoFaceService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoFaceService.cs
index 9763488b..b213ae89 100644
--- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoFaceService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoFaceService.cs
@@ -3,6 +3,7 @@ using Dlhis.Basic.Organization.Api;
using Dlhis.Basic.Organization.Api.Request;
using Dlhis.Basic.Organization.Request;
using Dlhis.Basic.Organization.Response;
+using Dlhis.Basic.ThirdParts;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Basic.Enums;
using Dlhis.Entity.Device.Enums;
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs
index efd2020f..1a27914f 100644
--- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoGroupService.cs
@@ -3,6 +3,7 @@ using Dlhis.Basic.Device.Response;
using Dlhis.Basic.Device.Services;
using Dlhis.Basic.Organization.Request;
using Dlhis.Basic.Organization.Response;
+using Dlhis.Basic.Utils;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Dlhis.Entity.Device.Enums;
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs
index 93bdb9f9..48cabf13 100644
--- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceService.cs
@@ -4,6 +4,7 @@ using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Basic.Enums;
using Dlhis.Entity.Device.Entities;
using Kurisu.AspNetCore.Cache;
+using Kurisu.AspNetCore.CustomClass;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Utils.Extensions;
using Mapster;
@@ -94,21 +95,28 @@ public class GainfoOutsourceService : IGainfoOutsourceService
public async Task GetExternalInfoAsync(string userNo)
{
- return await _dbContext.Queryable()
- .LeftJoin((a, b) => a.Code == b.Code)
- .LeftJoin((a, b, c) => a.SapCode == c.Code)
- .Where((a, b, c) => b.No == userNo)
- .Select((a, b, c) => new GainfoOutSourceExternalInfoResponse
- {
- Supplier = a.Supplier,
- SapCode = a.SapCode,
- SapPhone = a.SapPhone,
- SapName = c.Name,
- EntryDate = b.EntryDate,
- ResignationDate = b.ResignationDate,
- Factory = b.Factory
- })
- .SingleAsync();
+ var data = await _dbContext.Queryable()
+ .LeftJoin((a, b) => a.Code == b.Code)
+ .LeftJoin((a, b, c) => a.SapCode == c.Code)
+ .Where((a, b, c) => b.No == userNo)
+ .Select((a, b, c) => new GainfoOutSourceExternalInfoResponse
+ {
+ UserCode = b.Code,
+ Supplier = a.Supplier,
+ SapCode = a.SapCode,
+ SapPhone = a.SapPhone,
+ SapName = c.Name,
+ EntryDate = b.EntryDate,
+ ResignationDate = b.ResignationDate,
+ Factory = b.Factory
+ })
+ .SingleAsync();
+
+ data.IsWhiteListInAutoResign = await _dbContext.Queryable()
+ .Where(x => x.UserCode == data.UserCode)
+ .AnyAsync();
+
+ return data;
}
@@ -116,11 +124,27 @@ public class GainfoOutsourceService : IGainfoOutsourceService
{
var outsources = await _dbContext.Queryable()
.Where(x => x.Type == GainfoUserTypeEnumType.Outsource)
+ .Where(x => SqlFunc.Subqueryable().Where(p => p.UserCode == x.Code).NotAny())//不存在白名单中
.Select(x => new { x.Id, x.Code, x.Factory, x.CreateTime })
.ToListAsync();
var settings = await _factorySettingService.GetListAsync(false);
+ var holidaies = await _dbContext
+ .Queryable()
+ .Select(x => new
+ {
+ x.Type,
+ Period = new DatePeriod
+ {
+ Start = x.Start,
+ End = x.End
+ }
+ })
+ .ToListAsync();
+
+
+ var weekends = new List() { DayOfWeek.Saturday, DayOfWeek.Sunday };
foreach (var grp in outsources.GroupBy(x => x.Factory))
{
var setting = settings.First(x => x.Factory == grp.Key);
@@ -138,26 +162,67 @@ public class GainfoOutsourceService : IGainfoOutsourceService
.Select(x => SqlFunc.IsNull(SqlFunc.AggregateMax(x.RaiseDateTime), default(DateTime?)))
.SingleAsync();
- if (raiseDateTime.HasValue && raiseDateTime.Value.AddDays(setting.NoRecordAutoResignOutsourceDays) < DateTime.Now)
+ if (raiseDateTime.HasValue)
{
- try
+ var checkDates = GetDaysUntilToday(raiseDateTime.Value);
+ var days = checkDates.Count;
+ foreach (var date in checkDates)
{
- await _gainfoService.ResignAsync(new GainfoResignRequest
+ //date.DayOfWeek
+ foreach (var holiday in holidaies)
{
- Id = outsource.Id,
- Reason = $"{setting.NoRecordAutoResignOutsourceDays}天无通行记录",
- Date = DateTime.Now
- });
+ var isPresent = date >= holiday.Period.Start && date <= holiday.Period.Start;
+ if (isPresent)
+ {
+ if (holiday.Type == HolidayEnumType.Rest)
+ {
+ days--;
+ }
+ }
+ else
+ {
+ if (weekends.Contains(date.DayOfWeek))
+ {
+ days--;
+ }
+ }
+ }
}
- catch (Exception e)
+ if (days >= setting.NoRecordAutoResignOutsourceDays)
{
- _logger.LogError(e, "自动离职外包异常:{msg}", e.Message);
+ try
+ {
+ await _gainfoService.ResignAsync(new GainfoResignRequest
+ {
+ Id = outsource.Id,
+ Reason = $"{setting.NoRecordAutoResignOutsourceDays}天无通行记录",
+ Date = DateTime.Now
+ });
+ }
+ catch (Exception e)
+ {
+ _logger.LogError(e, "自动离职外包异常:{msg}", e.Message);
+ }
}
}
}
}
}
+ public List GetDaysUntilToday(DateTime begin)
+ {
+ var start = DateOnly.FromDateTime(begin.Date);
+ var today = DateOnly.FromDateTime(DateTime.Today);
+ if (start > today) return new List();
+
+ var days = new List();
+ for (var d = start; d <= today; d = d.AddDays(1))
+ {
+ days.Add(d);
+ }
+
+ return days;
+ }
//********************************************************************** help methods ***********************************************************************************
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs
index 49897a1a..f1298c9b 100644
--- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs
@@ -345,7 +345,7 @@ public class GainfoUpdateService : IGainfoUpdateService
var content = $"{workGrid.Name}的网格长,你好,检测到你网格中 {gainfo.Name}({gainfo.Code}),因发生离职或者异动,现已经删除该员工{dates}的排班信息,请前往系统处理!";
- await _dingTalkApi.SendWorkMessageAsync(new DingTalkWorkMessageRequest
+ await _dingTalkApi.SendWorkMessageByWorkGridAsync(new DingTalkWorkMessageRequest
{
Content = content,
WorkCodes = new List { workGrid.LeaderUserCode }
@@ -409,7 +409,7 @@ public class GainfoUpdateService : IGainfoUpdateService
}).SingleAsync();
var content = $"{workGrid.Name}的网格长,你好,检测到你网格中 {gainfo.Name}({gainfo.Code}),因发生离职或者异动,现已经删除该员工{dates}的排班信息,请前往系统处理!";
- await _dingTalkApi.SendWorkMessageAsync(new DingTalkWorkMessageRequest
+ await _dingTalkApi.SendWorkMessageByWorkGridAsync(new DingTalkWorkMessageRequest
{
Content = content,
WorkCodes = new List { workGrid.LeaderUserCode }
diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/OutsourceWhiteListService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/OutsourceWhiteListService.cs
new file mode 100644
index 00000000..ced4fc9c
--- /dev/null
+++ b/Src/Dlhis.Basic/Organization/Services/Implements/OutsourceWhiteListService.cs
@@ -0,0 +1,56 @@
+
+using Dlhis.Basic.Organization.Dto;
+using Dlhis.Basic.Organization.Request;
+using Dlhis.Entity.Basic.Entity;
+using Dlhis.Entity.Basic.Enums;
+using Kurisu.AspNetCore.DataAccess.Dto;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
+using Kurisu.AspNetCore.Utils.Extensions;
+
+namespace Dlhis.Basic.Organization.Services.Implements;
+
+public class OutsourceWhiteListService : IOutsourceWhiteListService
+{
+ private readonly IDbContext _dbContext;
+
+ public OutsourceWhiteListService(IDbContext dbContext)
+ {
+ _dbContext = dbContext;
+ }
+
+ public async Task AddAsync(string userCode)
+ {
+ var gainfo = await _dbContext.Queryable().Where(x => x.Code == userCode).SingleAsync();
+ gainfo.ThrowIfNull("人员信息不存在");
+ (gainfo.Type == GainfoUserTypeEnumType.Outsource).ThrowIfFalse("人员类型不正确");
+ if (!await _dbContext.Queryable().Where(x => x.UserCode == userCode).AnyAsync())
+ {
+ await _dbContext.InsertAsync(new OutsourceWhiteListEntity
+ {
+ UserCode = userCode
+ });
+ }
+ }
+
+ public async Task RemoveAsync(string userCode)
+ {
+ var whitelist = await _dbContext.Queryable().Where(x => x.UserCode == userCode).SingleAsync();
+ if (whitelist != null)
+ {
+ await _dbContext.DeleteAsync(whitelist);
+ }
+ }
+
+ public async Task> GetPageAsync(OutsourceWhiteListPageRequest request)
+ {
+ return await _dbContext.Queryable()
+ .LeftJoin((x, ga) => x.UserCode == ga.Code)
+ .Select((x, ga) => new GainfoDto
+ {
+ Code = ga.Code,
+ Name = ga.Name,
+ })
+ .ToPageListAsync(request);
+ }
+}
diff --git a/Src/Dlhis.Basic/HikService.cs b/Src/Dlhis.Basic/ThirdParts/HikService.cs
similarity index 96%
rename from Src/Dlhis.Basic/HikService.cs
rename to Src/Dlhis.Basic/ThirdParts/HikService.cs
index 6a2762ca..f0e98c5f 100644
--- a/Src/Dlhis.Basic/HikService.cs
+++ b/Src/Dlhis.Basic/ThirdParts/HikService.cs
@@ -1,10 +1,9 @@
using System.Text;
using Dlhis.Basic.Organization.Request;
using Dlhis.Basic.Organization.Response;
-using HttpUtil;
using Kurisu.AspNetCore.Utils.Extensions;
-namespace Dlhis.Basic;
+namespace Dlhis.Basic.ThirdParts;
public class HikService : IHikService
{
diff --git a/Src/Dlhis.Basic/HttpUtillib.cs b/Src/Dlhis.Basic/ThirdParts/HttpUtillib.cs
similarity index 93%
rename from Src/Dlhis.Basic/HttpUtillib.cs
rename to Src/Dlhis.Basic/ThirdParts/HttpUtillib.cs
index c983ec7a..7b8ec24e 100644
--- a/Src/Dlhis.Basic/HttpUtillib.cs
+++ b/Src/Dlhis.Basic/ThirdParts/HttpUtillib.cs
@@ -4,7 +4,7 @@ using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
-namespace HttpUtil
+namespace Dlhis.Basic.ThirdParts
{
public class HttpUtillib
{
@@ -46,7 +46,7 @@ namespace HttpUtil
StringBuilder sb = new StringBuilder();
sb.Append(_isHttps ? "https://" : "http://").Append(_ip).Append(":").Append(_port.ToString()).Append(uri);
- HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sb.ToString());
+ HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sb.ToString());
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version11;
req.AllowAutoRedirect = false; // 不允许自动重定向
@@ -73,7 +73,7 @@ namespace HttpUtil
StreamReader sr = new StreamReader(rspStream);
string strStream = sr.ReadToEnd();
long streamLength = strStream.Length;
- byte[] response = System.Text.Encoding.UTF8.GetBytes(strStream);
+ byte[] response = Encoding.UTF8.GetBytes(strStream);
rsp.Close();
return response;
}
@@ -123,7 +123,7 @@ namespace HttpUtil
sb.Append(_isHttps ? "https://" : "http://").Append(_ip).Append(":").Append(_port.ToString()).Append(uri);
// 创建POST请求
- HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sb.ToString());
+ HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sb.ToString());
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version11;
req.AllowAutoRedirect = false; // 不允许自动重定向
@@ -173,7 +173,7 @@ namespace HttpUtil
StreamReader sr = new StreamReader(rspStream);
string strStream = sr.ReadToEnd();
long streamLength = strStream.Length;
- byte[] response = System.Text.Encoding.UTF8.GetBytes(strStream);
+ byte[] response = Encoding.UTF8.GetBytes(strStream);
rsp.Close();
return response;
}
@@ -241,11 +241,11 @@ namespace HttpUtil
}
// x-ca-timestamp
- string timestamp = ((DateTime.Now.Ticks - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 1000).ToString();
+ string timestamp = ((DateTime.Now.Ticks - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 1000).ToString();
header.Add("x-ca-timestamp", timestamp);
// x-ca-nonce
- string nonce = System.Guid.NewGuid().ToString();
+ string nonce = Guid.NewGuid().ToString();
header.Add("x-ca-nonce", nonce);
// x-ca-key
@@ -261,7 +261,7 @@ namespace HttpUtil
if (_isHttps)
{
// set remote certificate Validation auto pass
- ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(remoteCertificateValidate);
+ ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(remoteCertificateValidate);
// FIX:修复不同.Net版对一些SecurityProtocolType枚举支持情况不一致导致编译失败等问题,这里统一使用数值
//(SecurityProtocolType)48 |
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 | (SecurityProtocolType)768 | (SecurityProtocolType)192;
@@ -277,7 +277,7 @@ namespace HttpUtil
private static string computeContentMd5(string body)
{
MD5 md5 = new MD5CryptoServiceProvider();
- byte[] result = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(body));
+ byte[] result = md5.ComputeHash(Encoding.UTF8.GetBytes(body));
return Convert.ToBase64String(result);
}
@@ -302,7 +302,7 @@ namespace HttpUtil
/// HMAXH265计算结果字符串
private static string computeForHMACSHA256(string str, string secret)
{
- var encoder = new System.Text.UTF8Encoding();
+ var encoder = new UTF8Encoding();
byte[] secretBytes = encoder.GetBytes(secret);
byte[] strBytes = encoder.GetBytes(str);
var opertor = new HMACSHA256(secretBytes);
@@ -325,25 +325,25 @@ namespace HttpUtil
{
if (null != header["Accept"])
{
- sb.Append((string)header["Accept"]);
+ sb.Append(header["Accept"]);
sb.Append("\n");
}
if (header.Keys.Contains("Content-MD5") && null != header["Content-MD5"])
{
- sb.Append((string)header["Content-MD5"]);
+ sb.Append(header["Content-MD5"]);
sb.Append("\n");
}
if (null != header["Content-Type"])
{
- sb.Append((string)header["Content-Type"]);
+ sb.Append(header["Content-Type"]);
sb.Append("\n");
}
if (header.Keys.Contains("Date") && null != header["Date"])
{
- sb.Append((string)header["Date"]);
+ sb.Append(header["Date"]);
sb.Append("\n");
}
}
diff --git a/Src/Dlhis.Basic/IHikService.cs b/Src/Dlhis.Basic/ThirdParts/IHikService.cs
similarity index 82%
rename from Src/Dlhis.Basic/IHikService.cs
rename to Src/Dlhis.Basic/ThirdParts/IHikService.cs
index e8d3988b..a15e1f01 100644
--- a/Src/Dlhis.Basic/IHikService.cs
+++ b/Src/Dlhis.Basic/ThirdParts/IHikService.cs
@@ -1,6 +1,6 @@
using Dlhis.Basic.Organization.Request;
-namespace Dlhis.Basic;
+namespace Dlhis.Basic.ThirdParts;
public interface IHikService : IScopeDependency
{
diff --git a/Src/Dlhis.Basic/JinkoSapHttpClientPack.cs b/Src/Dlhis.Basic/Utils/JinkoSapHttpClientPack.cs
similarity index 100%
rename from Src/Dlhis.Basic/JinkoSapHttpClientPack.cs
rename to Src/Dlhis.Basic/Utils/JinkoSapHttpClientPack.cs
diff --git a/Src/Dlhis.Basic/ObfuscateProviderJsonConverter.cs b/Src/Dlhis.Basic/Utils/ObfuscateProviderJsonConverter.cs
similarity index 98%
rename from Src/Dlhis.Basic/ObfuscateProviderJsonConverter.cs
rename to Src/Dlhis.Basic/Utils/ObfuscateProviderJsonConverter.cs
index 9dc85e8d..f643bee0 100644
--- a/Src/Dlhis.Basic/ObfuscateProviderJsonConverter.cs
+++ b/Src/Dlhis.Basic/Utils/ObfuscateProviderJsonConverter.cs
@@ -5,7 +5,7 @@ using Kurisu.AspNetCore.Cache;
using Kurisu.AspNetCore.Utils.Converters;
using Newtonsoft.Json;
-namespace Dlhis.Basic;
+namespace Dlhis.Basic.Utils;
public class ObfuscateProviderJsonConverter : ObfuscateJsonConverter
{
diff --git a/Src/Dlhis.Basic/ParallelExtensions.cs b/Src/Dlhis.Basic/Utils/ParallelExtensions.cs
similarity index 92%
rename from Src/Dlhis.Basic/ParallelExtensions.cs
rename to Src/Dlhis.Basic/Utils/ParallelExtensions.cs
index f330fa41..fbd50e83 100644
--- a/Src/Dlhis.Basic/ParallelExtensions.cs
+++ b/Src/Dlhis.Basic/Utils/ParallelExtensions.cs
@@ -1,4 +1,4 @@
-namespace Dlhis.Basic;
+namespace Dlhis.Basic.Utils;
public static class ParallelExtensions
{
diff --git a/Src/Dlhis.Basic/RecursionHelper.cs b/Src/Dlhis.Basic/Utils/RecursionHelper.cs
similarity index 99%
rename from Src/Dlhis.Basic/RecursionHelper.cs
rename to Src/Dlhis.Basic/Utils/RecursionHelper.cs
index 2315f2d6..377039f5 100644
--- a/Src/Dlhis.Basic/RecursionHelper.cs
+++ b/Src/Dlhis.Basic/Utils/RecursionHelper.cs
@@ -3,7 +3,7 @@ using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Kurisu.AspNetCore.Utils.Extensions;
-namespace Dlhis.Basic;
+namespace Dlhis.Basic.Utils;
public static class RecursionHelper
{
diff --git a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs
index 776b3ef6..6d6b6d75 100644
--- a/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs
+++ b/Src/Dlhis.Basic/WorkGrids/Services/Implements/WorkGridScheduleService.cs
@@ -233,7 +233,7 @@ public class WorkGridScheduleService : IWorkGridScheduleService
{
try
{
- await _jinkoApiService.SendWorkMessageAsync(new DingTalkWorkMessageRequest
+ await _jinkoApiService.SendWorkMessageByWorkGridAsync(new DingTalkWorkMessageRequest
{
Content = $"{gainfo.Name}({gainfo.Code})你好,系统检测到你被{workGridName}网格的网格长{workGridLeaderName}({workGridLeaderCode})安排了{date.ToString("yyyy年MM月dd日")}{periodType.GetDescription()},请按时上班",
WorkCodes = new List { gainfo.Code }
@@ -333,7 +333,7 @@ public class WorkGridScheduleService : IWorkGridScheduleService
{
try
{
- await _jinkoApiService.SendWorkMessageAsync(new DingTalkWorkMessageRequest
+ await _jinkoApiService.SendWorkMessageByWorkGridAsync(new DingTalkWorkMessageRequest
{
Content = $"{gainfo.Name}({gainfo.Code})你好,系统检测到你被{workGrid.Name}网格的网格长{workGrid.LeaderUserName}({workGrid.LeaderUserCode})删除了{request.Date.ToString("yyyy年MM月dd日")}{request.PeriodType.GetDescription()},如有疑问,请联系网格长!",
WorkCodes = new List { gainfo.Code }