Browse Source

Merge branch 'develop' of http://132.232.92.186:3000/XinXiBu/OA2023 into develop

yuanrf 1 year ago
parent
commit
528a8d232e

+ 3 - 1
OASystem/EntitySync/Program.cs

@@ -127,7 +127,9 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Pm_TaskAllocation), //任务分配 
     //typeof(Pm_TaskAllocation), //任务分配 
     //typeof(Pm_TaskRelevanceUser), //任务分配关联人员(完成者) 
     //typeof(Pm_TaskRelevanceUser), //任务分配关联人员(完成者) 
     //typeof(Pm_TaskJobRelevancy), //任务分配关联人员(完成者) 
     //typeof(Pm_TaskJobRelevancy), //任务分配关联人员(完成者) 
-    typeof(Crm_TableOperationRecord), //表操作记录 
+    //typeof(Crm_TableOperationRecord), //表操作记录 
+    typeof(Grp_InvertedList), //倒推表 
+    typeof(Grp_InvertedListVisaCountry), //倒推表签证国家 
 
 
 
 
 });
 });

+ 87 - 1
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -105,6 +105,7 @@ namespace OASystem.API.Controllers
         private readonly IHubContext<ChatHub, IChatClient> _hubContext;
         private readonly IHubContext<ChatHub, IChatClient> _hubContext;
         private readonly UsersRepository _usersRep;
         private readonly UsersRepository _usersRep;
         private readonly IJuHeApiService _juHeApi;
         private readonly IJuHeApiService _juHeApi;
+        private readonly InvertedListRepository _invertedListRep;
 
 
         public GroupsController(IMapper mapper, SqlSugarClient sqlSugar, GrpScheduleRepository grpScheduleRep, DelegationInfoRepository groupRepository,
         public GroupsController(IMapper mapper, SqlSugarClient sqlSugar, GrpScheduleRepository grpScheduleRep, DelegationInfoRepository groupRepository,
             TaskAssignmentRepository taskAssignmentRep, AirTicketResRepository airTicketResRep, DecreasePaymentsRepository decreasePaymentsRep,
             TaskAssignmentRepository taskAssignmentRep, AirTicketResRepository airTicketResRep, DecreasePaymentsRepository decreasePaymentsRep,
@@ -112,7 +113,8 @@ namespace OASystem.API.Controllers
             , DelegationVisaRepository delegationVisaRep, MessageRepository message, VisaPriceRepository visaPriceRep, CarTouristGuideGroundRepository carTouristGuideGroundRep,
             , DelegationVisaRepository delegationVisaRep, MessageRepository message, VisaPriceRepository visaPriceRep, CarTouristGuideGroundRepository carTouristGuideGroundRep,
             CheckBoxsRepository checkBoxs, GroupCostRepository GroupCostRepository, CostTypeHotelNumberRepository CostTypeHotelNumberRepository,
             CheckBoxsRepository checkBoxs, GroupCostRepository GroupCostRepository, CostTypeHotelNumberRepository CostTypeHotelNumberRepository,
             GroupCostParameterRepository GroupCostParameterRepository, HotelPriceRepository hotelPriceRep, CustomersRepository customersRep, SetDataRepository setDataRep,
             GroupCostParameterRepository GroupCostParameterRepository, HotelPriceRepository hotelPriceRep, CustomersRepository customersRep, SetDataRepository setDataRep,
-            TourClientListRepository tourClientListRep, TeamRateRepository teamRateRep, IHubContext<ChatHub, IChatClient> hubContext, UsersRepository usersRep, IJuHeApiService juHeApi)
+            TourClientListRepository tourClientListRep, TeamRateRepository teamRateRep, IHubContext<ChatHub, IChatClient> hubContext, UsersRepository usersRep, IJuHeApiService juHeApi,
+            InvertedListRepository invertedListRep)
         {
         {
             _mapper = mapper;
             _mapper = mapper;
             _grpScheduleRep = grpScheduleRep;
             _grpScheduleRep = grpScheduleRep;
@@ -146,6 +148,7 @@ namespace OASystem.API.Controllers
             _hubContext = hubContext;
             _hubContext = hubContext;
             _usersRep = usersRep;
             _usersRep = usersRep;
             _juHeApi = juHeApi;
             _juHeApi = juHeApi;
+            _invertedListRep = invertedListRep;
         }
         }
 
 
         #region 流程管控
         #region 流程管控
@@ -596,6 +599,8 @@ namespace OASystem.API.Controllers
                         await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.GroupBusinessOperations, title, content, userIds, diId);
                         await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.GroupBusinessOperations, title, content, userIds, diId);
                     }
                     }
 
 
+                    //默认创建倒推表
+                    await _invertedListRep._Create(dto.UserId, diId);
                 }
                 }
                 else if (dto.Status == 2)
                 else if (dto.Status == 2)
                 {
                 {
@@ -8987,5 +8992,86 @@ namespace OASystem.API.Controllers
         }
         }
 
 
         #endregion
         #endregion
+
+        #region 团组倒推表
+
+        /// <summary>
+        /// 倒推表基础数据
+        /// Init
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostInvertedListInit()
+        {
+            var viewData = await _invertedListRep._Init();
+            if (viewData.Code != 0)
+            {
+                return Ok(JsonView(false, viewData.Msg));
+            }
+
+            return Ok(JsonView(viewData.Data));
+        }
+
+        /// <summary>
+        /// 倒推表 
+        /// Info
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostInvertedListInfo(InvertedListCreateDto dto)
+        {
+            var viewData = await _invertedListRep._Info(dto.PortType, dto.DiId);
+            if (viewData.Code != 0)
+            {
+                return Ok(JsonView(false, viewData.Msg));
+            }
+
+            return Ok(JsonView(viewData.Data));
+        }
+
+
+        /// <summary>
+        /// 倒推表 
+        /// Create
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostInvertedListCreate(InvertedListCreateDto dto)
+        {
+            var viewData = await _invertedListRep._Create(dto.PortType,dto.DiId);
+            if (viewData.Code != 0)
+            {
+                return Ok(JsonView(false, viewData.Msg));
+            }
+
+            return Ok(JsonView(viewData.Data));
+        }
+
+        /// <summary>
+        /// 倒推表 
+        /// Update
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostInvertedListUpdate(InvertedListUpdateDto dto)
+        {
+            var viewData = await _invertedListRep._Update(dto);
+            if (viewData.Code != 0)
+            {
+                return Ok(JsonView(false, viewData.Msg));
+            }
+
+            return Ok(JsonView(viewData.Data));
+        }
+
+        #endregion
     }
     }
 }
 }

