yuanrf пре 8 месеци
родитељ
комит
f64f0f0087
28 измењених фајлова са 2709 додато и 1985 уклоњено
  1. 3 2
      OASystem/EntitySync/Program.cs
  2. 10 0
      OASystem/OASystem.Api/Controllers/BusinessController.cs
  3. 331 176
      OASystem/OASystem.Api/Controllers/FinancialController.cs
  4. 282 853
      OASystem/OASystem.Api/Controllers/GroupsController.cs
  5. 768 16
      OASystem/OASystem.Api/Controllers/StatisticsController.cs
  6. 0 1
      OASystem/OASystem.Api/Controllers/SystemController.cs
  7. 17 19
      OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskAssignment.cs
  8. 11 11
      OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskNotification.cs
  9. 4 3
      OASystem/OASystem.Api/Program.cs
  10. 7 0
      OASystem/OASystem.Domain/AutoMappers/_baseMappingProfile.cs
  11. 12 0
      OASystem/OASystem.Domain/Dtos/Financial/PostPayRequestByDateRangeDto.cs
  12. 6 101
      OASystem/OASystem.Domain/Dtos/Groups/HotelReservationsDto.cs
  13. 195 0
      OASystem/OASystem.Domain/Dtos/Statistics/MarketingSalesDto.cs
  14. 2 1
      OASystem/OASystem.Domain/Entities/Financial/Fin_ForeignReceivables.cs
  15. 2 0
      OASystem/OASystem.Domain/Entities/Groups/Grp_HotelReservations.cs
  16. 144 0
      OASystem/OASystem.Domain/Entities/Groups/Grp_HotelReservationsContent.cs
  17. 57 0
      OASystem/OASystem.Domain/Entities/Groups/Grp_VisitingClients.cs
  18. 34 0
      OASystem/OASystem.Domain/Enums/BusStatusCode.cs
  19. 31 0
      OASystem/OASystem.Domain/Result.cs
  20. 7 0
      OASystem/OASystem.Domain/ViewModels/Financial/Fin_DailyFeePaymentView.cs
  21. 146 53
      OASystem/OASystem.Domain/ViewModels/Groups/HotelReservationsByDiIdView.cs
  22. 54 0
      OASystem/OASystem.Domain/ViewModels/Groups/VisitingClientsView.cs
  23. 62 30
      OASystem/OASystem.Domain/ViewModels/Statistics/GroupStatementView.cs
  24. 37 0
      OASystem/OASystem.Domain/ViewModels/Statistics/MarketingSalesView.cs
  25. 22 0
      OASystem/OASystem.Domain/ViewModels/Statistics/MonthlyTimeSegment.cs
  26. 228 718
      OASystem/OASystem.Infrastructure/Repositories/Groups/HotelPriceRepository.cs
  27. 84 1
      OASystem/OASystem.Infrastructure/Repositories/Groups/TeamRateRepository.cs
  28. 153 0
      OASystem/OASystem.Infrastructure/Repositories/Groups/VisitingClientsRepository.cs

+ 3 - 2
OASystem/EntitySync/Program.cs

@@ -131,8 +131,9 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Grp_InvertedList), //倒推表 
     //typeof(Grp_InvertedListVisaCountry), //倒推表签证国家 
     //typeof(Grp_VisaFeeInfo),  //签证费用info 
-    typeof(Grp_HotelInquiry),  //酒店询价 
-
+    //typeof(Grp_HotelInquiry),  //酒店询价 
+    //typeof(Grp_HotelReservationsContent),  //酒店费用子表
+     typeof(Grp_VisitingClients),  //拜访团组客户
 
 });
 Console.WriteLine("数据库结构同步完成!");

+ 10 - 0
OASystem/OASystem.Api/Controllers/BusinessController.cs

@@ -566,6 +566,7 @@ Where c.ConfListId = {0}", ConfId);
         #endregion
 
 
+
         #region 文件删除
         /// <summary>
         ///  文件操作 
@@ -714,5 +715,14 @@ Where c.ConfListId = {0}", ConfId);
 
             return Ok(jw);
         }
+
+
+        [HttpGet]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public IActionResult CodeTest()
+        { 
+            
+            return Ok(JsonView(true, "测试成功!"));
+        }
     }
 }

+ 331 - 176
OASystem/OASystem.Api/Controllers/FinancialController.cs

@@ -43,6 +43,7 @@ using NPOI.HPSF;
 using System.Data.OleDb;
 using Org.BouncyCastle.Crypto;
 using OfficeOpenXml;
+using Org.BouncyCastle.Asn1.Crmf;
 
 namespace OASystem.API.Controllers
 {
@@ -2034,7 +2035,7 @@ namespace OASystem.API.Controllers
                 }
 
                 tree_Fin_DailyFeePaymentResult dailyResult = PayRequest_DailyByDateRange(dto.Status, checkedView.DailyPaymentIds, dto.beginDt, dto.endDt);
-                tree_Group_DailyFeePaymentResult groupResult = PayRequest_GroupPaymentByDateRange(dto.Status, checkedView.GroupIds, dto.beginDt, dto.endDt);
+                tree_Group_DailyFeePaymentResult groupResult = PayRequest_GroupPaymentByDateRange(dto.Status, checkedView.GroupIds, checkedView.HotelSubIds, dto.beginDt, dto.endDt);
 
                 stopwatch.Stop();
                 return Ok(JsonView(true, $"查询成功!耗时{stopwatch.ElapsedMilliseconds / 1000}s", new { daily = dailyResult, group = groupResult }));
@@ -2092,7 +2093,7 @@ namespace OASystem.API.Controllers
         /// <param name="beginDt"></param>
         /// <param name="endDt"></param>
         /// <returns></returns>
-        private tree_Group_DailyFeePaymentResult PayRequest_GroupPaymentByDateRange(int status, List<int> _groupIds, string beginDt, string endDt)
+        private tree_Group_DailyFeePaymentResult PayRequest_GroupPaymentByDateRange(int status, List<int> _groupIds,List<int> _hotelSubIds, string beginDt, string endDt)
         {
             tree_Group_DailyFeePaymentResult _DailyFeePaymentResult = new tree_Group_DailyFeePaymentResult();
             List<tree_Group_DailyFeePaymentPageListView> dataList = new List<tree_Group_DailyFeePaymentPageListView>();
@@ -2101,6 +2102,12 @@ namespace OASystem.API.Controllers
 
             if (status == 2)
             {
+                if (_hotelSubIds.Count > 1)
+                {
+                    var hrIds = _sqlSugar.Queryable<Grp_HotelReservationsContent>().Where(it => _hotelSubIds.Contains(it.Id)).Select(it => it.HrId).Distinct().ToList();
+                    _groupIds = _sqlSugar.Queryable<Grp_CreditCardPayment>().Where(it => it.CTable == 76 && hrIds.Contains(it.CId)).Select(it => it.Id).ToList();
+                }
+
                 if (_groupIds.Count < 1)
                 {
                     _DailyFeePaymentResult.dataList = new List<tree_Group_DailyFeePaymentPageListView>();
@@ -2127,6 +2134,7 @@ namespace OASystem.API.Controllers
             var countryFeeDatas = _sqlSugar.Queryable<Grp_NationalTravelFee>().Where(it => it.IsDel == 0).ToList();
 
             var hotelDatas = _sqlSugar.Queryable<Grp_HotelReservations>().Where(it => it.IsDel == 0 && groupIds.Contains(it.DiId)).ToList();
+            var hotelContentDatas = _sqlSugar.Queryable<Grp_HotelReservationsContent>().Where(it => it.IsDel == 0 && it.IsPay == 0 && groupIds.Contains(it.DiId)).ToList();
             var opDatas = _sqlSugar.Queryable<Grp_CarTouristGuideGroundReservations>().Where(it => it.IsDel == 0 && groupIds.Contains(it.DiId)).ToList();
             var visaDatas = _sqlSugar.Queryable<Grp_VisaInfo>().Where(it => it.IsDel == 0 && groupIds.Contains(it.DIId)).ToList();
             var ioaDatas = _sqlSugar.Queryable<Grp_InvitationOfficialActivities>().Where(it => it.IsDel == 0 && groupIds.Contains(it.DiId)).ToList();
@@ -2246,46 +2254,104 @@ namespace OASystem.API.Controllers
                             break;
                     }
 
-                    //
+
                     bool status1 = false;
                     if (_groupIds != null)
                     {
                         status1 = _groupIds.Contains(payInfo.Id);
                     }
 
-                    string payeeStr = string.Format(@" {0},开户行:{1},银行卡号:{2} ", string.IsNullOrEmpty(payInfo.Payee) ? "-" : payInfo.Payee,
-                        string.IsNullOrEmpty(payInfo.OtherBankName) ? "-" : payInfo.OtherBankName,
-                        string.IsNullOrEmpty(payInfo.OtherSideNo) ? "-" : payInfo.OtherSideNo);
+                    if (payInfo.CTable == 76) //酒店单独处理
+                    {
+                        var hotelContents = hotelContentDatas.Where(it => it.HrId == payInfo.CId);
+                        List<Group_DailyFeePaymentContentInfolView> childInfos = new List<Group_DailyFeePaymentContentInfolView>();
+                        foreach (var hotelContent in hotelContents)
+                        {
+                            string subPriceName = "";
+                            if (hotelContent.PriceType == 1) subPriceName = "房费";
+                            else if (hotelContent.PriceType == 2) subPriceName = "早餐";
+                            else if (hotelContent.PriceType == 3) subPriceName = "地税";
+                            else if (hotelContent.PriceType == 4) subPriceName = "城市税";
 
+                            if (string.IsNullOrEmpty(subPriceName)) subPriceName = priName;
+                            else subPriceName = $"{priName.Replace("]","")}-{subPriceName}]";
 
-                    decimal _PaymentAmount = (payInfo.PayMoney / 100) * payInfo.PayPercentage;//此次付款金额
-                    decimal _CNYSubTotalAmount = _PaymentAmount * payInfo.DayRate;//此次付款金额
-                    _CNYSubTotalAmount = Convert.ToDecimal(_CNYSubTotalAmount.ToString("#0.00"));
-                    var childInfo = new Group_DailyFeePaymentContentInfolView()
-                    {
-                        IsChecked = status1,
-                        Id = payInfo.Id,
-                        Payee = payeeStr,
-                        RowNumber = rouNumber,
-                        Applicant = userDatas.Find(it => it.Id == payInfo.CreateUserId)?.CnName ?? "",
-                        ApplicantDt = payInfo.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"),
-                        PayType = setDatas.Find(it => it.Id == payInfo.PayDId)?.Name ?? "",
-                        TransferMark = orbitalPrivateTransfer,
-                        PriceName = priName,
-                        ModuleName = setDatas.Find(it => it.Id == payInfo.CTable)?.Name ?? "",
-                        PayCurrCode = setDatas.Find(it => it.Id == payInfo.PaymentCurrency)?.Name ?? "",
-                        PaymentAmount = _PaymentAmount,
-                        PayRate = payInfo.DayRate,
-                        CNYSubTotalAmount = _CNYSubTotalAmount
-                    };
+                            string payeeStr1 = string.Format(@" {0},开户行:{1},银行卡号:{2} ",
+                            string.IsNullOrEmpty(hotelContent.Payee) ? "-" : hotelContent.Payee,
+                            string.IsNullOrEmpty(hotelContent.OtherBankName) ? "-" : hotelContent.OtherBankName,
+                            string.IsNullOrEmpty(hotelContent.OtherSideNo) ? "-" : hotelContent.OtherSideNo);
+
+                            decimal _PaymentAmount1 = hotelContent.Price;//此次付款金额
+                            decimal _CNYSubTotalAmount1 = _PaymentAmount1 * hotelContent.Rate;//此次付款金额
+                            _CNYSubTotalAmount1 = Convert.ToDecimal(_CNYSubTotalAmount1.ToString("#0.00"));
+
+                            //酒店子项Id选中状态更改
+                            if (_hotelSubIds != null) status1 = _hotelSubIds.Contains(hotelContent.Id);
+
+                            var childInfo1 = new Group_DailyFeePaymentContentInfolView()
+                            {
+                                IsChecked = status1,
+                                Id = payInfo.Id,
+                                HotelSubId = hotelContent.Id,
+                                Payee = payeeStr1,
+                                RowNumber = rouNumber,
+                                Applicant = userDatas.Find(it => it.Id == payInfo.CreateUserId)?.CnName ?? "",
+                                ApplicantDt = payInfo.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                                PayType = setDatas.Find(it => it.Id == payInfo.PayDId)?.Name ?? "",
+                                TransferMark = orbitalPrivateTransfer,
+                                PriceName = subPriceName,
+                                ModuleName = setDatas.Find(it => it.Id == payInfo.CTable)?.Name ?? "",
+                                PayCurrCode = setDatas.Find(it => it.Id == hotelContent.Currency)?.Name ?? "",
+                                PaymentAmount = _PaymentAmount1,
+                                PayRate = hotelContent.Rate,
+                                CNYSubTotalAmount = _CNYSubTotalAmount1
+                            };
+                            string remaksDescription1 = $"【{childInfo1.PayType}】【{childInfo1.ModuleName}】{rouNumber}、[申请人:{childInfo1.Applicant}]{subPriceName}[收款方:{childInfo1.Payee}] {childInfo1.PayCurrCode} {_PaymentAmount1.ToString("#0.00")}、CNY:{childInfo1.CNYSubTotalAmount.ToString("#0.00")}(团组:{groupInfo.TeamName})";
+
+                            childInfo1.RemaksDescription = remaksDescription1;
+                            childInfos.Add(childInfo1);
+                            rouNumber++;
+                        }
+
+                        childList.AddRange(childInfos);
 
-                    //string remaksDescription = $"【{childInfo.PayType}】【{childInfo.ModuleName}】{rouNumber}、[申请人:{childInfo.Applicant}][收款方:{childInfo.Payee}]{priName},{payInfo.OtherBankName},{payInfo.OtherSideNo}[{payInfo.ConsumptionPatterns}] {childInfo.PayCurrCode} {payInfo.PayMoney.ToString("#0.00")}、CNY:{childInfo.CNYSubTotalAmount.ToString("#0.00")}(团组:{groupInfo.TeamName})";
+                    }
+                    else
+                    {
+                        string payeeStr = string.Format(@" {0},开户行:{1},银行卡号:{2} ",
+                            string.IsNullOrEmpty(payInfo.Payee) ? "-" : payInfo.Payee,
+                            string.IsNullOrEmpty(payInfo.OtherBankName) ? "-" : payInfo.OtherBankName,
+                            string.IsNullOrEmpty(payInfo.OtherSideNo) ? "-" : payInfo.OtherSideNo);
 
-                    string remaksDescription = $"【{childInfo.PayType}】【{childInfo.ModuleName}】{rouNumber}、[申请人:{childInfo.Applicant}]{priName}[收款方:{childInfo.Payee}] {childInfo.PayCurrCode} {_PaymentAmount.ToString("#0.00")}、CNY:{childInfo.CNYSubTotalAmount.ToString("#0.00")}(团组:{groupInfo.TeamName})";
 
-                    childInfo.RemaksDescription = remaksDescription;
-                    childList.Add(childInfo);
-                    rouNumber++;
+                        decimal _PaymentAmount = (payInfo.PayMoney / 100) * payInfo.PayPercentage;//此次付款金额
+                        decimal _CNYSubTotalAmount = _PaymentAmount * payInfo.DayRate;//此次付款金额
+                        _CNYSubTotalAmount = Convert.ToDecimal(_CNYSubTotalAmount.ToString("#0.00"));
+                        var childInfo = new Group_DailyFeePaymentContentInfolView()
+                        {
+                            IsChecked = status1,
+                            Id = payInfo.Id,
+                            Payee = payeeStr,
+                            RowNumber = rouNumber,
+                            Applicant = userDatas.Find(it => it.Id == payInfo.CreateUserId)?.CnName ?? "",
+                            ApplicantDt = payInfo.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                            PayType = setDatas.Find(it => it.Id == payInfo.PayDId)?.Name ?? "",
+                            TransferMark = orbitalPrivateTransfer,
+                            PriceName = priName,
+                            ModuleName = setDatas.Find(it => it.Id == payInfo.CTable)?.Name ?? "",
+                            PayCurrCode = setDatas.Find(it => it.Id == payInfo.PaymentCurrency)?.Name ?? "",
+                            PaymentAmount = _PaymentAmount,
+                            PayRate = payInfo.DayRate,
+                            CNYSubTotalAmount = _CNYSubTotalAmount
+                        };
+
+                        string remaksDescription = $"【{childInfo.PayType}】【{childInfo.ModuleName}】{rouNumber}、[申请人:{childInfo.Applicant}]{priName}[收款方:{childInfo.Payee}] {childInfo.PayCurrCode} {_PaymentAmount.ToString("#0.00")}、CNY:{childInfo.CNYSubTotalAmount.ToString("#0.00")}(团组:{groupInfo.TeamName})";
+
+                        childInfo.RemaksDescription = remaksDescription;
+                        childList.Add(childInfo);
+                        rouNumber++;
+                    }
+                    
                 }
 
                 CompanyInfo companyInfo = new CompanyInfo();
