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

重构团组成本机票房型匹配逻辑复用

Lyyyi 1 неделя назад
Родитель
Сommit
d06329284b
1 измененных файлов с 54 добавлено и 387 удалено
  1. 54 387
      OASystem/OASystem.Api/Controllers/GroupsController.cs

+ 54 - 387
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -30915,215 +30915,22 @@ ORDER by  gctggrc.id DESC
             airSouer.Add("公务舱SGR", "公务舱及酒店单人间");
             airSouer.Add("公务舱JSES", "公务舱及酒店小套房");
             airSouer.Add("公务舱SUITE", "公务舱及酒店套房");
+            airSouer.Add("公务舱TBR", "公务舱及酒店双人间");
             airSouer.Add("经济舱SUITE", "经济舱及酒店套房");
             airSouer.Add("头等舱JSES", "头等舱及酒店小套房");
             airSouer.Add("头等舱SUITE", "头等舱及酒店套房");
             airSouer.Add("经济舱JSES", "经济舱及酒店小套房");
 
-            var priceDataList = new List<(string rsName, string cbName, string xsName, string prefix)>
-            {
-                ("VisaRS", "VisaCB", "VisaXS", "qz"),
-                ("BXRS", "BXCB", "BXXS", "bx"),
-                ("HCPRS", "HCPCB", "HCPXS", "hcp"),
-                ("JJCRS", "JJCCB", "JJCXS", "jjc"),
-                ("GWCRS", "GWCCB", "GWCXS", "gwc"),
-                ("TDCRS", "TDCCB", "TDCXS", "tdc"),
-                ("CPRS", "CPCB", "CPXS", "cp"),
-                ("HSRS", "HSCB", "HSXS", "hsjc"),
-                ("TBRNumber", "TBRCB", "TBRXS", "tbr"),
-                ("SGRNumber", "SGRCB", "SGRXS", "sgr"),
-                ("JSESNumber", "JSESCB", "JSESXS", "jses"),
-                ("SUITENumber", "SUITECB", "SUITEXS", "suite"),
-                ("DJRS", "DJCB", "DJXS", "dj"),
-                ("GWRS", "GWCB", "GWXS", "gw"),
-                ("LYJRS", "LYJCB", "LYJXS", "lyj"),
-            };
-            var OtherCostPropertyBJ = new string[] { "qz", "hcp", "cp", "bx", "hsjc", "dj", "gw", "lyj" };
-            var rightSum = 0.00M;
-
-            foreach (var (rsName, cbName, xsName, prefix) in priceDataList)
-            {
-                var rsValue = (int)mainPrice.GetType().GetProperty(rsName).GetValue(mainPrice);
-                var cbValue = (decimal)mainPrice.GetType().GetProperty(cbName).GetValue(mainPrice);
-                var xsValue = (decimal)mainPrice.GetType().GetProperty(xsName).GetValue(mainPrice);
-
-                if (prefix == "tbr")
-                {
-                    rsValue *= 2;
-                    cbValue /= 2;
-                }
-
-                if (OtherCostPropertyBJ.Contains(prefix))
-                {
-                    rightSum += cbValue * xsValue;
-                }
-            }
-
-
-            var hotelRooms = new Dictionary<string, int>
-                {
-                    { "SGR", costTypeHotelNumbers.SGR },
-                    { "TBR", costTypeHotelNumbers.TBR },
-                    { "JSES", costTypeHotelNumbers.JSES },
-                    { "SUITE", costTypeHotelNumbers.SUITE }
-                };
-
-            var flights = new Dictionary<string, int>
-                {
-                    { "经济舱", mainPrice.JJCRS },
-                    { "公务舱", mainPrice.GWCRS },
-                    { "头等舱", mainPrice.TDCRS }
-                };
-
-            var flightRoomMatchingRules = new Dictionary<string, string[]>
-            {
-                { "经济舱", new[] { "TBR", "SGR", "JSES", "SUITE" } },
-                { "公务舱", new[] { "SUITE", "JSES", "SGR" } },
-                { "头等舱", new[] { "SUITE", "JSES" } }
-            };
-
-            var result = new Dictionary<string, int>();
-
-            List<AirHotelPrice> airHotelPriceList = new List<AirHotelPrice>();
-
-            foreach (var flight in flights.Keys)
-            {
-                // 获取当前舱位的匹配规则
-                if (flightRoomMatchingRules.TryGetValue(flight, out string[] roomTypes))
-                {
-                    MatchRooms(ref hotelRooms, ref flights, roomTypes, flight, ref result);
-                }
-            }
-
-            #region right计算
-
-            if (result.Keys.Contains("经济舱TBR") && result["经济舱TBR"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = (mainPrice.TBRCB * mainPrice.TBRXS) / 2;
-                airHotelPriceList.Add(new
-                     AirHotelPrice
-                {
-                    Name = "经济舱TBR",
-                    Price = rightSum + air + hotel,
-                    Count = result["经济舱TBR"] * 2
-                });
-                allPrice += (rightSum + air + hotel) * result["经济舱TBR"] * 2;
-            }
-
-            if (result.Keys.Contains("经济舱SGR") && result["经济舱SGR"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = mainPrice.SGRCB * mainPrice.SGRXS;
-                airHotelPriceList.Add(new
-                    AirHotelPrice
-                {
-                    Name = "经济舱SGR",
-                    Price = rightSum + air + hotel,
-                    Count = result["经济舱SGR"]
-                });
-                allPrice += (rightSum + air + hotel) * result["经济舱SGR"];
-            }
-
-            if (result.Keys.Contains("公务舱SGR") && result["公务舱SGR"] > 0)
-            {
-                var air = mainPrice.GWCCB * mainPrice.GWCXS;
-                var hotel = mainPrice.SGRCB * mainPrice.SGRXS;
-                airHotelPriceList.Add(new
-                    AirHotelPrice
-                {
-                    Name = "公务舱SGR",
-                    Price = rightSum + air + hotel,
-                    Count = result["公务舱SGR"]
-                });
-                allPrice += (rightSum + air + hotel) * result["公务舱SGR"];
-            }
-
-            if (result.Keys.Contains("公务舱JSES") && result["公务舱JSES"] > 0)
-            {
-                var air = mainPrice.GWCCB * mainPrice.GWCXS;
-                var hotel = mainPrice.JSESCB * mainPrice.JSESXS;
-                airHotelPriceList.Add(new
-     AirHotelPrice
-                {
-                    Name = "公务舱JSES",
-                    Price = rightSum + air + hotel,
-                    Count = result["公务舱JSES"]
-                });
-                allPrice += (rightSum + air + hotel) * result["公务舱JSES"];
-            }
-
-            if (result.Keys.Contains("公务舱SUITE") && result["公务舱SUITE"] > 0)
-            {
-                var air = mainPrice.GWCCB * mainPrice.GWCXS;
-                var hotel = mainPrice.SUITECB * mainPrice.SUITEXS;
-                airHotelPriceList.Add(new
-     AirHotelPrice
-                {
-                    Name = "公务舱SUITE",
-                    Price = rightSum + air + hotel,
-                    Count = result["公务舱SUITE"]
-                });
-                allPrice += (rightSum + air + hotel) * result["公务舱SUITE"];
-            }
-
-            if (result.Keys.Contains("经济舱SUITE") && result["经济舱SUITE"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = mainPrice.SUITECB * mainPrice.SUITEXS;
-                airHotelPriceList.Add(new
-     AirHotelPrice
-                {
-                    Name = "经济舱SUITE",
-                    Price = rightSum + air + hotel,
-                    Count = result["经济舱SUITE"]
-                });
-                allPrice += (rightSum + air + hotel) * result["经济舱SUITE"];
-            }
-
-            if (result.Keys.Contains("头等舱JSES") && result["头等舱JSES"] > 0)
-            {
-                var air = mainPrice.TDCCB * mainPrice.TDCXS;
-                var hotel = mainPrice.JSESCB * mainPrice.JSESXS;
-                airHotelPriceList.Add(new
-      AirHotelPrice
-                {
-                    Name = "头等舱JSES",
-                    Price = rightSum + air + hotel,
-                    Count = result["头等舱JSES"]
-                });
-                allPrice += (rightSum + air + hotel) * result["头等舱JSES"];
-            }
-
-            if (result.Keys.Contains("头等舱SUITE") && result["头等舱SUITE"] > 0)
-            {
-                var air = mainPrice.TDCCB * mainPrice.TDCXS;
-                var hotel = mainPrice.SUITECB * mainPrice.SUITEXS;
-                airHotelPriceList.Add(new
-AirHotelPrice
-                {
-                    Name = "头等舱SUITE",
-                    Price = rightSum + air + hotel,
-                    Count = result["头等舱SUITE"]
-                });
-                allPrice += (rightSum + air + hotel) * result["头等舱SUITE"];
-            }
-
-            if (result.Keys.Contains("经济舱JSES") && result["经济舱JSES"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = mainPrice.JSESCB * mainPrice.JSESXS;
-                airHotelPriceList.Add(new
-AirHotelPrice
+            var matchData = CalculateGroupCostAirHotelMatch(mainPrice, costTypeHotelNumbers);
+            var airHotelPriceList = matchData.Items
+                .Select(x => new AirHotelPrice
                 {
-                    Name = "经济舱JSES",
-                    Price = rightSum + air + hotel,
-                    Count = result["经济舱JSES"]
-                });
-                allPrice += (rightSum + air + hotel) * result["经济舱JSES"];
-            }
-
-            #endregion
+                    Name = x.CabinType + x.RoomType,
+                    Price = x.SinglePrice,
+                    Count = x.PassengerCount
+                })
+                .ToList();
+            allPrice = matchData.TotalPrice;
 
             foreach (var item in airSouer.Keys)
             {
@@ -31230,9 +31037,6 @@ AirHotelPrice
                 ("GWRS", "GWCB", "GWXS", "gw")                           ,
                 ("LYJRS", "LYJCB", "LYJXS", "lyj")                      ,
             };
-            var OtherCostPropertyBJ = new string[] { "qz", "hcp", "cp", "bx", "hsjc", "dj", "gw", "lyj" };
-            var rightSum = 0.00M;
-
             foreach (var (rsName, cbName, xsName, prefix) in priceDataList)
             {
                 var rsValue = (int)mainPrice.GetType().GetProperty(rsName).GetValue(mainPrice);
@@ -31245,11 +31049,6 @@ AirHotelPrice
                     cbValue /= 2;
                 }
 
-                if (OtherCostPropertyBJ.Contains(prefix))
-                {
-                    rightSum += cbValue * xsValue;
-                }
-
                 if (rsValue == 0)
                 {
                     hideRowsList.Add(rowIndex);
@@ -31264,190 +31063,45 @@ AirHotelPrice
                 rowIndex += 2;
             }
 
-            var hotelRooms = new Dictionary<string, int>
-                {
-                    { "SGR", costTypeHotelNumbers.SGR },
-                    { "TBR", costTypeHotelNumbers.TBR },
-                    { "JSES", costTypeHotelNumbers.JSES },
-                    { "SUITE", costTypeHotelNumbers.SUITE }
-                };
-
-            var flights = new Dictionary<string, int>
-                {
-                    { "经济舱", mainPrice.JJCRS },
-                    { "公务舱", mainPrice.GWCRS },
-                    { "头等舱", mainPrice.TDCRS }
-                };
-
-            var flightRoomMatchingRules = new Dictionary<string, string[]>
-            {
-                { "经济舱", new[] { "TBR", "SGR", "JSES", "SUITE" } },
-                { "公务舱", new[] { "SUITE", "JSES", "SGR" } },
-                { "头等舱", new[] { "SUITE", "JSES" } }
-            };
-
-            var result = new Dictionary<string, int>();
-
-            foreach (var flight in flights.Keys)
-            {
-                // 获取当前舱位的匹配规则
-                if (flightRoomMatchingRules.TryGetValue(flight, out string[] roomTypes))
-                {
-                    MatchRooms(ref hotelRooms, ref flights, roomTypes, flight, ref result);
-                }
-            }
-
-            var allPrice = 0.00M;
+            var matchData = CalculateGroupCostAirHotelMatch(mainPrice, costTypeHotelNumbers);
 
             #region right计算
 
             int airRowIndex = 35;
 
-            if (result.Keys.Contains("经济舱TBR") && result["经济舱TBR"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = (mainPrice.TBRCB * mainPrice.TBRXS) / 2;
-                designer.SetDataSource("jjctbrrs", result["经济舱TBR"] * 2);
-                designer.SetDataSource("jjctbrbj", rightSum + air + hotel);
-                designer.SetDataSource("jjctbrzbj", (rightSum + air + hotel) * result["经济舱TBR"] * 2);
-                allPrice += (rightSum + air + hotel) * result["经济舱TBR"] * 2;
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
-
-            if (result.Keys.Contains("经济舱SGR") && result["经济舱SGR"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = mainPrice.SGRCB * mainPrice.SGRXS;
-                designer.SetDataSource("jjcsgrrs", result["经济舱SGR"]);
-                designer.SetDataSource("jjcsgrbj", rightSum + air + hotel);
-                designer.SetDataSource("jjcsgrzbj", (rightSum + air + hotel) * result["经济舱SGR"]);
-                allPrice += (rightSum + air + hotel) * result["经济舱SGR"];
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
-
-            if (result.Keys.Contains("公务舱SGR") && result["公务舱SGR"] > 0)
-            {
-                var air = mainPrice.GWCCB * mainPrice.GWCXS;
-                var hotel = mainPrice.SGRCB * mainPrice.SGRXS;
-                designer.SetDataSource("gwcsgrrs", result["公务舱SGR"]);
-                designer.SetDataSource("gwcsgrbj", rightSum + air + hotel);
-                designer.SetDataSource("gwcsgrzbj", (rightSum + air + hotel) * result["公务舱SGR"]);
-                allPrice += (rightSum + air + hotel) * result["公务舱SGR"];
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
-
-            if (result.Keys.Contains("公务舱JSES") && result["公务舱JSES"] > 0)
-            {
-                var air = mainPrice.GWCCB * mainPrice.GWCXS;
-                var hotel = mainPrice.JSESCB * mainPrice.JSESXS;
-                designer.SetDataSource("gwcjsesrs", result["公务舱JSES"]);
-                designer.SetDataSource("gwcjsesbj", rightSum + air + hotel);
-                designer.SetDataSource("gwcjseszbj", (rightSum + air + hotel) * result["公务舱JSES"]);
-                allPrice += (rightSum + air + hotel) * result["公务舱JSES"];
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
-
-            if (result.Keys.Contains("公务舱SUITE") && result["公务舱SUITE"] > 0)
-            {
-                var air = mainPrice.GWCCB * mainPrice.GWCXS;
-                var hotel = mainPrice.SUITECB * mainPrice.SUITEXS;
-                designer.SetDataSource("gwcsuiters", result["公务舱SUITE"]);
-                designer.SetDataSource("gwcsuitebj", rightSum + air + hotel);
-                designer.SetDataSource("gwcsuitezbj", (rightSum + air + hotel) * result["公务舱SUITE"]);
-                allPrice += (rightSum + air + hotel) * result["公务舱SUITE"];
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
-
-            if (result.Keys.Contains("经济舱SUITE") && result["经济舱SUITE"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = mainPrice.SUITECB * mainPrice.SUITEXS;
-                designer.SetDataSource("jjcsuiters", result["经济舱SUITE"]);
-                designer.SetDataSource("jjcsuitebj", rightSum + air + hotel);
-                designer.SetDataSource("jjcsuitezbj", (rightSum + air + hotel) * result["经济舱SUITE"]);
-                allPrice += (rightSum + air + hotel) * result["经济舱SUITE"];
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
-
-            if (result.Keys.Contains("头等舱JSES") && result["头等舱JSES"] > 0)
-            {
-                var air = mainPrice.TDCCB * mainPrice.TDCXS;
-                var hotel = mainPrice.JSESCB * mainPrice.JSESXS;
-                designer.SetDataSource("tdcjsesrs", result["头等舱JSES"]);
-                designer.SetDataSource("tdcjsesbj", rightSum + air + hotel);
-                designer.SetDataSource("tdcjseszbj", (rightSum + air + hotel) * result["头等舱JSES"]);
-                allPrice += (rightSum + air + hotel) * result["头等舱JSES"];
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
+            var quotationBindings = new[]
+            {
+                (CombinationName: "经济舱+TBR", DataSourcePrefix: "jjctbr"),
+                (CombinationName: "经济舱+SGR", DataSourcePrefix: "jjcsgr"),
+                (CombinationName: "公务舱+SGR", DataSourcePrefix: "gwcsgr"),
+                (CombinationName: "公务舱+JSES", DataSourcePrefix: "gwcjses"),
+                (CombinationName: "公务舱+SUITE", DataSourcePrefix: "gwcsuite"),
+                (CombinationName: "经济舱+SUITE", DataSourcePrefix: "jjcsuite"),
+                (CombinationName: "头等舱+JSES", DataSourcePrefix: "tdcjses"),
+                (CombinationName: "头等舱+SUITE", DataSourcePrefix: "tdcsuite"),
+                (CombinationName: "经济舱+JSES", DataSourcePrefix: "jjcjses")
+            };
 
-            if (result.Keys.Contains("头等舱SUITE") && result["头等舱SUITE"] > 0)
-            {
-                var air = mainPrice.TDCCB * mainPrice.TDCXS;
-                var hotel = mainPrice.SUITECB * mainPrice.SUITEXS;
-                designer.SetDataSource("tdcsuiters", result["头等舱SUITE"]);
-                designer.SetDataSource("tdcsuitebj", rightSum + air + hotel);
-                designer.SetDataSource("tdcsuitezbj", (rightSum + air + hotel) * result["头等舱SUITE"]);
-                allPrice += (rightSum + air + hotel) * result["头等舱SUITE"];
-            }
-            else
+            foreach (var binding in quotationBindings)
             {
-                hideRowsList.Add(airRowIndex);
-            }
-
-            airRowIndex += 2;
+                var item = matchData.Items.FirstOrDefault(x => x.CombinationName == binding.CombinationName);
+                if (item == null || item.PassengerCount <= 0)
+                {
+                    hideRowsList.Add(airRowIndex);
+                }
+                else
+                {
+                    designer.SetDataSource($"{binding.DataSourcePrefix}rs", item.PassengerCount);
+                    designer.SetDataSource($"{binding.DataSourcePrefix}bj", item.SinglePrice);
+                    designer.SetDataSource($"{binding.DataSourcePrefix}zbj", item.TotalPrice);
+                }
 
-            if (result.Keys.Contains("经济舱JSES") && result["经济舱JSES"] > 0)
-            {
-                var air = mainPrice.JJCCB * mainPrice.JJCXS;
-                var hotel = mainPrice.JSESCB * mainPrice.JSESXS;
-                designer.SetDataSource("jjcjsesrs", result["经济舱JSES"]);
-                designer.SetDataSource("jjcjsesbj", rightSum + air + hotel);
-                designer.SetDataSource("jjcjseszbj", (rightSum + air + hotel) * result["经济舱JSES"]);
-                allPrice += (rightSum + air + hotel) * result["经济舱JSES"];
-            }
-            else
-            {
-                hideRowsList.Add(airRowIndex);
+                airRowIndex += 2;
             }
 
             #endregion
 
-            designer.SetDataSource("AllPrice", "总金额:" + allPrice.ToString("#0.00"));
+            designer.SetDataSource("AllPrice", "总金额:" + matchData.TotalPrice.ToString("#0.00"));
             string savePaht = AppSettingsHelper.Get("ExcelBasePath") + "GroupCostQuotations/" + di.TeamName + "_详细报批费用.xls";
             var ws = designer.Workbook.Worksheets[0];
             foreach (var Rowindex in hideRowsList)
@@ -31534,6 +31188,21 @@ AirHotelPrice
                 return Ok(JsonView(false, "团组成本房型人数不存在!"));
             }
 
+            var data = CalculateGroupCostAirHotelMatch(mainPrice, costTypeHotelNumbers);
+
+            return Ok(JsonView(true, data.Items.Count > 0 ? "操作成功!" : "暂无可匹配的机票舱位+房型组合!", data, data.Items.Count));
+        }
+
+        /// <summary>
+        /// 按团组成本计算机票舱位与房型匹配结果。
+        /// </summary>
+        /// <param name="mainPrice">团组成本主记录</param>
+        /// <param name="costTypeHotelNumbers">Default 房型人数</param>
+        /// <returns>匹配后的组合价格及人数</returns>
+        private GroupCostAirHotelMatchView CalculateGroupCostAirHotelMatch(
+            Grp_GroupCostParameter mainPrice,
+            Grp_CostTypeHotelNumber costTypeHotelNumbers)
+        {
             var hotelRooms = new Dictionary<string, int>
             {
                 { "SGR", Math.Max(costTypeHotelNumbers.SGR, 0) },
@@ -31613,16 +31282,14 @@ AirHotelPrice
                 });
             }
 
-            var data = new GroupCostAirHotelMatchView
+            return new GroupCostAirHotelMatchView
             {
-                Diid = dto.Diid,
+                Diid = mainPrice.DiId,
                 Currency = mainPrice.Currency,
                 Items = items,
                 TotalPassengerCount = items.Sum(x => x.PassengerCount),
                 TotalPrice = items.Sum(x => x.TotalPrice)
             };
-
-            return Ok(JsonView(true, items.Count > 0 ? "操作成功!" : "暂无可匹配的机票舱位+房型组合!", data, items.Count));
         }
 
         /// <summary>