浏览代码

成本修改

yuanrf 4 天之前
父节点
当前提交
6ca8b79f34

+ 342 - 48
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -18033,6 +18033,31 @@ FROM
             designer.Workbook.Worksheets[1].Name = "费用总核算";
             Worksheet sheet = designer.Workbook.Worksheets[0];
 
+            #region 隐藏舱位
+            var settingAir = new[]
+            {
+                new { key = "经济舱", index = 7 },
+                new { key = "公务舱", index = 19 },
+                new { key = "头等舱", index = 11 }
+            };
+
+            var airType = _sqlSugar.Queryable<Grp_TourClientList>()
+                    .LeftJoin<Sys_SetData>((c, s) => s.IsDel == 0 && c.ShippingSpaceTypeId == s.Id)
+                    .Where((c, s) => c.IsDel == 0 && c.DiId == di.Id)
+                    .Select((c, s) => s.Name)
+                    .ToList()
+                    .GroupBy(x => x)
+                    .Select(x => x.Key);
+
+            foreach (var item in settingAir)
+            {
+                if (!airType.Contains(item.key))
+                {
+                    hideRowsList.Add(item.index);
+                }
+            }
+            #endregion
+
             foreach (var Rowindex in hideRowsList)
             {
                 ws.Cells.HideRows(Rowindex, 2);
@@ -19552,83 +19577,352 @@ AirHotelPrice
             public int Count { get; set; }
         }
 
-
-        private class HotelSum
+        /// <summary>
+        /// 团组系数设置
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IActionResult> QueryGroupCostCoefficient(QueryGroupCostCoefficientDto dto)
         {
-            internal decimal SGR { get; set; }
+            var di = await _sqlSugar.Queryable<Grp_DelegationInfo>()
+                .FirstAsync(x => x.Id == dto.Diid && x.IsDel == 0);
 
-            internal decimal TBR { get; set; }
+            if (di == null)
+            {
+                return Ok(JsonView(false, "团组不存在!"));
+            }
 
-            internal decimal JSES { get; set; }
+            //var firstExpression = Expressionable.Create<Grp_GroupCostParameter>()
+            //                                    .And(x => x.CostType == "A" && x.DiId == di.Id && x.IsDel == 0);
+            //var groupCostMainPrice = await _sqlSugar.Queryable<Grp_GroupCostParameter>().
+            //                            FirstAsync(firstExpression.ToExpression());
 
-            internal decimal SUITE { get; set; }
+            #region JSON
+            string hcpJson = @"
+                            [
+                                {
+                                    ""min"": 1,
+                                    ""max"": 500,
+                                    ""value"": 1.50
+                                },
+                                {
+                                    ""min"": 501,
+                                    ""max"": 1000,
+                                    ""value"": 1.40
+                                },
+                                {
+                                    ""min"": 1001,
+                                    ""max"": 2000,
+                                    ""value"": 1.35
+                                }
+                            ]";
+            #endregion
 
-            internal decimal AllPrice
-            {
-                get { return SGR + TBR + JSES + SUITE; }
-            }
-        }
+            var hcpPriceRange = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PriceRange>>(hcpJson);
 
+            List<(Predicate<decimal>, decimal)> hcpSwitchDictionary = hcpPriceRange
+                .Select(pr => (new Predicate<decimal>(x => x >= pr.Min && x <= pr.Max), pr.Value))
+                .ToList();
 
+            List<(Predicate<decimal>, List<(Predicate<decimal>, decimal)>)> jjcSwitchDictionary =
+                new List<(Predicate<decimal>, List<(Predicate<decimal>, decimal)>)>();
 