@@ -2432,64 +2498,71 @@ namespace OASystem.API.Controllers
 
             #endregion
 
-            try
+            PaymentRequestCheckedView requestCheckedView = new PaymentRequestCheckedView();
+            List<int> groupIds = new List<int>();
+            List<int> dailyPaymentIds = new List<int>();
+            List<int> hotelIds = new List<int>();
+
+            #region 参数处理
+            if (!string.IsNullOrEmpty(dto.GroupIds))
             {
-                PaymentRequestCheckedView requestCheckedView = new PaymentRequestCheckedView();
-                List<int> groupIds = new List<int>();
-                List<int> dailyPaymentIds = new List<int>();
+                if (dto.GroupIds.Contains(","))
+                {
+                    groupIds = dto.GroupIds.Split(',').Select(int.Parse).ToList();
+                }
+                else
+                {
+                    groupIds.Add(int.Parse(dto.GroupIds));
+                }
+            }
 
-                #region 参数处理
-                if (!string.IsNullOrEmpty(dto.GroupIds))
+            if (!string.IsNullOrEmpty(dto.HotelSubIds))
+            {
+                if (dto.HotelSubIds.Contains(","))
                 {
-                    if (dto.GroupIds.Contains(","))
-                    {
-                        groupIds = dto.GroupIds.Split(',').Select(int.Parse).ToList();
-                    }
-                    else
-                    {
-                        groupIds.Add(int.Parse(dto.GroupIds));
-                    }
+                    hotelIds = dto.HotelSubIds.Split(',').Select(int.Parse).ToList();
                 }
+                else
+                {
+                    hotelIds.Add(int.Parse(dto.HotelSubIds));
+                }
+            }
 
-                if (!string.IsNullOrEmpty(dto.DailyPaymentIds))
+            if (!string.IsNullOrEmpty(dto.DailyPaymentIds))
+            {
+                if (dto.DailyPaymentIds.Contains(","))
                 {
-                    if (dto.DailyPaymentIds.Contains(","))
-                    {
-                        dailyPaymentIds = dto.DailyPaymentIds.Split(',').Select(int.Parse).ToList();
-                    }
-                    else
-                    {
-                        dailyPaymentIds.Add(int.Parse(dto.DailyPaymentIds));
-                    }
+                    dailyPaymentIds = dto.DailyPaymentIds.Split(',').Select(int.Parse).ToList();
                 }
-                #endregion
-                requestCheckedView.GroupIds = groupIds;
-                requestCheckedView.DailyPaymentIds = dailyPaymentIds;
-                if (dto.Type == 1)
+                else
                 {
-                    TimeSpan ts = DateTime.Now.AddDays(180) - DateTime.Now; //设置redis 过期时间 半年(180)
-                    var status = await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>("paymentRequestCheckedData", JsonConvert.SerializeObject(requestCheckedView), ts);
-                    if (status)
-                    {
-                        return Ok(JsonView(true, "操作成功!"));
-                    }
+                    dailyPaymentIds.Add(int.Parse(dto.DailyPaymentIds));
                 }
-                else if (dto.Type == 2)
+            }
+            #endregion
+            requestCheckedView.GroupIds = groupIds;
+            requestCheckedView.HotelSubIds = hotelIds;
+            requestCheckedView.DailyPaymentIds = dailyPaymentIds;
+            if (dto.Type == 1)
+            {
+                TimeSpan ts = DateTime.Now.AddDays(180) - DateTime.Now; //设置redis 过期时间 半年(180)
+                var status = await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>("paymentRequestCheckedData", JsonConvert.SerializeObject(requestCheckedView), ts);
+                if (status)
                 {
-                    var status = await RedisRepository.RedisFactory.CreateRedisRepository().KeyDeleteAsync("paymentRequestCheckedData");
-                    if (status)
-                    {
-                        return Ok(JsonView(true, "操作成功!"));
-                    }
+                    return Ok(JsonView(true, "操作成功!"));
                 }
-                return Ok(JsonView(false, "操作失败!"));
             }
-            catch (Exception ex)
+            else if (dto.Type == 2)
             {
-                return Ok(JsonView(false, ex.Message));
+                var status = await RedisRepository.RedisFactory.CreateRedisRepository().KeyDeleteAsync("paymentRequestCheckedData");
+                if (status)
+                {
+                    return Ok(JsonView(true, "操作成功!"));
+                }
             }
-        }
+            return Ok(JsonView(false, "操作失败!"));
 
+        }
 
         /// <summary>
         /// 付款申请 (PageId=51)
@@ -2513,51 +2586,83 @@ namespace OASystem.API.Controllers
                 return Ok(JsonView(false, "结束日期格式不正确!正确格式:yyyy-MM-dd"));
             }
 
-            if (dto.UserId < 1)
-            {
-                return Ok(JsonView(false, "请传入有效的UserId参数!"));
-            }
+            if (dto.UserId < 1) return Ok(JsonView(false, "请传入有效的UserId参数!"));
+            if (dto.Id < 1) return Ok(JsonView(false, "请传入有效的Id参数!"));
+            if (dto.Rate <= 0) return Ok(JsonView(false, "请传入有效的Rate参数!"));
+            #endregion
 
-            if (dto.Id < 1)
-            {
-                return Ok(JsonView(false, "请传入有效的Id参数!"));
-            }
+            int hotelSubStatus = 0,status = 0;
+            int diid = 0, cTable = 0, currId = 0;
 
-            if (dto.Rate <= 0)
+            if (dto.HotelSubId > 0)
             {
-                return Ok(JsonView(false, "请传入有效的Rate参数!"));
+                //更改酒店子表汇率
+                hotelSubStatus = _sqlSugar.Updateable<Grp_HotelReservationsContent>()
+                                     .SetColumns(it => it.Rate == dto.Rate)
+                                     .Where(it => it.Id == dto.HotelSubId)
+                                     .ExecuteCommand();
+
+                if (hotelSubStatus > 0)
+                {
+                    var hotelSubInfo = _sqlSugar.Queryable<Grp_HotelReservationsContent>().Where(it => it.Id == dto.HotelSubId).First();
+                    if (hotelSubInfo != null)
+                    {
+                        diid = hotelSubInfo.DiId;
+                        currId = hotelSubInfo.Currency;
+                    }
+
+                    //付款申请汇率更改成功;更改团组汇率对应币种
+                    string currCode = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.Id == currId).First()?.Name ?? "";
+                    await _teamRateRep.UpdateGroupRateByDiIdAndCTableId(diid, 76, currCode, dto.Rate);
+                }
             }
-            #endregion
-            try
+
+            if (dto.Id > 0)
             {
-                var status = _sqlSugar.Updateable<Grp_CreditCardPayment>()
-                                      .SetColumns(it => it.DayRate == dto.Rate)
-                                      .Where(it => it.Id == dto.Id)
-                                      .ExecuteCommand();
+                var ccpInfo = _sqlSugar.Queryable<Grp_CreditCardPayment>().Where(it => it.Id == dto.Id).First();
+                decimal cnyMoney = 0.00M;
+                if (ccpInfo != null) {
+                    cnyMoney = ccpInfo.PayMoney * dto.Rate;
+                    diid = ccpInfo.DIId;
+                    cTable = ccpInfo.CTable; 
+                    currId = ccpInfo.PaymentCurrency;
+                }
+
+                status = _sqlSugar.Updateable<Grp_CreditCardPayment>()
+                                  .SetColumns(it => it.DayRate == dto.Rate)
+                                  .SetColumns(it => it.RMBPrice == cnyMoney)
+                                  .Where(it => it.Id == dto.Id)
+                                  .ExecuteCommand();
                 if (status > 0)
                 {
-                    PaymentRequestCheckedView checkedView = new PaymentRequestCheckedView();
-                    var checkedStr = await RedisRepository.RedisFactory.CreateRedisRepository().StringGetAsync<string>("paymentRequestCheckedData");
-                    if (checkedStr != null)
+                    //付款申请汇率更改成功;更改团组汇率对应币种
+                    if (cTable != 76)
                     {
-                        checkedView = JsonConvert.DeserializeObject<PaymentRequestCheckedView>(checkedStr.ToString());
+                        string currCode = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.Id == currId).First()?.Name ?? "";
+                        await _teamRateRep.UpdateGroupRateByDiIdAndCTableId(diid, cTable, currCode, dto.Rate);
                     }
+                }
+            }
 
-                    tree_Fin_DailyFeePaymentResult dailyResult = PayRequest_DailyByDateRange(1, checkedView.DailyPaymentIds, dto.beginDt, dto.endDt);
-                    tree_Group_DailyFeePaymentResult groupResult = PayRequest_GroupPaymentByDateRange(1, checkedView.GroupIds, dto.beginDt, dto.endDt);
+            if (hotelSubStatus > 0 || status > 0)
+            {
+                PaymentRequestCheckedView checkedView = new PaymentRequestCheckedView();
+                var checkedStr = await RedisRepository.RedisFactory.CreateRedisRepository().StringGetAsync<string>("paymentRequestCheckedData");
+                if (checkedStr != null)
+                {
+                    checkedView = JsonConvert.DeserializeObject<PaymentRequestCheckedView>(checkedStr.ToString());
+                }
 
-                    decimal _gz = dailyResult.gz + groupResult.gz;
-                    decimal _sz = dailyResult.sz + groupResult.sz;
+                tree_Fin_DailyFeePaymentResult dailyResult = PayRequest_DailyByDateRange(1, checkedView.DailyPaymentIds, dto.beginDt, dto.endDt);
+                tree_Group_DailyFeePaymentResult groupResult = PayRequest_GroupPaymentByDateRange(1, checkedView.GroupIds, checkedView.HotelSubIds, dto.beginDt, dto.endDt);
 
-                    return Ok(JsonView(true, "操作成功!", new { gz = dailyResult, sz = groupResult }));
-                }
+                decimal _gz = dailyResult.gz + groupResult.gz;
+                decimal _sz = dailyResult.sz + groupResult.sz;
 
-                return Ok(JsonView(false, "该项汇率修改失败!"));
-            }
-            catch (Exception ex)
-            {
-                return Ok(JsonView(false, ex.Message));
+                return Ok(JsonView(true, "操作成功!", new { gz = dailyResult, sz = groupResult }));
             }
+
+            return Ok(JsonView(false, "该项汇率修改失败!"));
         }
 
         /// <summary>