+ 23 - 8
OASystem/OASystem.Api/Controllers/StatisticsController.cs

@@ -624,7 +624,10 @@ namespace OASystem.API.Controllers
                         decimal unitCost = 0.00M;
                         decimal unitCost = 0.00M;
                         unitCost = (item.PayMoney / item.ClientNum).ConvertToDecimal1();
                         unitCost = (item.PayMoney / item.ClientNum).ConvertToDecimal1();
 
 
-                        string[] clientNames = item.ClientName.Split('.');
+                        Regex r = new Regex("[0-9]");
+                        string name1 = item.ClientName;
+                        name1 = r.Replace(name1, "");
+                        string[] clientNames = name1.Split('.');
                         for (int i = 0; i < item.ClientNum; i++)
                         for (int i = 0; i < item.ClientNum; i++)
                         {
                         {
                             string name = "";
                             string name = "";
@@ -633,19 +636,31 @@ namespace OASystem.API.Controllers
                                 int index = i + 1;
                                 int index = i + 1;
                                 if (index < clientNames.Length)
                                 if (index < clientNames.Length)
                                 {
                                 {
-                                    name = clientNames[index].Replace("MR","").Replace("MS","");
+                                    name = clientNames[index].Replace("MR","").Replace("MS","").Trim();
-                                    if (name.Length > 0)
+                                    if (!string.IsNullOrEmpty(name))
                                     {
                                     {
-                                        string nameLastStr = name[name.Length - 1].ToString();
+                                        airClientPris.Add(new
-                                        if (nameLastStr.IsNumeric())
                                         {
                                         {
-                                            name = name.Substring(0, name.Length - 1).Trim();
+                                            CnName = name,
-                                        }
+                                            EnName = name,
+                                            Price = unitCost,
+                                            AirType = item.AirTypeName
+                                        });
                                     }
                                     }
+                                    
+
+                                    //if (name.Length > 0)
+                                    //{
+                                    //    string nameLastStr = name[name.Length - 1].ToString();
+                                    //    if (nameLastStr.IsNumeric())
+                                    //    {
+                                    //        name = name.Substring(0, name.Length - 1).Trim();
+                                    //    }
+                                    //}
                                 }
                                 }
                             }
                             }
                             
                             
-                            clientPinYinName += string.Format(@"{0}.{1}出票价为:{2} CNY;", Index+1, name, unitCost);
+                            clientPinYinName += string.Format(@"{0}.{1}出票价为:{2} CNY;", Index+1, name, unitCost.ToString("#0.00"));
                         }
                         }
                     }
                     }
                     if (!string.IsNullOrEmpty(item.AuditGMDate))
                     if (!string.IsNullOrEmpty(item.AuditGMDate))

+ 11 - 10
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskAssignment.cs

@@ -1,6 +1,4 @@
-using Microsoft.AspNetCore.SignalR;
+using OASystem.Domain.Entities.PersonnelModule;
-using OASystem.Domain.Entities.Groups;
-using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
 using ILogger = Microsoft.Extensions.Logging.ILogger;
 using ILogger = Microsoft.Extensions.Logging.ILogger;
 
 
@@ -36,19 +34,22 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                 primaryIds = data.Select(it => it.Id).ToList();
                 primaryIds = data.Select(it => it.Id).ToList();
                 var subData = _taskAllocationRep._sqlSugar
                 var subData = _taskAllocationRep._sqlSugar
                                                 .Queryable<Pm_TaskRelevanceUser>()
                                                 .Queryable<Pm_TaskRelevanceUser>()
-                                                .Where(it => it.IsDel == 0 &&
+                                                .Where(it => 
+                                                             it.IsDel == 0 &&
                                                              primaryIds.Contains(it.TAId) &&
                                                              primaryIds.Contains(it.TAId) &&
                                                              it.TaskStatus <= TaskerEnum.UnderWay
                                                              it.TaskStatus <= TaskerEnum.UnderWay
                                                       )
                                                       )
                                                 .ToList();
                                                 .ToList();
