Просмотр исходного кода

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

yuanrf дней назад: 4
Родитель
Сommit
2eed89d663

+ 4 - 1
OASystem/EntitySync/Program.cs

@@ -180,6 +180,9 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Grp_FeeEntryAcknowledge),//团组费用录入通知记录表 
     //typeof(Res_OverseaVehicle),//境外用车信息 
     //typeof(Res_OverseaVehicleTypePrice),//境外用车类型价格信息   
-    typeof(Pm_CompanyDailyKpi),//财务部绩效考核   
+    //typeof(Pm_CompanyDailyKpi),//财务部绩效考核    
+    //typeof(Grp_ConfProcessOverview),//会务流程总览    
+    //typeof(Grp_ConfProcessNode),//会务流程节点     
+    typeof(Grp_ConfProcessLog),//团组会务流程总览操作日志  
 });
 Console.WriteLine("数据库结构同步完成!");

+ 8 - 4
OASystem/OASystem.Api/Controllers/FinancialController.cs

@@ -2637,16 +2637,20 @@ namespace OASystem.API.Controllers
                     item_rst.receivableTotal = (sum_fr + sum_extra).ToString("#0.00");
                     item_rst.prPrice = sum_pr.ToString("#0.00");
                     item_rst.refundAmount = sum_refund.ToString("#0.00");
-                    item_rst.receivedTotal = (sum_pr - sum_refund).ToString("#0.00");
-                    item_rst.balPrice = ((sum_fr + sum_extra) - (sum_pr - sum_refund)).ToString("#0.00");
+                    //item_rst.receivedTotal = (sum_pr - sum_refund).ToString("#0.00"); 
+                    item_rst.receivedTotal = sum_pr.ToString("#0.00");
+                    //item_rst.balPrice = ((sum_fr + sum_extra) - (sum_pr - sum_refund)).ToString("#0.00");
+                    item_rst.balPrice = ((sum_fr + sum_extra) - sum_pr).ToString("#0.00");
                     item_rst.prClient = str_client;
                     item_rst.schedule = str_schedule;
 
                     string tempVisitDate = Convert.ToDateTime(item_rst.visitDate).ToString("yyyy-MM-dd");
 
                     sumAll_fr += (sum_fr + sum_extra);
-                    sumAll_pr += (sum_pr - sum_refund);
-                    sumAll_balance += ((sum_fr + sum_extra) - (sum_pr - sum_refund));
+                    //sumAll_pr += (sum_pr - sum_refund);
+                    sumAll_pr += sum_pr;
+                    //sumAll_balance += ((sum_fr + sum_extra) - (sum_pr - sum_refund));
+                    sumAll_balance += ((sum_fr + sum_extra) - sum_pr);
 
                     //应收、已收、收款退还、余款 都为零 且 团组费用有值时 变色
                     if (sum_fr <= 0m && (sum_fr + sum_extra) <= 0m && sum_refund <= 0m && ((sum_fr + sum_extra) - (sum_pr - sum_refund)) <= 0m)

Разница между файлами не показана из-за своего большого размера
+ 1049 - 498
OASystem/OASystem.Api/Controllers/GroupsController.cs


+ 38 - 0
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -5397,7 +5397,45 @@ ORDER BY MonthNumber, CollectionDays";
 
         #endregion
 
+        #region 策划部日常绩效
+
+        /// <summary>
+        /// 策划部日常绩效 初始化数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> PlanningDailyKpiInit()
+        {
+            return Ok(await _companyDailyKyiRep.PlanningInitAsync());
+        }
+
+        /// <summary>
+        /// 策划部日常绩效 详情
+        /// </summary>
+        /// <param name="month">月份(2025-12)</param>
+        /// <param name="evaluator">考核人</param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> PlanningDailyKpiInfo(string month, int evaluator)
+        {
+            return Ok(await _companyDailyKyiRep.InfoAsync(month, evaluator));
+        }
+
+        /// <summary>
+        /// 策划部日常绩效 保存
+        /// </summary>
+        /// <param name="dto">请求类</param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> PlanningDailyKpiSave(CompanyDailyKpiSaveDto dto)
+        {
+            return Ok(await _companyDailyKyiRep.SaveAsync(dto));
+        }
+
         #endregion
 
+        #endregion
+
+
     }
 }

+ 6 - 0
OASystem/OASystem.Api/Middlewares/ExceptionHandlingMiddleware.cs

