Forráskód Böngészése

团组流程节点提示时间动态读取固定日期调整及节点名称更改

Lyyyi 1 hete%!(EXTRA string=óta)
szülő
commit
5db9012468

+ 12 - 33
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -1,20 +1,13 @@
 using Aspose.Cells;
 using Aspose.Cells;
-using Aspose.Cells.Drawing;
 using Aspose.Words;
 using Aspose.Words;
 using Aspose.Words.Drawing;
 using Aspose.Words.Drawing;
 using Aspose.Words.Tables;
 using Aspose.Words.Tables;
 using DiffMatchPatch;
 using DiffMatchPatch;
 using Dm.util;
 using Dm.util;
-using Humanizer;
 using iTextSharp.text.pdf;
 using iTextSharp.text.pdf;
-using k8s.KubeConfigModels;
-using Microsoft.AspNetCore.Routing.Template;
 using Microsoft.AspNetCore.SignalR;
 using Microsoft.AspNetCore.SignalR;
-using NPOI.POIFS.NIO;
-using NPOI.SS.Formula.Functions;
 using NPOI.SS.UserModel;
 using NPOI.SS.UserModel;
 using NPOI.SS.Util;
 using NPOI.SS.Util;
-using NPOI.Util;
 using NPOI.XSSF.UserModel;
 using NPOI.XSSF.UserModel;
 using OASystem.API.Middlewares;
 using OASystem.API.Middlewares;
 using OASystem.API.OAMethodLib;
 using OASystem.API.OAMethodLib;
@@ -33,45 +26,29 @@ using OASystem.Domain.Dtos.CRM;
 using OASystem.Domain.Dtos.FileDto;
 using OASystem.Domain.Dtos.FileDto;
 using OASystem.Domain.Dtos.Financial;
 using OASystem.Domain.Dtos.Financial;
 using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Dtos.Groups;
-using OASystem.Domain.Dtos.PersonnelModule;
-using OASystem.Domain.Dtos.System;
 using OASystem.Domain.Entities.Customer;
 using OASystem.Domain.Entities.Customer;
 using OASystem.Domain.Entities.Financial;
 using OASystem.Domain.Entities.Financial;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.Groups;
-using OASystem.Domain.ViewModels.CRM;
 using OASystem.Domain.ViewModels.Financial;
 using OASystem.Domain.ViewModels.Financial;
 using OASystem.Domain.ViewModels.Groups;
 using OASystem.Domain.ViewModels.Groups;
-using OASystem.Domain.ViewModels.JuHeExchangeRate;
 using OASystem.Domain.ViewModels.OCR;
 using OASystem.Domain.ViewModels.OCR;
-using OASystem.Domain.ViewModels.SmallFun;
 using OASystem.Infrastructure.Logging;
 using OASystem.Infrastructure.Logging;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.Financial;
 using OASystem.Infrastructure.Repositories.Financial;
 using OASystem.Infrastructure.Repositories.Groups;
 using OASystem.Infrastructure.Repositories.Groups;
-using OASystem.Infrastructure.Tools;
-using OASystem.RedisRepository;
-using Quartz.Logging;
 using Quartz.Util;
 using Quartz.Util;
-using SQLitePCL;
-using SqlSugar;
 using SqlSugar.Extensions;
 using SqlSugar.Extensions;
 using System.Collections;
 using System.Collections;
 using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations;
 using System.Data;
 using System.Data;
 using System.Diagnostics;
 using System.Diagnostics;
 using System.Globalization;
 using System.Globalization;
-using System.IO;
 using System.IO.Compression;
 using System.IO.Compression;
 using System.Linq.Expressions;
 using System.Linq.Expressions;
-using System.Security.Cryptography.Xml;
 using System.Text.Json;
 using System.Text.Json;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
 using System.Web;
 using System.Web;
-using YamlDotNet.Core;
 using static OASystem.API.OAMethodLib.JWTHelper;
 using static OASystem.API.OAMethodLib.JWTHelper;
 using static OASystem.Infrastructure.Repositories.Groups.AirTicketResRepository;
 using static OASystem.Infrastructure.Repositories.Groups.AirTicketResRepository;