-                foreach (var item in subData)
+               
-                {
-                    item.OverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
-                    item.TaskStatus = TaskerEnum.UnFinished;
-                    item.Cause = string.Format(@"任务没有提交完成或者超时,由系统设置任务未完成");
-                }
                 if (subData.Count > 0)
                 if (subData.Count > 0)
                 {
                 {
+                    foreach (var item in subData)
+                    {
+                        item.OverTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+                        item.TaskStatus = TaskerEnum.UnFinished;
+                        item.Cause = string.Format(@"任务没有提交完成或者超时,由系统设置任务未完成");
+                    }
+
                     var updateStatus = _taskAllocationRep._sqlSugar
                     var updateStatus = _taskAllocationRep._sqlSugar
                                                          .Updateable(subData)
                                                          .Updateable(subData)
                                                          .WhereColumns(it => it.Id)
                                                          .WhereColumns(it => it.Id)

+ 12 - 12
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskNotification.cs

@@ -2,6 +2,7 @@
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.Hub.Hubs;
 using OASystem.API.OAMethodLib.Hub.Hubs;
 using OASystem.API.OAMethodLib.SignalR.Hubs;
 using OASystem.API.OAMethodLib.SignalR.Hubs;
+using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
 using ILogger = Microsoft.Extensions.Logging.ILogger;
 using ILogger = Microsoft.Extensions.Logging.ILogger;
@@ -25,8 +26,8 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
             //在此处编写任务业务代码
             //在此处编写任务业务代码
             #region 消息处理
             #region 消息处理
 
 
-            var data = _taskAllocationRep._sqlSugar
+            var data =  _taskAllocationRep._sqlSugar
-                                         .Queryable<Domain.Entities.PersonnelModule.Pm_TaskAllocation>()
+                                         .Queryable<Pm_TaskAllocation>()
                                          .Where(it => it.IsDel == 0 &&
                                          .Where(it => it.IsDel == 0 &&
                                                       !string.IsNullOrEmpty(it.PredictEndTime) &&
                                                       !string.IsNullOrEmpty(it.PredictEndTime) &&
                                                       Convert.ToDateTime(it.PredictEndTime).ToString("yyyy-MM-dd").Equals(DateTime.Now.ToString("yyyy-MM-dd"))
                                                       Convert.ToDateTime(it.PredictEndTime).ToString("yyyy-MM-dd").Equals(DateTime.Now.ToString("yyyy-MM-dd"))
@@ -38,20 +39,21 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                 List<int> primaryIds = new List<int>();
                 List<int> primaryIds = new List<int>();
                 primaryIds = data.Select(it => it.Id).ToList();
                 primaryIds = data.Select(it => it.Id).ToList();
                 var subData = _taskAllocationRep._sqlSugar
                 var subData = _taskAllocationRep._sqlSugar
-                                                .Queryable<Domain.Entities.PersonnelModule.Pm_TaskRelevanceUser>()
+                                                .Queryable<Pm_TaskRelevanceUser>()
                                                 .Where(it => it.IsDel == 0 &&
                                                 .Where(it => it.IsDel == 0 &&
                                                              primaryIds.Contains(it.TAId) &&
                                                              primaryIds.Contains(it.TAId) &&
                                                              (int)it.TaskStatus <= (int)TaskEnum.UnderWay
                                                              (int)it.TaskStatus <= (int)TaskEnum.UnderWay
                                                       )
                                                       )
                                                 .ToList();
                                                 .ToList();
 
 
-                _taskAllocationRep._sqlSugar.BeginTran();
                 var depDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Department>().Where(it => it.IsDel == 0).ToList();
                 var depDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Department>().Where(it => it.IsDel == 0).ToList();
-                var groupDatas = _taskAllocationRep._sqlSugar.Queryable<Domain.Entities.Groups.Grp_DelegationInfo>().Where(it => it.IsDel == 0).ToList();
+                var groupDatas = _taskAllocationRep._sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0).ToList();
                 var userDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0).ToList();
                 var userDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0).ToList();
 
 
+
                 List<int> userIds = new List<int>();
                 List<int> userIds = new List<int>();
 
 
+                _taskAllocationRep._sqlSugar.BeginTran();
                 foreach (var item in data)
                 foreach (var item in data)
                 {
                 {
                     string depName = string.Empty;
                     string depName = string.Empty;
@@ -83,10 +85,8 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
 
 
                         var userData = userDatas.Where(it => it.Id == subItem.UserId).FirstOrDefault();
                         var userData = userDatas.Where(it => it.Id == subItem.UserId).FirstOrDefault();
                         if (userData != null) { userName = userData.CnName; }
                         if (userData != null) { userName = userData.CnName; }
-                        string msgContent = string.Format(@"归属团组:{1}<br/>
+                        string msgContent = string.Format(@$"归属团组:{groupName}<br/>
-                                                            预计起止时间:{2} 至 {3}<br/>
+                                                            任务参与者:{userName}");
-                                                            任务参与者:{4}",
-                                                            groupName, item.PredictBeginTime, item.PredictEndTime, userName);
                         Sys_Message _Message = new Sys_Message()
                         Sys_Message _Message = new Sys_Message()
                         {
                         {
                             Type = MessageTypeEnum.TaskProgressUpdate,
                             Type = MessageTypeEnum.TaskProgressUpdate,
@@ -99,7 +99,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                             DeleteTime = "1990-01-01 00:00:00.000",
                             DeleteTime = "1990-01-01 00:00:00.000",
                             DiId = item.DiId,
                             DiId = item.DiId,
                         };
                         };
-                        var msgAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_Message>(_Message).ExecuteReturnIdentity();
+                        var msgAddId = _taskAllocationRep._sqlSugar.Insertable(_Message).ExecuteReturnIdentity();
                         if (msgAddId < 0)
                         if (msgAddId < 0)
                         {
                         {
                             _taskAllocationRep._sqlSugar.RollbackTran();
                             _taskAllocationRep._sqlSugar.RollbackTran();
@@ -118,7 +118,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                             DeleteTime = "1990-01-01 00:00:00.000"
                             DeleteTime = "1990-01-01 00:00:00.000"
                         };
                         };
 
 
-                        var msgAuthAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_MessageReadAuth>(_MessageReadAuth).ExecuteReturnIdentity();
+                        var msgAuthAddId = _taskAllocationRep._sqlSugar.Insertable(_MessageReadAuth).ExecuteReturnIdentity();
                         if (msgAuthAddId < 0)
                         if (msgAuthAddId < 0)
                         {
                         {
                             _taskAllocationRep._sqlSugar.RollbackTran();
                             _taskAllocationRep._sqlSugar.RollbackTran();
@@ -130,7 +130,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                 }
                 }
                 _taskAllocationRep._sqlSugar.CommitTran();
                 _taskAllocationRep._sqlSugar.CommitTran();
                 //推送消息
                 //推送消息
-                _hubContext.Clients.Clients(UserStore.OnlineUser.Where(it => userIds.Contains(it.UserId)).Select(it => it.ConnectionId).ToList()).ReceiveMessage("您有新的任务相关消息");
+               await _hubContext.Clients.Clients(UserStore.OnlineUser.Where(it => userIds.Contains(it.UserId)).Select(it => it.ConnectionId).ToList()).ReceiveMessage("您有新的任务相关消息");
 
 
                 _logger.LogInformation("任务消息推送成功 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "【在线人数】:" + JsonConvert.SerializeObject(UserStore.OnlineUser));
                 _logger.LogInformation("任务消息推送成功 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "【在线人数】:" + JsonConvert.SerializeObject(UserStore.OnlineUser));
             }
             }

+ 11 - 2
OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/TaskJob.cs

@@ -21,8 +21,17 @@ namespace OASystem.API.OAMethodLib.Quartz.Jobs
         {
         {
             _logger.LogInformation("调用任务状态变更Function " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
             _logger.LogInformation("调用任务状态变更Function " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 
 
-            //在此处编写任务业务代码
+            try
-            TaskAssignment.PostTaskUpdateStatus();
+            {
+                //在此处编写任务业务代码
+                TaskAssignment.PostTaskUpdateStatus();
+            }
+            catch (Exception ex)
+            {
+
+                _logger.LogInformation($"调用任务状态变更Function ErrorMsg:{ex.Message} " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+            }
+           
 
 
             return Task.CompletedTask;
             return Task.CompletedTask;
         }
         }

+ 13 - 3
OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/TaskNewsFeedJob.cs

@@ -28,12 +28,22 @@ namespace OASystem.API.OAMethodLib.Quartz.Jobs
         public async Task Execute(IJobExecutionContext context)
         public async Task Execute(IJobExecutionContext context)
         {
         {
 
 
-            _logger.LogInformation("调用任务状态变更Function " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+            _logger.LogInformation("调用任务消息通知 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 
 
-            //在此处编写任务业务代码
+            try
-             TaskNotification.PostTaskMessageNotification();
+            {
+                //在此处编写任务业务代码
+                TaskNotification.PostTaskMessageNotification();
+            }
+            catch (Exception ex)
+            {
+
+                _logger.LogInformation($"调用任务消息通知ErrorMsg:{ex.Message} " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+            }
+           
 
 
             //return Task.CompletedTask;
             //return Task.CompletedTask;
+            await Task.CompletedTask;
         }
         }
     }
     }
 }
 }

+ 1 - 1
OASystem/OASystem.Api/OAMethodLib/Quartz/QuartzFactory.cs

@@ -33,7 +33,7 @@ namespace QuzrtzJob.Factory
                             .Build();
                             .Build();
             
             
             var taskTrigger = TriggerBuilder.Create()
             var taskTrigger = TriggerBuilder.Create()
-                            //.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
+                            //.WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())//每六十秒执行一次
                             .WithCronSchedule("0 0 9,18 * * ?") //每天早上九点和下午六点触发
                             .WithCronSchedule("0 0 9,18 * * ?") //每天早上九点和下午六点触发
                             .Build();
                             .Build();
             var taskMsgTrigger = TriggerBuilder.Create()
             var taskMsgTrigger = TriggerBuilder.Create()

+ 5 - 5
OASystem/OASystem.Domain/AutoMappers/_baseMappingProfile.cs

@@ -253,7 +253,6 @@ namespace OASystem.Domain.AutoMappers
             #endregion
             #endregion
 
 
             #region 人事 模块
             #region 人事 模块
-
             //CreateMap<WageSheetInfoView, Pm_WageSheet>();
             //CreateMap<WageSheetInfoView, Pm_WageSheet>();
             CreateMap<Pm_WageSheet, WageSheetItemInfoView>();
             CreateMap<Pm_WageSheet, WageSheetItemInfoView>();
             CreateMap<WageAddOrEditDto, Pm_WageSheet>();
             CreateMap<WageAddOrEditDto, Pm_WageSheet>();
@@ -261,15 +260,16 @@ namespace OASystem.Domain.AutoMappers
             CreateMap<SalaryCalculatorSingleDto, Pm_WageSheet>();
             CreateMap<SalaryCalculatorSingleDto, Pm_WageSheet>();
             CreateMap<WageSheetInfoView, Pm_WageSheet>();
             CreateMap<WageSheetInfoView, Pm_WageSheet>();
             CreateMap<Pm_WageSheet, WageSheetInfoView>();
             CreateMap<Pm_WageSheet, WageSheetInfoView>();
-
             CreateMap<Pm_WageSheet, WageSheetInfoView>();
             CreateMap<Pm_WageSheet, WageSheetInfoView>();
-
             CreateMap<WageSheetMonthWorkdaysAddOrEditDto, Pm_WageIssueWorkingDay>();
             CreateMap<WageSheetMonthWorkdaysAddOrEditDto, Pm_WageIssueWorkingDay>();
             CreateMap<CalendarInfoView, Sys_Calendar>();
             CreateMap<CalendarInfoView, Sys_Calendar>();
-
-
             CreateMap<TaskAllocationAddOrEditDto, Pm_TaskAllocation>();
             CreateMap<TaskAllocationAddOrEditDto, Pm_TaskAllocation>();
             #endregion
             #endregion
+
+            #region 倒推表
+            CreateMap<InvertedListUpdateDto, Grp_InvertedList>();
+            CreateMap<VisaCountryInfo, Grp_InvertedListVisaCountry>();
+            #endregion
         }
         }
     }
     }
 }
 }