@@ -75,6 +75,12 @@ namespace OASystem.API.Middlewares
                 // 根据异常类型设置不同的响应状态码和消息
                 switch (exception)
                 {
+                    case BusinessException businessEx: // 新增:处理 BusinessException
+                        response.StatusCode = StatusCodes.Status400BadRequest;
+                        errorResponse.Msg = businessEx.Message;
+                        errorResponse.Code = StatusCodes.Status400BadRequest; // 设置正确的 HTTP 状态码
+                        break;
+
                     case SqlException sqlEx when sqlEx.Number == -2:
                         response.StatusCode = StatusCodes.Status503ServiceUnavailable;
                         errorResponse.Msg = "数据库连接超时,请稍后重试。";

+ 93 - 13
OASystem/OASystem.Api/OAMethodLib/GeneralMethod.cs

@@ -4,11 +4,10 @@ using Aspose.Words;
 using Aspose.Words.Layout;
 using Aspose.Words.Saving;
 using Aspose.Words.Tables;
-using Dm.util;
+using Humanizer;
 using Microsoft.AspNetCore.SignalR;
 using Microsoft.International.Converters.PinYinConverter;
 using NodaTime;
-using NPOI.OpenXmlFormats.Vml;
 using OASystem.API.OAMethodLib.File;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.Hub.Hubs;
@@ -17,20 +16,19 @@ using OASystem.API.OAMethodLib.KiMiApi;
 using OASystem.API.OAMethodLib.SignalR.Hubs;
 using OASystem.Domain.AesEncryption;
 using OASystem.Domain.Dtos.Groups;
+using OASystem.Domain.Dtos.PersonnelModule;
 using OASystem.Domain.Entities.Customer;
 using OASystem.Domain.Entities.Financial;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.ViewModels.Financial;
 using OASystem.Domain.ViewModels.Groups;
 using OASystem.Domain.ViewModels.JuHeExchangeRate;
-using OASystem.Domain.ViewModels.Statistics;
+using OASystem.Domain.ViewModels.PersonnelModule;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.Groups;
 using System.Data;
 using System.IdentityModel.Tokens.Jwt;
 using System.Security.Claims;
-using OASystem.Domain.ViewModels.PersonnelModule;
-using OASystem.Domain.Dtos.PersonnelModule;
 
 namespace OASystem.API.OAMethodLib
 {
@@ -4297,6 +4295,88 @@ namespace OASystem.API.OAMethodLib
         /// </summary>
         private readonly static decimal _fxRateRise = 1.0350M;
 
+        #region 城市区间费用详情
+
+        /// <summary>
+        /// 城市区间费用详情 使用的币种及汇率
+        /// </summary>
+        /// <param name="groupId"></param>
+        /// <returns></returns>
+        public static async Task<List<CurrencyInfo>> EnterExitCostOVFeeUsedCurrencyAsync(int groupId = 0)
+        {
+            var infos = new List<CurrencyInfo>();
+
+            bool isUsedGroup = false;
+            var countryies = new List<string>();
+
+            var groupInfo = await _sqlSugar.Queryable<Grp_DelegationInfo>().Where(x => x.Id == groupId).FirstAsync();
+            if (groupInfo != null)
+            {
+                countryies = _dirRep.GroupSplitCountry(groupInfo.VisitCountry);
+                if (countryies.Any())
+                {
+                    isUsedGroup = true;
+                }
+            }
+
+            infos = await _sqlSugar.Queryable<Res_OverseaVehicle>()
+                .LeftJoin<Sys_SetData>((ov, sd) => ov.Currency == sd.Id)
+                .Where((ov, sd) => ov.IsDel == 0)
+                .WhereIF(isUsedGroup, (ov, sd) => countryies.Contains(ov.CountryName))
+                .Select((ov, sd) => new CurrencyInfo()
+                {
+                    CurrencyCode = sd.Name.ToUpper(),
+                    CurrencyName = sd.Remark
+                })
+                .ToListAsync();
+
+            //出入境费用存储的币种及汇率
+            var eexCurrencyInfos = new List<CurrencyInfo>();
+            if (infos.Any())
+            {
+                var eecInfo = await _sqlSugar.Queryable<Grp_EnterExitCost>().Where(x => x.IsDel == 0 && x.DiId == groupId).FirstAsync();
+                if (eecInfo != null)
+                {
+                    eexCurrencyInfos = CommonFun.GetCurrencyChinaToList(eecInfo.CurrencyRemark);
+                }
+            }
+
+            //合并已使用币种及汇率
+            infos.ForEach(x =>
+            {
+                var eexCurrencyInfo = eexCurrencyInfos.Where(y => y.CurrencyCode == x.CurrencyCode).FirstOrDefault();
+                if (eexCurrencyInfo != null)
+                {
+                    x.Rate = eexCurrencyInfo.Rate;
+                }
+            });
+
+            //未存储费用集合
+            var unSaveCurrInfos = infos.Where(x => !eexCurrencyInfos.Any(y => y.CurrencyCode == x.CurrencyCode)).ToList();
+            if (unSaveCurrInfos.Any())
+            {
+                var currencyRate = await _juHeApi.PostItemRateAsync(unSaveCurrInfos.Select(it => it.CurrencyCode!).ToArray());
+                if (currencyRate.Count > 0)
+                {
+                    foreach (var item in infos)
+                    {
+                        var rateInfo = currencyRate.Where(it => it.Name.Equals(item.CurrencyName)).FirstOrDefault();
+                        if (rateInfo != null)
+                        {
+                            decimal rate1 = Convert.ToDecimal(rateInfo.FSellPri) / 100.00M;
+                            rate1 *= _fxRateRise;
+
+                            item.Rate = rate1.TruncDecimals(4) + _xchgRateAdj;
+                        }
+                    }
+                }
+            }
+
+            return infos;
+        }
+
+        #endregion
+
         /// <summary>
         /// 出入境费用 初始化汇率
         /// </summary>
@@ -4304,13 +4384,13 @@ namespace OASystem.API.OAMethodLib
         public static async Task<List<CurrencyInfo>> EnterExitCostInitRate()
         {
             //默认币种显示
-            List<CurrencyInfo> currencyInfos = new List<CurrencyInfo>()
+            var currencyInfos = new List<CurrencyInfo>()
                 {
-                    new CurrencyInfo (){ CurrencyCode="USD",CurrencyName = "美元",Rate = 7.5000M },
-                    new CurrencyInfo (){ CurrencyCode="EUR",CurrencyName = "欧元",Rate = 8.0000M },
-                    new CurrencyInfo (){ CurrencyCode="GBP",CurrencyName = "英镑",Rate = 9.5000M },
-                    new CurrencyInfo (){ CurrencyCode="JPY",CurrencyName = "日元",Rate = 0.0500M },
-                    new CurrencyInfo (){ CurrencyCode="HKD",CurrencyName = "港币",Rate = 0.9500M },
+                    new(){ CurrencyCode="USD",CurrencyName = "美元",Rate = 7.5000M },
+                    new(){ CurrencyCode="EUR",CurrencyName = "欧元",Rate = 8.0000M },
+                    new(){ CurrencyCode="GBP",CurrencyName = "英镑",Rate = 9.5000M },
+                    new(){ CurrencyCode="JPY",CurrencyName = "日元",Rate = 0.0500M },
+                    new(){ CurrencyCode="HKD",CurrencyName = "港币",Rate = 0.9500M },
                 };
 
             var currencyRate = await _juHeApi.PostItemRateAsync(currencyInfos.Select(it => it.CurrencyCode!).ToArray());
@@ -4433,8 +4513,8 @@ namespace OASystem.API.OAMethodLib
                     //if (cacheRate.Rate != currRate)
                     //{
                     //    isSendMsg = true;
-                        //>团组归属:<font color='info'>{groupName}</font>
-                        msgContent.AppendLine($">- {cacheRate.CurrencyName}汇率(页面保存):{cacheRate.Rate:#0.0000}  / 实时汇率(接口保存,已上浮1.0350):{currRate:#0.0000}【原接口输出汇率为:{liveRate.Rate:#0.0000}】");
+                    //>团组归属:<font color='info'>{groupName}</font>
+                    msgContent.AppendLine($">- {cacheRate.CurrencyName}汇率(页面保存):{cacheRate.Rate:#0.0000}  / 实时汇率(接口保存,已上浮1.0350):{currRate:#0.0000}【原接口输出汇率为:{liveRate.Rate:#0.0000}】");
                     //}
                 }
                 return (isSendMsg, msgContent.ToString(), liveRates);

+ 9 - 1
OASystem/OASystem.Domain/Dtos/Groups/EnterExitCostDto.cs

@@ -14,6 +14,7 @@ namespace OASystem.Domain.Dtos.Groups
     public class EnterExitCostDataSourceDto : PortDtoBase
     {
         //public int ProvinceId { get; set; } = 1408;
+
     }
 
     /// <summary>
@@ -478,7 +479,15 @@ namespace OASystem.Domain.Dtos.Groups
         public string? Remark { get; set; }
     }
 
+    #region 境外用车
+
+    public class GetEnterExitCostOVFeeSaveDto: CityIntervalInfo
+    {
+        public int GroupId { get; set; }
+        public int CurrUserId { get; set; }
+    }
 
+    #endregion
 
     #region Mobile Request Dto
 
@@ -893,7 +902,6 @@ namespace OASystem.Domain.Dtos.Groups
 
     #endregion
 
-
     #region Draft Mobile Request Dto
 
     //EnterExitCostDraftMobileNameData

+ 34 - 0
OASystem/OASystem.Domain/Dtos/Groups/VisaProcessDtos.cs

@@ -117,4 +117,38 @@ namespace OASystem.Domain.Dtos.Groups
         public bool IsCompleted { get; set; } = false;
     }
 