@@ -2570,10 +2675,7 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostPayRequestPayChange(PayRequestPayChangeDto dto)
         {
-            if (dto.UserId < 1)
-            {
-                return Ok(JsonView(false, "请传入有效的UserId参数!"));
-            }
+            if (dto.UserId < 1) return Ok(JsonView(false, "请传入有效的UserId参数!"));
 
             //if (string.IsNullOrEmpty(dto.GroupIds))
             //{
@@ -2585,98 +2687,152 @@ namespace OASystem.API.Controllers
             //    return Ok(JsonView(false, "请传入有效的DailyPaymentIds参数!"));
             //}
 
-            try
+
+            List<int> groupIds = new List<int>();
+            List<int> dailyPaymentIds = new List<int>();
+            List<int> hotelSubIds = new List<int>();
+
+            #region 参数处理
+            if (!string.IsNullOrEmpty(dto.GroupIds))
             {
-                List<int> groupIds = new List<int>();
-                List<int> dailyPaymentIds = new List<int>();
+                if (dto.GroupIds.Contains(",")) groupIds = dto.GroupIds.Split(',').Select(int.Parse).ToList();
+                else groupIds.Add(int.Parse(dto.GroupIds));
+            }
 
-                #region 参数处理
-                if (!string.IsNullOrEmpty(dto.GroupIds))
+            if (!string.IsNullOrEmpty(dto.HotelSubIds))
+            {
+                if (dto.HotelSubIds.Contains(",")) hotelSubIds = dto.HotelSubIds.Split(',').Select(int.Parse).ToList();
+                else hotelSubIds.Add(int.Parse(dto.HotelSubIds));
+                if (hotelSubIds.Count > 0)
                 {
-                    if (dto.GroupIds.Contains(","))
+                    foreach (var item in hotelSubIds)
                     {
-                        groupIds = dto.GroupIds.Split(',').Select(int.Parse).ToList();
-                    }
-                    else
-                    {
-                        groupIds.Add(int.Parse(dto.GroupIds));
+                        if (item < 1)
+                        {
+                            hotelSubIds.Remove(item);
+                        }
                     }
                 }
+            }
+
+            if (!string.IsNullOrEmpty(dto.DailyPaymentIds))
+            {
+                if (dto.DailyPaymentIds.Contains(",")) dailyPaymentIds = dto.DailyPaymentIds.Split(',').Select(int.Parse).ToList();
+                else dailyPaymentIds.Add(int.Parse(dto.DailyPaymentIds));
+            }
+            #endregion
 
-                if (!string.IsNullOrEmpty(dto.DailyPaymentIds))
+            bool changeStatus = false;
+            _sqlSugar.BeginTran();
+
+            if (groupIds.Count > 0)
+            {
+
+                var ccpInfos = _sqlSugar.Queryable<Grp_CreditCardPayment>().Where(it => it.IsDel == 0 && groupIds.Contains(it.Id)).ToList();
+                var otherTypeCcpIds = ccpInfos.Where(it => it.CTable != 76).Select(it => it.Id).ToList();
+                var hotelTyprCcpIds = ccpInfos.Where(it => it.CTable == 76).Select(it => it.Id).ToList();
+                int groupStatus = 0;
+                if (otherTypeCcpIds.Count > 0) //其他费用类型 正常付款
                 {
-                    if (dto.DailyPaymentIds.Contains(","))
-                    {
-                        dailyPaymentIds = dto.DailyPaymentIds.Split(',').Select(int.Parse).ToList();
-                    }
-                    else
-                    {
-                        dailyPaymentIds.Add(int.Parse(dto.DailyPaymentIds));
-                    }
+                    groupStatus = _sqlSugar.Updateable<Grp_CreditCardPayment>()
+                                           .SetColumns(it => it.IsPay == 1)
+                                           .Where(it => otherTypeCcpIds.Contains(it.Id))
+                                           .ExecuteCommand();
+                    changeStatus = true;
                 }
-                #endregion
-
-                bool changeStatus = false;
-                _sqlSugar.BeginTran();
 
-                if (groupIds.Count > 0)
+                if (hotelTyprCcpIds.Count > 0) //酒店费用子项逻辑付款,酒店子项费用全部付完款,c表ispay=1
                 {
-                    var groupStatus = _sqlSugar.Updateable<Grp_CreditCardPayment>()
-                                               .SetColumns(it => it.IsPay == 1)
-                                               .Where(it => groupIds.Contains(it.Id))
-                                               .ExecuteCommand();
-                    if (groupStatus > 0)
+                    if (hotelSubIds.Count > 0)
                     {
+                        List<int> hrPayIds = new List<int>();
+                        var hrIspayStatus = _sqlSugar.Updateable<Grp_HotelReservationsContent>()
+                                                   .SetColumns(it => it.IsPay == 1)
+                                                   .Where(it => hotelSubIds.Contains(it.Id))
+                                                   .ExecuteCommand();
                         changeStatus = true;
-                    }
-                }
+                        //酒店子项是否全部付完款
+                        List<int> hrIds = _sqlSugar.Queryable<Grp_HotelReservationsContent>().Where(it => it.IsDel == 0 && hotelSubIds.Contains(it.Id)).Select(it => it.HrId).Distinct().ToList();
+                        if (hrIds.Count > 0 )
+                        {
+                            var hotelSubFeeData = _sqlSugar.Queryable<Grp_HotelReservationsContent>().Where(it => it.IsDel == 0 && hrIds.Contains(it.HrId)).ToList();
+                            var hotelSubFeeGroupData = hotelSubFeeData.GroupBy(it => it.HrId).ToList();
+                            foreach (var item in hotelSubFeeGroupData)
+                            {
+                                var allTotal = item.Where(it => it.Price > 0).ToList().Count;
+                                var paymentTotal = item.Where(it => it.Price > 0 && it.IsPay == 1).ToList().Count;
+                                if (allTotal == paymentTotal)
+                                {
+                                    hrPayIds.Add(item.Key);
+                                }
+                            }
+                        }
 
-                if (dailyPaymentIds.Count > 0)
-                {
-                    var dailyPaymentStatus = _sqlSugar.Updateable<Fin_DailyFeePayment>()
+                        if (hrPayIds.Count > 0)
+                        {
+                            //c表更改全部付款的酒店费用
+                            groupStatus = _sqlSugar.Updateable<Grp_CreditCardPayment>()
                                                .SetColumns(it => it.IsPay == 1)
-                                               .Where(it => dailyPaymentIds.Contains(it.Id))
+                                               .Where(it => it.CTable == 76 && hrPayIds.Contains(it.CId))
                                                .ExecuteCommand();
-                    if (dailyPaymentStatus > 0)
-                    {
-                        changeStatus = true;
+                        }
                     }
                 }
+            }
 
-                if (changeStatus)
+            //if (hotelSubIds.Count > 0)
+            //{
+            //    var groupStatus = _sqlSugar.Updateable<Grp_HotelReservationsContent>()
+            //                               .SetColumns(it => it.IsPay == 1)
+            //                               .Where(it => hotelSubIds.Contains(it.Id))
+            //                               .ExecuteCommand();
+            //    if (groupStatus > 0)
+            //    {
+            //        changeStatus = true;
+            //    }
+            //}
+
+            if (dailyPaymentIds.Count > 0)
+            {
+                var dailyPaymentStatus = _sqlSugar.Updateable<Fin_DailyFeePayment>()
+                                           .SetColumns(it => it.IsPay == 1)
+                                           .Where(it => dailyPaymentIds.Contains(it.Id))
+                                           .ExecuteCommand();
+                if (dailyPaymentStatus > 0)
                 {
-                    _sqlSugar.CommitTran();
+                    changeStatus = true;
+                }
+            }
 
-                    #region 应用推送
-                    try
-                    {
-                        foreach (int ccpId in groupIds)
-                        {
-                            List<string> tempList = new List<string>() { ccpId.ToString() };
-                            await AppNoticeLibrary.SendUserMsg_GroupStatus_PayResult(ccpId, tempList);
-                        }
+            if (changeStatus)
+            {
+                _sqlSugar.CommitTran();
 
-                        foreach (int dailyId in dailyPaymentIds)
-                        {
-                            List<string> tempList = new List<string>() { dailyId.ToString() };
-                            await AppNoticeLibrary.DailyPayReminder_Pay_ToUser(dailyId, tempList);
-                        }
-                    }
-                    catch (Exception ex)
+                #region 应用推送
+                try
+                {
+                    foreach (int ccpId in groupIds)
                     {
+                        List<string> tempList = new List<string>() { ccpId.ToString() };
+                        await AppNoticeLibrary.SendUserMsg_GroupStatus_PayResult(ccpId, tempList);
                     }
-                    #endregion
 
-                    return Ok(JsonView(true, "操作成功!"));
+                    foreach (int dailyId in dailyPaymentIds)
+                    {
+                        List<string> tempList = new List<string>() { dailyId.ToString() };
+                        await AppNoticeLibrary.DailyPayReminder_Pay_ToUser(dailyId, tempList);
+                    }
                 }
-                _sqlSugar.RollbackTran();
-                return Ok(JsonView(false, "付款状态修改失败!"));
-            }
-            catch (Exception ex)
-            {
-                _sqlSugar.RollbackTran();
-                return Ok(JsonView(false, ex.Message));
+                catch (Exception ex)
+                {
+                }
+                #endregion
+
+                return Ok(JsonView(true, "操作成功!"));
             }
+            _sqlSugar.RollbackTran();
+            return Ok(JsonView(false, "付款状态修改失败!"));
+
         }
 
         /// <summary>
@@ -2741,7 +2897,7 @@ namespace OASystem.API.Controllers
                 }
 
                 tree_Fin_DailyFeePaymentResult dailyResult = PayRequest_DailyByDateRange(2, checkedView.DailyPaymentIds, dto.beginDt, dto.endDt);