-        [HttpPost]
-        public async Task<IActionResult> QueryGroupCostCoefficient(QueryGroupCostCoefficientDto dto)
-        {
-            var di = await _sqlSugar.Queryable<Grp_DelegationInfo>()
-                .FirstAsync(x => x.Id == dto.Diid && x.IsDel == 0);
+            //jjcSwitchDictionary.Add((new Predicate<decimal>(x => x >= 1 && x <= 3),
+            //    new List<(Predicate<decimal>, decimal)>()
+            //    {
+            //        (new Predicate<decimal>(y => y >= 1000 && y <= 3000), 2.6M),
+            //        (new Predicate<decimal>(y => y > 3000), 2.5M)
+            //    }
+            //    ));
 
-            if (di == null)
+            #region 签证系数
+
+            var visaXS = 0.00M;
+            switch (dto.VisaCB)
             {
-                return Ok(JsonView(false, "团组不存在!"));
+                case decimal n when (n > 1 && n < 500):
+
+                    switch (dto.VisaRS)
+                    {
+                        case 2 or 3:
+                            visaXS = 1.35M;
+                            break;
+                        case 4 or 5:
+                            visaXS = 1.30M;
+                            break;
+                        case 6 or 7:
+                            visaXS = 1.25M;
+                            break;
+                        case 8 or 9 or 10:
+                            visaXS = 1.20M;
+                            break;
+                        case > 10:
+                            visaXS = 1.15M;
+                            break;
+                        default:
+                            visaXS = 0.00M;
+                            break;
+                    }
+                    break;
+
+                case decimal n when (n >= 500 && n < 1000):
+
+                    switch (dto.VisaRS)
+                    {
+                        case 2 or 3 or 4:
+                            visaXS = 1.30M;
+                            break;
+                        case 5 or 6 or 7 or 8:
+                            visaXS = 1.25M;
+                            break;
+                        case 9 or 10:
+                            visaXS = 1.20M;
+                            break;
+                        case > 10:
+                            visaXS = 1.15M;
+                            break;
+                        default:
+                            visaXS = 0.00M;
+                            break;
+                    }
+                    break;
+
+                default:
+
+                    switch (dto.VisaRS)
+                    {
+                        case 2 or 3 or 4:
+                            visaXS = 1.30M;
+                            break;
+                        case 5 or 6 or 7 or 8:
+                            visaXS = 1.25M;
+                            break;
+                        case 9 or 10:
+                            visaXS = 1.20M;
+                            break;
+                        case > 10:
+                            visaXS = 1.15M;
+                            break;
+                        default:
+                            visaXS = 0.00M;
+                            break;
+                    }
+                    break;
+
             }
 
-            var groupCost = _sqlSugar.Queryable<Grp_GroupCost>()
-                                     .Where(x => x.Diid == dto.Diid && x.IsDel == 0)
-                                     .ToList();
+            #endregion
 
-            var groupHotelNumber = _sqlSugar.Queryable<Grp_CostTypeHotelNumber>()
-                                     .Where(x => x.Diid == dto.Diid && x.IsDel == 0)
-                                     .ToList();
+            #region 火车系数
+            var hcpXS = 0.00M;
+            foreach (var (condition, result) in hcpSwitchDictionary)
+            {
+                if (condition(dto.HCPCB))
+                {
+                    hcpXS = result;
+                    break;
+                }
+            }
+            #endregion
 
-            var groupHotelNumberDefault = groupHotelNumber.FirstOrDefault(x => x.Type == "Default");
+            #region 机票系数
 
-            HotelSum hotelSumP = new();
+            #region 经济舱系数
+            var jjcXS = 0.00M; 
+            switch (dto.JJCCB)
+            {
+                case decimal x when (x >= 1000 && x <= 3000):
+                    jjcXS = 2.6M;
+                    break;
+                case decimal x when (x >= 3001 && x <= 8000):
+                    jjcXS = 2.3M;
+                    break;
+                case decimal x when (x >= 8001 && x <= 15000):
+                    jjcXS = 2.1M;
+                    break;
+                case decimal x when (x >= 15001 && x <= 30000):
+                    jjcXS = 1.95M;
+                    break;
+                case > 30000:
+                    jjcXS = 1.8M;
+                    break;
+                default:
+                    break;
+            }
+
+            #endregion
 
-            if (groupCost.Any())
+            #region 公务舱系数
+            var gwcXS = 0.00M;
+            switch (dto.GWCCB)
             {
-                hotelSumP.SGR = groupHotelNumberDefault.SGR > 0 ? groupCost.Sum(x => x.SGR) * groupHotelNumberDefault.SGR : 0;
-                hotelSumP.TBR = groupHotelNumberDefault.TBR > 0 ? groupCost.Sum(x => x.TBR) * groupHotelNumberDefault.TBR : 0;
-                hotelSumP.JSES = groupHotelNumberDefault.JSES > 0 ? groupCost.Sum(x => x.JS_ES) * groupHotelNumberDefault.JSES : 0;
-                hotelSumP.SUITE = groupHotelNumberDefault.SUITE > 0 ? groupCost.Sum(x => x.Suite) * groupHotelNumberDefault.SUITE : 0;
+                case decimal x when (x >= 1000 && x <= 3000):
+                    gwcXS = 2.5M;
+                    break;
+                case decimal x when (x >= 3001 && x <= 8000):
+                    gwcXS = 2.2M;
+                    break;
+                case decimal x when (x >= 8001 && x <= 15000):
+                    gwcXS = 2.0M;
+                    break;
+                case decimal x when (x >= 15001 && x <= 30000):
+                    gwcXS = 1.85M;
+                    break;
+                case > 30000:
+                    gwcXS = 1.7M;
+                    break;
+                default:
+                    break;
             }
+            #endregion
 
-            #region 地接系数
-            Func<int, decimal> coefficientByDJ = (number) =>
+            #region 头等舱系数
+            var tdcXS = 0.00M;
+            switch (dto.TDCCB)
             {
-                if (number < 1) return 0.00M;
+                case > 70000:
+                    tdcXS = 1.5M;
+                    break;
+                default:
+                    tdcXS = 1.9M;
+                    break;
+            }
+            #endregion
 
-                return number switch
-                {
-                    < 6 => 2.5M,
-                    6 => 2.4M,
-                    7 => 1.8M,
-                    8 => 2.0M,
-                    9 => 3.0M,
-                    10 => 1.75M,
-                    > 10 => 1.9M,
-                };
-            };
             #endregion
 
             #region 酒店系数
 