+    public class ConfProcessSetActualDoneDto
+    {
+        /// <summary>
+        /// 节点Id
+        /// </summary>
+        public int NodeId { get; set; }
+
+        /// <summary>
+        /// 参与人
+        /// </summary>
+        public List<int> Participators { get; set; }
+
+        /// <summary>
+        /// 是否有文件(如需要)
+        /// </summary>
+        public bool IsFileUp { get; set; } = false;
+
+        /// <summary>
+        /// 实际完成时间
+        /// 情况1:正常使用
+        /// 情况2:IsFileUp == true,设置值
+        /// </summary>
+        public string ActualDone { get; set; }
+
+        /// <summary>
+        /// 当前用户Id  
+        /// </summary>
+        public int CurrUserId { get; set; }
+    }
+
+    public class ConfProcessChangeNodeTempSaveDto : ConfProcessOverInfoView
+    {
+        public int CurrUserId { get; set; }
+    }
 }

+ 38 - 6
OASystem/OASystem.Domain/Entities/Customer/Crm_DeleClient.cs

@@ -702,13 +702,45 @@ namespace OASystem.Domain.Entities.Customer
         public string MilSkill { get; set; }
 
         /// <summary>
-        /// 服役时间(单位:xxxx年xx月xx日) 起
+        /// 服役时间(单位:xxxx年xx月xx日) 起
         /// </summary>