-                tree_Group_DailyFeePaymentResult groupResult = PayRequest_GroupPaymentByDateRange(2, checkedView.GroupIds, dto.beginDt, dto.endDt);
+                tree_Group_DailyFeePaymentResult groupResult = PayRequest_GroupPaymentByDateRange(2, checkedView.GroupIds, checkedView.HotelSubIds, dto.beginDt, dto.endDt);
 
                 if (dailyResult.childList == null)
                 {
@@ -3013,7 +3169,6 @@ namespace OASystem.API.Controllers
                         {
                             return new Result() { Code = -1, Msg = "暂无团组汇率,请前往设置!", Data = CurrencyRate };
                         }
-
                     }
                     else
                     {

Разлика између датотеке није приказан због своје велике величине
+ 282 - 853
OASystem/OASystem.Api/Controllers/GroupsController.cs


+ 768 - 16
OASystem/OASystem.Api/Controllers/StatisticsController.cs

@@ -21,6 +21,10 @@ using Aspose.Words.Lists;
 using static OASystem.API.OAMethodLib.GeneralMethod;
 using TypeInfo = OASystem.Domain.ViewModels.Statistics.TypeInfo;
 using System.Net.NetworkInformation;
+using System.ComponentModel.Design;
+using NetTaste;
+using OASystem.Domain.ViewModels.QiYeWeChat;
+using NPOI.POIFS.Crypt.Dsig;
 
 namespace OASystem.API.Controllers
 {
@@ -37,6 +41,7 @@ namespace OASystem.API.Controllers
         private readonly DelegationInfoRepository _groupRep;
         private readonly SetDataRepository _setDataRep;
         private readonly TeamRateRepository _teamRateRep;
+        private readonly VisitingClientsRepository _visitingClientsRep;
 
         /// <summary>
         /// Init
@@ -45,16 +50,16 @@ namespace OASystem.API.Controllers
         /// <param name="sqlSugar"></param>
         /// <param name="groupRep"></param>
         /// <param name="setDataRep"></param>
-        public StatisticsController(IMapper mapper, SqlSugarClient sqlSugar, DelegationInfoRepository groupRep, SetDataRepository setDataRep, TeamRateRepository teamRate)
+        public StatisticsController(IMapper mapper, SqlSugarClient sqlSugar, DelegationInfoRepository groupRep, SetDataRepository setDataRep, TeamRateRepository teamRate, VisitingClientsRepository visitingClientsRep)
         {
             _mapper = mapper;
             _groupRep = groupRep;
             _setDataRep = setDataRep;
             _sqlSugar = sqlSugar;
             _teamRateRep = teamRate;
+            _visitingClientsRep = visitingClientsRep;
         }
 
-
         #region 团组报表
 
         /// <summary>
@@ -217,8 +222,8 @@ namespace OASystem.API.Controllers
                  * 超支费用 
                  */
                 decimal exTotalAmount = 0.00M;
-                string _ecSql = string.Format(@"Select gec.Id As GECId,gec.DiId As GECDiId,gec.PriceName,ccp.PayMoney,sd1.Name As PaymentCurrency,
-													   ccp.RMBPrice As CNYPrice,ccp.DayRate,ccp.Payee,ccp.OrbitalPrivateTransfer,sd2.Name As PayWay,
+                string _ecSql = string.Format(@"Select gec.Id As GECId,gec.DiId As GECDiId,gec.PriceName,(gec.PriceSum * gec.Coefficient) As PayMoney,sd1.Name As PaymentCurrency,
+													   (gec.PriceSum * gec.Coefficient * ccp.DayRate) As CNYPrice,ccp.DayRate,ccp.Payee,ccp.OrbitalPrivateTransfer,sd2.Name As PayWay,
 													   sd3.Name As CardType,ccp.IsPay,u.CnName As Applicant,gec.CreateTime
 												From OA2023DB.dbo.Fin_GroupExtraCost gec
 												Left Join Grp_CreditCardPayment ccp On gec.Id = ccp.CId
@@ -419,26 +424,67 @@ namespace OASystem.API.Controllers
 
                 groupHotelFeeViews = await _sqlSugar.SqlQueryable<GroupHotelFeeView>(hotelFeeSql).ToListAsync();
 
+                List<int> hotelSubIds = groupHotelFeeViews.Select(it => it.HrId).ToList();
+                List<Grp_HotelReservationsContent> groupHotelContentFeeViews = new List<Grp_HotelReservationsContent>();
+                groupHotelContentFeeViews = await _sqlSugar.Queryable<Grp_HotelReservationsContent>().Where(it => hotelSubIds.Contains(it.HrId)).ToListAsync();
+
                 decimal HotelCNYTotalPrice = 0.00M;
 
                 var teamRateData = await _teamRateRep.PostGroupRateInfoByDiId(_dto.DiId);
                 foreach (var item in groupHotelFeeViews)
                 {
-                    HotelCNYTotalPrice += item.CNYPrice;
+                    var roomData = groupHotelContentFeeViews.Find(it => it.HrId == item.HrId && it.PriceType == 1); //房费 
+                    item.RoomPrice = roomData?.Price ?? 0.00M;
+                    item.RoomPriceCurrency = _setDatas.Find(it => it.Id == roomData?.Currency)?.Name;
+                    string feeMark1 = roomData?.OrbitalPrivateTransfer == 0 ? "公转" : "私转";
+                    string isFeeMark1 = roomData?.IsOppay == 1 ? "是" : "否";
+                    item.RoomInfoTips = @$"当时汇率:{roomData?.Rate.ToString("#0.0000")} <br/>
+                                           收款方:{roomData?.Payee}<br/>
+                                           费用标识:{feeMark1} <br/>
+                                           支付方式:{_setDatas.Find(it => it.Id == roomData?.PayDId)?.Name} <br/>
+                                           卡类型:{_setDatas.Find(it => it.Id == roomData?.CTDId)?.Name}
+                                           是否由地接支付:{isFeeMark1} <br/>";
+
+                    var breakfastData = groupHotelContentFeeViews.Find(it => it.HrId == item.HrId && it.PriceType == 2); //早餐 
+                    item.BreakfastPrice = breakfastData?.Price ?? 0.00M;
+                    item.BreakfastCurrency = _setDatas.Find(it => it.Id == breakfastData?.Currency)?.Name;
+                    string feeMark2 = breakfastData?.OrbitalPrivateTransfer == 0 ? "公转" : "私转";
+                    string isFeeMark2 = breakfastData?.IsOppay == 1 ? "是" : "否";
+                    item.BreakfastInfoTips = @$"当时汇率:{breakfastData?.Rate.ToString("#0.0000")} <br/>
+                                                收款方:{breakfastData?.Payee}<br/>
+                                                费用标识:{feeMark2} <br/>
+                                                支付方式:{_setDatas.Find(it => it.Id == roomData?.PayDId)?.Name} <br/>
+                                                卡类型:{_setDatas.Find(it => it.Id == roomData?.CTDId)?.Name} <br/>
+                                                是否由地接支付:{isFeeMark2} <br/>";
+
+                    var landTaxData = groupHotelContentFeeViews.Find(it => it.HrId == item.HrId && it.PriceType == 3); //地税 
+                    item.GovernmentRent = landTaxData?.Price ?? 0.00M;
+                    item.GovernmentRentCurrency = _setDatas.Find(it => it.Id == landTaxData?.Currency)?.Name;
+                    string feeMark3 = landTaxData?.OrbitalPrivateTransfer == 0 ? "公转" : "私转";
+                    string isFeeMark3 = landTaxData?.IsOppay == 1 ? "是" : "否";
+                    item.GovernmentRentTips = @$"当时汇率:{landTaxData?.Rate.ToString("#0.0000")} <br/>
+                                                 收款方:{landTaxData?.Payee}<br/>
+                                                 费用标识:{feeMark3} <br/>
+                                                 支付方式:{_setDatas.Find(it => it.Id == landTaxData?.PayDId)?.Name} <br/>
+                                                 卡类型:{_setDatas.Find(it => it.Id == landTaxData?.CTDId)?.Name} <br/>
+                                                 是否由地接支付:{isFeeMark3} <br/>";
+
+                    var cityTaxData = groupHotelContentFeeViews.Find(it => it.HrId == item.HrId && it.PriceType == 4); //城市税 
+                    item.CityTax = cityTaxData?.Price ?? 0.00M;
+                    item.CityTaxCurrency = _setDatas.Find(it => it.Id == cityTaxData?.Currency)?.Name;
+                    string feeMark4 = cityTaxData?.OrbitalPrivateTransfer == 0 ? "公转" : "私转";
+                    string isFeeMark4 = landTaxData?.IsOppay == 1 ? "是" : "否";
+                    item.CityTaxTips = @$"当时汇率:{cityTaxData?.Rate.ToString("#0.0000")} <br/>
+                                          收款方:{cityTaxData?.Payee}<br/>
+                                          费用标识:{feeMark4} <br/>
+                                          支付方式:{_setDatas.Find(it => it.Id == cityTaxData?.PayDId)?.Name} <br/>
+                                          卡类型:{_setDatas.Find(it => it.Id == cityTaxData?.CTDId)?.Name} <br/>
+                                          是否由地接支付:{isFeeMark4} <br/>";
 
+                    HotelCNYTotalPrice += item.CNYPrice;
                     item.PayMoney = item.PayMoney.ConvertToDecimal1();
                     item.CNYPrice = item.CNYPrice.ConvertToDecimal1();
 
-                    string currencyRateStr = "";
-                    List<string> currencys = new List<string>();
-                    if (!string.IsNullOrEmpty(item.BreakfastCurrency)) currencys.Add(item.BreakfastCurrency);
-                    if (!string.IsNullOrEmpty(item.GovernmentRentCurrency)) currencys.Add(item.GovernmentRentCurrency);
-                    if (!string.IsNullOrEmpty(item.CityTaxCurrency)) currencys.Add(item.CityTaxCurrency);
-                    if (!string.IsNullOrEmpty(item.PaymentCurrency)) currencys.Add(item.PaymentCurrency);
-
-                    currencyRateStr = await GeneralMethod.PostGroupRateByCTableAndCurrency(teamRateData, 76, currencys);
-
-                    item.CurrencyRateStr = currencyRateStr;
                 }
 
                 _geView.GroupHotelFeeViews = groupHotelFeeViews;
@@ -1128,7 +1174,6 @@ namespace OASystem.API.Controllers
 
         #endregion
 
-
         #region 报表/折线图统计
         //企业利润-团组利润
         //企业利润-会务利润
@@ -1991,5 +2036,712 @@ namespace OASystem.API.Controllers
 
         #endregion
 
+        #region 市场部销售额
+
+        /// <summary>
+        ///  市场部销售额
+        /// Init 基础数据(公司/人员/年份/季度/月份)
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesInitData")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesInitData(MarketingSalesInitDataDto _dto)
+        {
+            #region  参数验证
+            MarketingSalesInitDataDtoFoalidator validationRules = new MarketingSalesInitDataDtoFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+
+
+            var companyData = _sqlSugar.Queryable<Sys_Company>().Where(it => it.IsDel == 0)
+                                       .Select(it => new { id = it.Id, name = it.CompanyName })
+                                       .ToList();
+            List<int> companyIds = companyData.Select(it => it.id).ToList();
+
+            List<int> pickGroupUserIds = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0)
+                                                  .Select(it => it.JietuanOperator )
+                                                  .ToList();
+
+            //var jobData = _sqlSugar.Queryable<Sys_JobPost>().Where(it => it.IsDel == 0 && companyIds.Contains(it.CompanyId) && (it.JobName.Contains("经理") || it.JobName.Contains("主管")))
+            //                       .Select(it => new { it.Id, it.CompanyId, it.DepId, it.JobName })
+            //                       .ToList();
+            //List<int> jobIds = jobData.Select(it => it.Id).ToList();
+            //(depIds.Contains(it.DepId) || jobIds.Contains(it.JobPostId)
+            //userId = 21 
+            var userData = _sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0 && (pickGroupUserIds.Contains(it.Id) || it.Id == 21))
+                                   .Select(it => new { id = it.Id, companyId = it.CompanyId, name = it.CnName })
+                                   .ToList();
+
+            companyData.Insert(0, new { id = -1, name = "全部" });
+            userData.Insert(0, new { id = -1, companyId = -1, name = "全部" });
+
+            #region 年份
+
+            var dtData = new List<dynamic>();
+            int dt = DateTime.Now.Year;
+            for (int y = dt; y >= dt-4; y--)
+            {
+                //季度
+                var quarterDatas = new List<dynamic>();
+                quarterDatas.Add(new { name = "全部", beginDt = $"{y}-01-01", endDt = $"{y}-12-31" });
+                for (int q = 0; q < 4; q++)
+                {
+                    dynamic quarterData = null;
+                    if (q == 0)
+                    {
+                        var monthDatas = new List<dynamic>();
+                        monthDatas.Add(new { name = $"全部", beginDt = $"{y}-01-01", endDt = $" {y}-03-31" });
+                        for (int m = 1; m < 4; m++)
+                        {
+                            MonthlyTimeSegment timeSegment = new MonthlyTimeSegment(y, m);
+                            monthDatas.Add(new { name = $"{ConvertToChinese(m)}", beginDt = timeSegment.Start.ToString("yyyy-MM-dd"), endDt = timeSegment.End.ToString("yyyy-MM-dd") });
+                        }
+                        //quarterData = new { name = "第一季度", beginDt = $"{y}-01-01", endDt = $" {y}-03-31", monthData = monthDatas };
+                        quarterData = new { name = "第一季度", monthData = monthDatas };
+                    }
+                    else if (q == 1)
+                    {
+                        var monthDatas = new List<dynamic>();
+                        monthDatas.Add(new { name = $"全部", beginDt = $"{y}-04-01", endDt = $"{y}-06-30" });
+                        for (int m = 4; m < 7; m++)
+                        {
+                            MonthlyTimeSegment timeSegment = new MonthlyTimeSegment(y, m);
+                            monthDatas.Add(new { name = $"{ConvertToChinese(m)}", beginDt = timeSegment.Start.ToString("yyyy-MM-dd"), endDt = timeSegment.End.ToString("yyyy-MM-dd") });
+                        }
+
+                        //quarterData = new { name = "第二季度", beginDt = $"{y}-04-01", endDt = $"{y}-06-30", monthData = monthDatas };
+                        quarterData = new { name = "第二季度",  monthData = monthDatas };
+                    }
+                    else if (q == 2)
+                    {
+                        var monthDatas = new List<dynamic>();
+                        monthDatas.Add(new { name = $"全部", beginDt = $"{y}-07-01", endDt = $"{y}-09-30" });
+                        for (int m = 7; m < 10; m++)
+                        {
+                            MonthlyTimeSegment timeSegment = new MonthlyTimeSegment(y, m);
+                            monthDatas.Add(new { name = $"{ConvertToChinese(m)}", beginDt = timeSegment.Start.ToString("yyyy-MM-dd"), endDt = timeSegment.End.ToString("yyyy-MM-dd") });
+                        }
+                        //quarterData = new { name = "第三季度", beginDt = $"{y}-07-01", endDt = $"{y}-09-30", monthData = monthDatas };
+                        quarterData = new { name = "第三季度", monthData = monthDatas };
+                    }
+                    else if (q == 3)
+                    {
+                        var monthDatas = new List<dynamic>();
+                        monthDatas.Add(new { name = $"全部", beginDt = $"{y}-10-01", endDt = $"{y}-12-31" });
+                        for (int m = 10; m < 13; m++)
+                        {
+                            MonthlyTimeSegment timeSegment = new MonthlyTimeSegment(y, m);
+                            monthDatas.Add(new { name = $"{ConvertToChinese(m)}", beginDt = timeSegment.Start.ToString("yyyy-MM-dd"), endDt = timeSegment.End.ToString("yyyy-MM-dd") });
+                        }
+                        //quarterData = new { name = "第四季度", beginDt = $"{y}-10-01", endDt = $"{y}-12-31", monthData = monthDatas }; 
+                        quarterData = new { name = "第四季度", monthData = monthDatas };
+                    }
+                    quarterDatas.Add(quarterData); 
+                }
+
+                dtData.Add(new
+                {
+                    year = y,
+                    //yearData = new { beginDt = $"{y}-01-01", endDt = $"{y}-12-31" },
+                    quarterData = quarterDatas,
+                });
+            }
+
+            #endregion
+
+            return Ok(JsonView(true, "操作成功!", new { companyData = companyData, userData = userData, dtData = dtData }));
+            #endregion
+
+        }
+
+        private static string ConvertToChinese(int month)
+        {
+            if (month < 1 || month > 12)
+                throw new ArgumentOutOfRangeException(nameof(month), "月份必须在1到12之间。");
+
+            var cultureInfo = new System.Globalization.CultureInfo("zh-CN");
+            var dateTimeFormat = cultureInfo.DateTimeFormat;
+            return dateTimeFormat.GetMonthName(month);
+        }
+
+        /// <summary>
+        ///  市场部销售额
+        ///  年度/季度/月度 报表(同比)
+        ///  (增加团组查询条件 IsSure=1)
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesStatistics")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesStatistics_Year(MarketingSalesStatisticsDto _dto)
+        {
+            #region  参数验证
+
+            MarketingSalesStatisticsDtoFoalidator validationRules = new MarketingSalesStatisticsDtoFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+
+            #endregion
+
+            string beginDt = $"{_dto.BeginDt} 00:00:00",endDt = $"{_dto.EndDt} 23:59:59";
+            
+            return Ok(JsonView(true, "操作成功!", await GroupSales(_dto.CompanyId, _dto.GroupPickupUserId, beginDt, endDt)));
+        }
+
+
+        private async Task<List<int>> GetUserIds(int companyId, int groupPickupUserId)
+        {
+            //全部人员Id
+            //查询所有公司的市场部
+            List<int> pickGroupIds = _sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0).Select(it => it.JietuanOperator).Distinct().ToList();
+            List<int> userIds = new List<int>();
+            var userDatas = await _sqlSugar.Queryable<Sys_Users>()
+                                           .InnerJoin<Sys_Company>((u, c) => u.CompanyId == c.Id)
+                                           .Where((u, c) => u.IsDel == 0 && pickGroupIds.Contains( u.Id))
+                                           .Select((u, c) => new { u.Id, u.CompanyId, u.CnName })
+                                           .ToListAsync();
+
+            userIds = userDatas.Select(it => it.Id).ToList();
+            if (companyId > 0)
+            {
+                userIds = userDatas.Where(it => it.CompanyId == companyId).Select(it => it.Id).ToList();
+            }
+            if (groupPickupUserId > 0)
+            {
+                userIds = userDatas.Where(it => it.Id == groupPickupUserId).Select(it => it.Id).ToList();
+            }
+
+            return userIds;
+        }
+
+        /// <summary>
+        /// 计算团组销售额
+        /// </summary>
+        /// <param name="companyId"></param>
+        /// <param name="groupPickupUserId"></param>
+        /// <param name="beginDt"></param>
+        /// <param name="endDt"></param>
+        /// <returns></returns>
+        private async Task<SalesYOYView> GroupSales(int companyId, int groupPickupUserId,string beginDt, string endDt)
+        {
+            decimal thisSales = 0.00M, lastSales = 0.00M, yoy = 1.00M;
+            var _view = new SalesYOYView();
+            List<int> userIds = new List<int>();
+            userIds = await GetUserIds(companyId, groupPickupUserId);
+            string userSqlWhere = "";
+            if (userIds.Count > 0)
+            {
+                userSqlWhere = string.Format($" And Id IN ({string.Join(',', userIds)})");
+            }
+             
+
+            string sql = string.Format($@"SELECT
+    CAST(SUM(Sales) AS decimal(12,2)) AS Sales
+FROM
+  (
+    SELECT
+      YEAR(di.VisitDate) AS [Year],
+      (
+        SELECT
+          CAST(SUM(ItemSumPrice * Rate) AS decimal(12,2))
+        FROM
+          Fin_ForeignReceivables
+        WHERE
+          IsDel = 0
+          AND AddingWay IN (0, 1, 2)
+          AND di.Id = Diid
+      ) AS Sales
+    FROM
+      Grp_DelegationInfo di
+    WHERE
+      di.IsDel = 0
+	  AND di.IsSure = 1
+      AND di.JietuanOperator IN (
+        SELECT
+          Id
+        FROM
+          Sys_Users
+        WITH
+          (NoLock)
+        WHERE
+          IsDel = 0 {userSqlWhere} 
+      )
+      AND di.VisitDate BETWEEN '{beginDt}' AND '{endDt}'
+  ) temp");
+
+            var newDB = _sqlSugar.CopyNew();
+            var salesData = newDB.SqlQueryable<SalesView>(sql).First();
+
+            thisSales = salesData?.Sales ?? 0.00M;
+
+            string lastBeginDt = Convert.ToDateTime(beginDt).AddYears(-1).ToString("yyyy-MM-dd HH:mm:ss"),
+                   lastEndDt = Convert.ToDateTime(endDt).AddYears(-1).ToString("yyyy-MM-dd HH:mm:ss");
+            string lastSql = string.Format($@"SELECT
+    CAST(SUM(Sales) AS decimal(12,2)) AS Sales
+FROM
+  (
+    SELECT
+      YEAR(di.VisitDate) AS [Year],
+      (
+        SELECT
+          CAST(SUM(ItemSumPrice * Rate) AS decimal(12,2))
+        FROM
+          Fin_ForeignReceivables
+        WHERE
+          IsDel = 0
+          AND AddingWay IN (0, 1, 2)
+          AND di.Id = Diid
+      ) AS Sales
+    FROM
+      Grp_DelegationInfo di
+    WHERE
+      di.IsDel = 0
+	  AND di.IsSure = 1
+      AND di.JietuanOperator IN (
+        SELECT
+          Id
+        FROM
+          Sys_Users
+        WITH
+          (NoLock)
+        WHERE
+          IsDel = 0 {userSqlWhere} 
+      )
+      AND di.Issure = 1
+      AND di.VisitDate BETWEEN '{lastBeginDt}' AND '{lastEndDt}'
+  ) temp");
+
+            var salesData1 = newDB.SqlQueryable<SalesView>(lastSql).First();
+            lastSales = salesData1?.Sales ?? 0.00M;
+
+            if (lastSales != 0 && thisSales != 0) yoy = (thisSales - lastSales) / lastSales;
+
+            _view = new SalesYOYView
+            {
+                thisYearSales = thisSales.ToString("#0.00"),
+                lastYearSales = lastSales.ToString("#0.00"),
+                yoy = yoy.ToString("#0.00")
+
+            };
+            return _view;
+        }
+
+        private class SalesView
+        {
+            public decimal Sales { get; set; }
+        }
+
+        private class SalesYOYView
+        {
+            public string thisYearSales { get; set; }
+            public string lastYearSales { get; set; }
+            public string yoy { get; set; }
+        }
+
+
+        /// <summary>
+        ///  市场部销售额
+        ///  团组列表
+        ///  (增加团组查询条件 IsSure=1)
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesGroupList")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesGroupList(MarketingSalesGroupListDto _dto)
+        {
+            #region  参数验证
+
+            MarketingSalesStatisticsDtoFoalidator validationRules = new MarketingSalesStatisticsDtoFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+
+            #endregion
+
+            string userSql = "";
+            List<int> userIds = new List<int>();
+            userIds = await GetUserIds(_dto.CompanyId, _dto.GroupPickupUserId);
+
+            if (userIds.Count > 0)
+            {
+                userSql = @$" And di.JietuanOperator In ({string.Join(",",userIds)})";
+            }
+
+            if (!string.IsNullOrEmpty(_dto.SearchCriteria))
+            {
+                userSql += string.Format(@$" AND di.TeamName Like '%{_dto.SearchCriteria}%'");
+            }
+
+
+            string beginDt = $"{_dto.BeginDt} 00:00:00", endDt = $"{_dto.EndDt} 23:59:59";
+
+            string sql = string.Format(@$"SELECT
+  ROW_NUMBER() OVER (
+    ORDER BY
+      CollectionDays
+  ) AS RowNumber,
+  *
+FROM
+  (
+    SELECT
+      di.Id,
+      di.TeamName,
+      di.ClientUnit,
+      di.ClientName,
+      di.VisitDate,
+      di.VisitPNumber,
+      di.JietuanOperator,
+      di.VisitEndDate,
+      (
+        SELECT
+          CAST(
+            COALESCE(SUM(ItemSumPrice * Rate), 0) AS DECIMAL(12, 2)
+          ) AS GroupSales
+        FROM
+          Fin_ForeignReceivables
+        WHERE
+          IsDel = 0
+          AND di.Id = Diid
+          AND AddingWay IN (0, 1, 2)
+      ) AS GroupSales,
+      u.CnName AS GroupPickupUser,
+      DATEADD(DAY, 7, di.VisitEndDate) AS CollectionDays
+    FROM
+      Grp_DelegationInfo di
+    WITH
+      (NoLock)
+      LEFT JOIN Sys_Users u ON di.JietuanOperator = u.Id
+    WHERE
+      di.Isdel = 0
+	  AND di.IsSure = 1 {userSql} 
+      AND VisitDate Between '{beginDt}' And  '{endDt}'
+  ) Temp ");
+
+            RefAsync<int> total = 0;
+            var groupData = await _sqlSugar.SqlQueryable<MarketingSalesGroupList>(sql).ToPageListAsync(_dto.PageIndex, _dto.PageSize, total);
+
+            return Ok(JsonView(true, "操作成功!", groupData, total));
+        }
+
+        /// <summary>
+        ///  市场部销售额
+        ///  客户类型、客户等级 统计
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesGroupStatistics")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesGroupStatistics(MarketingSalesGroupStatisticsDto _dto)
+        {
+            #region  参数验证
+
+            MarketingSalesStatisticsDtoFoalidator validationRules = new MarketingSalesStatisticsDtoFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+
+            #endregion
+
+            string beginDt = $"{_dto.BeginDt} 00:00:00", endDt = $"{_dto.EndDt} 23:59:59";
+            List<int> userIds = await GetUserIds(_dto.CompanyId, _dto.GroupPickupUserId);
+
+            string userSql = "";
+            if (userIds.Count > 0)
+            {
+                userSql = string.Format(@$" AND JietuanOperator IN ({string.Join(",",userIds)})");
+            }
+
+            string sql = "";
+
+            if (_dto.StatisticsType == 1 )
+            {
+                sql = string.Format(@$"Select 
+	sd.[Name],
+	Count(*) As [Count]
+From Grp_DelegationInfo di
+Left Join Sys_SetData sd On di.TeamDid = sd.Id
+Where di.Isdel = 0 
+And IsSure = 1 {userSql} 
+And VisitDate Between '{beginDt}' And  '{endDt}'
+Group By [Name]
+Order By Count Desc");
+            }
+            else if (_dto.StatisticsType == 2)
+            {
+                sql = string.Format(@$"Select 
+	sd.[Name],
+	Count(*) As [Count]
+From Grp_DelegationInfo di
+Left Join Sys_SetData sd On di.TeamLevSId = sd.Id
+Where di.Isdel = 0 
+And IsSure = 1 {userSql} 
+And VisitDate Between '{beginDt}' And  '{endDt}'
+Group By [Name]
+Order By Count Desc");
+            }
+            else return Ok(JsonView(false, "StatisticsType不在可取范围!"));
+
+            if (_dto.PortType == 1)
+            {
+                string sql1 = string.Format(@$"Select 
+	sd.[Name],
+	Count(*) As [Count]
+From Grp_DelegationInfo di
+Left Join Sys_SetData sd On di.TeamDid = sd.Id
+Where di.Isdel = 0 
+And IsSure = 1 {userSql} 
+And VisitDate Between '{beginDt}' And  '{endDt}'
+Group By [Name]
+Order By Count Desc");
+
+
+                var customerTypeData = await _sqlSugar.SqlQueryable<MarketingSalesGroupStatisticsView>(sql1).ToListAsync();
+
+                string sql2 = string.Format(@$"Select 
+	sd.[Name],
+	Count(*) As [Count]
+From Grp_DelegationInfo di
+Left Join Sys_SetData sd On di.TeamLevSId = sd.Id
+Where di.Isdel = 0 
+And IsSure = 1 {userSql} 
+And VisitDate Between '{beginDt}' And  '{endDt}'
+Group By [Name]
+Order By Count Desc");
+                var clientGradeData = await _sqlSugar.SqlQueryable<MarketingSalesGroupStatisticsView>(sql2).ToListAsync();
+                return Ok(JsonView(true, "操作成功!", new {
+                    customerTypeData= customerTypeData,
+                    clientGradeData = clientGradeData
+                }));
+
+            }
+            else if (_dto.PortType == 2 || _dto.PortType == 3)
+            {
+                var data = await _sqlSugar.SqlQueryable<MarketingSalesGroupStatisticsView>(sql).ToListAsync();
+                return Ok(JsonView(true, "操作成功!", data, data.Count));
+            }
+            else return Ok(JsonView(false, MsgTips.Port));
+        }
+
+        /// <summary>
+        ///  市场部销售额
+        ///  接单排名
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesOrderRanking")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesOrderRanking(MarketingSalesOrderRankingDto _dto)
+        {
+            #region  参数验证
+
+            MarketingSalesStatisticsDtoFoalidator validationRules = new MarketingSalesStatisticsDtoFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+
+            #endregion
+
+            string beginDt = $"{_dto.BeginDt} 00:00:00", endDt = $"{_dto.EndDt} 23:59:59";
+
+            List<int> userIds = await GetUserIds(_dto.CompanyId, _dto.GroupPickupUserId);
+
+            string userSql = "";
+            if (userIds.Count > 0)
+            {
+                userSql = string.Format(@$" AND JietuanOperator IN ({string.Join(",", userIds)})");
+            }
+
+            string sql = string.Format(@$"Select 
+	ROW_NUMBER() Over(Order By Count(*) Desc) As RowNumber,
+	u.CnName As UserName,
+	Count(*) As [Count]
+	From Grp_DelegationInfo di
+	Left Join Sys_Users u On di.JietuanOperator = u.Id
+	Where di.Isdel = 0 
+    AND IsSure = 1 {userSql} 
+	And VisitDate Between '{beginDt}' And  '{endDt}'
+	Group By CnName");
+
+
+            RefAsync<int> total = 0;
+
+            var rankingData = await _sqlSugar.SqlQueryable<MarketingSalesOrderRankingView>(sql).ToPageListAsync(_dto.PageIndex, _dto.PageSize, total);
+
+            return Ok(JsonView(true, "操作成功!", rankingData, total));
+        }
+
+        /// <summary>
+        ///  市场部销售额
+        ///  客户拜访列表
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesVCList")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesVCList(MarketingSalesVCListDto _dto)
+        {
+            #region  参数验证
+            MarketingSalesUserPageFuncDtoBaseFoalidator validationRules = new MarketingSalesUserPageFuncDtoBaseFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+            #endregion
+            return Ok(await _visitingClientsRep._List(_dto.PortType,_dto.PageIndex,_dto.PageIndex,_dto.DiId,_dto.Search));
+        }
+
+        /// <summary>
+        ///  市场部销售额
+        ///  客户拜访 操作(添加 Or 编辑)
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesVCOperate")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesVCOperate(MarketingSalesVCOperrateDto _dto)
+        {
+            #region  参数验证
+            MarketingSalesUserPageFuncDtoBaseFoalidator validationRules = new MarketingSalesUserPageFuncDtoBaseFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+            #endregion
+            return Ok(await _visitingClientsRep._AddOrEdit(_dto));
+        }
+
+        /// <summary>
+        ///  市场部销售额
+        ///  客户拜访 Del
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesVCDel")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesVCDel(MarketingSalesVCDelDto _dto)
+        {
+            
+            return Ok(await _visitingClientsRep._Del(_dto.Id,_dto.UserId));
+        }
+
+        /// <summary>
+        ///  市场部销售额
+        ///  客户拜访 操作 save
+        /// </summary>
+        /// <param name="_dto">市场部销售额请求dto</param>
+        /// <returns></returns>
+        [HttpPost("PostMarketingSalesVCSave")]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostMarketingSalesVCSave(MarketingSalesVCSaveDto _dto)
+        {
+            #region  参数验证
+            MarketingSalesUserPageFuncDtoBaseFoalidator validationRules = new MarketingSalesUserPageFuncDtoBaseFoalidator();
+            var validResult = await validationRules.ValidateAsync(_dto);
+            if (!validResult.IsValid)
+            {
+                var errors = new StringBuilder();
+                foreach (var error in validResult.Errors) errors.AppendLine(error.ErrorMessage);
+                return Ok(JsonView(false, errors.ToString()));
+            }
+
+            PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
+
+            #region 页面操作权限验证
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+
+            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, MsgTips.CheckAuth));
+            #endregion
+            #endregion
+            return Ok(await _visitingClientsRep._Save(_dto));
+        }
+
+        #endregion
     }
 }

+ 0 - 1
OASystem/OASystem.Api/Controllers/SystemController.cs

@@ -706,7 +706,6 @@ namespace OASystem.API.Controllers
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-
         [HttpPost]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> QueryDepartmentList(DepartmentDto dto)

+ 17 - 19
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskAssignment.cs

@@ -20,26 +20,25 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
         public static async void PostTaskUpdateStatus()
         {
             //_taskAllocationRep.ChangeDataBase(DBEnum.OA2023DB);
-            var data = _taskAllocationRep._sqlSugar
-                                         .Queryable<Pm_TaskAllocation>()
-                                         .Where(it => it.IsDel == 0 &&
-                                                      !string.IsNullOrEmpty(it.PredictEndTime) &&
-                                                      Convert.ToDateTime(it.PredictEndTime) >= DateTime.Now
-                                               )
-                                         .ToList();
+            var newDB = _taskAllocationRep._sqlSugar.CopyNew();
+            var data = newDB.Queryable<Pm_TaskAllocation>()
+                            .Where(it => it.IsDel == 0 &&
+                                        !string.IsNullOrEmpty(it.PredictEndTime) &&
+                                        Convert.ToDateTime(it.PredictEndTime) >= DateTime.Now
+                                )
+                            .ToList();
             if (data.Count > 0)
             {
                 //处理要变更状态的员工
                 List<int> primaryIds = new List<int>();
                 primaryIds = data.Select(it => it.Id).ToList();
-                var subData = _taskAllocationRep._sqlSugar
-                                                .Queryable<Pm_TaskRelevanceUser>()
-                                                .Where(it => 
-                                                             it.IsDel == 0 &&
-                                                             primaryIds.Contains(it.TAId) &&
-                                                             it.TaskStatus <= TaskerEnum.UnderWay
-                                                      )
-                                                .ToList();
+                var subData = newDB.Queryable<Pm_TaskRelevanceUser>()
+                                    .Where(it => 
+                                                    it.IsDel == 0 &&
+                                                    primaryIds.Contains(it.TAId) &&
+                                                    it.TaskStatus <= TaskerEnum.UnderWay
+                                            )
+                                    .ToList();
                
                 if (subData.Count > 0)
                 {
@@ -50,10 +49,9 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                         item.Cause = string.Format(@"任务没有提交完成或者超时,由系统设置任务未完成");
                     }
 
-                    var updateStatus = _taskAllocationRep._sqlSugar
-                                                         .Updateable(subData)
-                                                         .WhereColumns(it => it.Id)
-                                                         .ExecuteCommand();
+                    var updateStatus = newDB.Updateable(subData)
+                                            .WhereColumns(it => it.Id)
+                                            .ExecuteCommand();
                     //_taskAllocationRep._sqlSugar.Close();
                 }
             }

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

@@ -25,8 +25,8 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
 
             //在此处编写任务业务代码
             #region 消息处理
-
-            var data =  _taskAllocationRep._sqlSugar
+            var newDB = _taskAllocationRep._sqlSugar.CopyNew();
+            var data = newDB
                                          .Queryable<Pm_TaskAllocation>()
                                          .Where(it => it.IsDel == 0 &&
                                                       !string.IsNullOrEmpty(it.PredictEndTime) &&
@@ -38,7 +38,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                 //处理要任务提醒的员工
                 List<int> primaryIds = new List<int>();
                 primaryIds = data.Select(it => it.Id).ToList();
-                var subData = _taskAllocationRep._sqlSugar
+                var subData = newDB
                                                 .Queryable<Pm_TaskRelevanceUser>()
                                                 .Where(it => it.IsDel == 0 &&
                                                              primaryIds.Contains(it.TAId) &&
@@ -46,14 +46,14 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                                                       )
                                                 .ToList();
 
-                var depDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Department>().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 depDatas = newDB.Queryable<Sys_Department>().Where(it => it.IsDel == 0).ToList();
+                var groupDatas = newDB.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0).ToList();
+                var userDatas = newDB.Queryable<Sys_Users>().Where(it => it.IsDel == 0).ToList();
 
 
                 List<int> userIds = new List<int>();
 
-                _taskAllocationRep._sqlSugar.BeginTran();
+                newDB.BeginTran();
                 foreach (var item in data)
                 {
                     string depName = string.Empty;
@@ -99,10 +99,10 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                             DeleteTime = "1990-01-01 00:00:00.000",
                             DiId = item.DiId,
                         };
-                        var msgAddId = _taskAllocationRep._sqlSugar.Insertable(_Message).ExecuteReturnIdentity();
+                        var msgAddId = newDB.Insertable(_Message).ExecuteReturnIdentity();
                         if (msgAddId < 0)
                         {
-                            _taskAllocationRep._sqlSugar.RollbackTran();
+                            newDB.RollbackTran();
                             _logger.LogError("任务通知消息推送失败!");
                             return;
                         }
@@ -118,7 +118,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                             DeleteTime = "1990-01-01 00:00:00.000"
                         };
 
-                        var msgAuthAddId = _taskAllocationRep._sqlSugar.Insertable(_MessageReadAuth).ExecuteReturnIdentity();
+                        var msgAuthAddId = newDB.Insertable(_MessageReadAuth).ExecuteReturnIdentity();
                         if (msgAuthAddId < 0)
                         {
                             _taskAllocationRep._sqlSugar.RollbackTran();
@@ -128,7 +128,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
                         userIds.Add(subItem.UserId);
                     }
                 }
-                _taskAllocationRep._sqlSugar.CommitTran();
+                newDB.CommitTran();
                 //推送消息
                await _hubContext.Clients.Clients(UserStore.OnlineUser.Where(it => userIds.Contains(it.UserId)).Select(it => it.ConnectionId).ToList()).ReceiveMessage("您有新的任务相关消息");
 

+ 4 - 3
OASystem/OASystem.Api/Program.cs

@@ -120,12 +120,14 @@ builder.Services.AddScoped(options =>
         new ConnectionConfig() {
             ConfigId = DBEnum.OA2023DB,
             ConnectionString = _config.GetConnectionString("OA2023DB"),
-            DbType = DbType.SqlServer, IsAutoCloseConnection = true },
+            DbType = DbType.SqlServer, 
+            IsAutoCloseConnection = true },
         new ConnectionConfig()
         {
             ConfigId = DBEnum.OA2014DB,
             ConnectionString = _config.GetConnectionString("OA2014DB"),
-            DbType = DbType.SqlServer, IsAutoCloseConnection = true },
+            DbType = DbType.SqlServer, 
+            IsAutoCloseConnection = true },
     });
 });
 #endregion