+ 41 - 0
OASystem/OASystem.Domain/Dtos/Groups/InvertedListDto.cs

@@ -0,0 +1,41 @@
+using OASystem.Domain.ViewModels.Groups;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.Groups
+{
+    /// <summary>
+    /// 倒推表 Dto
+    /// </summary>
+    public class InvertedListDto
+    {
+    }
+
+
+    /// <summary>
+    /// 倒推表 Dto
+    /// Create
+    /// </summary>
+    public class InvertedListCreateDto : PortDtoBase
+    {
+        /// <summary>
+        /// 团组Id 
+        /// </summary>
+        public int DiId { get; set; }
+    }
+
+    /// <summary>
+    /// 倒推表 Dto
+    /// Update
+    /// </summary>
+    public class InvertedListUpdateDto : InvertedListInfoView
+    {
+        /// <summary>
+        /// 请求类型
+        /// </summary>
+        public int PortType { get; set; }
+    }
+}

+ 249 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_InvertedList.cs

@@ -0,0 +1,249 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.Groups
+{
+    /// <summary>
+    /// 团组倒推表
+    /// Is....: 0 是 1 否
+    /// A:自然日  B:工作日
+    /// </summary>
+    [SugarTable("Grp_InvertedList")]
+    public class Grp_InvertedList:EntityBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        [SugarColumn(IsNullable = true,ColumnDataType = "int")]
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 报批资料准备时间 - A
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string ApprovalDataDt { get; set; }
+
+        /// <summary>
+        /// 报批资料准备
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsApprovalData { get; set; } = 1;
+
+        /// <summary>
+        /// 报批资料准备 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string ApprovalDataRemark { get; set; } = "准备报批资料(包括:邀请函,请示,报批行程,报批费用)";
+
+        /// <summary>
+        /// 报批时间 - A
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string ApprovalDt { get; set; }
+
+        /// <summary>
+        /// 报批时间
+        /// 1 预批件 2 正常批件 默认值??-1
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int ApprovalType { get; set; }
+
+        /// <summary>
+        /// 报批
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsApproval { get; set; } = 1;
+
+        /// <summary>
+        /// 报批 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string ApprovalRemark { get; set; } = "客户准备报批资料并递交到省外办,同时我司开始收集客户签证需要的资料";
+
+        /// <summary>
+        /// 出批件时间 - A
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string IssueApprovalDt { get; set; }
+
+        /// <summary>
+        /// 出批件
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsIssueApproval { get; set; } = 1;
+
+        /// <summary>
+        /// 报批 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string IssueApprovalRemark { get; set; } = "出预批件";
+
+        /// <summary>
+        /// 办护照时间 - B
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string ApplyPassportDt { get; set; }
+
+        /// <summary>
+        /// 办护照
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsApplyPassport { get; set; } = 1;
+
+        /// <summary>
+        /// 办护照 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string ApplyPassportRemark { get; set; } = "制作护照-护照出";
+
+        /// <summary>
+        /// 签证资料准备时间 - A
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string VisaInformationDt { get; set; }
+
+        /// <summary>
+        /// 签证资料准备
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsVisaInformation { get; set; } = 1;
+
+        /// <summary>
+        /// 签证资料准备 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string VisaInformationRemark { get; set; } = "汇总客户签证信息,准备送签资料";
+
+        /// <summary>
+        /// 送签时间 - B
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string SendVisaDt { get; set; }
+
+        /// <summary>
+        /// 送签
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsSendVisa { get; set; } = 1;
+
+        /// <summary>
+        /// 送签 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string SendVisaRemark { get; set; } = "签证周期暂无或免签\r\n(签证周期仅供参考)";
+
+        /// <summary>
+        /// 出签时间 - B
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string IssueVisaDt { get; set; }
+
+        /// <summary>
+        /// 出签
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsIssueVisa { get; set; } = 1;
+
+        /// <summary>
+        /// 出签 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string IssueVisaRemark { get; set; } = "外办领取签证";
+
+        /// <summary>
+        /// 行前会 - A
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string PreTripMeetingDt { get; set; }
+
+        /// <summary>
+        /// 行前会
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsPreTripMeeting { get; set; } = 1;
+
+        /// <summary>
+        /// 行前会 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string PreTripMeetingRemark { get; set; } = "开行前会为出访人员交代细节";
+
+        /// <summary>
+        /// 送机 - A
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string AirportdDropOffDt { get; set; }
+
+        /// <summary>
+        /// 送机
+        /// 是否完成
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsAirportdDropOff { get; set; } = 1;
+
+        /// <summary>
+        /// 送机 
+        /// 备注
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string AirportdDropOffRemark { get; set; } = "为出访人员办理登机服务及行李打包等";
+
+    }
+
+    /// <summary>
+    /// 倒推表签证 国家信息
+    /// (数据来源:签证标准费用表 默认值)
+    /// </summary>
+    [SugarTable("Grp_InvertedListVisaCountry")]
+    public class Grp_InvertedListVisaCountry : EntityBase
+    {
+        /// <summary>
+        /// 倒推表Id
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int ILId { get; set; }
+
+        /// <summary>
+        /// 国家
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(100)")]
+        public string Country { get; set; }
+
+        /// <summary>
+        /// 公务类型ID 
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int OfficialTypeId { get; set; }
+
+        /// <summary>
+        /// 签证类型ID 
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int VisaTypeId { get; set; }
+
+        /// <summary>
+        /// 签证时间(工作日) 
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int VisaDay { get; set; }
+    }
+}

