void AddSubDocument(SubOrder subOrder, MainOrder order) { MethodInfo info = typeof (MainOrder) .GetMethod("AddSubOrder", BindingFlags.NonPublic | BindingFlags.Instance); info.Invoke(order, new[] {subOrder}); }
//撤销订单 private void cancelOrder(SubOrder subOrder) { // if (subOrder.OrderID.Equals(string.Empty)) { LogUtils.EnginLog($"撤单错误|未找到订单编号:{subOrder.InstrumentID}|{subOrder.Direction}|{subOrder.Offset}|{subOrder.LimitPrice}|{subOrder.Volume}|{subOrder.CustomID}"); return; } // if (subOrder.Status == OrderStatus.Canceled || subOrder.Status == OrderStatus.Error || subOrder.Status == OrderStatus.Filled) { return; } // int rtn; rtn = mTrader.ReqOrderAction(subOrder.OrderID); //这种情况多是盘后未撤订单,按撤单处理 if (rtn == -1) { subOrder.Status = OrderStatus.Canceled; subOrder.VolumeLeft = 0; activeOrders.Remove(subOrder); subOrder.Refresh(); } LogUtils.EnginLog($"撤单:{rtn}|{subOrder.InstrumentID}|{subOrder.Direction}|{subOrder.Offset}|{subOrder.LimitPrice}|{subOrder.Volume}|{subOrder.CustomID}|{subOrder.OrderID}"); }
/// <summary> /// 先按BC方式拆单,BC拆完仍有剩余时,全部放到一个子订单中(里面的费用全设为MaxValue) /// </summary> /// <param name="productList"></param> /// <returns></returns> public SplitedOrder Split(List <ProductEntity> productList /*, int totalQuantity*/) { var result = new SplitedOrder(); var peTuple = SplitProductEntity(productList, (decimal)this.BcConfig.TotalPriceLimit); // 额度(2万)以后按BC拆单 var subOrder = CreateSubOrder(); peTuple.Item1.ForEach(pe => subOrder.ProList.AddRange(pe.OrderInfo)); subOrder.TaxCost = CalculateTax(peTuple.Item1); result.AddSubOrder(subOrder); if (peTuple.Item2.Count > 0) { // 超过额度的不拆了,卖不了 var invalidSubOrder = new SubOrder("-1", null, null, null, null, null, peTuple.Item2.SelectMany(pe => pe.OrderInfo).ToList()) { LogisticsUnitPrice = int.MaxValue, LogisticsCost = int.MaxValue, TaxCost = int.MaxValue, }; result.AddSubOrder(invalidSubOrder); } result.OrderList.ForEach(so => so.LogisticsCost = this.CalculateFreight(so.CalculateTotalWeight())); result.OrderList.ForEach(so => so.CalculateTotalPrice()); return(result); }
private SubOrder CreateSubOrder() { var result = new SubOrder("", this.Rule.LogisticsId, this.Rule.LogisticsName, this.Rule.Organization.URL, this.Rule.SubOrganizationName, this.Rule.RuleName); result.LogisticsUnitPrice = (decimal)this.Rule.Rule.Price; return(result); }
/// <summary> /// 拆一个子订单出来 /// </summary> /// <param name="peDic"></param> /// <returns></returns> private SubOrder SplitOneSubOrder(List <ProductEntity> productEntities, bool withTax) { SubOrder subOrder = CreateSubOrder(); foreach (var productEntity in productEntities) { var splitRuleProduct = SplitRuleProduct(productEntity.OrderInfo.Where(p => p.Quantity > 0).ToList()); var restProductList = splitRuleProduct.Item2; foreach (var kv in splitRuleProduct.Item1) { var products = kv.Value; if (subOrder.CalculateTotalQuantity() >= this.LimitedQuantity) { restProductList.AddRange(products); continue; } var ruleItem = ruleItemLevelDic[kv.Key]; var quantityLimit = Math.Min(ruleItem.MaxQuantity, this.LimitedQuantity - subOrder.CalculateTotalQuantity()); var weightLimit = this.LimitedWeight - subOrder.CalculateTotalWeight(); var priceLimit = (withTax ? this.LimitedMaxPrice : this.TaxThreshold) - subOrder.CalculateTotalPrice(); var productsTuple = SplitProducts(products, quantityLimit, weightLimit, priceLimit, ruleItem.MinQuantity); subOrder.ProList.AddRange(productsTuple.Item1); restProductList.AddRange(productsTuple.Item2); } productEntity.OrderInfo = restProductList; if (subOrder.CalculateTotalQuantity() >= this.LimitedQuantity) { break; } } return(subOrder.ProList.Count > 0 ? subOrder : null); }
private SubOrder CreateSubOrder() { var result = new SubOrder("", this.BcConfig.LogisticsName, this.BcConfig.LogisticsName, this.BcConfig.URL, this.BcConfig.GradeName, this.BcConfig.SubBusinessName); result.LogisticsUnitPrice = (decimal)this.BcConfig.Price; return(result); }
private SplitedOrder SplitOrder(string orderId, List <ProductEntity> productList, List <Product> badProductList, int totalQuantity, SplitPrinciple splitPrinciple) { Debug.Assert(splitPrinciple != SplitPrinciple.LogisticsFirst); var result = new SplitedOrder(); List <List <RuleEntity> > ruleOptions = null; switch (splitPrinciple) { case SplitPrinciple.SpeedFirst: break; case SplitPrinciple.QuanlityFirst: case SplitPrinciple.PriceFirst: default: ruleOptions = splitConfig.GetRuleEntities(splitPrinciple, productList); break; } if (ruleOptions != null && ruleOptions.Count > 0) { var splitResults = ruleOptions.Select(rules => SplitOnce(SplitPackage.SplitV1.Common.Common.CloneProductEntityList(productList), rules, splitPrinciple)).ToList(); Tuple <SplitedOrder, bool, List <ProductEntity> > optimal = null; switch (splitPrinciple) { case SplitPrinciple.QuanlityFirst: optimal = splitResults.OrderBy(t => t.Item2 ? 0 : 1) .ThenBy(t => t.Item1.OrderList.Count) .ThenBy(t => t.Item1.CalculateLogisticsAndTaxCost()) .FirstOrDefault(); break; case SplitPrinciple.PriceFirst: case SplitPrinciple.LogisticsFirst: default: optimal = splitResults.OrderBy(t => t.Item2 ? 0 : 1) .ThenBy(t => t.Item1.CalculateLogisticsAndTaxCost()) .ThenBy(t => t.Item1.OrderList.Count) .FirstOrDefault(); break; } result = optimal != null ? optimal.Item1 : result; } else { // BC方式,计算跨境综合税 result = this.ReturnRemainPackage(productList); } if (badProductList != null && badProductList.Any()) { var subOrder = new SubOrder("-2", null, null, null, null, null, badProductList) { LogisticsUnitPrice = int.MaxValue, LogisticsCost = int.MaxValue, TaxCost = int.MaxValue, }; result.AddSubOrder(subOrder); } result.OrderId = orderId; return(result); }
/// <summary> /// 计算税费 /// </summary> /// <param name="weight"></param> /// <returns></returns> public void CalculateTax(SubOrder subOrder) { subOrder.TaxCost = (subOrder.CalculateTotalPrice() > this.TaxThreshold) ? subOrder.ProList.Sum(p => p.CalculateTotalPrice() * (decimal)Spliter.TheSubLevelDic[p.PTId].PostTaxRate) : 0; //return price <= this.TaxThreshold ? 0 : price * this.TaxRate / 100; }
public ActionResult Receipt(SubOrder order) { SubReceipt receipt = new SubReceipt(); double[] subPrices = new double[] { 10.99, 11.99, 12.99, 13.99, 14.99 }; double[] sizePrices = new double[] { 1.50, 2.00, 3.00 }; double[] mealDealPrices = new double[] { 0.00, 1.99, 2.49 }; //Get the name receipt.SandwichType = Enum.GetName(typeof(SandwichType), order.sTypes); receipt.SandwichSize = Enum.GetName(typeof(SandwichSize), order.sSizes); receipt.SandwichDeal = Enum.GetName(typeof(SandwichDeal), order.sDeals); receipt.quantity = order.qty; //Get the value double subPrice = subPrices[(int)order.sTypes]; double subSize = sizePrices[(int)order.sSizes]; double subDeal = mealDealPrices[(int)order.sDeals]; receipt.subPrice = Math.Round(subPrice * subSize, 2); receipt.mealDealPrice = subDeal; receipt.sandwichAndMealPrice = Math.Round(subPrice * subSize, 2) + subDeal; receipt.accumulateIncome(); receipt.accumulateTaxes(); subsList.Add(order); Session["Order"] = receipt; Session["OrderList"] = subsList; return(View(receipt)); }
private SplitedOrder ReturnRemainPackage(List <ProductEntity> remainProducts) { var result = new SplitedOrder(); var productList = remainProducts.SelectMany(o => o.OrderInfo).ToList(); var invalidSubOrder = new SubOrder() { Id = "-1", TotalWeight = productList.Sum(o => o.Weight * o.Quantity), TotalPrice = productList.Sum(o => o.ProPrice * o.Quantity), ProList = productList }; result.AddSubOrder(invalidSubOrder); return(result); }
private bool SetSubOrderDealed(SubOrder order) { BeginTransaction(); Tvip_Sub_Order daSubOrder = new Tvip_Sub_Order(); daSubOrder.ReferenceTransactionFrom(Transaction); if (!daSubOrder.SelectByPk(order.Sub_Id)) { Rollback(); return(false); } if (!daSubOrder.SetSubOrderDealed()) { Rollback(); return(false); } Commit(); return(true); }
public IHttpActionResult List() { var data = db.Orders.ToList(); var dung = new List <SubOrder>(); foreach (var item in data) { var obj = new SubOrder() { Id = item.Id, CustomerId = item.Customer.Name, DateT = item.DateT, StaffId = item.Staff.Name, TotalPrice = item.TotalPrice }; dung.Add(obj); } return(Json(new { dung })); }
public IHttpActionResult AddOrder([FromBody] Order model) { if (model.Id == 0) { var item = db.Orders.Add(model); db.SaveChanges(); var staff = db.Staffs.Find(item.StaffId); var customer = db.Customers.Find(item.CustomerId); var obj = new SubOrder() { Id = item.Id, CustomerId = staff.Name, DateT = item.DateT, StaffId = customer.Name, TotalPrice = item.TotalPrice }; return(Json(new { obj })); } return(Json(new { })); }
public List <int> Create(List <DTOOrderItem> orderItems, int orderId) { var data = (from oi in orderItems join i in itemRepo.Get(null, null, "") on oi.ItemId equals i.Id join c in catalogRepo.Get(null, null, "") on i.CatalogId equals c.Id join v in vendorRepo.Get(null, null, "") on c.VendorId equals v.Id select new { ItemId = i.Id, VendorId = v.Id, Price = oi.Qty * i.Price * (1 - (decimal)0.01 * c.Discount) } into vendorGroups group vendorGroups by vendorGroups.VendorId into res select new { VendorId = res.Key, SubOrderPrice = res.Sum(x => x.Price) }).ToList(); List <int> subOrderIds = new List <int>(); foreach (var so in data) { SubOrder subOrder = new SubOrder() { OrderId = orderId, VendorId = so.VendorId, Price = so.SubOrderPrice, ExpectedShipmentDate = DateTime.Now.AddDays(7) }; subOrderIds.Add(subOrderRepo.Insert(subOrder)); } Models.Order order = orderRepo.GetByID(orderId); order.Price = data.Sum(x => x.SubOrderPrice); orderRepo.Update(order); orderRepo.Save(); return(subOrderIds); }
//同步订单 private void syncOrder(OrderField o, SubOrder s) { //更新编号 s.OrderID = o.OrderID; //只有正常和部成,才响应订单事件 if (s.Status == OrderStatus.Normal || s.Status == OrderStatus.Partial) { switch (o.Status) { case HaiFeng.OrderStatus.Canceled: s.VolumeLeft = 0; s.Status = OrderStatus.Canceled; activeOrders.Remove(s); break; case HaiFeng.OrderStatus.Filled: s.VolumeLeft = 0; s.Status = OrderStatus.Filled; s.VolumeTraded = s.Volume; activeOrders.Remove(s); break; case HaiFeng.OrderStatus.Error: s.VolumeLeft = 0; s.Status = OrderStatus.Error; activeOrders.Remove(s); break; case HaiFeng.OrderStatus.Partial: s.VolumeLeft = o.VolumeLeft; s.VolumeTraded = s.Volume - s.VolumeLeft; s.Status = OrderStatus.Partial; break; } } s.Refresh(); }
//发送订单 private void SendOrder(SubOrder subOrder) { //自增编码 subOrder.CustomID = customID++; orderMap.Add(subOrder.CustomID, subOrder); activeOrders.Add(subOrder); //转换 HaiFeng.DirectionType direction = subOrder.Direction == DirectionType.Buy ? HaiFeng.DirectionType.Buy : HaiFeng.DirectionType.Sell; HaiFeng.OffsetType offset = HaiFeng.OffsetType.Open; switch (subOrder.Offset) { case OffsetType.Open: offset = HaiFeng.OffsetType.Open; break; case OffsetType.Close: offset = HaiFeng.OffsetType.Close; break; case OffsetType.CloseToday: offset = HaiFeng.OffsetType.CloseToday; break; } //报单 int rtn = mTrader.ReqOrderInsert(pInstrument: subOrder.InstrumentID, pDirection: direction, pOffset: offset, pPrice: subOrder.LimitPrice, pVolume: subOrder.Volume, pCustom: subOrder.CustomID, pType: OrderType.Limit, pHedge: HedgeType.Speculation); LogUtils.EnginLog($"发单:{rtn}\t{subOrder.CustomID}\t{subOrder.InstrumentID}\t{subOrder.Direction}\t{subOrder.Offset}\t{subOrder.LimitPrice}\t{subOrder.Volume}"); }
/// <summary> /// 进行该类商品进行拆解 /// </summary> /// <param name="products">商品列表</param> /// <param name="quantityLimit">最大数量</param> /// <param name="weightLimit">最大重量</param> /// <param name="priceLimit">最大价值</param> /// <param name="minQuantity">最小数量</param> /// <returns></returns> private Tuple <List <Product>, List <Product> > SplitProducts(List <Product> products, int quantityLimit, int weightLimit, decimal priceLimit, int minQuantity) { SubOrder subOrder = CreateSubOrder(); var restProductList = new List <Product>(); foreach (var p in products) { if (subOrder.CalculateTotalQuantity() >= quantityLimit) { restProductList.Add(p); continue; } var qLimit = quantityLimit - subOrder.CalculateTotalQuantity(); var wLimit = weightLimit - subOrder.CalculateTotalWeight(); var pLimit = priceLimit - subOrder.CalculateTotalPrice(); var productTuple = SplitProduct(p, qLimit, wLimit, pLimit); if (productTuple.Item1.Quantity > 0) { subOrder.ProList.Add(productTuple.Item1); } if (productTuple.Item2.Quantity > 0) { restProductList.Add(productTuple.Item2); } } if (subOrder.CalculateTotalQuantity() >= minQuantity) { return(Tuple.Create(subOrder.ProList, restProductList)); } else { return(Tuple.Create(new List <Product>(), products)); } }
public IHttpActionResult UpdateOrder([FromBody] Order model) { var data = db.Orders.Find(model.Id); data.DateT = model.DateT; data.CustomerId = model.CustomerId; db.SaveChanges(); var staff = db.Staffs.Find(data.StaffId); var customer = db.Customers.Find(data.CustomerId); var objective = new SubOrder() { Id = data.Id, CustomerId = staff.Name, DateT = data.DateT, StaffId = customer.Name, TotalPrice = data.TotalPrice }; return(Json(new { objective })); ; }
private bool UpgradeUserRole(SubOrder subOrder, UserLevel level) { DateTime start = DateTime.Now; BeginTransaction(); Tnet_User_Role daVip = new Tnet_User_Role(); daVip.ReferenceTransactionFrom(Transaction); if (!daVip.SelectByUserId_UserLevel(subOrder.User_Id, (int)level)) { daVip.User_Id = subOrder.User_Id; daVip.Expire_Time = start.AddYears(1); daVip.Last_Modify_Time = DateTime.Now; daVip.User_Level = (int)level; daVip.Role_Name = UserLevel.VIP会员.ToString(); if (!daVip.Insert()) { Rollback(); return(false); } } else { if (daVip.Expire_Time > start) { start = daVip.Expire_Time; } daVip.Expire_Time = start.AddYears(1); daVip.Last_Modify_Time = DateTime.Now; if (!daVip.Update()) { Rollback(); return(false); } } if (!string.IsNullOrEmpty(this.Order.Biz_Args)) { JsonObject arg = JsonObject.Parse(this.Order.Biz_Args); string org_code = arg.GetString("Org_Code"); if (!string.IsNullOrEmpty(org_code)) { Tnet_Organization daOrg = new Tnet_Organization(); if (!daOrg.SelectByOrgCode(org_code)) { Rollback(); Alert("归属俱乐部未找到"); return(false); } Tnet_User_Profile daProfile = new Tnet_User_Profile(); daProfile.ReferenceTransactionFrom(Transaction); daProfile.User_Id = daVip.User_Id; daProfile.Org_Id = daOrg.Org_Id; daProfile.Last_Modify_Time = DateTime.Now; if (!daProfile.Update()) { Rollback(); Alert("修改归属信息失败"); return(false); } } } Tnet_User daUser = new Tnet_User(); daUser.ReferenceTransactionFrom(Transaction); if (!daUser.UpdateUserLevel(subOrder.User_Id, level)) { Rollback(); Alert("更新会员角色失败"); return(false); } Commit(); return(true); }
/// <summary> /// 计算税费 /// </summary> /// <param name="weight"></param> /// <returns></returns> public void CalculateTax(SubOrder subOrder) { subOrder.TaxCost = (subOrder.CalculateTotalPrice() > this.TaxThreshold) ? subOrder.ProList.Sum(p => p.CalculateTotalPrice() * 0) : 0; }
//生成子订单 private void createSubOrder(Order order) { PositionField position; if (mTrader.DicPositionField.TryGetValue(order.InstrumentID + "_" + (order.Direction == DirectionType.Buy ? "Sell" : "Buy"), out position)) { //计算冻结数量 int frozenTd = 0; int frozenYd = 0; foreach (SubOrder subOrder in activeOrders) { if (order.Direction == subOrder.Direction) { frozenTd += subOrder.Offset == OffsetType.CloseToday ? subOrder.VolumeLeft : 0; frozenYd += subOrder.Offset == OffsetType.Close ? subOrder.VolumeLeft : 0; } } //剩余数量 int volLeft = order.Volume; //先平今 if (volLeft <= 0) { return; } int posLeft = position.TdPosition > frozenTd ? position.TdPosition - frozenTd : 0; int vol = posLeft > volLeft ? volLeft : posLeft; volLeft -= vol; if (vol > 0) { SubOrder subOrder = new SubOrder(pOrder: order, instrumentID: order.InstrumentID, direction: order.Direction, offset: OffsetType.CloseToday, limitPrice: order.Price, insertTime: DateTime.Now, volume: vol, volumeLeft: vol, status: OrderStatus.Normal); order.AddSubOrder(subOrder); } //后平仓 if (volLeft <= 0) { return; } posLeft = position.YdPosition > frozenYd ? position.YdPosition - frozenYd : 0; vol = posLeft > volLeft ? volLeft : posLeft; volLeft -= vol; if (vol > 0) { SubOrder subOrder = new SubOrder(pOrder: order, instrumentID: order.InstrumentID, direction: order.Direction, offset: OffsetType.Close, limitPrice: order.Price, insertTime: DateTime.Now, volume: vol, volumeLeft: vol, status: OrderStatus.Normal); order.AddSubOrder(subOrder); } //再开仓 if (volLeft <= 0) { return; } vol = volLeft; if (vol > 0) { SubOrder subOrder = new SubOrder(pOrder: order, instrumentID: order.InstrumentID, direction: order.Direction, offset: OffsetType.Open, limitPrice: order.Price, insertTime: DateTime.Now, volume: vol, volumeLeft: vol, status: OrderStatus.Normal); order.AddSubOrder(subOrder); } } else { SubOrder subOrder = new SubOrder(pOrder: order, instrumentID: order.InstrumentID, direction: order.Direction, offset: OffsetType.Open, limitPrice: order.Price, insertTime: DateTime.Now, volume: order.Volume, volumeLeft: order.Volume, status: OrderStatus.Normal); order.AddSubOrder(subOrder); } }
private void btn_HandleThings_Click(object sender, EventArgs e) { try { List <string> userIds = this.txb_handleUserIds.Text.Trim().Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (userIds.Count == 0) { MessageBox.Show("请输入userIds....."); return; } this.lbl_showmsg.Text = "正在准备数据......"; this.btn_HandleThings.Enabled = false; List <AssetDebtRebatesModel> listDebtRebateModels = this.GetDebtRebatesInfos(userIds); if (userIds.Count == 0) { this.lbl_showmsg.Text = "提示"; this.btn_HandleThings.Enabled = true; return; } this.txb_UserNums.Text = userIds.Count.ToString(); //对listCancelBookModles分组 //获取集合 List <Task> tasks = new List <Task>(); for (int i = 0; i < 6; i++) { tasks.Add(Task.Run(async() => { while (userIds.Count > 0) { string userId = string.Empty; lock (this.objLock) { if (userIds.Count > 0) { userId = userIds[0]; if (!string.IsNullOrEmpty(userId)) { userIds.Remove(userId); } } } if (!string.IsNullOrEmpty(userId)) { List <AssetDebtRebatesModel> modelsByUserId = listDebtRebateModels.Where(x => x.UserId == userId).ToList(); if (modelsByUserId.Count == 0) { continue; } long totalAmount = 0; bool isFlag = false; foreach (AssetDebtRebatesModel item in modelsByUserId) { //执行 SubOrder firstOrDefault = item.subOrderListArray.FirstOrDefault(); if (firstOrDefault != null) { string orderId = firstOrDefault.SubOrderId; //查询银行 int status = await BankGatewayService.GetOrderSearch(orderId); for (int j = 0; j < 5; j++) { status = await BankGatewayService.GetOrderSearch(orderId); if (status == 1) { break; } } switch (status) { case 1: //获取金额 totalAmount += firstOrDefault.Amount; break; case -2: isFlag = true; //记录用户Id和orderid重试几次 Logger.LoadData(@"GetDebtRebateData\ErrorId.txt", $"UserId:{userId},OrderId{orderId}"); break; } } } //输入总流水 int data = isFlag ? 0 : 1; string userData = $"{userId},{totalAmount},{data}"; Logger.LoadData(@"GetDebtRebateData\UserInfo.txt", userData); lock (this.objLock) { this.txb_SuccessNums.Text = (Convert.ToInt32(this.txb_SuccessNums.Text) + 1).ToString(); } } } })); } Task.WaitAll(tasks.ToArray()); //执行完毕后 this.lbl_showmsg.Text = "全部执行完毕"; this.btn_HandleThings.Enabled = true; } catch (Exception exception) { Console.WriteLine(exception); throw; } }
private SplitedOrder SplitOrder(string orderId, List <ProductEntity> productList, List <Product> badProductList, int totalQuantity, SplitPrinciple splitPrinciple) { Debug.Assert(splitPrinciple != SplitPrinciple.LogisticsFirst); var result = new SplitedOrder(); List <List <RuleEntity> > ruleOptions = null; switch (splitPrinciple) { case SplitPrinciple.SpeedFirst: // BC break; //case SplitPrinciple.LogisticsFirst: case SplitPrinciple.QuanlityFirst: case SplitPrinciple.PriceFirst: default: ruleOptions = splitConfig.GetRuleEntities(splitPrinciple, productList); break; } if (ruleOptions != null && ruleOptions.Count > 0) { var splitResults = ruleOptions.Select(rules => SplitOnce(SplitPackage.Split.Common.Common.CloneProductEntityList(productList), rules, splitPrinciple)).ToList(); var msgs = Enumerable.Repeat(string.Format("Spliter.SplitOrder({0}, {1}, {2}, {3}) alternative:", "orderId=" + orderId, "productList.Count=" + productList.Count, "totalQuantity=" + totalQuantity, "splitPrinciple=" + splitPrinciple), 1) .Concat(splitResults.Select(ret => string.Format(" ({0}, {1}, {2})", ret.Item1, ret.Item2, "[" + string.Join(", ", ret.Item3) + "]"))); LogHelper.Logger.Info(string.Join(Environment.NewLine, msgs)); Tuple <SplitedOrder, bool, List <ProductEntity> > optimal = null; switch (splitPrinciple) { case SplitPrinciple.QuanlityFirst: optimal = splitResults.OrderBy(t => t.Item2 ? 0 : 1) .ThenBy(t => t.Item1.OrderList.Count) .ThenBy(t => t.Item1.CalculateLogisticsAndTaxCost()) .FirstOrDefault(); break; case SplitPrinciple.PriceFirst: case SplitPrinciple.LogisticsFirst: default: optimal = splitResults.OrderBy(t => t.Item2 ? 0 : 1) .ThenBy(t => t.Item1.CalculateLogisticsAndTaxCost()) .ThenBy(t => t.Item1.OrderList.Count) .FirstOrDefault(); break; } result = optimal != null ? optimal.Item1 : result; } else { // BC方式,计算跨境综合税 result = bcRuleEntity.Split(productList); } if (badProductList != null && badProductList.Any()) { var subOrder = new SubOrder("-2", null, null, null, null, null, badProductList) { LogisticsUnitPrice = int.MaxValue, LogisticsCost = int.MaxValue, TaxCost = int.MaxValue, }; result.AddSubOrder(subOrder); } result.OrderId = orderId; return(result); }