ソースを参照

境外用车 接口调整

Lyyyi 3 日 前
コミット
b1ca4242da

+ 45 - 1
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/AppNotice/Library.cs

@@ -126,7 +126,6 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
 
         #region 团组费用审核
         #region 团组费用审核
 
 
-
         /// <summary>
         /// <summary>
         /// 向指定群聊发送- 费用申请 -通知
         /// 向指定群聊发送- 费用申请 -通知
         /// </summary>
         /// </summary>
@@ -1669,6 +1668,51 @@ di.VisitPNumber);
             return true;
             return true;
         }
         }
 
 
+        #endregion
+
+        #region 团组流程节点任务通知、预警
+        /// <summary>
+        /// 团组流程节点任务通知
+        /// 接收者:审核节点相关人 
+        /// </summary>
+        /// <param name="groupName"></param>
+        /// <param name="msgs"></param>
+        /// <param name="qwUserIds"></param>
+        /// <returns></returns>
+        public static async Task<bool> SendUserMsg_GroupProcNode_Notif(string groupName,List<string> msgs, List<string> qwUserIds)
+        {
+            //消息体 或者 接收人 集合为空,则不发送
+            if (!msgs.Any() || !qwUserIds.Any())
+            {
+                return false;
+            }
+
+            var msgLabel = string.Join("\n", msgs);
+
+            string resMsg = string.Format(@" ` 团组任务通知 `  
+
+> ` {0} `: 
+
+{1}
+
+>通知时间:<font color='comment'>{2}</font> 
+
+[详细信息请前往OA系统查看](http://oa.pan-american-intl.com:4399/)   ",
+groupName,
+msgLabel,
+DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
+
+            ResponseBase result = await _qiYeWeChatApiService.GroupStatus_SendMessage_ToUser_Markdown(qwUserIds, resMsg);
+            if (result.errcode != 0)
+            {
+                //抄送日志 
+                return false;
+            }
+
+            return true;
+        }
+        
+
         #endregion
         #endregion
 
 
         #region Helper
         #region Helper

+ 46 - 5
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/GroupProcessNode.cs

@@ -1,6 +1,8 @@
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
+using OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Infrastructure.Repositories.Groups;
 using OASystem.Infrastructure.Repositories.Groups;
+using static OASystem.Infrastructure.Repositories.Groups.ProcessOverviewRepository;
 
 
 namespace OASystem.API.OAMethodLib.Quartz.Business
 namespace OASystem.API.OAMethodLib.Quartz.Business
 {
 {
@@ -11,22 +13,61 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
     {
     {
         private readonly static DelegationInfoRepository _grpDeleRep = AutofacIocManager.Instance.GetService<DelegationInfoRepository>();
         private readonly static DelegationInfoRepository _grpDeleRep = AutofacIocManager.Instance.GetService<DelegationInfoRepository>();
         private static readonly ProcessOverviewRepository _procOverviewRep = AutofacIocManager.Instance.GetService<ProcessOverviewRepository>();
         private static readonly ProcessOverviewRepository _procOverviewRep = AutofacIocManager.Instance.GetService<ProcessOverviewRepository>();
-        private static readonly IQiYeWeChatApiService _qiYeWeChatApiService = AutofacIocManager.Instance.GetService<IQiYeWeChatApiService>();
+        //private static readonly IQiYeWeChatApiService _qiYeWeChatApiService = AutofacIocManager.Instance.GetService<IQiYeWeChatApiService>();
 
 
         /// <summary>
         /// <summary>
         /// 企微通知
         /// 企微通知
         /// </summary>
         /// </summary>
-        public static async void QiYeWeChatNotifyAsync() 
+        public static async void QiYeWeChatNotifyAsync()
         {
         {
             var currDt = DateTime.Now;
             var currDt = DateTime.Now;
 
 
-            var groupInfos = await _grpDeleRep._sqlSugar.Queryable<Grp_DelegationInfo>()
-                .Where(x => x.IsDel == 0)
-                .ToListAsync();
+            // 默认通知人
+            var defaultNotifyUserIds = new HashSet<int>
+            {
+                5,   // 雷怡
+                208, // 杨俊霄
+                327  // 江姗
+            };
+            var defaultNotifyQiyeChatUserIds = await _grpDeleRep._sqlSugar.Queryable<Sys_Users>()
+               .Where(x => defaultNotifyUserIds.Contains(x.Id) && x.IsDel == 0)
+               .Select(x => x.QiyeChatUserId)
+               .ToListAsync();
+
+            var groupAllNodeInfos = await _procOverviewRep.GetGroupAllProcessNodeInfoAsync();
+            if (groupAllNodeInfos == null) return;
+
+            var notifyList = groupAllNodeInfos.FindAll(x => x.PromptTime?.Date == currDt.Date);
+            if (notifyList == null) return;
+
+            // 按照团组ID和流程枚举分组
+            var groupedByGroupIdAndProcType = notifyList.GroupBy(x => new { x.GroupId, x.ProcType })
+               .ToDictionary(
+                    group => group.Key,
+                    group => group.ToList()
+                );
+
+            // 提取获取提示人员企业微信用户ID的逻辑
+            Func<List<UserAndQiWeiUserIdView>, List<string>> getPromptPersonQiyeChatUserIds = promptPersons =>
+                promptPersons?.Select(x => x.QiyeChatUserId).ToList() ?? new List<string>();
 
 
+            // 按照团分组发送通知
+            foreach (var group in groupedByGroupIdAndProcType)
+            {
+                var info = group.Value.FirstOrDefault();
+                if (info == null) continue;
 
 
+                var msgs = info.ProcType == GroupProcessType.Invitation
+                   ? group.Value.Select(x => $"- {x.NodeName}开始了。").ToList()
+                    : new List<string> { $"- {info.NodeName}开始了。" };
 
 
+                var qiWeiChatUserIds = new List<string>();
+                qiWeiChatUserIds.AddRange(defaultNotifyQiyeChatUserIds);
+                qiWeiChatUserIds.AddRange(getPromptPersonQiyeChatUserIds(info.PromptPerson));
 
 
+                // 企微通知
+                await AppNoticeLibrary.SendUserMsg_GroupProcNode_Notif(info.GroupName, msgs, qiWeiChatUserIds);
+            }
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 38 - 0
OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/GroupProcessNodeJob.cs

@@ -0,0 +1,38 @@
+using OASystem.API.OAMethodLib.Quartz.Business;
+using Quartz;
+
+namespace OASystem.API.OAMethodLib.Quartz.Jobs
+{
+    /// <summary>
+    /// 团组流程节点
+    /// 每早9点触发
+    /// </summary>
+    public class GroupProcessNodeJob : IJob
+    {
+        private readonly ILogger<GroupProcessNodeJob> _logger;
+
+        public GroupProcessNodeJob(ILogger<GroupProcessNodeJob> logger)
+        {
+            _logger = logger;
+        }
+
+        public Task Execute(IJobExecutionContext context)
+        {
+            var jobName = context.JobDetail.Key.Name;
+            _logger.LogInformation($"开始执行任务 {jobName},时间:{DateTime.Now:yyyy - MM - dd HH:mm:ss}");
+
+            try
+            {
+                //在此处编写任务业务代码
+                GroupProcessNode.QiYeWeChatNotifyAsync();
+            }
+            catch (Exception ex)
+            {
+                _logger.LogInformation($"开始执行任务 {jobName},ErrorMsg:{ex.Message} " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+            }
+
+
+            return Task.CompletedTask;
+        }
+    }
+}

+ 36 - 14
OASystem/OASystem.Api/OAMethodLib/Quartz/QuartzFactory.cs

@@ -27,25 +27,28 @@ namespace QuzrtzJob.Factory
 
 
             //4、创建一个触发器
             //4、创建一个触发器
             var trigger = TriggerBuilder.Create()
             var trigger = TriggerBuilder.Create()
-                            //.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
-                            .WithCronSchedule("0 15 9 * * ?")
-                            .Build();
+                //.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
+                .WithCronSchedule("0 15 9 * * ?")
+                .Build();
 
 
             var taskTrigger = TriggerBuilder.Create()
             var taskTrigger = TriggerBuilder.Create()
-                            //.WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每六十秒执行一次
-                            .WithCronSchedule("0 0 9,18 * * ?") //每天早上九点和下午六点触发
-                            .Build();
+                //.WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每六十秒执行一次
+                .WithCronSchedule("0 0 9,18 * * ?") //每天早上九点和下午六点触发
+                .Build();
+
             var taskMsgTrigger = TriggerBuilder.Create()
             var taskMsgTrigger = TriggerBuilder.Create()
-                            //.WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每六十秒执行一次
-                            .WithCronSchedule("0 0 9,18 * * ?") //每天早上九点和下午六点触发
-                            .Build();
+                //.WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每六十秒执行一次
+                .WithCronSchedule("0 0 9,18 * * ?") //每天早上九点和下午六点触发
+                .Build();
+
             var teamCurrencyTrigger = TriggerBuilder.Create()
             var teamCurrencyTrigger = TriggerBuilder.Create()
-                            //.WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每六十秒执行一次
-                            .WithCronSchedule("0 0 0 * * ? ") //每天零点零分点触发
-                            .Build();
+                 //.WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每六十秒执行一次
+                 .WithCronSchedule("0 0 0 * * ? ") //每天零点零分点触发
+                 .Build();
+
             var performanceTrigger = TriggerBuilder.Create()
             var performanceTrigger = TriggerBuilder.Create()
-                            .WithCronSchedule("0 0 5 1 * ?") //每月1号5点执行
-                            .Build();
+                .WithCronSchedule("0 0 5 1 * ?") //每月1号5点执行
+                .Build();
 
 
             //5、创建任务
             //5、创建任务
             var jobDetail = JobBuilder.Create<ALiYunPostMessageJob>().WithIdentity("job1", "group").Build();
             var jobDetail = JobBuilder.Create<ALiYunPostMessageJob>().WithIdentity("job1", "group").Build();
@@ -61,8 +64,27 @@ namespace QuzrtzJob.Factory
             await _scheduler.ScheduleJob(teamCurrencyJobDetail, teamCurrencyTrigger);
             await _scheduler.ScheduleJob(teamCurrencyJobDetail, teamCurrencyTrigger);
             await _scheduler.ScheduleJob(performanceJobDetail, performanceTrigger);
             await _scheduler.ScheduleJob(performanceJobDetail, performanceTrigger);
 
 
+            //每天早上九点触发
+            //await CreateAndScheduleJob<GroupProcessNodeJob>("job5", "group", CreateTrigger("0 0 9 * * ?"));
+            await CreateAndScheduleJob<GroupProcessNodeJob>("job6", "group", CreateTrigger("30 43 11 * * ?"));
+
 
 
             return await Task.FromResult("将触发器和任务器绑定到调度器中完成");
             return await Task.FromResult("将触发器和任务器绑定到调度器中完成");
         }
         }
+
+        private async Task CreateAndScheduleJob<T>(string jobName, string groupName, ITrigger trigger) where T : IJob
+        {
+            var jobDetail = JobBuilder.Create<T>()
+              .WithIdentity(jobName, groupName)
+              .Build();
+            await _scheduler.ScheduleJob(jobDetail, trigger);
+        }
+
+        private ITrigger CreateTrigger(string cronExpression)
+        {
+            return TriggerBuilder.Create()
+              .WithCronSchedule(cronExpression)
+              .Build();
+        }
     }
     }
 }
 }

+ 1 - 1
OASystem/OASystem.Infrastructure/Repositories/Groups/ProcessOverviewRepository.cs

@@ -798,7 +798,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// <param name="groupId"></param>
         /// <param name="groupId"></param>
         /// <param name="currUserId"></param>
         /// <param name="currUserId"></param>
         /// <returns></returns>
         /// <returns></returns>
-        public async Task<List<GroupProcFullNodeDetails>> GroupProcFulllNodeTimeInitAsync()
+        public async Task<List<GroupProcFullNodeDetails>> GetGroupAllProcessNodeInfoAsync()
         {
         {
             var processs = new List<GroupProcFullNodeDetails>();
             var processs = new List<GroupProcFullNodeDetails>();
 
 

+ 16 - 14
OASystem/OASystem.Infrastructure/Repositories/Resource/OverseaVehicleRepository.cs

@@ -241,27 +241,29 @@ namespace OASystem.Infrastructure.Repositories.Resource
                     _sqlSugar.RollbackTran();
                     _sqlSugar.RollbackTran();
                     return new JsonView(false, $"车信息,操作失败!");
                     return new JsonView(false, $"车信息,操作失败!");
                 }
                 }
+
+                await _sqlSugar.Deleteable<Res_OverseaVehicleTypePrice>()
+                     .Where(x => x.OvId == info.Id)
+                     .ExecuteCommandAsync();
+
+
                 foreach (var subInfo in subInfos)
                 foreach (var subInfo in subInfos)
                 {
                 {
+                    subInfo.OvId = info.Id;
                     subInfo.LastUpdateUserId = dto.CurrUserId;
                     subInfo.LastUpdateUserId = dto.CurrUserId;
                     subInfo.LastUpdateTime = DateTime.Now;
                     subInfo.LastUpdateTime = DateTime.Now;
-                }
-                var subCount = await _sqlSugar.Updateable(subInfos)
-                    .UpdateColumns(it => new
+                    if (subInfo.Id == 0)
                     {
                     {
-                        it.CarTypeName,
-                        it.ServiceType,
-                        it.Price,
-                        it.LastUpdateUserId,
-                        it.LastUpdateTime,
-                        it.Remark
-                    })
-                    .WhereColumns (it => new { it.Id })
-                    .ExecuteCommandAsync();
-                if (subCount < 1)
+                        subInfo.CreateUserId = dto.CurrUserId;
+                        subInfo.CreateTime = DateTime.Now;
+                    }
+                }
+
+                var insert = await _sqlSugar.Insertable(subInfos).ExecuteCommandAsync();
+                if (insert < 1)
                 {
                 {
                     _sqlSugar.RollbackTran();
                     _sqlSugar.RollbackTran();
-                    return new JsonView(false, $"车型信息,操作失败!");
+                    return new JsonView(false, $"车型信息,部分新增,操作失败!");
                 }
                 }
             }
             }
             catch (Exception ex)
             catch (Exception ex)