+ 233 - 0
OASystem/OASystem.Domain/ViewModels/Groups/InvertedListView.cs

@@ -0,0 +1,233 @@
+using OASystem.Domain.Entities.Groups;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.Groups
+{
+    /// <summary>
+    /// 倒推表 View
+    /// </summary>
+    public class InvertedListView:Grp_InvertedList
+    {
+    }
+
+    /// <summary>
+    /// 倒推表详情 View 
+    /// A - 自然日  B-国内工作日
+    /// </summary>
+    public class InvertedListInfoView
+    {
+        /// <summary>
+        /// 查询标识
+        /// true 需提醒客户该团未创建倒推表
+        /// </summary>
+        public bool IsQuery { get; set; } = false;
+
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 报批资料准备时间 - A
+        /// </summary>
+        public string ApprovalDataDt { get; set; }
+
+        /// <summary>
+        /// 报批资料准备
+        /// 是否完成
+        /// </summary>
+        public int IsApprovalData { get; set; }
+
+        /// <summary>
+        /// 报批资料准备 
+        /// 备注
+        /// </summary>
+        public string ApprovalDataRemark { get; set; } = "准备报批资料(包括:邀请函,请示,报批行程,报批费用)";
+
+        /// <summary>
+        /// 报批时间 - A
+        /// </summary>
+        public string ApprovalDt { get; set; }
+
+        /// <summary>
+        /// 报批时间
+        /// 1 预批件 2 正常批件 默认值??-1
+        /// </summary>
+        public int ApprovalType { get; set; }
+
+        /// <summary>
+        /// 报批
+        /// 是否完成
+        /// </summary>
+        public int IsApproval { get; set; }
+
+        /// <summary>
+        /// 报批 
+        /// 备注
+        /// </summary>
+        public string ApprovalRemark { get; set; } = "客户准备报批资料并递交到省外办,同时我司开始收集客户签证需要的资料";
+
+        /// <summary>
+        /// 出批件时间 - A
+        /// </summary>
+        public string IssueApprovalDt { get; set; }
+
+        /// <summary>
+        /// 出批件
+        /// 是否完成
+        /// </summary>
+        public int IsIssueApproval { get; set; }
+
+        /// <summary>
+        /// 出批件时间 
+        /// 备注
+        /// </summary>
+        public string IssueApprovalRemark { get; set; } = "出预批件";
+
+        /// <summary>
+        /// 办护照时间 - B
+        /// </summary>
+        public string ApplyPassportDt { get; set; }
+
+        /// <summary>
+        /// 办护照
+        /// 是否完成
+        /// </summary>
+        public int IsApplyPassport { get; set; }
+
+        /// <summary>
+        /// 办护照 
+        /// 备注
+        /// </summary>
+        public string ApplyPassportRemark { get; set; } = "制作护照-护照出";
+
+        /// <summary>
+        /// 签证资料准备时间
+        /// </summary>
+        public string VisaInformationDt { get; set; }
+
+        /// <summary>
+        /// 签证资料准备
+        /// 是否完成
+        /// </summary>
+        public int IsVisaInformation { get; set; }
+
+        /// <summary>
+        /// 签证资料准备 
+        /// 备注
+        /// </summary>
+        public string VisaInformationRemark { get; set; } = "汇总客户签证信息,准备送签资料";
+
+        /// <summary>
+        /// 签证国家信息
+        /// </summary>
+        public List<VisaCountryInfo> VisaCountryData { get; set; }
+
+        /// <summary>
+        /// 送签时间 - B
+        /// </summary>
+        public string SendVisaDt { get; set; }
+
+        /// <summary>
+        /// 送签
+        /// 是否完成
+        /// </summary>
+        public int IsSendVisa { get; set; }
+
+        /// <summary>
+        /// 送签 
+        /// 备注
+        /// </summary>
+        public string SendVisaRemark { get; set; } = "签证周期暂无或免签\r\n(签证周期仅供参考)";
+
+        /// <summary>
+        /// 出签时间 - B
+        /// </summary>
+        public string IssueVisaDt { get; set; }
+
+        /// <summary>
+        /// 出签
+        /// 是否完成
+        /// </summary>
+        public int IsIssueVisa { get; set; }
+
+        /// <summary>
+        /// 出签 
+        /// 备注
+        /// </summary>
+        public string IssueVisaRemark { get; set; } = "外办领取签证";
+
+        /// <summary>
+        /// 行前会 - A
+        /// </summary>
+        public string PreTripMeetingDt { get; set; }
+
+        /// <summary>
+        /// 行前会
+        /// 是否完成
+        /// </summary>
+        public int IsPreTripMeeting { get; set; }
+
+        /// <summary>
+        /// 行前会 
+        /// 备注
+        /// </summary>
+        public string PreTripMeetingRemark { get; set; } = "开行前会为出访人员交代细节";
+
+        /// <summary>
+        /// 送机 - A
+        /// </summary>
+        public string AirportdDropOffDt{ get; set; }
+
+        /// <summary>
+        /// 送机
+        /// 是否完成
+        /// </summary>
+        public int IsAirportdDropOff { get; set; }
+
+        /// <summary>
+        /// 送机 
+        /// 备注
+        /// </summary>
+        public string AirportdDropOffRemark { get; set; } = "为出访人员办理登机服务及行李打包等";
+
+    }
+    /// <summary>
+    /// 签证国家信息
+    /// </summary>
+    public class VisaCountryInfo
+    {
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 倒推表Id
+        /// </summary>
+        public int ILId { get; set; }
+
+        /// <summary>
+        /// 国家
+        /// </summary>
+        public string Country { get; set; }
+
+        /// <summary>
+        /// 公务类型ID 
+        /// </summary>
+        public int OfficialTypeId { get; set; }
+
+        /// <summary>
+        /// 签证类型ID 
+        /// </summary>
+        public int VisaTypeId { get; set; }
+
+        /// <summary>
+        /// 签证时间(工作日) 
+        /// </summary>
+        public int VisaDay { get; set; }
+    }
+}