-        public DateTime? ServeTimeBegin { get; set; }
-        /// <summary>
-        /// 服役时间(单位:xxxx年xx月xx日)止
-        /// </summary>
-        public DateTime? ServeTimeEnd { get; set; }
+        public string ServeDuration { get; set; }
+
+    }
+
+    /// <summary>
+    /// 拒签记录
+    /// </summary>
+    public class VisaRefusalRecord
+    {
+        public string Country { get; set; }
+
+        public DateTime Date { get; set; }
+
+        public string Reason { get; set; }
+    }
+
+    /// <summary>
+    /// 旅行历史
+    /// </summary>
+    public class TravelHistory
+    {
+        public string Country { get; set; }
+
+        public DateTime ArrivalDate { get; set; }
+
+        public DateTime DepartureDate { get; set; }
+
+        public string VisaType { get; set; }
+    }
+
+    /// <summary>
+    /// 已出访的国家
+    /// </summary>
+    public class CountryVisited
+    {
+        public string Country { get; set; }
 
+        public string VisitDate { get; set; }
     }
 }

+ 268 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_ConfProcess.cs

@@ -0,0 +1,268 @@
+using AutoMapper.Configuration.Annotations;
+using OASystem.Domain.Enums;
+using System.ComponentModel;
+
+namespace OASystem.Domain.Entities.Groups
+{
+    /// <summary>
+    /// 会务流程总览
+    /// </summary>
+    [SugarTable("Grp_ConfProcessOverview", "会务流程总览")]
+    public class Grp_ConfProcessOverview : EntityBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        [SugarColumn(ColumnName = "GroupId", ColumnDescription = "团组Id", IsNullable = true, ColumnDataType = "int")]
+        public int GroupId { get; set; }
+
+        /// <summary>
+        /// 流程顺序
+        /// </summary>
+        [SugarColumn(ColumnName = "ProcessOrder", ColumnDescription = "流程顺序", IsNullable = true, ColumnDataType = "int")]
+        public int ProcessOrder { get; set; }
+
+        /// <summary>
+        /// 流程类型 
+        /// </summary>
+        [SugarColumn(ColumnName = "ProcessType", ColumnDescription = "流程类型", ColumnDataType = "int")]
+        public ConfProcessType ProcessType { get; set; }
+
+        /// <summary>
+        /// 整体状态 
+        /// </summary>
+        [SugarColumn(ColumnName = "OverallStatus", ColumnDescription = "流程整体状态", ColumnDataType = "int")]
+        public ProcessStatus OverallStatus { get; set; } = ProcessStatus.UnStarted;
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        [SugarColumn(ColumnName = "StartTime", ColumnDescription = "开始时间", IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        [SugarColumn(ColumnName = "EndTime", ColumnDescription = "结束时间", IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 更新人 
+        /// </summary>
+        [SugarColumn(ColumnName = "UpdatedUserId", ColumnDescription = "更新人", IsNullable = true, ColumnDataType = "int")]
+        public int UpdatedUserId { get; set; }
+
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        [SugarColumn(ColumnName = "UpdatedTime", ColumnDescription = "更新时间", ColumnDataType = "datetime")]
+        public DateTime UpdatedTime { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 节点集合 - 流程包含的所有节点(导航属性)
+        /// </summary>
+        [Ignore]
+        [Navigate(NavigateType.OneToMany, nameof(Grp_ProcessNode.ProcessId))]
+        public List<Grp_ConfProcessNode> Nodes { get; set; } = new List<Grp_ConfProcessNode>();
+
+        public Grp_ConfProcessOverview() { }
+
+        public static Grp_ConfProcessOverview Create(int groupId, int processOrder, ProcessStatus overallStatus, int currUserId, List<Grp_ConfProcessNode> nodes)
+        {
+            return new Grp_ConfProcessOverview
+            {
+                GroupId = groupId,
+                ProcessOrder = processOrder,
+                ProcessType = ConfProcessType.Conference,
+                OverallStatus = overallStatus,
+                StartTime = DateTime.Now,
+                UpdatedUserId = currUserId,
+                CreateUserId = currUserId,
+                Nodes = nodes
+            };
+        }
+    }
+
+    /// <summary>
+    /// 会务流程节点
+    /// </summary>
+    [SugarTable("Grp_ConfProcessNode", "会务流程节点")]
+    public class Grp_ConfProcessNode : EntityBase
+    {
+        /// <summary>
+        /// 流程ID
+        /// </summary>
+        [SugarColumn(ColumnName = "ProcessId", ColumnDescription = "流程ID", IsNullable = true, ColumnDataType = "int")]
+        public int ProcessId { get; set; }
+
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        [SugarColumn(ColumnName = "NodeName", ColumnDescription = "节点名称", ColumnDataType = "varchar(100)")]
+        public string NodeName { get; set; }
+
+        /// <summary>
+        /// 节点描述提示
+        /// </summary>
+        [SugarColumn(ColumnName = "NodeDescTips", ColumnDescription = "节点描述提示", ColumnDataType = "varchar(300)")]
+        public string NodeDescTips { get; set; }
+
+        /// <summary>
+        /// 节点顺序 
+        /// </summary>
+        [SugarColumn(ColumnName = "NodeOrder", ColumnDescription = "节点顺序", ColumnDataType = "int")]
+        public int NodeOrder { get; set; }
+
+        /// <summary>
+        /// 节点状态 
+        /// </summary>
+        [SugarColumn(ColumnName = "OverallStatus", ColumnDescription = "节点状态", ColumnDataType = "int")]
+        public ProcessStatus OverallStatus { get; set; } = ProcessStatus.UnStarted;
+
+        /// <summary>
+        /// 参与人 
+        /// </summary>
+        [SugarColumn(ColumnName = "Participator", ColumnDescription = "参与人 [1,2,3]", IsNullable = true, ColumnDataType = "varchar(200)")]
+        public string Participator { get; set; }
+
+        /// <summary>
+        /// 操作人 
+        /// </summary>
+        [SugarColumn(ColumnName = "Operator", ColumnDescription = "操作人", IsNullable = true, ColumnDataType = "int")]
+        public int? Operator { get; set; }
+
+        /// <summary>
+        /// 操作时间 
+        /// </summary>
+        [SugarColumn(ColumnName = "OperationTime", ColumnDescription = "操作时间", IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime? OperationTime { get; set; }
+
+        /// <summary>
+        /// 实际完成时间 
+        /// </summary>
+        [SugarColumn(ColumnName = "ActualDone", ColumnDescription = "实际完成时间", IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime? ActualDone { get; set; }
+
+        /// <summary>
+        /// 是否为当前节点
+        /// </summary>
+        [SugarColumn(ColumnName = "IsCurrent", ColumnDescription = "是否为当前节点", ColumnDataType = "bit")]
+        [DefaultValue(false)]
+        public bool IsCurrent { get; set; }
+
+        /// <summary>
+        /// 是否上传文件
+        /// </summary>
+        [SugarColumn(ColumnName = "IsFileUp", ColumnDescription = "是否上传文件", ColumnDataType = "bit")]
+        [DefaultValue(false)]
+        public bool IsFileUp { get; set; }
+
+        public Grp_ConfProcessNode() { }
+
+        /// <summary>
+        /// 是否启用文件上传
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        public bool IsEnaFileUpBtn { get; set; }
+
+        /// <summary>
+        /// 参与人
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        public List<int> Participators { get; set; }
+
+        /// <summary>
+        /// Create
+        /// </summary>
+        /// <param name="nodeOrder">排序</param>
+        /// <param name="nodeName">名称</param>
+        /// <param name="nodeDescTips">描述提示</param>
+        /// <param name="status">状态</param>
+        /// <param name="isCurrent">是否是当前节点</param>
+        /// <param name="isFileUp">是否上传文件</param>
+        /// <param name="currUserId">当前用户Id</param>
+        /// <param name="participators">参与人</param>
+        /// <param name="remark">备注</param>
+        /// <returns></returns>
+        public static Grp_ConfProcessNode Create(int nodeOrder, string nodeName, string nodeDescTips, ProcessStatus status, bool isCurrent, bool isFileUp, int currUserId,
+            List<int> participators, string remark = null)
+        {
+            bool isEnaFileUpBtn = isFileUp;
+
+            return new Grp_ConfProcessNode
+            {
+                NodeOrder = nodeOrder,
+                NodeName = nodeName,
+                NodeDescTips = nodeDescTips,
+                OverallStatus = status,
+                IsCurrent = isCurrent,
+                Participators = participators,
+                IsEnaFileUpBtn = isEnaFileUpBtn,
+                IsFileUp = isFileUp,
+                CreateUserId = currUserId,
+                Remark = remark
+            };
+        }
+
+    }
+    public class ParticipatorInfo
+    {
+        public int UserId { get; set; }
+        public string UserName { get; set; }
+    }
+
+    /// <summary>
+    /// 团组流程操作日志
+    /// </summary>
+    [SugarTable("Grp_ConfProcessLog", "团组会务流程总览操作日志")]
+    public class Grp_ConfProcessLog : EntityBase
+    {
+        /// <summary>
+        /// 流程ID
+        /// </summary>
+        [SugarColumn(ColumnName = "ProcessId", ColumnDescription = "流程ID", IsNullable = true, ColumnDataType = "int")]
+        public int? ProcessId { get; set; }
+
+        /// <summary>
+        /// 节点ID
+        /// </summary>
+        [SugarColumn(ColumnName = "NodeId", ColumnDescription = "节点ID", IsNullable = true, ColumnDataType = "int")]
+        public int? NodeId { get; set; }
+
+        /// <summary>
+        /// 团组ID
+        /// </summary>
+        [SugarColumn(ColumnName = "GroupId", ColumnDescription = "团组ID", IsNullable = true, ColumnDataType = "int")]
+        public int GroupId { get; set; }
+
+        /// <summary>
+        /// 操作类型
+        /// </summary>
+        [SugarColumn(ColumnName = "OpType", ColumnDescription = "操作类型", ColumnDataType = "varchar(50)")]
+        public string OpType { get; set; }
+
+        /// <summary>
+        /// 操作描述
+        /// </summary>
+        [SugarColumn(ColumnName = "OpDesc", ColumnDescription = "操作描述", ColumnDataType = "varchar(500)")]
+        public string OpDesc { get; set; }
+
+        /// <summary>
+        /// 变更前数据
+        /// </summary>
+        [SugarColumn(ColumnName = "BeforeData", ColumnDescription = "变更前数据", IsNullable = true, ColumnDataType = "nvarchar(max)")]
+        public string BeforeData { get; set; }
+
+        /// <summary>
+        /// 变更后数据
+        /// </summary>
+        [SugarColumn(ColumnName = "AfterData", ColumnDescription = "变更后数据", IsNullable = true, ColumnDataType = "nvarchar(max)")]
+        public string AfterData { get; set; }
+
+        /// <summary>
+        /// 变更字段
+        /// </summary>
+        [SugarColumn(ColumnName = "ChgFields", ColumnDescription = "变更字段", IsNullable = true, ColumnDataType = "varchar(500)")]
+        public string ChgFields { get; set; }
+    }
+}

+ 8 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_EnterExitCost.cs

@@ -280,5 +280,13 @@
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
         public string LastUpdateTime { get; set; }
+
+        /// <summary>
+        /// 城市区间费用详情 
+        /// json 格式存储 CityIntervalInfo
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(max)")]
+        public string CityIntervalFeeDetails { get; set; }
+
     }
 }

+ 13 - 6
OASystem/OASystem.Domain/Enums/GroupProcessType.cs

@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.ComponentModel;
 
 namespace OASystem.Domain.Enums
 {
@@ -67,4 +62,16 @@ namespace OASystem.Domain.Enums
         [Description("已完成")]
         Completed = 3
     }
+
+    /// <summary>
+    /// 会务流程类型
+    /// </summary>
+    public enum ConfProcessType
+    {
+        /// <summary>
+        /// 会务
+        /// </summary> 
+        [Description("会务")]
+        Conference = 1,
+    }
 }

+ 150 - 0
OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostView.cs

@@ -1290,4 +1290,154 @@ namespace OASystem.Domain.ViewModels.Groups
         /// </summary>
         public string LastUpdTime { get; set; }
     }
+
+    #region 境外用车
+
+    /// <summary>
+    /// 城市区间费用详情
+    /// </summary>
+    public class CityIntervalInfo
+    {
+        /// <summary>
+        /// 接送机费用合计
+        /// </summary>
+        public decimal APTFeeTotal { get; set; } = 0.00m;
+
+        /// <summary>
+        /// 接送机费用详情
+        /// </summary>
+        public List<RoundTripTransferInfo> APTFeeDetails { get; set; }
+
+        /// <summary>
+        /// 拉车费用合计
+        /// </summary>
+        public decimal PullCartFeeTotal { get; set; } = 0.00m;
+
+        /// <summary>
+        /// 拉车费用详情
+        /// </summary>
+        public List<PullCartInfo> PullCartFeeDetails { get; set; }
+
+        /// <summary>
+        /// 火车费用合计
+        /// </summary>
+        public decimal TrainFeeTotal { get; set; } = 0.00m;
+
+        /// <summary>
+        /// 火车费用详情
+        /// </summary>
+        public List<TrainInfo> TrainFeeDetails { get; set; }
+
+        /// <summary>
+        /// 城市机票费用合计
+        /// </summary>
+        public decimal CityAirTicketFeeTotal { get; set; } = 0.00m;
+
+        /// <summary>
+        /// 城市机票费用详情
+        /// </summary>
+        public List<CityAirTicketInfo> CityAirTicketFeeDetails { get; set; }
+
+        /// <summary>
+        /// 币种信息
+        /// </summary>
+        public List<CurrencyInfo> Currencies { get; set; }
+
+        /// <summary>
+        /// 最后操作人
+        /// </summary>
+        public string LastUpdateUserName  { get; set; }
+
+        /// <summary>
+        /// 最后操作时间
+        /// </summary>
+        public string LastUpdateTime { get; set; }
+
+        /// <summary>
+        /// 创建人
+        /// </summary>
+        public string CreateUserName { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public string CreateTime { get; set; }
+    }
+
+    /// <summary>
+    /// 接送机
+    /// </summary>
+    public class RoundTripTransferInfo : CityIntervalBase
+    {
+        /// <summary>
+        /// 境外用车服务类型(接送机) Id
+        /// </summary>
+        public int OvId { get; set; }
+
+        /// <summary>
+        /// 导游成本
+        /// </summary>
+        public decimal GuideCost { get; set; }
+
+        /// <summary>
+        /// 其他成本
+        /// </summary>
+        public decimal OtherCost { get; set; }
+
+        /// <summary>
+        /// 服务次数
+        /// </summary>
+        public int ServiceCount { get; set; }
+
+    }
+
+    /// <summary>
+    /// 拉车
+    /// </summary>
+    public class PullCartInfo : CityIntervalBase { }
+
+    /// <summary>
+    /// 火车
+    /// </summary>
+    public class TrainInfo : CityIntervalBase { }
+
+    /// <summary>
+    /// 城市机票
+    /// </summary>
+    public class CityAirTicketInfo : CityIntervalBase { }
+
+
+    public class CityIntervalBase
+    {
+        public int No { get; set; }
+
+        /// <summary>
+        /// 成本
+        /// </summary>
+        public decimal Cost { get; set; }
+
+        /// <summary>
+        /// 系数
+        /// </summary>
+        public decimal Coefficient { get; set; }
+
+        /// <summary>
+        /// 国家、城市 成本币种
+        /// </summary>
+        public string CurrencyName { get; set; }
+
+        /// <summary>
+        /// 报价
+        /// </summary>
+        public decimal Quote { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string Remark { get; set; }
+    }
+
+
+    #endregion
+
 }

+ 65 - 0
OASystem/OASystem.Domain/ViewModels/Groups/ProcessOverView.cs

@@ -0,0 +1,65 @@
+using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.Enums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.Groups
+{
+    public class ProcessOverView
+    {
+    }
+
+
+    public class ConfProcessOverInfo {
+
+        /// <summary>
+        /// 是否可切换节点模板
+        /// </summary>
+        public bool IsNodeTemplSwitchable { get; set; }
+
+        public int TempId
+        {
+            get
+            {
+                int tempId = 0;
+                if (ConfProcess.FirstOrDefault().Nodes.Count == 8) tempId = 1;
+                else if (ConfProcess.FirstOrDefault().Nodes.Count == 6) tempId = 2;
+                return tempId;
+            }
+        }
+
+        public List<ConfProcessOverInfoView> ConfProcess { get; set; }
+    }
+
+    public class ConfProcessOverInfoView
+    { 
+        public int Id { get; set; }
+
+        
+
+        public int GroupId { get; set; }
+        public ConfProcessType ProcessType { get; set; }
+        public string ProcessName { get; set; }
+        public List<ConfProcessNodeInfoView> Nodes { get; set; }
+    }
+    public class ConfProcessNodeInfoView
+    {
+        public int Id { get; set; }
+        public int ProcessId { get; set; }
+        public int NodeOrder { get; set; }
+        public string NodeName { get; set; }
+        public string NodeDescTips { get; set; }
+        public ProcessStatus OverallStatus { get; set; }
+        public List<int> Participators { get; set; }
+        public string StatusText { get; set; }
+        public string Operator { get; set; }
+        public string OpeateTime { get; set; }
+        public string ActualDone { get; set; }
+
+        public bool IsEnaFileUpBtn { get; set; }
+        public bool IsFileUp { get; set; }
+    }
+}

Разница между файлами не показана из-за своего большого размера
+ 1080 - 274
OASystem/OASystem.Infrastructure/Repositories/Groups/ProcessOverviewRepository.cs


+ 52 - 4
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/CompanyDailyKpiRepository.cs

@@ -97,8 +97,10 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
         /// <param name="depName">部门名称 空查询全部</param>
         /// <returns></returns>
         public async Task<(bool Success, string Message, List<string> Departments, List<KpiTempDepartmentInfo> DepartmentsWithJobs)>
-            KpiDepartmentsAndJobs(string depName = "")
+            KpiDepartmentsAndJobs(List<string> depNames)
         {
+            if (depNames?.Any() != true) return (false, "请求部门为空", new List<string>(), new List<KpiTempDepartmentInfo>());
+
             var departments = new List<string>();
             var departmentsWithJobs = new List<KpiTempDepartmentInfo>();
             var config = await _sqlSugar.Queryable<Sys_SetDataType>()
@@ -146,7 +148,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                     return new { Department = dept, Job = job };
                 })
                 .Where(x => x.Department != "未分类")
-                .WhereIF(!string.IsNullOrEmpty(depName),x=> x.Department.Equals(depName))
+                .WhereIF(depNames.Any(), x => depNames.Contains(x.Department))
                 .GroupBy(x => x.Department)
                 .Select(g => new KpiTempDepartmentInfo()
                 {
@@ -166,7 +168,54 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
         /// <returns></returns>
         public async Task<JsonView> InitAsync()
         {
-            var result = await KpiDepartmentsAndJobs("财务部");
+            var depNames = new List<string> { "财务部", "市场部" };
+            var result = await KpiDepartmentsAndJobs(depNames);
+            if (!result.Success)
+            {
+                _jv.Msg = result.Message;
+                return _jv;
+            }
+
+            var userInfos = await _sqlSugar.Queryable<Sys_Users>()
+                .LeftJoin<Sys_JobPost>((u, jp) => u.JobPostId == jp.Id)
+                .LeftJoin<Sys_Department>((u, jp, d) => u.DepId == d.Id)
+                .LeftJoin<Sys_Company>((u, jp, d, c) => u.CompanyId == c.Id)
+                .Where((u, jp, d, c) => u.IsDel == 0)
+                .Select((u, jp, d, c) => new
+                {
+                    UserId = u.Id,
+                    u.CompanyId,
+                    c.CompanyName,
+                    u.DepId,
+                    d.DepName,
+                    u.JobPostId,
+                    jp.JobName,
+                    UserName = u.CnName
+                })
+                .OrderBy(u => u.CompanyId)
+                .ToListAsync();
+
+            var jobNames = result.DepartmentsWithJobs
+                .SelectMany(x => x.JobNames)
+                .ToList();
+
+            var view = userInfos.Where(x => jobNames.Contains(x.JobName))
+                .Select(x => new KpiTempUserInfo() { Id = x.UserId, DepName = x.DepName, JobName = x.JobName, Name = x.UserName })
+                .ToList();
+            _jv.Code = StatusCodes.Status200OK;
+            _jv.Data = view;
+            _jv.Msg = $"操作成功";
+            return _jv;
+        }
+
+        /// <summary>
+        /// 策划部基础数据
+        /// </summary>
+        /// <returns></returns>
+        public async Task<JsonView> PlanningInitAsync()
+        {
+            var depNames = new List<string> { "策划部" };
+            var result = await KpiDepartmentsAndJobs(depNames);
             if (!result.Success)
             {
                 _jv.Msg = result.Message;
@@ -292,7 +341,6 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                         });
                     });
                 });
-
             }
             _jv.Code = StatusCodes.Status200OK;
             _jv.Data = info;