@@ -366,7 +368,6 @@ app.Lifetime.ApplicationStopped.Register(() =>
 
 #endregion
 
-
 #region SignalR
 
 app.MapHub<ChatHub>("/ChatHub", options =>

+ 7 - 0
OASystem/OASystem.Domain/AutoMappers/_baseMappingProfile.cs

@@ -21,6 +21,7 @@ using OASystem.Domain.ViewModels.CRM;
 using OASystem.Domain.ViewModels.PersonnelModule;
 using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.Dtos.PersonnelModule;
+using OASystem.Domain.Dtos.Statistics;
 
 namespace OASystem.Domain.AutoMappers
 {
@@ -148,6 +149,7 @@ namespace OASystem.Domain.AutoMappers
             CreateMap<Grp_HotelReservations, HotelReservationsByIdView>();
             CreateMap<Grp_CreditCardPayment, Grp_CreditCardView>();
             CreateMap<OpHotelReservationsData, Grp_HotelReservations>();
+            CreateMap<HotelReservationsContnetDetailsView, Grp_HotelReservationsContent>();
             CreateMap<OpHotelReservationsData, Grp_CreditCardPayment>();
             #endregion
 
@@ -275,6 +277,11 @@ namespace OASystem.Domain.AutoMappers
             #region 酒店询价
             CreateMap<HotelInquiryAddOrEditDto, Grp_HotelInquiry>();
             #endregion
+
+            #region 市场客户资料 --> 拜访客户记录
+            CreateMap<MarketingSalesVCOperrateDto, Grp_VisitingClients>();
+            CreateMap<MarketingSalesVCSaveInfo, Grp_VisitingClients>();
+            #endregion
         }
     }
 }