+ 69 - 18
OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationInfoRepository.cs

@@ -66,37 +66,25 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 var _DelegationInfo = await _sqlSugar.SqlQueryable<Web_ShareGroupInfoView>(sql).FirstAsync();
                 var _DelegationInfo = await _sqlSugar.SqlQueryable<Web_ShareGroupInfoView>(sql).FirstAsync();
                 if (_DelegationInfo != null)
                 if (_DelegationInfo != null)
                 {
                 {
-                    if (!string.IsNullOrEmpty(_DelegationInfo.VisitCountry))
+                    _DelegationInfo.VisitCountry = FormartTeamName(_DelegationInfo.VisitCountry);
-                    {
-                        if (_DelegationInfo.VisitCountry.Contains("|"))
-                        {
-                            _DelegationInfo.VisitCountry = _DelegationInfo.VisitCountry.Replace("|", "、");
-                        }
-                    }
-                    else _DelegationInfo.VisitCountry = " - ";
-
-                    result.Data = _DelegationInfo;
                 }
                 }
                 else result.Msg = "暂无该团组信息";
                 else result.Msg = "暂无该团组信息";
+
+                result.Data = _DelegationInfo;
             }
             }
             else if (dto.PortType == 2 || dto.PortType == 3) //IOS Or Android
             else if (dto.PortType == 2 || dto.PortType == 3) //IOS Or Android
             {
             {
                 var _DelegationInfo = await _sqlSugar.SqlQueryable<IOSOrAndroid_ShareGroupInfoView>(sql).FirstAsync();
                 var _DelegationInfo = await _sqlSugar.SqlQueryable<IOSOrAndroid_ShareGroupInfoView>(sql).FirstAsync();
                 if (_DelegationInfo != null)
                 if (_DelegationInfo != null)
                 {
                 {
-                    if (!string.IsNullOrEmpty(_DelegationInfo.VisitCountry))
+                    _DelegationInfo.VisitCountry = FormartTeamName(_DelegationInfo.VisitCountry);
-                    {
-                        if (_DelegationInfo.VisitCountry.Contains("|"))
-                        {
-                            _DelegationInfo.VisitCountry = _DelegationInfo.VisitCountry.Replace("|", "、");
-                        }
-                    }
-                    else _DelegationInfo.VisitCountry = " - ";
 
 
                     result.Data = _DelegationInfo;
                     result.Data = _DelegationInfo;
                 }
                 }
                 else result.Msg = "暂无该团组信息";
                 else result.Msg = "暂无该团组信息";
 
 
+                result.Data = _DelegationInfo;
+
             }
             }
             else result.Msg = "请输入正确的端口号。1 Web 2 Android 3 IOS";
             else result.Msg = "请输入正确的端口号。1 Web 2 Android 3 IOS";
 
 
@@ -106,6 +94,48 @@ namespace OASystem.Infrastructure.Repositories.Groups
             return result;
             return result;
         }
         }
 
 
