Пример #1
0
 void AddSubDocument(SubOrder subOrder, MainOrder order)
 {
     
     MethodInfo info = typeof (MainOrder)
         .GetMethod("AddSubOrder", BindingFlags.NonPublic | BindingFlags.Instance);
     info.Invoke(order, new[] {subOrder});
 }
Пример #2
0
        //撤销订单
        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}");
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        /// <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;
        }
Пример #9
0
        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));
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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 }));
        }
Пример #13
0
 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 { }));
 }
Пример #14
0
        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);
        }
Пример #15
0
        //同步订单
        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();
        }
Пример #16
0
        //发送订单
        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}");
        }
Пример #17
0
        /// <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));
            }
        }
Пример #18
0
        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 }));

            ;
        }
Пример #19
0
        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);
        }
Пример #20
0
 /// <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;
 }
Пример #21
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);
            }
        }
Пример #22
0
        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;
            }
        }
Пример #23
0
        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);
        }