+ 12 - 0
OASystem/OASystem.Domain/Dtos/Financial/PostPayRequestByDateRangeDto.cs

@@ -22,6 +22,12 @@ namespace OASystem.Domain.Dtos.Financial
     {
         public int UserId { get; set; }
         public int Id { get; set; }
+
+        /// <summary>
+        /// 酒店子表Id
+        /// </summary>
+        public int HotelSubId { get; set; }
+
         public decimal Rate { get; set; }
     }
 
@@ -35,6 +41,12 @@ namespace OASystem.Domain.Dtos.Financial
         /// </summary>
         public string GroupIds { get; set; }
 
+        /// <summary>
+        /// 酒店子表费用 Id集合 多个英文逗号隔开 
+        /// 1,2,3,4,5
+        /// </summary>
+        public string HotelSubIds { get; set; }
+
         /// <summary>
         /// 日付相关费用 id集合 多个英文逗号隔开 
         /// 1,2,3,4,5

+ 6 - 101
OASystem/OASystem.Domain/Dtos/Groups/HotelReservationsDto.cs

@@ -1,4 +1,5 @@
 using FluentValidation;
+using OASystem.Domain.ViewModels.Groups;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -59,11 +60,6 @@ namespace OASystem.Domain.Dtos.Groups
         /// </summary>
         public int GTId { get; set; }
 
-        /// <summary>
-        /// 信用卡类型 (设置数据外键编号)
-        /// </summary>
-        public int CTDId { get; set; }
-
         /// <summary>
         /// 入住卷号
         /// </summary>
@@ -175,110 +171,19 @@ namespace OASystem.Domain.Dtos.Groups
         public int OtherRoomCount { get; set; }
 
         /// <summary>
-        /// 信用卡金额
+        /// 信用卡金额/项费用总计合费用
         /// </summary>
         public decimal CardPrice { get; set; }
 
         /// <summary>
-        /// 是否由地接支付
-        /// 0 否 1 是
-        /// </summary>
-        public int Isoppay { get; set; }
-
-        /// <summary>
-        /// 早餐价格
-        /// </summary>
-        public decimal BreakfastPrice { get; set; }
-
-        /// <summary>
-        /// 早餐币种 (设置数据外键编号)
-        /// </summary>
-        public int BreakfastCurrency { get; set; }
-
-        /// <summary>
-        /// 地税
-        /// </summary>
-        public decimal GovernmentRent { get; set; }
-
-        /// <summary> 
-        /// 地税币种 (设置数据外键编号)
-        /// </summary>
-        public int GovernmentRentCurrency { get; set; }
-
-        /// <summary>
-        /// 城市税
-        /// </summary>
-        public decimal CityTax { get; set; }
-
-        /// <summary>
-        /// 城市税币种 (设置数据外键编号)
-        /// </summary>
-        public int CityTaxCurrency { get; set; }
-
-        /// <summary>
-        /// 支付方式 (设置数据外键编号)
-        /// </summary>
-        public int PayDId { get; set; }
-
-        /// <summary>
-        /// 消费方式
-        /// </summary>
-        public string? ConsumptionPatterns { get; set; }
-
-        /// <summary>
-        /// 消费日期
-        /// </summary>
-        public string? ConsumptionDate { get; set; }
-
-        /// <summary>
-        /// 付款金额
-        /// </summary>
-        public decimal PayMoney { get; set; }
-
-        /// <summary>
-        /// 付款币种 (设置数据外键编号)
-        /// </summary>
-        public int PaymentCurrency { get; set; }
-
-        /// <summary>
-        /// 银行卡号
-        /// </summary>
-        public string? BankNo { get; set; }
-        /// <summary>
-        /// 持卡人姓名
-        /// </summary>
-        public string? CardholderName { get; set; }
-
-        /// <summary>
-        /// 公司银行账号
-        /// </summary>
-        public string? CompanyBankNo { get; set; }
-
-        /// <summary>
-        /// 对方开户行
-        /// </summary>
-        public string? OtherBankName { get; set; }
-
-        /// <summary>
-        /// 对方银行账号
+        /// 信用卡币种/项费用总计合费用币种
         /// </summary>
-        public string? OtherSideNo { get; set; }
-
-        /// <summary>
-        /// 对方姓名
-        /// </summary>
-        public string? OtherSideName { get; set; }
-
-        /// <summary>
-        /// 收款方
-        /// </summary>
-        public string? Payee { get; set; }
+        public int CardPriceCurrency { get; set; }
 
         /// <summary>
-        /// 费用标识 (设置数据外键编号)
-        /// 可不选
+        /// 子表信息
         /// </summary>
-        public int OrbitalPrivateTransfer { get; set; } = -1;
+        public List<HotelReservationsContnetDetailsView> Contents { get; set; }
 
         /// <summary>
         /// C表付款信息 备注

+ 195 - 0
OASystem/OASystem.Domain/Dtos/Statistics/MarketingSalesDto.cs

@@ -0,0 +1,195 @@
+using FluentValidation;
+using OASystem.Domain.Dtos.System;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Globalization;
+using OASystem.Domain.ViewModels.Groups;
+
+namespace OASystem.Domain.Dtos.Statistics
+{
+    public class MarketingSalesUserPageFuncDtoBase
+    {
+        /// <summary>
+        /// 请求端口分类
+        /// 1 Web 2 Android 3 IOS
+        /// </summary>
+        public int PortType { get; set; } = 1;
+
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public int UserId { get; set; }
+
+        /// <summary>
+        /// 页面Id
+        /// </summary>
+        public int PageId { get; set; } = 180;
+    }
+
+    public class MarketingSalesUserPageFuncDtoBaseFoalidator : AbstractValidator<MarketingSalesUserPageFuncDtoBase>
+    {
+        public MarketingSalesUserPageFuncDtoBaseFoalidator()
+        {
+            RuleFor(it => it.PortType).InclusiveBetween(1,3).WithMessage(MsgTips.Port);
+            RuleFor(it => it.UserId).GreaterThan(1).WithMessage(MsgTips.UserId);
+            RuleFor(it => it.PageId).GreaterThan(1).WithMessage(MsgTips.PageId);
+        }
+    }
+
+    /// <summary>
+    /// 市场部销售额 Dto
+    /// </summary>
+    public class MarketingSalesDto { }
+
+    /// <summary>
+    /// 市场部销售额 
+    /// 市场部人员列表
+    /// Dto
+    /// </summary>
+    public class MarketingSalesInitDataDto : MarketingSalesUserPageFuncDtoBase { }
+    public class MarketingSalesInitDataDtoFoalidator : AbstractValidator<MarketingSalesInitDataDto>
+    {
+        public MarketingSalesInitDataDtoFoalidator() 
+        {
+            Include(new MarketingSalesUserPageFuncDtoBaseFoalidator());
+        }
+    }
+
+    /// <summary>
+    ///  市场部销售额
+    ///  年度/季度/月度 报表
+    /// </summary>
+    public class MarketingSalesStatisticsDto : MarketingSalesUserPageFuncDtoBase 
+    {
+        /// <summary>
+        /// 公司Id
+        /// </summary>
+        public int CompanyId { get; set; }
+
+        /// <summary>
+        /// 接团人Id
+        /// </summary>
+        public int GroupPickupUserId  { get; set; }
+
+        public string BeginDt { get; set; }
+
+        public string EndDt { get; set; }
+
+    }
+    public class MarketingSalesStatisticsDtoFoalidator : AbstractValidator<MarketingSalesStatisticsDto>
+    {
+        public MarketingSalesStatisticsDtoFoalidator()
+        {
+            Include(new MarketingSalesUserPageFuncDtoBaseFoalidator());
+            RuleFor(it => it.BeginDt)
+                .Must(dateString => DateTime.TryParse(dateString, out _))
+                .WithMessage("请输入有效开始的日期");
+            RuleFor(it => it.EndDt)
+                .Must(dateString => DateTime.TryParse(dateString, out _))
+                .WithMessage("请输入有效结束的日期");
+        }
+    }
+
+    /// <summary>
+    ///  市场部销售额
+    ///  团组列表
+    /// </summary>
+    public class MarketingSalesGroupListDto : MarketingSalesStatisticsDto {
+
+        public int PageIndex { get; set; } = 1;
+        public int PageSize { get; set; } = 10;
+
+        public string SearchCriteria { get; set; }
+    }
+
+    /// <summary>
+    ///  市场部销售额
+    ///  客户类型、客户等级 统计
+    /// </summary>
+    public class MarketingSalesGroupStatisticsDto : MarketingSalesStatisticsDto
+    {
+        /// <summary>
+        /// 图形统计类型
+        /// 1 客户类型 2 客户等级
+        /// </summary>
+        public int StatisticsType { get; set; } = 1;
+    }
+
+    /// <summary>
+    ///  市场部销售额
+    ///  接单排名
+    /// </summary>
+    public class MarketingSalesOrderRankingDto : MarketingSalesStatisticsDto
+    {
+        public int PageIndex { get; set; } = 1;
+        public int PageSize { get; set; } = 5;
+    }
+
+    public class MarketingSalesVCListDto: MarketingSalesUserPageFuncDtoBase
+    {
+        public int PageIndex { get; set; } = 1;
+        public int PageSize { get; set; } = 10;
+
+        public int DiId { get; set; }
+        public string Search { get; set; }
+    }
+
+    public class MarketingSalesVCOperrateDto : MarketingSalesUserPageFuncDtoBase
+    {
+        /// <summary>
+        /// opearate 时
+        /// Id > 0 修改
+        /// Id < 1 添加
+        /// </summary>
+        public int Id { get; set; }
+       
+    }
+
+    public class MarketingSalesVCSaveDto: MarketingSalesUserPageFuncDtoBase
+    {
+        public List<MarketingSalesVCSaveInfo> Items { get; set; }
+    }
+
+
+    public class MarketingSalesVCSaveInfo
+    {
+        public int DiId { get; set; }
+        /// <summary>
+        /// 拜访时间 - 开始 
+        /// </summary>
+        public DateTime BeginDt { get; set; }
+        /// <summary>
+        /// 拜访时间 - 结束
+        /// </summary>
+        public DateTime EndDt { get; set; }
+        /// <summary>
+        /// 客户单位
+        /// </summary>
+        public string CustomerUnit { get; set; }
+        /// <summary>
+        /// 客户工作
+        /// </summary>
+        public string CustomerJob { get; set; }
+        /// <summary>
+        /// 客户姓名
+        /// </summary>
+        public string CustomerName { get; set; }
+        /// <summary>
+        /// 客户联系方式
+        /// </summary>
+        public string CustomerContact { get; set; }
+        /// <summary>
+        /// 拜访内容
+        /// </summary>
+        public string Remark { get; set; }
+    }
+
+    public class MarketingSalesVCDelDto
+    {
+        public int UserId { get; set; }
+        public int Id { get; set; }
+    }
+}

+ 2 - 1
OASystem/OASystem.Domain/Entities/Financial/Fin_ForeignReceivables.cs

@@ -87,7 +87,8 @@ namespace OASystem.Domain.Entities.Financial
 
         /// <summary>
         /// 添加方式   
-        /// 0 - 账单模块   1 - 成本预算模块
+        /// 0 - 账单模块   1 - 成本预算模块 2 - 分摊费用 3 - 其他费用
+        /// TODO:增加费用类型
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int AddingWay { get; set; }

+ 2 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_HotelReservations.cs

@@ -171,6 +171,8 @@ namespace OASystem.Domain.Entities.Groups
         public decimal CardPrice { get; set; }
         /// <summary>
         /// 信用卡刷卡类型
+        /// 之前存卡类型
+        /// 现在存币种
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int CardPriceCurrency { get; set; }

+ 144 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_HotelReservationsContent.cs

@@ -0,0 +1,144 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.Groups
+{
+    /// <summary>
+    /// 酒店费用子项内容
+    /// </summary>
+    [SugarTable("Grp_HotelReservationsContent")]
+    public class Grp_HotelReservationsContent:EntityBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        [SugarColumn(IsNullable = true,ColumnDataType = "int")]
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 酒店费用录入主表Id
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int HrId { get; set; }
+
+        /// <summary>
+        /// 费用类型
+        /// 1:房费
+        /// 2:早餐
+        /// 3:地税
+        /// 4:城市税
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int PriceType { get; set; }
+
+        /// <summary>
+        /// 费用
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "decimal(10,2)")]
+        public decimal Price { get; set; }
+
+        /// <summary>
+        /// 币种
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int Currency { get; set; }
+
+        /// <summary>
+        /// 汇率
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "decimal(10,4)")]
+        public decimal Rate { get; set; }
+
+        /// <summary>
+        /// 由地接支付
+        /// 0 否 1是
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsOppay { get; set; }
+
+        /// <summary>
+        /// 支付方式
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int PayDId { get; set; }
+
+        /// <summary>
+        /// 消费方式
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(125)")]
+        public string ConsumptionPatterns { get; set; }
+        /// <summary>
+        /// 消费日期
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string ConsumptionDate { get; set; }
+        /// <summary>
+        /// 卡类型
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int CTDId { get; set; }
+        /// <summary>
+        /// 银行卡号
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(125)")]
+        public string BankNo { get; set; }
+        /// <summary>
+        /// 持卡人姓名
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(125)")]
+        public string CardholderName { get; set; }
+        ///// <summary>
+        ///// 付款金额
+        ///// </summary>
+        //[SugarColumn(IsNullable = true, ColumnDataType = "decimal(10, 2)")]
+        //public decimal PayMoney { get; set; }
+        ///// <summary>
+        ///// 付款币种 数据类型Id
+        ///// </summary>
+        //[SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        //public int PaymentCurrency { get; set; }
+
+        /// <summary>
+        /// 公司银行卡号
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(125)")]
+        public string CompanyBankNo { get; set; }
+        /// <summary>
+        /// 对方开户行
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(125)")]
+        public string OtherBankName { get; set; }
+        /// <summary>
+        /// 对方银行账号
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(125)")]
+        public string OtherSideNo { get; set; }
+        /// <summary>
+        /// 对方姓名
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(125)")]
+        public string OtherSideName { get; set; }
+
+        /// <summary> 
+        /// 是否付款  0 否 1 是
+        /// </summary> 
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int IsPay { get; set; }
+
+        /// <summary>
+        /// 收款方
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
+        public string Payee { get; set; }
+        /// <summary>
+        /// 费用标识
+        /// 0 公转 1 私转
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int OrbitalPrivateTransfer { get; set; }
+
+    }
+}