+
+        /// <summary>
+        /// 团组信息List 团组预览详情共享Api
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<Result> PostShareGroupInfos(int portType)
+        {
+            Result result = new Result() { Code = -2, Msg = "未知错误", Data = new List<object>() { } };
+
+            string sql = string.Format(@"Select Id,TeamName,TourCode,ClientName,VisitCountry,VisitStartDate,VisitEndDate,VisitDays,VisitPNumber 
+                                             From Grp_DelegationInfo Where IsDel = 0 Order By Id Desc");
+
+
+            var _DelegationInfo = await _sqlSugar.SqlQueryable<Web_ShareGroupInfoView>(sql).ToListAsync();
+            if (_DelegationInfo.Count > 0)
+            {
+                foreach (var item in _DelegationInfo)
+                {
+                    item.VisitCountry = FormartTeamName(item.VisitCountry);
+                }
+            }
+            else { result.Msg = "暂无该团组信息"; return result; }
+
+            if (portType == 1) //Web
+            {
+
+                result.Data = _DelegationInfo;
+            }
+            else if (portType == 2 || portType == 3) //IOS Or Android
+            {
+
+                result.Data = _DelegationInfo;
+            }
+            else { result.Msg = "请输入正确的端口号。1 Web 2 Android 3 IOS"; return result; }
+
+            result.Code = 0;
+            result.Msg = "成功!";
+
+            return result;
+        }
+
         #endregion
         #endregion
         /// <summary>
         /// <summary>
         /// 获取接团信息Info
         /// 获取接团信息Info
@@ -127,6 +157,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 var _DelegationInfo = await _sqlSugar.SqlQueryable<DelegationInfoWebView>(sql).FirstAsync();
                 var _DelegationInfo = await _sqlSugar.SqlQueryable<DelegationInfoWebView>(sql).FirstAsync();
                 if (_DelegationInfo != null)
                 if (_DelegationInfo != null)
                 {
                 {
+                    _DelegationInfo.TeamName = FormartTeamName(_DelegationInfo.TeamName);
                     result.Code = 0;
                     result.Code = 0;
                     result.Msg = "成功!";
                     result.Msg = "成功!";
                     result.Data = _DelegationInfo;
                     result.Data = _DelegationInfo;
@@ -139,6 +170,26 @@ namespace OASystem.Infrastructure.Repositories.Groups
         }
         }
         #region 团组
         #region 团组
 
 
+
+        /// <summary>
+        /// 统一团组国家分割字符
+        /// </summary>
+        /// <param name="teamName"></param>
+        /// <returns></returns>
+        public string FormartTeamName( string teamName) 
+        {
+            string str = "";
+            if (!string.IsNullOrEmpty(teamName))
+            {
+                List<string> searchreplaces = new List<string>() { "|", "、", " ", "/", ",", "," };
+                foreach (var item in searchreplaces)
+                {
+                    str = teamName.Replace(item, "、");
+                }
+            }
+            return str.Trim();
+        }
+
         /// <summary>
         /// <summary>
         /// 获取接团信息 Page List
         /// 获取接团信息 Page List
         /// </summary>
         /// </summary>

+ 321 - 0
OASystem/OASystem.Infrastructure/Repositories/Groups/InvertedListRepository.cs

@@ -0,0 +1,321 @@
+using AutoMapper;
+using MySqlX.XDevAPI.Common;
+using OASystem.Domain;
+using OASystem.Domain.Dtos.Groups;
+using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.Entities.Resource;
+using OASystem.Domain.ViewModels.Groups;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Result = OASystem.Domain.Result;
+
+namespace OASystem.Infrastructure.Repositories.Groups
+{
+    /// <summary>
+    /// 倒推表 仓储
+    /// </summary>
+    public class InvertedListRepository:BaseRepository<Grp_InvertedList,InvertedListView>
+    {
+        private readonly IMapper _mapper;
+        private readonly Result _result;
+        private readonly DelegationInfoRepository _delegationInfoRep;
+        public InvertedListRepository(SqlSugarClient sqlSugar, IMapper mapper, DelegationInfoRepository delegationInfoRep)
+            : base(sqlSugar)
+        {
+            _mapper = mapper;
+            _result = new Result() { Code = -1, Msg = "系统错误!", Data = new List<object>() { } };
+            _delegationInfoRep = delegationInfoRep;
+        }
+
+        /// <summary>
+        /// 基础数据
+        /// </summary>
+        /// <returns></returns>
+        public async Task<Result> _Init()
+        {
+            dynamic groupData = null;
+            var groupData1 = await _delegationInfoRep.PostShareGroupInfos(1);
+            if (groupData1.Code == 0)
+            {
+                groupData = groupData1.Data;
+            }
+
+            var setData  = await _sqlSugar.Queryable<Sys_SetData>().Where(it => it.IsDel == 0).ToListAsync();
+
+            var officialTypeData = setData.Where(it => it.STid  == 81).Select(it => new { it.Id,it.Name }).ToList();
+
+            var visaTypeData = setData.Where(it => it.STid == 82).Select(it => new { it.Id, it.Name }).ToList();
+
+            _result.Code = 0;
+            _result.Msg = "操作成功!";
+            _result.Data = new {
+                groupData = groupData1,
+                officialTypeData = officialTypeData,
+                visaTypeData = visaTypeData
+            };
+
+            return _result;
+        }
+
+        /// <summary>
+        /// Info
+        /// </summary>
+        /// <returns></returns>
+        public async Task<Result> _Info(int portTypeId,int diId)
+        {
+            #region 参数验证
+            if (portTypeId < 1)
+            {
+                _result.Msg = "请输入有效的PortType参数值";
+                return _result;
+            }
+            if (diId < 1)
+            {
+                _result.Msg = "请输入有效的DiId参数值";
+                return _result;
+            }
+
+            #endregion
+            string sql = string.Format(@$"Select * From Grp_InvertedList Where Isdel={0} And DiId = {diId}");
+            var info = await _sqlSugar.SqlQueryable<InvertedListInfoView>(sql).FirstAsync();
+
+            if (info == null) {
+                info = new InvertedListInfoView();
+
+                var groupInfo = await _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0 && it.Id == diId).FirstAsync();
+                if (groupInfo == null)
+                {
+                    _result.Msg = @$"团组数据不存在!";
+                    return _result;
+                }
+
+                List<string> visitCountry = new List<string>();
+
+                string grpVisitCountry = groupInfo.VisitCountry;
+
+                if (!string.IsNullOrEmpty(grpVisitCountry))
+                {
+                    grpVisitCountry = _delegationInfoRep.FormartTeamName(grpVisitCountry);
+
+                    visitCountry = grpVisitCountry.Split("、").ToList();
+                }
+
+
+                //签证费用标准
+                var visaFeeDatas = await _sqlSugar.Queryable<Res_CountryFeeCost>().Where(it => it.IsDel == 0).ToListAsync();
+                List<VisaCountryInfo> visaCountryInfos = new List<VisaCountryInfo>();
+
+                foreach (var itemn in visitCountry) 
+                {
+                    visaCountryInfos.Add(new VisaCountryInfo() { 
+                    
+                        Country = itemn,
+                        OfficialTypeId=-1,
+                        VisaTypeId = -1,
+                        VisaDay = Convert.ToInt32(visaFeeDatas.Find(it => it.VisaCountry.Equals(itemn.Trim()))?.VisaTime ?? "0"),
+                    });
+                }
+                info.VisaCountryData = visaCountryInfos;
+                _result.Data = info;
+                _result.Msg = "未查询到数据!";
+                _result.Code = 0;
+                return _result; 
+            }
+
+            info.IsQuery = true;
+            int ilId = info.Id;
+
+            string visaSql = string.Format(@$"Select * From Grp_InvertedListVisaCountry Where Isdel={0} And ILId = {ilId}");
+            var visaCountryInfo = await _sqlSugar.SqlQueryable<VisaCountryInfo>(sql).ToListAsync();
+
+            info.VisaCountryData = visaCountryInfo;
+            _result.Data = info;
+            _result.Code = 0;
+
+            return _result;
+        }
+
+        /// <summary>
+        /// Create
+        /// </summary>
+        /// <param name="diId"></param>
+        /// <returns></returns>
+        public async Task<Result> _Create(int userId,int diId)
+        {
+            #region 参数验证
+            if (diId < 1)
+            {
+                _result.Msg = $@"请输入有效的DiId参数值!";
+                return _result;
+            }
+            if (userId < 1)
+            {
+                _result.Msg = $@"请输入有效的UserId参数值!";
+                return _result;
+            }
+            #endregion
+
+            var selectInfo = await _sqlSugar.Queryable<Grp_InvertedList>().Where(it => it.IsDel == 0 && it.DiId == diId).FirstAsync();
+            if (selectInfo != null)
+            {
+                _result.Msg = @$"该数据已存在,不可重复创建!";
+                return _result;
+            }
+
+            var groupInfo = await _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0 && it.Id == diId).FirstAsync();
+            if (groupInfo != null)
+            {
+                _result.Msg = @$"团组数据不存在,不可创建!";
+                return _result;
+            }
+
+            if (string.IsNullOrEmpty( groupInfo.VisitDate.ToString()))
+            {
+                _result.Msg = @$"团组出访时间未填写,不可创建!";
+                return _result;
+            }
+
+            DateTime visitDt = groupInfo.VisitDate;
+
+            List<string> visitCountry = new List<string>();
+
+            string grpVisitCountry  = groupInfo.VisitCountry;
+
+            if (!string.IsNullOrEmpty(grpVisitCountry))
+            {
+                grpVisitCountry = _delegationInfoRep.FormartTeamName(grpVisitCountry);
+
+                visitCountry = grpVisitCountry.Split("、").ToList();
+            }
+
+            //签证费用标准
+            var visaFeeDatas = await _sqlSugar.Queryable<Res_CountryFeeCost>().Where(it => it.IsDel == 0).ToListAsync();
+
+
+            /*
+             * 默认步骤所需提前天数
+             * A 自然日 B 工作日
+             */
+            int approvalData_advanceDays = 60,     //报批资料准备
+                approval_advanceDays = 45,         //报批
+                IssueApproval_advanceDays = 33,    //出批件
+                ApplyPassport_advanceDays = 30,    //办护照
+                VisaInformation_advanceDays = 16,  //签证资料准备
+                sendVisa_advanceDays = 12,         //送签
+                issueVisa_advanceDays = 5,         //出签
+                preTripMeeting_advanceDays = 3,    //行前会
+                airportdDropOff_advanceDays = 0;   //送机
+
+            var info = new Grp_InvertedList() { 
+                DiId = diId,
+                ApprovalDataDt = visitDt.AddDays(approvalData_advanceDays).ToString("yyyy-MM-dd"),
+                ApprovalDt = visitDt.AddDays(approval_advanceDays).ToString("yyyy-MM-dd"),
+                ApprovalType = -1,
+                IssueApprovalDt = visitDt.AddDays(IssueApproval_advanceDays).ToString("yyyy-MM-dd"),
+                ApplyPassportDt = visitDt.AddDays(ApplyPassport_advanceDays).ToString("yyyy-MM-dd"),
+                VisaInformationDt = visitDt.AddDays(VisaInformation_advanceDays).ToString("yyyy-MM-dd"),
+                SendVisaDt = visitDt.AddDays(sendVisa_advanceDays).ToString("yyyy-MM-dd"),
+                IssueVisaDt = visitDt.AddDays(issueVisa_advanceDays).ToString("yyyy-MM-dd"),
+                PreTripMeetingDt = visitDt.AddDays(preTripMeeting_advanceDays).ToString("yyyy-MM-dd"),
+                AirportdDropOffDt = visitDt.AddDays(airportdDropOff_advanceDays).ToString("yyyy-MM-dd"),
+                CreateUserId = userId,
+            };
+            _sqlSugar.BeginTran();
+
+            int add1 = await _sqlSugar.Insertable<Grp_InvertedList>(info).ExecuteReturnIdentityAsync();
+            if (add1<1)
+            {
+                _result.Msg = $@"倒推表添加失败!";
+                _sqlSugar.RollbackTran();
+                return _result;
+            }
+
+            List<Grp_InvertedListVisaCountry> _InvertedListVisaCountries = new List<Grp_InvertedListVisaCountry>();
+            foreach (var item in visitCountry)
+            {
+                int days = Convert.ToInt32(visaFeeDatas.Find(x => x.VisaCountry.Equals(item.Trim()))?.VisaTime ?? "0");
+                
+                _InvertedListVisaCountries.Add(new Grp_InvertedListVisaCountry()
+                {
+                    ILId = add1,
+                    Country = item,
+                    OfficialTypeId = -1,
+                    VisaTypeId = -1,
+                    VisaDay = days,
+                });
+            }
+
+            int add2 = await _sqlSugar.Insertable<Grp_InvertedList>(info).ExecuteReturnIdentityAsync();
+
+            _sqlSugar.CommitTran();
+            _result.Code = 0;
+            _result.Msg = @$"操作成功!";
+            return _result;
+        }
+
+
+
+        /// <summary>
+        /// Update
+        /// </summary>
+        /// <param name="diId"></param>
+        /// <returns></returns>
+        public async Task<Result> _Update(InvertedListUpdateDto dto)
+        {
+            #region 参数验证
+            if (dto.DiId < 1)
+            {
+                _result.Msg = $@"请输入有效的DiId参数值!";
+                return _result;
+            }
+            if (dto.Id < 1)
+            {
+                _result.Msg = $@"请输入有效的Id参数值!";
+                return _result;
+            }
+            #endregion
+
+            Grp_InvertedList _InvertedList = _mapper.Map<Grp_InvertedList>(dto);
+            List<Grp_InvertedListVisaCountry> _InvertedListVisaCountries = new List<Grp_InvertedListVisaCountry>();
+            if (dto.VisaCountryData.Count > 0)
+            {
+                _InvertedListVisaCountries = _mapper.Map<List<Grp_InvertedListVisaCountry>>(dto.VisaCountryData);
+            }
+            _sqlSugar.BeginTran();
+
+            int update1 = await _sqlSugar.Updateable(_InvertedList)
+                                         .IgnoreColumns(it => new { it.CreateTime,it.IsDel })
+                                         .ExecuteCommandAsync();
+            if (update1 < 1) 
+            {
+                _sqlSugar.RollbackTran();
+                _result.Msg = @$"修改失败!";
+                return _result;
+
+            }
+
+            if (_InvertedListVisaCountries.Count > 0)
+            {
+                int update2 = await _sqlSugar.Updateable(_InvertedListVisaCountries)
+                                         .IgnoreColumns(it => new { it.CreateTime, it.IsDel })
+                                         .ExecuteCommandAsync();
+
+                if (update2 < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    _result.Msg = @$"修改失败!";
+                    return _result;
+                }
+            }
+
+            _sqlSugar.CommitTran();
+            _result.Code = 0;
+            _result.Msg = @$"操作成功!";
+            return _result;
+        }
+    }
+}