-using static OpenAI.GPT3.ObjectModels.SharedModels.IOpenAiModels;
 using Bookmark = Aspose.Words.Bookmark;
 using Bookmark = Aspose.Words.Bookmark;
 using Cell = Aspose.Words.Tables.Cell;
 using Cell = Aspose.Words.Tables.Cell;
 using Table = Aspose.Words.Tables.Table;
 using Table = Aspose.Words.Tables.Table;
@@ -4082,12 +4059,13 @@ FROM
 
 
             _sqlSugar.BeginTran();
             _sqlSugar.BeginTran();
 
 
-            var infos = await _sqlSugar.Queryable<Crm_DeleClient>().Where(x => x.IsDel == 0).Select(x => new { x.Id,x.FirstName,x.LastName,x.Phone }).ToListAsync();
+            var infos = await _sqlSugar.Queryable<Crm_DeleClient>().Where(x => x.IsDel == 0).Select(x => new { x.Id, x.FirstName, x.LastName, x.Phone }).ToListAsync();
 
 
             var infoDecrypts = new List<dynamic>();
             var infoDecrypts = new List<dynamic>();
             foreach (var item in infos)
             foreach (var item in infos)
             {
             {
-                infoDecrypts.Add(new { 
+                infoDecrypts.Add(new
+                {
                     Id = item.Id,
                     Id = item.Id,
                     FirstName = AesEncryptionHelper.Decrypt(item.FirstName),
                     FirstName = AesEncryptionHelper.Decrypt(item.FirstName),
                     LastName = AesEncryptionHelper.Decrypt(item.LastName),
                     LastName = AesEncryptionHelper.Decrypt(item.LastName),
@@ -4095,9 +4073,9 @@ FROM
                 });
                 });
             }
             }
 
 
-            var infoVaild = infoDecrypts.Where(x => 
-                info.FirstName.Equals(x.x.FirstName) && 
-                info.LastName.Equals(x.x.LastName) && 
+            var infoVaild = infoDecrypts.Where(x =>
+                info.FirstName.Equals(x.x.FirstName) &&
+                info.LastName.Equals(x.x.LastName) &&
                 info.Phone.Equals(x.x.Phone))
                 info.Phone.Equals(x.x.Phone))
                 .FirstOrDefault();
                 .FirstOrDefault();
 
 
@@ -4121,10 +4099,10 @@ FROM
                 EncryptionProcessor.EncryptProperties(info);
                 EncryptionProcessor.EncryptProperties(info);
 
 
                 var insertId = await _sqlSugar.Insertable(info).ExecuteReturnIdentityAsync();
                 var insertId = await _sqlSugar.Insertable(info).ExecuteReturnIdentityAsync();
-                if (insertId <  1)
+                if (insertId < 1)
                 {
                 {
                     _sqlSugar.RollbackTran();
                     _sqlSugar.RollbackTran();
-                    return Ok(JsonView(false,"信息添加失败!"));
+                    return Ok(JsonView(false, "信息添加失败!"));
                 }
                 }
 
 
                 if (familys.Any())
                 if (familys.Any())
@@ -4170,7 +4148,8 @@ FROM
                 }
                 }
             }
             }
             //修改
             //修改