+ 57 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_VisitingClients.cs

@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.Groups
+{
+    /// <summary>
+    /// 拜访团组客户
+    /// </summary>
+    [SugarTable("Grp_VisitingClients")]
+    public class Grp_VisitingClients:EntityBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 拜访时间 - 开始
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime BeginDt { get; set; }
+
+        /// <summary>
+        /// 拜访时间 - 结束
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime EndDt { get; set; }
+
+        /// <summary>
+        /// 客户单位
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(100)")]
+        public string CustomerUnit { get; set; }
+
+        /// <summary>
+        /// 客户职务
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
+        public string CustomerJob { get; set; }
+
+        /// <summary>
+        /// 客户名称
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string CustomerName { get; set; }
+
+        /// <summary>
+        /// 客户联系方式
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string CustomerContact { get; set; }
+    }
+}

+ 34 - 0
OASystem/OASystem.Domain/Enums/BusStatusCode.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Enums
+{
+    /// <summary>
+    /// 业务状态码
+    /// </summary>
+    public enum  BusStatusCode:int
+    {
+        [Description("操作成功")]
+        Success = 200,//添加成功
+        [Description("操作失败")]
+        Failed = 201,//添加失败
+        [Description("添加失败")]
+        AddFailed = 202,//添加失败
+        [Description("修改失败")]
+        UpdateFailed = 203,//修改失败
+        [Description("删除失败")]
+        DeleteFailed = 204,//删除失败
+        [Description("请检查端口值是否正确!“portType”:1:WEB;2:ANDROID;3:IOS;")]
+        PortTypeError = 205,//端口类型错误
+        [Description("集合没有数据,请传入数据")]
+        ItemsNotFound = 206,//没有找到数据
+        [Description("DiId值错误")]
+        DiIdValueError = 207,//DiId值错误
+        [Description("UserId值错误")]
+        UserIdValueError = 208,//UserId值错误
+    }
+}

+ 31 - 0
OASystem/OASystem.Domain/Result.cs

@@ -29,6 +29,26 @@ namespace OASystem.Domain
         /// </summary>
         public static string Fail = "操作失败!";
 
+        /// <summary>
+        /// 添加成功
+        /// </summary>
+        public static string AddSucceed = "添加成功!";
+
+        /// <summary>
+        /// 添加成功
+        /// </summary>
+        public static string AddFail = "添加失败!";
+
+        /// <summary>
+        /// 修改成功
+        /// </summary>
+        public static string EditSucceed = "修改成功!";
+
+        /// <summary>
+        /// 修改成功
+        /// </summary>
+        public static string EditFail = "修改失败!";
+
         /// <summary>
         /// 端口错误消息提示
         /// </summary>
@@ -61,6 +81,17 @@ namespace OASystem.Domain
         /// UserId错误消息提示
         /// </summary>
         public static string UserId = "请检查UserId是否正确!";
+
+
+        /// <summary>
+        /// PageId错误消息提示
+        /// </summary>
+        public static string PageId = "请检查PageId是否正确!";
+
+        /// <summary>
+        /// CheckAuth 错误消息提示
+        /// </summary>
+        public static string CheckAuth = "您没有查看权限!";
     }
 
    

+ 7 - 0
OASystem/OASystem.Domain/ViewModels/Financial/Fin_DailyFeePaymentView.cs

@@ -426,6 +426,11 @@ namespace OASystem.Domain.ViewModels.Financial
 
         public int Id { get; set; }
 
+        /// <summary>
+        /// 酒店费用子类 Id
+        /// </summary>
+        public int HotelSubId { get; set; } = -1;
+
         /// <summary>
         /// 支付方式
         /// </summary>
@@ -496,5 +501,7 @@ namespace OASystem.Domain.ViewModels.Financial
         public List<int> GroupIds { get; set; }
 
         public List<int> DailyPaymentIds { get; set; }
+
+        public List<int> HotelSubIds { get; set; }
     }
 }

+ 146 - 53
OASystem/OASystem.Domain/ViewModels/Groups/HotelReservationsByDiIdView.cs

@@ -115,11 +115,6 @@ namespace OASystem.Domain.ViewModels.Groups
         /// </summary>
         public int GTId { get; set; }
 
-        /// <summary>
-        /// 卡类型 (设置数据外键编号)
-        /// </summary>
-        public int CTDId { get; set; }
-
         /// <summary>
         /// 入住卷号
         /// </summary>
@@ -236,109 +231,207 @@ namespace OASystem.Domain.ViewModels.Groups
         public decimal CardPrice { get; set; }
 
         /// <summary>
-        /// 是否由地接支付
-        /// 0 否 1 是
+        /// 信用卡币种
         /// </summary>
-        public int Isoppay { get; set; }
+        public int CardPriceCurrency { get; set; }
+
+        ///// <summary>
+        ///// 是否由地接支付
+        ///// 0 否 1 是
+        ///// </summary>
+        //public int Isoppay { get; set; }
+
+        ///// <summary>
+        ///// 早餐价格
+        ///// </summary>
+        //public decimal BreakfastPrice { get; set; }
+
+        ///// <summary>
+        ///// 早餐币种 (设置数据外键编号)
+        ///// </summary>
+        //public int BreakfastCurrency { get; set; }
+
+        ///// <summary>
+        ///// 地税
+        ///// </summary>
+        //public decimal GovernmentRent { get; set; }
+
+        ///// <summary> 
+        ///// 地税币种 (设置数据外键编号)
+        ///// </summary>
+        //public int GovernmentRentCurrency { get; set; }
+
+        ///// <summary>
+        ///// 城市税
+        ///// </summary>
+        //public decimal CityTax { get; set; }
+
+        ///// <summary>
+        ///// 城市税币种 (设置数据外键编号)
+        ///// </summary>
+        //public int CityTaxCurrency { get; set; }
+
+        ///// <summary>
+        ///// 支付方式 (设置数据外键编号)
+        ///// </summary>
+        //public int PayDId { get; set; }
+
+        ///// <summary>
+        ///// 消费方式
+        ///// </summary>
+        //public string? ConsumptionPatterns { get; set; }
+
+        ///// <summary>
+        ///// 消费日期
+        ///// </summary>
+        //public string? ConsumptionDate { get; set; }
 
         /// <summary>
-        /// 早餐价格
+        /// 付款金额
         /// </summary>
-        public decimal BreakfastPrice { get; set; }
+        public decimal PayMoney { get; set; }
 
         /// <summary>
-        /// 早餐币种 (设置数据外键编号)
+        /// 付款币种 (设置数据外键编号)
         /// </summary>
-        public int BreakfastCurrency { get; set; }
+        public int PaymentCurrency { get; set; }
+
+        ///// <summary>
+        ///// 银行卡号
+        ///// </summary>
+        //public string? BankNo { get; set; }
+        ///// <summary>
+        ///// 持卡人姓名
+        ///// </summary>
+        //public string? CardholderName { get; set; }
+
+        ///// <summary>
+        ///// 公司银行账号
+        ///// </summary>
+        //public string? CompanyBankNo { get; set; }
+
+        ///// <summary>
+        ///// 对方开户行
+        ///// </summary>
+        //public string? OtherBankName { get; set; }
+
+        ///// <summary>
+        ///// 对方银行账号
+        ///// </summary>
+        //public string? OtherSideNo { get; set; }
+
+        ///// <summary>
+        ///// 对方姓名
+        ///// </summary>
+        //public string? OtherSideName { get; set; }
+
+        ///// <summary>
+        ///// 收款方
+        ///// </summary>
+        //public string? Payee { get; set; }
+
+        ///// <summary>
+        ///// 费用标识 (设置数据外键编号)
+        ///// </summary>
+        //public int OrbitalPrivateTransfer { get; set; }
 
         /// <summary>
-        /// 地税
+        /// C表付款信息 备注
         /// </summary>
-        public decimal GovernmentRent { get; set; }
+        public string? CcpRemark { get; set; }
+         
+        public List<HotelReservationsContnetDetailsView>  Contents { get; set; }
+    }
 
-        /// <summary> 
-        /// 地税币种 (设置数据外键编号)
-        /// </summary>
-        public int GovernmentRentCurrency { get; set; }
+    public class HotelReservationsContnetDetailsView
+    {
+        public int Id { get; set; }
+
+        public int DiId { get; set; }
+
+        public int HrId { get; set; }
 
         /// <summary>
-        /// 城市税
+        /// 费用类型
+        /// 1:房费
+        /// 2:早餐
+        /// 3:地税
+        /// 4:城市税
         /// </summary>
-        public decimal CityTax { get; set; }
+        public int PriceType { get; set; }
 
         /// <summary>
-        /// 城市税币种 (设置数据外键编号)
+        /// 费用
         /// </summary>
-        public int CityTaxCurrency { get; set; }
+        public decimal Price { get; set; }
 
         /// <summary>
-        /// 支付方式 (设置数据外键编号)
+        /// 币种
         /// </summary>
-        public int PayDId { get; set; }
+        public int Currency { get; set; }
 
         /// <summary>
-        /// 消费方式
+        /// 汇率
         /// </summary>
-        public string? ConsumptionPatterns { get; set; }
+        public decimal Rate { get; set; }
 
         /// <summary>
-        /// 消费日期
+        /// 由地接支付
+        /// 0 否 1是
         /// </summary>
-        public string? ConsumptionDate { get; set; }
+        public int IsOppay { get; set; }
 
         /// <summary>
-        /// 付款金额
+        /// 支付方式
         /// </summary>
-        public decimal PayMoney { get; set; }
+        public int PayDId { get; set; } = 1;
 
         /// <summary>
-        /// 付款币种 (设置数据外键编号)
+        /// 消费方式
         /// </summary>
-        public int PaymentCurrency { get; set; }
-
+        public string ConsumptionPatterns { get; set; }
+        /// <summary>
+        /// 消费日期
+        /// </summary>
+        public string ConsumptionDate { get; set; }
+        /// <summary>
+        /// 卡类型
+        /// </summary>
+        public int CTDId { get; set; }
         /// <summary>
         /// 银行卡号
         /// </summary>
-        public string? BankNo { get; set; }
+        public string BankNo { get; set; }
         /// <summary>
         /// 持卡人姓名
         /// </summary>
-        public string? CardholderName { get; set; }
-
+        public string CardholderName { get; set; }
         /// <summary>
-        /// 公司银行
+        /// 公司银行
         /// </summary>
-        public string? CompanyBankNo { get; set; }
-
+        public string CompanyBankNo { get; set; }
         /// <summary>
         /// 对方开户行
         /// </summary>
-        public string? OtherBankName { get; set; }
-
+        public string OtherBankName { get; set; }
         /// <summary>
         /// 对方银行账号
         /// </summary>
-        public string? OtherSideNo { get; set; }
-
+        public string OtherSideNo { get; set; }
         /// <summary>
         /// 对方姓名
         /// </summary>
-        public string? OtherSideName { get; set; }
+        public string OtherSideName { get; set; }
 
         /// <summary>
         /// 收款方
         /// </summary>
-        public string? Payee { get; set; }
-
-        /// <summary>
-        /// 费用标识 (设置数据外键编号)
-        /// </summary>
-        public int OrbitalPrivateTransfer { get; set; }
-
+        public string Payee { get; set; }
         /// <summary>
-        /// C表付款信息 备注
+        /// 费用标识
+        /// 0 公转 1 私转
         /// </summary>
-        public string? CcpRemark { get; set; }
+        public int OrbitalPrivateTransfer { get; set; } = 0;
     }
 
     /// <summary>

+ 54 - 0
OASystem/OASystem.Domain/ViewModels/Groups/VisitingClientsView.cs

@@ -0,0 +1,54 @@
+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
+{
+    public class VisitingClientsView:Grp_VisitingClients
+    {
+    }
+
+    public class VisitingClientsListView
+    {
+        public int RowNumber { get; set; }
+        /// <summary>
+        /// opearate 时
+        /// Id > 0 修改
+        /// Id < 1 添加
+        /// </summary>
+        public int Id { get; set; }
+        /// <summary>
+        /// 拜访时间 - 开始 
+        /// </summary>
+        public DateTime BeginDt { get; set; }
+        /// <summary>
+        /// 拜访时间 - 结束
+        /// </summary>
+        public DateTime EndDt { get; set; }
+        /// <summary>
+        /// 客户单位
+        /// </summary>
+        public string CustomerUnit { get; set; }
+        /// <summary>
+        /// 客户工作
+        /// </summary>
+        public string CustomerJob { get; set; }
+        /// <summary>
+        /// 客户姓名
+        /// </summary>
+        public string CustomerName { get; set; }
+        /// <summary>
+        /// 客户联系方式
+        /// </summary>
+        public string CustomerContact { get; set; }
+        /// <summary>
+        /// 拜访内容
+        /// </summary>
+        public string Remark { get; set; }
+        public string Operator { get; set; }
+        public string OperationDt { get; set; }
+    }
+}

+ 62 - 30
OASystem/OASystem.Domain/ViewModels/Statistics/GroupStatementView.cs

@@ -584,10 +584,7 @@ namespace OASystem.Domain.ViewModels.Statistics
         /// </summary>
         public string? CheckOutDate { get; set; }
 
-        /// <summary>
-        /// 支付币种
-        /// </summary>
-        public string? PaymentCurrency { get; set; }
+
 
         /// <summary>
         /// 单间价格
@@ -629,6 +626,21 @@ namespace OASystem.Domain.ViewModels.Statistics
         /// </summary>
         public int OtherRoomCount { get; set; }
 
+        /// <summary>
+        /// 房间费用
+        /// </summary>
+        public decimal RoomPrice { get; set; }
+
+        /// <summary>
+        /// 房间费用币种
+        /// </summary>
+        public string RoomPriceCurrency { get; set; }
+
+        /// <summary>
+        /// 房间费用提示信息
+        /// </summary>
+        public string RoomInfoTips { get; set; }
+
         /// <summary>
         /// 早餐费用
         /// </summary>
@@ -640,10 +652,15 @@ namespace OASystem.Domain.ViewModels.Statistics
         public string? BreakfastCurrency { get; set; }
 
         /// <summary>
-        /// 由地接支付
-        /// 0 是 1否
+        /// 早餐提示消息
         /// </summary>
-        public int Isoppay { get; set; }
+        public string BreakfastInfoTips { get; set; }
+
+        ///// <summary>
+        ///// 由地接支付
+        ///// 0 是 1否
+        ///// </summary>
+        //public int Isoppay { get; set; }
 
         /// <summary>
         /// 地税
@@ -655,6 +672,11 @@ namespace OASystem.Domain.ViewModels.Statistics
         /// </summary>
         public string? GovernmentRentCurrency { get; set; }
 
+        /// <summary>
+        /// 地税提示消息
+        /// </summary>
+        public string GovernmentRentTips { get; set; }
+
         /// <summary>
         /// 城市价格
         /// </summary>