+            Dictionary<decimal, List<string>> dic = new Dictionary<decimal, List<string>>()
+            {
+                {1.6M, new List<string>(){"新西兰","澳大利亚" }},
+                {1.5M, new List<string>(){"越南社会主义共和国",
+                "老挝",
+                "柬埔寨",
+                "泰国",
+                "缅甸",
+                "马来西亚",
+                //"新加坡",
+                "文莱达鲁萨兰",
+                "印度尼西亚",
+                "东帝汶"}},
+                {1.2M, new List<string>(){ "日本","新加坡","法国","意大利","荷兰"}},
+            };
+
+
+            #region SGR
+            var sgrXS = 1.25M;
             #endregion
 
+            #region TBR
+            var tbrXS = 1.25M;
+            #endregion
+
+            #region JSES
+            var jsesXS = 1.25M;
+            #endregion
+
+            #region SUITE
+            var suiteXS = 1.25M;
+            #endregion
 
-            return Ok(JsonView(true, "查询成功", new
+            var countryArr = di.VisitCountry.Split("|");
+
+            foreach (var item in dic)
+            {
+                var extsisCount = item.Value.Where(x => countryArr.Contains(x))
+                                            .Count();
+                if (extsisCount > 0)
+                {
+                    jsesXS = item.Key;
+                    sgrXS = item.Key;
+                    tbrXS = item.Key;
+                    suiteXS = item.Key;
+                }
+            }
+
+
+            #endregion
+
+            #region 地接系数
+            var djXS = 0.00M;
+
+            switch (dto.DJRS)
+            {
+                case 2 or 3 :
+                    djXS = 2.65M;
+                    break;
+                case 4:
+                    djXS = 2.6M;
+                    break;
+                case 5 or 6:
+                    djXS = 2.5M;
+                    break;
+                case 7 or 8:
+                    djXS = 2.4M;
+                    break;
+                case 9 or 10:
+                    djXS = 2.3M;
+                    break;
+                case 11:
+                    djXS = 2.2M;
+                    break;
+                case 12:
+                    djXS = 2.1M;
+                    break;
+                case 13 or 14:
+                    djXS = 2M;
+                    break;
+                case 15:
+                    djXS = 1.9M;
+                    break;
+                case 16 or 17 or 18:
+                    djXS = 1.8M;
+                    break;
+                case 19 or 20:
+                    djXS = 1.7M;
+                    break;
+
+            }
+
+            #endregion
+
+            #region 零用金系数
+            var lyjXS = 0.00M;
+            switch (dto.LYJRS)
             {
-                HotelSum = hotelSumP,
-                CoefficientByDJ = coefficientByDJ(di.VisitPNumber) // 示例调用
+                case 2:
+                    lyjXS = 1.25M;
+                    break;
+                case 3 or 4 or 5:
+                    lyjXS = 1.2M;
+                    break;
+                case int number when (number > 5 && number < 10):
+                    lyjXS = 1.15M;
+                    break;
+                case > 10:
+                    lyjXS = 1.1M;
+                    break;
+                default:
+                    break;
+            }
+
+            #endregion
+
+            return Ok(JsonView(true, "查询成功", new ArrayList()
+            {
+                new { label = "火车票系数", value = hcpXS, key = "hcpXS" },
+                new { label = "经济舱系数", value = jjcXS, key = "jjcXS" },
+                new { label = "公务舱系数", value = gwcXS, key = "gwcXS" },
+                new { label = "头等舱系数", value = tdcXS, key = "tdcXS" },
+                new { label = "SGR系数", value = sgrXS, key = "sgrXS" },
+                new { label = "TBR系数", value = tbrXS, key = "tbrXS" },
+                new { label = "JSES系数", value = jsesXS, key = "jsesXS" },
+                new { label = "SUITE系数", value = suiteXS, key = "suiteXS" },
+                new { label = "地接系数", value = djXS, key = "djXS" },
+                new { label = "零用金系数", value = lyjXS, key = "lyjXS" },
+                new { label = "公务系数", value = 2M, key = "gwXS" }
             }));
         }
 

+ 30 - 0
OASystem/OASystem.Domain/Dtos/Groups/GroupCostSavaDto.cs

@@ -1389,6 +1389,36 @@ namespace OASystem.Domain.Dtos.Groups
     public class QueryGroupCostCoefficientDto
     {
         public int Diid { get; set; }
+
+        // Visa相关属性
+        public decimal VisaCB { get; set; } // 签证成本基准值
+        public int VisaRS { get; set; } // 签证人数
+
+        // 火车相关属性
+        //public int HCPRS { get; set; }
+        public decimal HCPCB { get; set; } // 火车成本基准值
+
+        // 机票相关属性
+        //public int JJCRS { get; set; }
+        public decimal JJCCB { get; set; } // 经济舱成本基准值
+        //public int GWCRS { get; set; }
+        public decimal GWCCB { get; set; } // 公务舱成本基准值
+        //public int TDCRS { get; set; }
+        public decimal TDCCB { get; set; } // 头等舱成本基准值
+
+
+        //地接相关
+        public int DJRS { get; set; } //地接人数
+
+        //零用金相关
+        public int LYJRS { get; set; } // 零用金人数
+    }
+
+    public class PriceRange
+    {
+        public decimal Min { get; set; }
+        public decimal Max { get; set; }
+        public decimal Value { get; set; }
     }
 
     public class HistoryCarDataView