-            else {
+            else
+            {
                 int id = infoVaild?.Id ?? 0;
                 int id = infoVaild?.Id ?? 0;
                 var updInfo = await _sqlSugar.Queryable<Crm_DeleClient>().FirstAsync(x => x.Id == id);
                 var updInfo = await _sqlSugar.Queryable<Crm_DeleClient>().FirstAsync(x => x.Id == id);
 
 
@@ -4194,7 +4173,7 @@ FROM
 
 
                 EncryptionProcessor.EncryptProperties(updInfo);
                 EncryptionProcessor.EncryptProperties(updInfo);
 
 
-                var upd = await _sqlSugar.Updateable(updInfo).ExecuteCommandAsync(); 
+                var upd = await _sqlSugar.Updateable(updInfo).ExecuteCommandAsync();
                 if (upd < 1)
                 if (upd < 1)
                 {
                 {
                     _sqlSugar.RollbackTran();
                     _sqlSugar.RollbackTran();
@@ -6510,7 +6489,7 @@ FROM
         {
         {
             var data = await _groupRepository.GetCrmByGroupId(dto);
             var data = await _groupRepository.GetCrmByGroupId(dto);
 
 
-            return Ok(JsonView(data.Code == 0 , data.Code != 0 ? "暂无信息" : "操作成功", data.Data));
+            return Ok(JsonView(data.Code == 0, data.Code != 0 ? "暂无信息" : "操作成功", data.Data));
         }
         }
 
 
 
 

+ 120 - 6
OASystem/OASystem.Api/Controllers/SearchController.cs

@@ -11,6 +11,7 @@ using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.ViewModels.Search;
 using OASystem.Domain.ViewModels.Search;
 using OASystem.Infrastructure.Repositories.System;
 using OASystem.Infrastructure.Repositories.System;
 using static iTextSharp.text.pdf.AcroFields;
 using static iTextSharp.text.pdf.AcroFields;
+using OASystem.Infrastructure.Repositories.CRM;
 
 
 namespace OASystem.API.Controllers
 namespace OASystem.API.Controllers
 {
 {
@@ -24,15 +25,19 @@ namespace OASystem.API.Controllers
         private readonly SqlSugarClient _sqlSugar;
         private readonly SqlSugarClient _sqlSugar;
         private readonly DynamicSearchService<Grp_DelegationInfo> _groupSearchService;
         private readonly DynamicSearchService<Grp_DelegationInfo> _groupSearchService;
         private readonly DynamicSearchService<NewClientDataView> _clientSearchService;
         private readonly DynamicSearchService<NewClientDataView> _clientSearchService;
+
+        private readonly NewClientDataRepository _clientDataRepository;
         public SearchController(
         public SearchController(
             SqlSugarClient sqlSugar,
             SqlSugarClient sqlSugar,
            DynamicSearchService<Grp_DelegationInfo> groupSearchService,
            DynamicSearchService<Grp_DelegationInfo> groupSearchService,
-           DynamicSearchService<NewClientDataView> clientSearchService
+           DynamicSearchService<NewClientDataView> clientSearchService,
+           NewClientDataRepository clientDataRepository
            )
            )
         {
         {
             _sqlSugar = sqlSugar;
             _sqlSugar = sqlSugar;
             _groupSearchService = groupSearchService;
             _groupSearchService = groupSearchService;
             _clientSearchService = clientSearchService;
             _clientSearchService = clientSearchService;
+            _clientDataRepository = clientDataRepository;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -108,7 +113,7 @@ namespace OASystem.API.Controllers
         /// <returns></returns>
         /// <returns></returns>
         [HttpGet("group/{userId}/{keyword}")]
         [HttpGet("group/{userId}/{keyword}")]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> ClientKeywordSearch(int userId,string keyword)
+        public async Task<IActionResult> ClientKeywordSearch(int userId, string keyword)
         {
         {
             try
             try
             {
             {
@@ -132,7 +137,115 @@ namespace OASystem.API.Controllers
                 var data = _sqlSugar.Queryable<Crm_NewClientData>()
                 var data = _sqlSugar.Queryable<Crm_NewClientData>()
                     .Where(x => x.IsDel == 0 && clientIds.Contains(x.Id))
                     .Where(x => x.IsDel == 0 && clientIds.Contains(x.Id))
                     .OrderByDescending(x => x.CreateTime)
                     .OrderByDescending(x => x.CreateTime)
-                    .Select(x => new NewClientDataView (){
+                    .Select(x => new NewClientDataView()
+                    {
+                        Id = x.Id,
+                        Client = x.Client,
+                        Contact = x.Contact,
+                        Job = x.Job,
+                        Telephone = x.Telephone,
+                        Location = x.Location,
+                    })
+                    .ToList();
+                int index = 0;
+                data.ForEach(x =>
+                {
+                    index++;
+                    x.RowNumber = index;
+                    x.Client = AesEncryptionHelper.Decrypt(x.Client);
+                    x.Contact = AesEncryptionHelper.Decrypt(x.Contact);
+                    x.Job = AesEncryptionHelper.Decrypt(x.Job);
+                    x.Telephone = AesEncryptionHelper.Decrypt(x.Telephone);
+                    x.Location = AesEncryptionHelper.Decrypt(x.Location);
+                });
+
+
+                var searchRequest = new DynamicSearchRequest
+                {
+                    Keyword = keyword,
+                    RequireAllSingleChars = true,
+                    PageIndex = 1,
+                    PageSize = 999999,
+                    FieldWeights = new Dictionary<string, int>
+                    {
+                        { "Client", 10 },
+                        { "Contact", 8 },
+                        { "Location", 6 }
+                    },
+                    OrderBy = "CreateTime"
+                };
+
+                // 验证字段配置
+                var validation = _clientSearchService.ValidateFieldConfig(
+                    searchRequest.FieldWeights,
+                    searchRequest.ReturnFields);
+
+                if (!validation.IsValid)
+                {
+                    return Ok(JsonView(true, $"暂无数据!{validation.Message}"));
+                }
+
+                var result = _clientSearchService.SearchDataSource(searchRequest, data);
+
+                if (result.Success)
+                {
+                    var view = result.Items.Select(x => x.Data).ToList();
+
+                    int resetIndex = 0;
+                    view.ForEach(x =>
+                    {
+                        resetIndex++;
+                        x.RowNumber = resetIndex;
+                    });
+
+                    return Ok(JsonView(true, result.Message, view, view.Count));
+                }
+
+                return Ok(JsonView(true, "暂无数据"));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(true, $"搜索服务暂时不可用!"));
+            }
+
+        }
+
+
+        /// <summary>
+        /// 客户资料
+        /// </summary>
+        /// <param name="userId">关键字</param>
+        /// <param name="keyword">关键字</param>
+        /// <returns></returns>
+        [HttpGet("ClientKeywordSearch/{userId}/{keyword}")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> ClientKeywordSearchAll(int userId, string keyword)
+        {
+            try
+            {
+                // 验证请求参数
+                if (string.IsNullOrEmpty(keyword))
+                {
+                    return Ok(JsonView(true, $"暂无数据!"));
+                }
+
+                var userIds = _clientDataRepository.GetNewExistClient(userId).Select(x => x.Id).ToList();
+                //查询有权限的数据(包括负责用户)
+                var clientIds = await _sqlSugar
+                    .Queryable<Crm_ClientDataAndUser>()
+                    .Where(x => x.IsDel == 0 && userIds.Contains(x.usersId))
+                    .Select(x => x.NewClientDataId)
+                    .ToListAsync();
+                if (clientIds == null || clientIds.Count < 1)
+                {
+                    return Ok(JsonView(true, $"暂无数据!"));
+                }
+
+                var data = _sqlSugar.Queryable<Crm_NewClientData>()
+                    .Where(x => x.IsDel == 0 && clientIds.Contains(x.Id))
+                    .OrderByDescending(x => x.CreateTime)
+                    .Select(x => new NewClientDataView()
+                    {
                         Id = x.Id,
                         Id = x.Id,
                         Client = x.Client,
                         Client = x.Client,
                         Contact = x.Contact,
                         Contact = x.Contact,
@@ -179,14 +292,15 @@ namespace OASystem.API.Controllers
                     return Ok(JsonView(true, $"暂无数据!{validation.Message}"));
                     return Ok(JsonView(true, $"暂无数据!{validation.Message}"));
                 }
                 }
 
 
-                var result = _clientSearchService.SearchDataSource(searchRequest,data);
+                var result = _clientSearchService.SearchDataSource(searchRequest, data);
 
 
                 if (result.Success)
                 if (result.Success)
                 {
                 {
                     var view = result.Items.Select(x => x.Data).ToList();
                     var view = result.Items.Select(x => x.Data).ToList();
 
 
                     int resetIndex = 0;
                     int resetIndex = 0;
-                    view.ForEach(x => {
+                    view.ForEach(x =>
+                    {
                         resetIndex++;
                         resetIndex++;
                         x.RowNumber = resetIndex;
                         x.RowNumber = resetIndex;
                     });
                     });
@@ -194,7 +308,7 @@ namespace OASystem.API.Controllers
                     return Ok(JsonView(true, result.Message, view, view.Count));
                     return Ok(JsonView(true, result.Message, view, view.Count));
                 }
                 }
 
 
-                return Ok(JsonView(true,"暂无数据"));
+                return Ok(JsonView(true, "暂无数据"));
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {

+ 79 - 47
OASystem/OASystem.Infrastructure/Repositories/Groups/ProcessOverviewRepository.cs

@@ -99,25 +99,12 @@ namespace OASystem.Infrastructure.Repositories.Groups
             processs.Add(
             processs.Add(
                 Grp_ProcessOverview.Create(groupId, 1, GroupProcessType.Invitation, ProcessStatus.InProgress, currUserId,
                 Grp_ProcessOverview.Create(groupId, 1, GroupProcessType.Invitation, ProcessStatus.InProgress, currUserId,
                 new List<Grp_ProcessNode>()
                 new List<Grp_ProcessNode>()
-                    //{
-                    //    Grp_ProcessNode.Create(1, "报批基础资料准备",oaNode1Tips,ProcessStatus.InProgress, true,false,false,false,currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(2, "报批邀请函资料准备",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(2, "具体名单下放",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(3, "获得批件",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(3, "提交客户所需报件材料完毕",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(4, "对接公务",oaNode4Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(5, "参与翻译对接",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(5, "参与公务翻译人员落实",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(6, "商邀文案配合",oaNode6Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(7, "票据上传(相关票据)",oaNode7Tips,ProcessStatus.InProgress, false,false,true,false, currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(7, "公务邀请数据有效录入",oaNode7Tips,ProcessStatus.InProgress, false,false,true,false, currUserId,oaNodeOpUsers),
-                    //}
                     {
                     {
-                        Grp_ProcessNode.Create(1, "报批基础资料准备",oaNode1Tips,ProcessStatus.InProgress, true,false,false,false,currUserId,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(2, "具体名单下放",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(3, "提交客户所需报件材料完毕",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(4, "对接公务",oaNode4Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(5, "参与公务翻译人员落实",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(1, "初期报批文字材料",oaNode1Tips,ProcessStatus.InProgress, true,false,false,false,currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(2, "第一轮对接",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(3, "第二轮对接",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(4, "取得邀请函",oaNode4Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(5, "公务等事项确认",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
                         Grp_ProcessNode.Create(6, "公务邀请数据有效录入",oaNode6Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
                         Grp_ProcessNode.Create(6, "公务邀请数据有效录入",oaNode6Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
                         Grp_ProcessNode.Create(7, "文件上传",oaNode7Tips,ProcessStatus.InProgress, false,false,true,false, currUserId,oaNodeOpUsers),
                         Grp_ProcessNode.Create(7, "文件上传",oaNode7Tips,ProcessStatus.InProgress, false,false,true,false, currUserId,oaNodeOpUsers),
                     }
                     }
@@ -484,6 +471,43 @@ namespace OASystem.Infrastructure.Repositories.Groups
             return new Result { Code = 200, Data = processes, Msg = "查询成功!" };
             return new Result { Code = 200, Data = processes, Msg = "查询成功!" };
         }
         }
 
 
+        /// <summary>
+        /// 指定日期增加工作日
+        /// </summary>
+        /// <param name="startDate"></param>
+        /// <param name="days"></param>
+        /// <returns></returns>
+        private static DateTime AddWeekdays(DateTime startDate, int days)
+        {
+            DateTime currentDate = startDate;
+            if (days >= 0)
+            {
+                while (days > 0)
+                {
+                    currentDate = currentDate.AddDays(1);
+                    DayOfWeek day = currentDate.DayOfWeek;
+                    if (day != DayOfWeek.Saturday && day != DayOfWeek.Sunday)
+                    {
+                        days--;
+                    }
+                }
+            }
+            else
+            {
+                days = Math.Abs(days);
+                while (days > 0)
+                {
+                    currentDate = currentDate.AddDays(-1);
+                    DayOfWeek day = currentDate.DayOfWeek;
+                    if (day != DayOfWeek.Saturday && day != DayOfWeek.Sunday)
+                    {
+                        days--;
+                    }
+                }
+            }
+            return currentDate;
+        }
+
         /// <summary>
         /// <summary>
         /// 节点提示消息
         /// 节点提示消息
         /// </summary>
         /// </summary>
@@ -495,44 +519,52 @@ namespace OASystem.Infrastructure.Repositories.Groups
         {
         {
             string msg = string.Empty;
             string msg = string.Empty;
             int groupId = groupInfo.Id;
             int groupId = groupInfo.Id;
+            groupInfo.VisitDate = groupInfo.VisitDate.AddDays(1); //第二天开始计算
             switch (procType)
             switch (procType)
             {
             {
                 case GroupProcessType.Invitation:
                 case GroupProcessType.Invitation:
                     switch (nodeOrder)
                     switch (nodeOrder)
                     {
                     {
                         case 1:
                         case 1:
-                            msg = "更新报批行程和请示,提供其他报批所需材料,4个工作日内完成。";
+                            msg = "“完成基础请示、报批日程初稿”,4个工作日(仍需根据客户意见和联系情况及时修改补充所需其他材料,例如印证文件、成果表等,直至终稿)";
+
+                            if (groupInfo.Step == 1 || groupInfo.Step == 2)
+                            {
+                                if (groupInfo.StepOperationTime.HasValue)
+                                {
+                                    msg = $"请于{AddWeekdays(groupInfo.StepOperationTime.Value, 4):yyyy年MM月dd日}内完成该项工作(“完成基础请示、报批日程初稿”,4个工作日(仍需根据客户意见和联系情况及时修改补充所需其他材料,例如印证文件、成果表等,直至终稿))";
+                                }
+                            }
+
                             break;
                             break;
                         case 2:
                         case 2:
+                            msg = $"请于{AddWeekdays(groupInfo.VisitDate, 7):yyyy年MM月dd日}内完成该项工作(7个工作日,所有报批机构前部联系,邀请机构一个国家不少于4家进行重点对接(4家机构中,其中3家机构需有效对接,其中1家可为付费机构备选))";
+                            break;
+                        case 3:
+                            msg = "10个工作日,根据最新情况,联系公务机构1/3取得回应;邀请机构基本明确。";
+                            break;
+                        case 4:
                             var custInfo = _sqlSugar.Queryable<Grp_TourClientList>()
                             var custInfo = _sqlSugar.Queryable<Grp_TourClientList>()
                                 .Where(c => c.DiId == groupId && c.IsDel == 0)
                                 .Where(c => c.DiId == groupId && c.IsDel == 0)
                                 .OrderByDescending(c => c.CreateTime)
                                 .OrderByDescending(c => c.CreateTime)
                                 .First();
                                 .First();
-                            //msg = "客户提供完整名单后,2周内取得邀请函(翻译件)。";
-                            //if (custInfo != null)
-                            //{
-                            //    msg = $"请于{custInfo.CreateTime.AddDays(14):yyyy年MM月dd日}内完成该项工作(客户提供完整名单后,2周内取得邀请函(翻译件))";
-                            //}
-                            msg = "下放后两周取得邀请函";
+
+                            msg = $"正式名单下放后2周内(含非工作日)。如团组前期准备时间已经较长,则按客户要求尽快提供。 加急团组备注特殊情况。";
+
                             if (custInfo != null)
                             if (custInfo != null)
                             {
                             {
-                                msg = $"请于{custInfo.CreateTime.AddDays(14):yyyy年MM月dd日}内完成该项工作(下放后两周取得邀请函)";
+                                msg = $"请于{custInfo.CreateTime.AddDays(14):yyyy年MM月dd日}内完成该项工作(正式名单下放后2周内(含非工作日)。如团组前期准备时间已经较长,则按客户要求尽快提供。 加急团组备注特殊情况。)";
                             }
                             }
-
-                            break;
-                        case 3:
-                            msg = "提供完整的报批全套资源。";
-                            break;
-                        case 4:
-                            msg = $"请于{groupInfo.VisitDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(按进度实际公务活动落实情况,出发前5日落实公务)";
                             break;
                             break;
                         case 5:
                         case 5:
+                            groupInfo.VisitDate = groupInfo.VisitDate.AddDays(-1); //时间倒推,调整回原始出发日期
+                            msg = $"请于{AddWeekdays(groupInfo.VisitDate,-5):yyyy年MM月dd日}内完成该项工作(团组出发前,5个工作日完成所有公务确认工作。";
+
                             break;
                             break;
                         case 6:
                         case 6:
                             break;
                             break;
                         case 7:
                         case 7:
-                            //msg = $"请于{groupInfo.VisitEndDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(团组结束前完成)";
-                            msg = $"请于{groupInfo.VisitEndDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(如果需要上传请在团组结束前完成)";
+                            msg = $"请于{groupInfo.VisitEndDate:yyyy年MM月dd日}内完成该项工作(如果需要上传请在团组结束前完成)";
                             break;
                             break;
                     }
                     }
                     break;
                     break;
@@ -567,15 +599,15 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         case 4:
                         case 4:
                             break;
                             break;
                         case 5:
                         case 5:
-                            msg = $"请于{groupInfo.VisitDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(团组出发前5日)";
+                            msg = $"请于{AddWeekdays(groupInfo.VisitDate,2):yyyy年MM月dd日}内完成该项工作(团组出发前2个工作日)";
                             break;
                             break;
                         case 6:
                         case 6:
                             break;
                             break;
                         case 7:
                         case 7:
-                            msg = $"请于{groupInfo.VisitEndDate.AddDays(5):yyyy年MM月dd日}内完成该项工作(机票蓝联打票及上传机票超支费用账单,团组归国后5个工作日内)";
+                            msg = $"请于{AddWeekdays(groupInfo.VisitEndDate,5):yyyy年MM月dd日}内完成该项工作(机票蓝联打票及上传机票超支费用账单,团组归国后5个工作日内)";
                             break;
                             break;
                         case 8:
                         case 8:
-                            msg = $"1. 票据上传(机票报销蓝联、行程单及机票说明) \r\n 2. 请于{groupInfo.VisitEndDate.AddDays(10):yyyy年MM月dd日}内完成该项工作(团组归国后10个工作日内) *按机票报价*0.999折扣出具机票报销蓝联、行程单及机票说明";
+                            msg = $"1. 票据上传(机票报销蓝联、行程单及机票说明) \r\n 2. 请于{AddWeekdays(groupInfo.VisitEndDate,10):yyyy年MM月dd日}内完成该项工作(团组归国后10个工作日内) *按机票报价*0.999折扣出具机票报销蓝联、行程单及机票说明";
                             break;
                             break;
                     }
                     }
                     break;
                     break;
@@ -588,7 +620,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             {
                             {
                                 if (groupInfo.StepOperationTime.HasValue)
                                 if (groupInfo.StepOperationTime.HasValue)
                                 {
                                 {
-                                    msg = $"请于{groupInfo.StepOperationTime.Value.AddDays(2):yyyy年MM月dd日}内完成该项工作(建团后打勾确认出团的时候开始2个工作日)";
+                                    msg = $"请于{AddWeekdays(groupInfo.StepOperationTime.Value, 2):yyyy年MM月dd日}内完成该项工作(建团后打勾确认出团的时候开始2个工作日)";
                                 }
                                 }
                             }
                             }
                             break;
                             break;
@@ -597,10 +629,10 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         case 3:
                         case 3:
                             break;
                             break;
                         case 4:
                         case 4:
-                            msg = $"1.行前再次确认酒店订单、付款状态及入住安排 \r\n 2.请于{groupInfo.VisitDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(团组出发前5天)";
+                            msg = $"1.行前再次确认酒店订单、付款状态及入住安排 \r\n 2.请于{AddWeekdays(groupInfo.VisitDate,-2):yyyy年MM月dd日}内完成该项工作(团组出发前2个工作日)";
                             break;
                             break;
                         case 5:
                         case 5:
-                            msg = $"1.行程结束后整理酒店发票(含超支费用发票)与结算 \r\n 2.请于{groupInfo.VisitEndDate.AddDays(5):yyyy年MM月dd日}内完成该项工作(团组结束后5天内)";
+                            msg = $"1.行程结束后整理酒店发票(含超支费用发票)与结算 \r\n 2.请于{AddWeekdays(groupInfo.VisitEndDate,5):yyyy年MM月dd日}内完成该项工作(团组结束后5个工作日内)";
                             break;
                             break;
                     }
                     }
                     break;
                     break;
@@ -615,17 +647,17 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             msg = $"机票行程代码最后一段录入后1个工作日内。";
                             msg = $"机票行程代码最后一段录入后1个工作日内。";
                             if (airTripCodeInfo != null)
                             if (airTripCodeInfo != null)
                             {
                             {
-                                msg = $"请于{airTripCodeInfo.CreateTime.AddDays(1):yyyy年MM月dd日}内完成该项工作(机票行程代码最后一段录入后1个工作日内)";
+                                msg = $"请于{AddWeekdays(airTripCodeInfo.CreateTime, 1):yyyy年MM月dd日}内完成该项工作(机票行程代码最后一段录入后1个工作日内)";
                             }
                             }
                             break;
                             break;
                         case 2:
                         case 2:
-                            msg = $"1.联系并询价地接、餐厅、用车、景点等供应商 \r\n 2. 请于{groupInfo.CreateTime.AddDays(7):yyyy年MM月dd日}内完成该项工作(建团完成后7个工作日内)";
+                            msg = $"1.联系并询价地接、餐厅、用车、景点等供应商 \r\n 2. 请于{AddWeekdays(groupInfo.VisitDate, 20):yyyy年MM月dd日}内完成该项工作(团组出行前20个工作日)";
                             break;
                             break;
                         case 3:
                         case 3:
-                            msg = $"请于{groupInfo.CreateTime.AddDays(10):yyyy年MM月dd日}内完成该项工作(上一步往后3个工作日内)";
+                            msg = $"请于{AddWeekdays(groupInfo.CreateTime, 10):yyyy年MM月dd日}内完成该项工作(上一步往后3个工作日内)";
                             break;
                             break;
                         case 4:
                         case 4:
-                            msg = $"请于{groupInfo.CreateTime.AddDays(12):yyyy年MM月dd日}内完成该项工作(上一步往后2个工作日内)";
+                            msg = $"请于{AddWeekdays(groupInfo.CreateTime, 12):yyyy年MM月dd日}内完成该项工作(上一步往后2个工作日内)";
                             break;
                             break;
                         case 5:
                         case 5:
                             var backListInfo = _sqlSugar.Queryable<Grp_InvertedList>().Where(x => x.DiId == groupId && x.IsDel == 0).First();
                             var backListInfo = _sqlSugar.Queryable<Grp_InvertedList>().Where(x => x.DiId == groupId && x.IsDel == 0).First();
@@ -641,7 +673,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         case 6:
                         case 6:
                             break;
                             break;
                         case 7:
                         case 7:
-                            msg = $"请于{groupInfo.VisitEndDate.AddDays(5):yyyy年MM月dd日}内完成该项工作(团组归国后5个工作日内) *上传最终报批行程,确定城市间交通最终版报价分配;地接账单(清楚标注超时及其他项超支费用)、地接交通费用原始票据、城市间交通明细表;";
+                            msg = $"请于{AddWeekdays( groupInfo.VisitEndDate,5):yyyy年MM月dd日}内完成该项工作(团组归国后5个工作日内) *上传最终报批行程,确定城市间交通最终版报价分配;地接账单(清楚标注超时及其他项超支费用)、地接交通费用原始票据、城市间交通明细表;";
                             break;
                             break;
                     }
                     }
                     break;
                     break;
@@ -655,7 +687,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             msg = "团组报批前三公费用表";
                             msg = "团组报批前三公费用表";
                             break;
                             break;
                         case 3:
                         case 3:
-                            msg = $"1.整理统计团组超支费用、三公报销资料给到各单位 \r\n 2. 请于{groupInfo.VisitEndDate.AddDays(12):yyyy年MM月dd日}内完成该项工作(团组归国后12个工作日内)";
+                            msg = $"1.整理统计团组超支费用、三公报销资料给到各单位 \r\n 2. 请于{AddWeekdays(groupInfo.VisitEndDate,12):yyyy年MM月dd日}内完成该项工作(团组归国后12个工作日内)";
                             break;
                             break;
                         case 4:
                         case 4:
                             break;
                             break;