@@ -666,45 +688,55 @@ namespace OASystem.Domain.ViewModels.Statistics
         public string? CityTaxCurrency { get; set; }
 
         /// <summary>
-        /// 信用卡金额
+        /// 城市税提示信息
         /// </summary>
-        public decimal PayMoney { get; set; } = 0.00M;
+        public string? CityTaxTips { get; set; }
 
         /// <summary>
-        /// 人民币金额
+        /// 信用卡金额
         /// </summary>
-        public decimal CNYPrice { get; set; } = 0.00M;
+        public decimal PayMoney { get; set; } = 0.00M;
 
         /// <summary>
-        /// 当天汇率
+        /// 信用卡金额币种
         /// </summary>
-        public decimal DayRate { get; set; } = 0.0000M;
+        public string? PaymentCurrency { get; set; }
 
         /// <summary>
-        /// 币种汇率
+        /// 人民币金额
         /// </summary>
-        public string? CurrencyRateStr { get; set; }
+        public decimal CNYPrice { get; set; } = 0.00M;
 
-        /// <summary>
-        /// 收款方
-        /// </summary>
-        public string? Payee { get; set; }
+        ///// <summary>
+        ///// 当天汇率
+        ///// </summary>
+        //public decimal DayRate { get; set; } = 0.0000M;
 
-        /// <summary>
-        /// 费用标识
-        /// -1 未选择 0 公转 1 私转
-        /// </summary>
-        public int OrbitalPrivateTransfer { get; set; }
+        ///// <summary>
+        ///// 币种汇率
+        ///// </summary>
+        //public string? CurrencyRateStr { get; set; }
 
         /// <summary>
-        /// 支付方式
+        /// 收款方
         /// </summary>
-        public string? PayWay { get; set; }
+        public string? Payee { get; set; }
 
-        /// <summary>
-        /// 卡类型
-        /// </summary>
-        public string? CardType { get; set; }
+        ///// <summary>
+        ///// 费用标识
+        ///// -1 未选择 0 公转 1 私转
+        ///// </summary>
+        //public int OrbitalPrivateTransfer { get; set; }
+
+        ///// <summary>
+        ///// 支付方式
+        ///// </summary>
+        //public string? PayWay { get; set; }
+
+        ///// <summary>
+        ///// 卡类型
+        ///// </summary>
+        //public string? CardType { get; set; }
 
         /// <summary>
         /// 是否支付

+ 37 - 0
OASystem/OASystem.Domain/ViewModels/Statistics/MarketingSalesView.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.Statistics
+{
+    public class MarketingSalesView
+    {
+    }
+
+    public class MarketingSalesGroupList {
+        public int RowNumber { get; set; }
+        public int Id { get; set; }
+        public string TeamName { get; set; }
+        public string ClientUnit { get; set; }
+        public string ClientName { get; set; }
+        public int VisitPNumber { get; set; } 
+        public DateTime VisitDate { get; set; }
+        public DateTime VisitEndDate { get; set; }
+        public decimal GroupSales { get; set; }
+        public DateTime CollectionDays { get; set; }
+        public string GroupPickupUser { get; set; }
+    }
+
+    public class  MarketingSalesGroupStatisticsView {
+        public string Name { get; set; }
+        public int Count { get; set; }
+    }
+
+    public class MarketingSalesOrderRankingView {
+        public int RowNumber { get; set; }
+        public string UserName { get; set; }
+        public int Count { get; set; }
+    }
+}

+ 22 - 0
OASystem/OASystem.Domain/ViewModels/Statistics/MonthlyTimeSegment.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.Statistics
+{
+    public class MonthlyTimeSegment
+    {
+        public DateTime Start { get; private set; }
+        public DateTime End { get; private set; }
+
+        public MonthlyTimeSegment(int year, int month)
+        {
+            DateTime startOfMonth = new DateTime(year, month, 1);
+            DateTime endOfMonth = startOfMonth.AddMonths(1).AddDays(-1);
+            Start = startOfMonth;
+            End = endOfMonth;
+        }
+    }
+}

Разлика између датотеке није приказан због своје велике величине
+ 228 - 718
OASystem/OASystem.Infrastructure/Repositories/Groups/HotelPriceRepository.cs


+ 84 - 1
OASystem/OASystem.Infrastructure/Repositories/Groups/TeamRateRepository.cs

@@ -1,4 +1,5 @@
 using Newtonsoft.Json;
+using NPOI.SS.Formula.PTG;
 using OASystem.Domain;
 using OASystem.Domain.Dtos.Financial;
 using OASystem.Domain.Dtos.Groups;
@@ -393,6 +394,29 @@ namespace OASystem.Infrastructure.Repositories.Groups
                                         .ExecuteCommandAsync();
                             if (res > 0)
                             {
+                                //团组汇率更改成功;更改C表对应汇率 及rmb金额
+                                var ccpInfos = _sqlSugar.Queryable<Grp_CreditCardPayment>().Where(it => it.IsDel == 0 && it.DIId == dto.DiId && it.CTable == item.CTable).ToList();
+                                var currData = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.IsDel == 0 && it.STid == 66).ToList();
+                                if (ccpInfos.Count > 0)
+                                {
+                                    foreach (var ccpInfo in ccpInfos)
+                                    {
+                                        string currCode = currData.Find(it => it.Id == ccpInfo.PaymentCurrency)?.Name ?? "";
+                                        decimal thisRate = item.teamRates.Find(it => it.CurrencyCode.Equals(currCode))?.Rate ?? 0.00M;
+                                        if (thisRate > 0.00M)
+                                        {
+                                            ccpInfo.DayRate = thisRate;
+                                            ccpInfo.RMBPrice = ccpInfo.PayMoney * thisRate;
+                                        }
+                                    }
+
+                                    var ccpStatus = _sqlSugar.Updateable(ccpInfos)
+                                                             .UpdateColumns(it => new { it.DayRate, it.RMBPrice })
+                                                             .WhereColumns(it => it.Id)
+                                                             .ExecuteCommand();
+                                }
+                                
+
                                 updateCount++;
                             }
                         }
@@ -402,7 +426,6 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             result.Msg = "操作失败!";
                             break;
                         }
-
                     }
 
                     if (res > 0)
@@ -473,6 +496,66 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
         }
 
+        /// <summary>
+        /// 更改团组对应模块 对应币种汇率
+        /// </summary>
+        /// <param name="diId">团组Id</param>
+        /// <param name="cTableId">团组模块</param>
+        /// <param name="currCode">币种code</param>
+        /// <param name="currRate">币种汇率</param>
+        /// <returns></returns>
+        public async Task<bool> UpdateGroupRateByDiIdAndCTableId(int diId, int cTableId, string currCode, decimal currRate)
+        {
+            if (diId < 1) return false;
+            if (cTableId < 1) return false;
+
+            var _info = await PostGroupTeamRateByDiIdAndCTableId(1, diId, cTableId);
+            TeamRateUpdateDto OPDto = new TeamRateUpdateDto();
+            OPDto.DiId = diId;
+            var teamRates = new List<TeamRateUpdateInfo>();
+            if (_info == null) 
+            {
+                var currData = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.IsDel == 0 && it.STid == 66 && it.Name.Equals(currCode)).First();
+                teamRates.Add(
+                    new TeamRateUpdateInfo()
+                    {
+                        Id = 0,
+                        CTable = cTableId,
+                        teamRates = new List<TeamRateDescView> 
+                        {
+                            new TeamRateDescView() 
+                            {
+                                CurrencyName = currData?.Remark,
+                                CurrencyCode = currCode,
+                                Rate = currRate
+                            }
+                        }
+                    }
+                );
+            }
+            else
+            {
+                var rateCurrInfo = new TeamRateUpdateInfo();
+                rateCurrInfo.CTable = cTableId;
+                var currInfos = new List<TeamRateDescView>();
+                foreach (var item in _info.TeamRates)
+                {
+                    var currInfo = new TeamRateDescView();
+                    currInfo.CurrencyName = item.CurrencyName;
+                    currInfo.CurrencyCode = item.CurrencyCode;
+                    if (item.CurrencyCode.Equals(currCode)) currInfo.Rate = currRate;
+                    else currInfo.Rate = item.Rate;
+                    currInfos.Add(currInfo);
+                }
+                rateCurrInfo.teamRates = currInfos;
+                teamRates.Add(rateCurrInfo);
+            }
+            OPDto.teamRateUpdateInfos = teamRates;
+            await PostGroupRateUpdate(OPDto);
+
+            return true;
+        }
+
         /// <summary>
         /// 团组汇率币种拆分
         /// 团组币种按指定格式拆分 返回集合

+ 153 - 0
OASystem/OASystem.Infrastructure/Repositories/Groups/VisitingClientsRepository.cs

@@ -0,0 +1,153 @@
+using AutoMapper;
+using OASystem.Domain;
+using OASystem.Domain.Dtos.Statistics;
+using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.ViewModels.Groups;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Infrastructure.Repositories.Groups
+{
+    /// <summary>
+    /// 客户拜访 仓储
+    /// </summary>
+    public class VisitingClientsRepository : BaseRepository<Grp_VisitingClients, VisitingClientsView>
+    {
+
+        private readonly IMapper _mapper;
+        private readonly JsonView _view; 
+        public VisitingClientsRepository(SqlSugarClient sqlSugar, IMapper mapper)
+            : base(sqlSugar)
+        {
+            _mapper = mapper;
+            _view = new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = BusStatusCode.Failed.GetEnumDescription() };
+        }
+
+        /// <summary>
+        /// 获取客户拜访列表
+        /// </summary>
+        /// <param name="portType"></param>
+        /// <param name="pageIndex"></param>
+        /// <param name="pageSize"></param>
+        /// <param name="diId"></param>
+        /// <param name="search"></param>
+        /// <returns></returns>
+        public async Task<JsonView> _List(int portType,int pageIndex, int pageSize,int diId,string search)
+        {
+            if (portType ==1 || portType == 2 || portType == 3)
+            {
+                string sql  = string.Format(@$"Select
+	ROW_NUMBER() Over(Order By BeginDt Asc) As RowNumber,
+	vc.Id,
+	vc.BeginDt,
+	vc.EndDt,
+	vc.CustomerUnit,
+	vc.CustomerJob,
+	vc.CustomerName,
+	vc.CustomerContact,
+	u.CnName As Operator,
+	vc.CreateTime As OperationDt
+From Grp_VisitingClients vc 
+Left Join Sys_Users u On vc.CreateUserId = u.Id
+Where vc.Isdel = 0 And vc.DiId = {diId}");
+
+                RefAsync<int > total = 0;
+                var data = await _sqlSugar.SqlQueryable<VisitingClientsListView>(sql).ToPageListAsync(pageIndex, pageSize, total);
+
+                _view.Code = StatusCodes.Status200OK;
+                _view.Msg = MsgTips.Succeed;
+                _view.Data = data;
+                _view.Count = total;
+            }
+
+            return _view;
+        }
+
+        /// <summary>
+        /// 团组客户拜访 Add Or Edit
+        /// </summary>
+        /// <param name="_dto"></param>
+        /// <returns></returns>
+        public async Task<JsonView> _AddOrEdit(MarketingSalesVCOperrateDto _dto)
+        {
+            var info = _mapper.Map<Grp_VisitingClients>(_dto);
+
+            if (_dto.PortType == 1 || _dto.PortType == 2 || _dto.PortType == 3)
+            {
+                if (info.Id > 0) //编辑
+                {
+                    var update = await _sqlSugar.Updateable(info).IgnoreColumns(it => new { it.CreateTime, it.CreateUserId, it.DeleteUserId, it.DeleteTime, it.IsDel }).ExecuteCommandAsync();
+                    if (update <= 0) return new JsonView() { Code = (int)BusStatusCode.UpdateFailed, Msg = BusStatusCode.UpdateFailed.GetEnumDescription() };
+                }
+                else //新增
+                {
+                    info.CreateUserId = _dto.UserId;
+                    var add = await _sqlSugar.Insertable(info).ExecuteCommandAsync();
+                    if (add <= 0) return new JsonView() { Code = (int)BusStatusCode.AddFailed, Msg = BusStatusCode.AddFailed.GetEnumDescription() };
+                }
+                return new JsonView() { Code = (int)BusStatusCode.Success, Msg = BusStatusCode.Success.GetEnumDescription() };
+            }
+            else return new JsonView() { Code = (int)BusStatusCode.PortTypeError, Msg = BusStatusCode.PortTypeError.GetEnumDescription() };
+        }
+
+
+        public async Task<JsonView> _Save(MarketingSalesVCSaveDto _dto)
+        {
+            var infos = _mapper.Map<List<Grp_VisitingClients>>(_dto.Items);
+
+            if (_dto.PortType == 1 || _dto.PortType == 2 || _dto.PortType == 3)
+            {
+
+                if (infos.Count > 0)
+                {
+                    infos.ForEach(it => {
+                        it.CreateUserId = _dto.UserId;
+                    });
+                    int diid = infos[0].DiId;
+                    int userId = _dto.UserId; 
+                    if (diid < 1) return new JsonView() { Code = (int)BusStatusCode.DiIdValueError, Msg = BusStatusCode.DiIdValueError.GetEnumDescription() };
+                    
+                    if (userId < 1) return new JsonView() { Code = (int)BusStatusCode.UserIdValueError, Msg = BusStatusCode.UserIdValueError.GetEnumDescription() };
+
+
+                    //执行逻辑删除
+                    var update = await _sqlSugar.Updateable<Grp_VisitingClients>()
+                                                .SetColumns(it => new Grp_VisitingClients() { IsDel = 1, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), DeleteUserId = userId })
+                                                .Where(it => it.DiId == diid)
+                                                .ExecuteCommandAsync();
+
+                    //执行添加
+                    var add = await _sqlSugar.Insertable(infos).ExecuteCommandAsync();
+
+                    if (add > 0) return new JsonView() { Code = (int)BusStatusCode.Success, Msg = BusStatusCode.Success.GetEnumDescription() };
+
+                }
+                else new JsonView() { Code = (int)BusStatusCode.ItemsNotFound, Msg = BusStatusCode.ItemsNotFound.GetEnumDescription() };
+            }
+            else return new JsonView() { Code = (int)BusStatusCode.PortTypeError, Msg = BusStatusCode.PortTypeError.GetEnumDescription() };
+
+            return new JsonView() { Code = (int)BusStatusCode.Failed, Msg = BusStatusCode.Failed.GetEnumDescription() };
+        }
+
+        /// <summary>
+        /// 团组客户拜访 del
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="userId"></param>
+        /// <returns></returns>
+        public async Task<JsonView> _Del(int id, int userId)
+        {
+            var info = new Grp_VisitingClients() { Id = id, IsDel = 1, DeleteUserId = userId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};
+            var update = await _sqlSugar.Updateable(info)
+                                        .UpdateColumns(it => new { it.IsDel, it.DeleteUserId, it.DeleteTime })
+                                        .WhereColumns(it => it.Id)
+                                        .ExecuteCommandAsync();
+            if (update <= 0) return new JsonView() { Code = (int)BusStatusCode.DeleteFailed, Msg = BusStatusCode.DeleteFailed.GetEnumDescription() };
+            return new JsonView() { Code = (int)BusStatusCode.Success, Msg = BusStatusCode.Success.GetEnumDescription() };
+
+        }
+    }
+}