Exemplo n.º 1
0
        /// <summary>
        /// 从淘宝中间表生成系统订单
        /// </summary>
        /// <param name="organ"></param>
        /// <param name="channel"></param>
        /// <see cref=""/>
        /// <returns>0转换成功,数值表示失败计数</returns>
        public int GenerateOrderFromTaobao(MemberOrganization organ, MemberChannel channel)
        {
            string strUserPrefix = Utility.ConfigHelper.GlobalConst.GetSetting("TaobaoUserPrefix");
            int nFailCount = 0;       // 转换失败计数器
            string strFailTids = "";
            var oTbOrders = (from o in dbEntity.ExTaobaoOrders.Include("TaobaoOrderItems")
                             where o.Transfered == false && o.status == "WAIT_SELLER_SEND_GOODS"
                                   && o.OrgID == organ.Gid && o.ChlID == channel.Gid
                             select o).ToList();
            foreach (var oTrade in oTbOrders)
            {
                try
                {
                    // 创建数据库事务
                    using (var scope = new TransactionScope())
                    {
                        string strTid = oTrade.tid.ToString();
                        var oOrder = (from o in dbEntity.OrderInformations
                                      where o.OrgID == organ.Gid && o.ChlID == channel.Gid
                                            && o.LinkCode == strTid
                                      select o).FirstOrDefault();
                        bool bSuccess = false;
                        if (oOrder == null)
                        {
                            // 查询和新建用户
                            string strLoginName = strUserPrefix + oTrade.buyer_nick;
                            var oUser = (from u in dbEntity.MemberUsers
                                         where u.LoginName == strLoginName
                                         select u).FirstOrDefault();
                            if (oUser == null)
                            {
                                oUser = new MemberUser
                                {
                                    Organization = organ,
                                    Role = dbEntity.MemberRoles.Where(r => r.OrgID == organ.Gid && r.Code == "Public").FirstOrDefault(),
                                    Channel = channel,
                                    LoginName = strLoginName,
                                    Ustatus = (byte)ModelEnum.UserStatus.VALID,
                                    NickName = oTrade.buyer_nick,
                                    DisplayName = oTrade.buyer_nick,
                                    Passcode = String.IsNullOrEmpty(oTrade.receiver_mobile) ? oTrade.receiver_phone : oTrade.receiver_mobile,
                                    Culture = dbEntity.GeneralCultureUnits.Where(c => c.Culture == 2052).FirstOrDefault(),
                                    Email = oTrade.buyer_email
                                };
                            }

                            // 匹配地区
                            var oLocation = (from r in dbEntity.GeneralRegions
                                             where r.Code == "CHN"       // 中国
                                             select r).FirstOrDefault();
                            var oProvince = (from r in dbEntity.GeneralRegions
                                             where r.Parent.Code == "CHN"
                                                   && (r.ShortName == oTrade.receiver_state || r.Map01 == oTrade.receiver_state)
                                             select r).FirstOrDefault();
                            if (oProvince != null)
                            {
                                oLocation = oProvince;                   // 匹配到省
                                var oCity = (from r in dbEntity.GeneralRegions
                                             where r.aParent == oProvince.Gid
                                                   && (r.ShortName == oTrade.receiver_city || r.Map01 == oTrade.receiver_city)
                                             select r).FirstOrDefault();
                                if (oCity != null)
                                {
                                    oLocation = oCity;                   // 匹配到市
                                    var oDistrict = (from r in dbEntity.GeneralRegions
                                                     where r.aParent == oCity.Gid
                                                           && (r.ShortName == oTrade.receiver_district || r.Map01 == oTrade.receiver_district)
                                                     select r).FirstOrDefault();
                                    if (oDistrict != null)
                                        oLocation = oDistrict;           // 匹配到区
                                }
                            }

                            // 支付方式 -- 支付宝
                            var oPayType = (from p in dbEntity.FinancePayTypes
                                            where p.Deleted == false && p.OrgID == organ.Gid && p.Code == "alipay"
                                            select p).FirstOrDefault();
                            // 货币 -- 人民币
                            var oCurrency = (from u in dbEntity.GeneralMeasureUnits
                                             where u.Deleted == false && u.Code == "¥"
                                                   && u.Utype == (byte)ModelEnum.MeasureUnit.CURRENCY
                                             select u).FirstOrDefault();

                            // 创建订单主表
                            oOrder = new OrderInformation
                            {
                                Organization = organ,
                                Channel = channel,
                                User = oUser,
                                LinkCode = strTid,
                                Ostatus = (byte)ModelEnum.OrderStatus.NONE,
                                TransType = (oTrade.type == "cod") ? (byte)ModelEnum.TransType.COD : (byte)ModelEnum.TransType.SECURED,
                                PayType = oPayType,
                                PayNote = oTrade.alipay_no,
                                // Pieces = oTrade.num,

                                Currency = oCurrency,
                                SaleAmount = Decimal.Parse(oTrade.total_fee),
                                // ExecuteAmount = Decimal.Parse(oTrade.payment) - Decimal.Parse(oTrade.post_fee),
                                ShippingFee = Decimal.Parse(oTrade.post_fee),
                                MoneyPaid = Decimal.Parse(oTrade.payment),
                                // Differ = 0,

                                PaidTime = new DateTimeOffset(oTrade.pay_time.Value, TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)),
                                Consignee = oTrade.receiver_name,
                                Location = oLocation,
                                FullAddress = oTrade.receiver_state + oTrade.receiver_city + oTrade.receiver_district + oTrade.receiver_address,
                                PostCode = oTrade.receiver_zip,
                                Telephone = oTrade.receiver_phone,
                                Mobile = oTrade.receiver_mobile,
                                Email = oTrade.buyer_email,
                                PostComment = oTrade.buyer_memo,
                                LeaveWord = oTrade.seller_memo
                            };

                            // 子订单实付金额。精确到2位小数,单位:元。如:200.07,表示:200元7分。计算公式如下:payment = price * num + adjust_fee - discount_fee + post_fee
                            // (邮费,单笔子订单时子订单实付金额包含邮费,多笔子订单时不包含邮费);
                            // 对于退款成功的子订单,由于主订单的优惠分摊金额,会造成该字段可能不为0.00元。建议使用退款前的实付金额减去退款单中的实际退款金额计算。
                            bool bSingleProduct = (oTrade.TaobaoOrderItems.Count() == 1);
                            decimal nTotalQty = 0m;      // 商品总数量,标准计量单位
                            decimal nItemAmount = 0m;    // 商品总金额

                            // 创建订单从表
                            foreach (var item in oTrade.TaobaoOrderItems)
                            {
                                // 先找OnSale.Code确定是否为pu-parts模式,SKU号对应不上时,必须判断转换失败
                                var oParts = (from s in dbEntity.ProductOnSales.Include("Product")
                                              where s.Deleted == false
                                                    && s.OrgID == organ.Gid && s.ChlID == channel.Gid
                                                    && s.Code == item.outer_sku_id
                                                    && s.Mode == (byte)ModelEnum.ProductMode.PU_PARTS
                                              orderby s.Ostatus descending
                                              select s).FirstOrDefault();
                                if (oParts == null)
                                {
                                    // PU-SKU 模式,只导入一个OnItem加入订单
                                    var oOnSku = (from s in dbEntity.ProductOnItems.Include("SkuItem").Include("OnSale")
                                                  where s.OnSale.Deleted == false && s.Deleted == false
                                                        && s.OnSale.Mode == (byte)ModelEnum.ProductMode.PU_SKU
                                                        && s.OnSale.OrgID == organ.Gid
                                                        && s.OnSale.ChlID == channel.Gid
                                                        && s.SkuItem.Code == item.outer_sku_id
                                                  orderby s.OnSale.Ostatus descending, s.OnSale.CreateTime descending
                                                  select s).FirstOrDefault();
                                    var oOnPrice = (from p in dbEntity.ProductOnUnitPrices.Include("MarketPrice").Include("SalePrice")
                                                    where p.Deleted == false
                                                          && p.OnSkuID == oOnSku.Gid       // oOnSku空,则直接到catch记录错误
                                                    orderby p.IsDefault descending, p.CreateTime descending
                                                    select p).FirstOrDefault();
                                    // 计量单位转换,进位法
                                    decimal nQuantity = Decimal.Parse(item.num.ToString());
                                    decimal nPercent = Decimal.Parse("1" + new string('0', oOnPrice.Percision));
                                    nQuantity = Math.Ceiling(nQuantity * oOnPrice.UnitRatio * nPercent) / nPercent;
                                    decimal nPayment = Decimal.Parse(item.payment);
                                    // 单笔子订单时子订单实付金额包含邮费,多笔子订单时不包含邮费
                                    if (bSingleProduct) nPayment -= oOrder.ShippingFee;
                                    OrderItem oOrderItem = new OrderItem
                                    {
                                        OnSkuItem = oOnSku,
                                        SkuItem = oOnSku.SkuItem,
                                        Name = item.title,
                                        Quantity = nQuantity,
                                        MarketPrice = oOnPrice.MarketPrice.GetResource(oOrder.Currency.Gid),
                                        SalePrice = oOnPrice.SalePrice.GetResource(oOrder.Currency.Gid),
                                        ExecutePrice = Math.Round(nPayment / nQuantity, 2),
                                        Remark = String.Format("淘宝:{0} | {1} | {2} | {3}", item.num, item.payment, item.discount_fee, item.adjust_fee)
                                    };
                                    // 统计与误差计算
                                    nTotalQty += nQuantity;
                                    nItemAmount += oOrderItem.ExecutePrice * nQuantity;
                                    oOrder.OrderItems.Add(oOrderItem);
                                }
                                else
                                {
                                    // PU-Parts模式,需要将所有OnItem加入订单,只第一个商品有价格,其他商品价格为零
                                    var oPartItems = (from i in dbEntity.ProductOnItems.Include("SkuItem").Include("OnSale")
                                                      where i.Deleted == false
                                                            && i.OnSaleID == oParts.Gid
                                                      select i).ToList();
                                    bool bIsFirst = true;
                                    decimal nQuantity = Decimal.Parse(item.num.ToString());
                                    decimal nPayment = Decimal.Parse(item.payment);
                                    // 单笔子订单时子订单实付金额包含邮费,多笔子订单时不包含邮费
                                    if (bSingleProduct) nPayment -= oOrder.ShippingFee;
                                    foreach (var oOnSku in oPartItems)
                                    {
                                        var oOnPrice = (from p in dbEntity.ProductOnUnitPrices.Include("MarketPrice").Include("SalePrice")
                                                        where p.Deleted == false && p.OnSkuID == oOnSku.Gid  // oOnSku空,则直接到catch记录错误
                                                        orderby p.IsDefault descending
                                                        select p).FirstOrDefault();
                                        // decimal nItemQty = oOnSku.SetQuantity * nQuantity;          // 不使用套装数量,使用转换算法
                                        // 计量单位转换,进位法
                                        decimal nPercent = Decimal.Parse("1" + new string('0', oOnPrice.Percision));
                                        decimal nItemQty = Math.Ceiling(nQuantity * oOnPrice.UnitRatio * nPercent) / nPercent;
                                        OrderItem oOrderItem = new OrderItem
                                        {
                                            OnSkuItem = oOnSku,
                                            SkuItem = oOnSku.SkuItem,
                                            Name = oOnSku.FullName.GetResource(2052),
                                            Quantity = nItemQty,
                                            MarketPrice = oOnPrice.MarketPrice.GetResource(oOrder.Currency.Gid),
                                            SalePrice = oOnPrice.SalePrice.GetResource(oOrder.Currency.Gid),
                                            ExecutePrice = (bIsFirst) ? Math.Round(nPayment / nItemQty, 2) : 0m,  // 第一个商品有价格,其他商品没有价格
                                            Remark = String.Format("淘宝:{0} | {1} | {2} | {3} | {4}", item.title, item.num, item.payment, item.discount_fee, item.adjust_fee)
                                        };
                                        // 统计与误差计算
                                        nTotalQty += nItemQty;
                                        nItemAmount += oOrderItem.ExecutePrice * nItemQty;
                                        oOrder.OrderItems.Add(oOrderItem);
                                        bIsFirst = false;
                                    }
                                }
                            }
                            oOrder.Pieces = nTotalQty;
                            oOrder.ExecuteAmount = nItemAmount;
                            oOrder.Differ = oOrder.MoneyPaid - oOrder.ShippingFee - nItemAmount;  // 误差
                            dbEntity.OrderInformations.Add(oOrder);
                            dbEntity.SaveChanges();

                            // 更新淘宝订单转换成功状态
                            oTrade.OrderID = oOrder.Gid;
                            oTrade.Transfered = true;
                            dbEntity.SaveChanges();

                            // 创建已收款记录
                            FinancePayment oFinance = new FinancePayment
                            {
                                Organization = organ,
                                PayTo = (byte)ModelEnum.PayDirection.TO_CORPBANK,
                                Pstatus = (byte)ModelEnum.PayStatus.PAID,
                                RefType = (byte)ModelEnum.NoteType.ORDER,
                                RefID = oOrder.Gid,
                                Reason = String.Format("支付宝:{0}", oTrade.alipay_no),
                                PayDate = new DateTimeOffset(oTrade.pay_time.Value, TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)),
                                Currency = oOrder.Currency,
                                Amount = oOrder.MoneyPaid,
                                Remark = String.Format("淘宝订单:{0}", oTrade.tid)
                            };
                            dbEntity.FinancePayments.Add(oFinance);

                            // 索取发票
                            if (!String.IsNullOrEmpty(oTrade.invoice_name))
                            {
                                FinanceInvoice oInvoice = new FinanceInvoice
                                {
                                    OrderInfo = oOrder,
                                    Code = oOrder.Gid.ToString("N"),
                                    Title = oTrade.invoice_name,
                                    Amount = oOrder.MoneyPaid
                                };
                                dbEntity.FinanceInvoices.Add(oInvoice);
                            }
                            dbEntity.SaveChanges();
                            bSuccess = true;
                        }
                        else
                        {
                            // TODO Warning

                            nFailCount++;
                            strFailTids += String.Format("{0},", oTrade.tid);
                        }
                        scope.Complete();
                        if (bSuccess)
                        {
                            oEventBLL.WriteEvent(String.Format("淘宝订单转换成功: {0}, {1}", oOrder.Code, oTrade.tid),
                                ModelEnum.ActionLevel.GENERIC, ModelEnum.ActionSource.ORDER, this.ToString());
                        }
                    }
                }
                catch
                {
                    nFailCount++;
                    strFailTids += String.Format("{0},", oTrade.tid);
                }
            }
            if (nFailCount > 0)
            {
                oEventBLL.WriteEvent(String.Format("淘宝订单转换失败: {0}", strFailTids),
                    ModelEnum.ActionLevel.ERROR, ModelEnum.ActionSource.ORDER, this.ToString());
            }
            return nFailCount;
        }
Exemplo n.º 2
0
        /// <summary>
        /// 保存页面修改信息,通过编辑的标志位来判断保存不同的信息
        /// </summary>
        /// <param name="oBackOrder"></param>
        /// <returns></returns>
        public ActionResult SaveEditOrderInfo(OrderInformation oBackOrder)
        {
            if (bChangeOrder == true)
            {
                if (bOrderBaseInfoEdit == true && bOrderItemInfoEdit == false && bOrderFeeInfoEdit == false)
                {
                    oNewOrder.LinkCode = oBackOrder.LinkCode;
                    oNewOrder.PayID = oBackOrder.PayID;
                    oNewOrder.aCurrency = oBackOrder.aCurrency;
                    oNewOrder.TransType = oBackOrder.TransType;
                    oNewOrder.LeaveWord = oBackOrder.LeaveWord;
                    oNewOrder.PostComment = oBackOrder.PostComment;
                    oNewOrder.PayNote = oBackOrder.PayNote;

                    oNewOrder.Consignee = oBackOrder.Consignee;
                    oNewOrder.aLocation = oBackOrder.aLocation;
                    var bestWhID = dbEntity.Database.SqlQuery<Guid>("SELECT dbo.fn_FindBestWarehouse({0}, {1}, {2})", oNewOrder.OrgID, oNewOrder.ChlID, oNewOrder.aLocation).FirstOrDefault();
                    if (bestWhID != null)
                    {
                        oNewOrder.WhID = (Guid)bestWhID;
                    }
                    oNewOrder.FullAddress = oBackOrder.FullAddress;
                    oNewOrder.PostCode = oBackOrder.PostCode;
                    oNewOrder.Telephone = oBackOrder.Telephone;
                    oNewOrder.Mobile = oBackOrder.Mobile;
                    oNewOrder.Email = oBackOrder.Email;
                    oNewOrder.BestDelivery = oBackOrder.BestDelivery;
                    oNewOrder.BuildingSign = oBackOrder.BuildingSign;
                    EditShippingListShow();//更新承运商列表信息
                    bOrderBaseInfoEdit = false;
                }
                else if (bOrderBaseInfoEdit == false && bOrderItemInfoEdit == true && bOrderFeeInfoEdit == false)
                {
                    //保存商品信息进入全局变量
                    //oNewOrder.OrderItems.Clear();
                    List<OrderItem> newList = new List<OrderItem>();
                    foreach (OrderItem item in listNewOrderItem)
                    {
                        OrderItem newObj = new OrderItem();
                        newObj.OrderID = item.OrderID;
                        newObj.OnSkuID = item.OnSkuID;
                        newObj.SkuID = item.SkuID;
                        newObj.Name = item.Name;
                        newObj.Quantity = item.Quantity;
                        newObj.TobeShip = item.TobeShip;
                        newObj.Shipped = item.Shipped;
                        newObj.BeReturn = item.BeReturn;
                        newObj.Returned = item.Returned;
                        newObj.MarketPrice = item.MarketPrice;
                        newObj.SalePrice = item.SalePrice;
                        newObj.ExecutePrice = item.ExecutePrice;
                        newObj.SkuPoint = item.SkuPoint;
                        newObj.Remark = item.Remark;
                        //oNewOrder.OrderItems.Add(item);
                        newList.Add(newObj);
                    }
                    oNewOrder.OrderItems = newList;
                    setAmount();
                    EditShippingListShow();//更新承运商列表信息
                    bOrderItemInfoEdit = false;
                }
                else if (bOrderBaseInfoEdit == false && bOrderItemInfoEdit == false && bOrderFeeInfoEdit == true)
                {
                    //保存费用信息进入全局变量
                    oNewOrder.ShippingFee = oBackOrder.ShippingFee;
                    oNewOrder.TaxFee = oBackOrder.TaxFee;
                    oNewOrder.Insurance = oBackOrder.Insurance;
                    oNewOrder.PaymentFee = oBackOrder.PaymentFee;
                    oNewOrder.PackingFee = oBackOrder.PackingFee;
                    oNewOrder.ResidenceFee = oBackOrder.ResidenceFee;
                    oNewOrder.LiftGateFee = oBackOrder.LiftGateFee;
                    oNewOrder.InstallFee = oBackOrder.InstallFee;
                    oNewOrder.OtherFee = oBackOrder.OtherFee;
                    bOrderFeeInfoEdit = false;
                }

                if(bSaveEditOrderInfo == true)
                {
                    Guid currentEditOrderGid = oNewOrder.Gid;
                    OrderInformation oCurrentEditOrder = dbEntity.OrderInformations.Where(p => p.Gid == currentEditOrderGid && p.Deleted == false).FirstOrDefault();
                    //订单基本信息保存
                    oCurrentEditOrder.DocVersion = oCurrentEditOrder.DocVersion + 1;
                    oCurrentEditOrder.LinkCode = oNewOrder.LinkCode;
                    oCurrentEditOrder.PayID = oNewOrder.PayID;
                    oCurrentEditOrder.WhID = oNewOrder.WhID;
                    oCurrentEditOrder.aCurrency = oNewOrder.aCurrency;
                    oCurrentEditOrder.TransType = oNewOrder.TransType;
                    oCurrentEditOrder.LeaveWord = oNewOrder.LeaveWord;
                    oCurrentEditOrder.PostComment = oNewOrder.PostComment;
                    oCurrentEditOrder.PayNote = oNewOrder.PayNote;

                    oCurrentEditOrder.Consignee = oNewOrder.Consignee;
                    oCurrentEditOrder.aLocation = oNewOrder.aLocation;
                    oCurrentEditOrder.FullAddress = oNewOrder.FullAddress;
                    oCurrentEditOrder.PostCode = oNewOrder.PostCode;
                    oCurrentEditOrder.Telephone = oNewOrder.Telephone;
                    oCurrentEditOrder.Mobile = oNewOrder.Mobile;
                    oCurrentEditOrder.Email = oNewOrder.Email;
                    oCurrentEditOrder.BestDelivery = oNewOrder.BestDelivery;
                    oCurrentEditOrder.BuildingSign = oNewOrder.BuildingSign;

                    //保存商品信息
                    //保存订单的产品
                    decimal Pieces = 0;//商品件数
                    List<OrderItem> hasBeforeOrderItems = dbEntity.OrderInformations.Find(oNewOrder.Gid).OrderItems.ToList();
                    foreach (OrderItem oldOrderItem in hasBeforeOrderItems)
                    {
                        oldOrderItem.Deleted = true;
                    }
                    foreach (OrderItem newOrderItem in listNewOrderItem)
                    {
                        Pieces += Math.Round(newOrderItem.Quantity,newOrderItem.SkuItem.Percision);//简单相加商品件数
                        newOrderItem.OrderID = oNewOrder.Gid;
                        OrderItem obj = hasBeforeOrderItems.Where(o => o.OrderID == newOrderItem.OrderID && o.OnSkuID == newOrderItem.OnSkuID).FirstOrDefault();
                        if (obj != null)//本身有该索引对应的记录
                        {
                            obj.Quantity = newOrderItem.Quantity;
                            obj.ExecutePrice = newOrderItem.ExecutePrice;
                            obj.TobeShip = newOrderItem.TobeShip;
                            obj.Deleted = false;
                        }
                        else
                        {
                            OrderItem newObj = new OrderItem();
                            newObj.OrderID = newOrderItem.OrderID;
                            newObj.OnSkuID = newOrderItem.OnSkuID;
                            newObj.SkuID = newOrderItem.SkuID;
                            newObj.Name = newOrderItem.Name;
                            newObj.Quantity = newOrderItem.Quantity;
                            newObj.TobeShip = newOrderItem.TobeShip;
                            newObj.Shipped = newOrderItem.Shipped;
                            newObj.BeReturn = newOrderItem.BeReturn;
                            newObj.Returned = newOrderItem.Returned;
                            newObj.MarketPrice = newOrderItem.MarketPrice;
                            newObj.SalePrice = newOrderItem.SalePrice;
                            newObj.ExecutePrice = newOrderItem.ExecutePrice;
                            newObj.SkuPoint = newOrderItem.SkuPoint;
                            newObj.Remark = newOrderItem.Remark;
                            dbEntity.OrderItems.Add(newObj);
                        }
                        oCurrentEditOrder.Pieces = Pieces;//商品件数赋值
                    }
                    //dbEntity.SaveChanges();
                    //保存承运商信息
                    List<OrderShipping> hasBeforeOrderShippings = dbEntity.OrderShippings.Where(o => o.OrderID == oNewOrder.Gid).ToList();//获取原数据库的所有该订单下对应的OrderShipping
                    foreach (OrderShipping oldOrderShip in hasBeforeOrderShippings)
                    {
                        oldOrderShip.Deleted = true;//全部变成删除
                        oldOrderShip.Candidate = false;
                    }
                    foreach (OrderShipping newOrderShip in listNewOrderShipping)
                    {
                        newOrderShip.OrderID = oNewOrder.Gid;
                        OrderShipping obj = hasBeforeOrderShippings.Where(o => o.OrderID == newOrderShip.OrderID && o.ShipID == newOrderShip.ShipID).FirstOrDefault();
                        if (obj==null)
                        {
                            if (newOrderShip.ShipID == oNewShipper.Gid)
                                newOrderShip.Candidate = true;
                            OrderShipping newObj = new OrderShipping();
                            newObj.OrderID = newOrderShip.OrderID;
                            newObj.ShipID = newOrderShip.ShipID;
                            newObj.Ostatus = newOrderShip.Ostatus;
                            newObj.ShipWeight = newOrderShip.ShipWeight;
                            newObj.Candidate = newOrderShip.Candidate;
                            newObj.Remark = newOrderShip.Remark;
                            dbEntity.OrderShippings.Add(newObj);
                        }
                        else
                        {//若OrderShipping已经有该索引的记录
                            if (obj.ShipID == oNewShipper.Gid)
                                obj.Candidate = true;
                            obj.Deleted = false;//变成可用状态
                        }
                    }
                    //dbEntity.SaveChanges();

                    //保存价格信息
                    oCurrentEditOrder.SaleAmount = oNewOrder.SaleAmount;
                    oCurrentEditOrder.ExecuteAmount = oNewOrder.ExecuteAmount;
                    oCurrentEditOrder.ShippingFee = oNewOrder.ShippingFee;
                    oCurrentEditOrder.TaxFee = oNewOrder.TaxFee;
                    oCurrentEditOrder.Insurance = oNewOrder.Insurance;
                    oCurrentEditOrder.PaymentFee = oNewOrder.PaymentFee;
                    oCurrentEditOrder.PackingFee = oNewOrder.PackingFee;
                    oCurrentEditOrder.ResidenceFee = oNewOrder.ResidenceFee;
                    oCurrentEditOrder.LiftGateFee = oNewOrder.LiftGateFee;
                    oCurrentEditOrder.InstallFee = oNewOrder.InstallFee;
                    oCurrentEditOrder.OtherFee = oNewOrder.OtherFee;

                    //保存全局的信息
                    dbEntity.SaveChanges();

                    bOrderBaseInfoEdit = false;
                    bOrderItemInfoEdit = false;
                    bOrderFeeInfoEdit = false;
                    bChangeOrder = false;
                    bSaveEditOrderInfo = false;
                }

            }

            return null;
        }
Exemplo n.º 3
0
        public void OrderItemTest()
        {
            ProductOnItem oSku = ProductOnItemTest();
            GeneralResource res = new GeneralResource
            {
            };
            oLiveEntities.GeneralResources.Add(res);

            MemberOrganization org = new MemberOrganization
            {
                Code = GetRandCode()
            };
            oLiveEntities.MemberOrganizations.Add(org);

            MemberRole role = new MemberRole
            {
                Name = res,
                Code = GetRandCode(),
                Organization = org
            };
            oLiveEntities.MemberRoles.Add(role);

            MemberChannel mChl = new MemberChannel
            {
                Code = GetRandCode()
            };
            oLiveEntities.MemberChannels.Add(mChl);

            MemberUser user = new MemberUser
            {
                Organization = org,
                Channel = mChl,
                Role = role,
                LoginName = "*****@*****.**",
                Passcode = "5425425425",
                SaltKey = "343134"
            };
            oLiveEntities.MemberUsers.Add(user);

            OrderInformation oInfo = new OrderInformation
            {
                Organization = org,
                Channel = mChl,
                Code = GetRandCode(),
                User = user
            };
            oLiveEntities.OrderInformations.Add(oInfo);
            oLiveEntities.SaveChanges();

            OrderItem oItem = new OrderItem
            {
                OnSkuID = oSku.Gid,
                Order = oInfo
            };
            oLiveEntities.OrderItems.Add(oItem);

            oLiveEntities.SaveChanges();
        }
Exemplo n.º 4
0
 /// <summary>
 /// 商品编辑,保存到缓存listNewOrderItem
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 public bool OrderItemEdit(OrderItem model)
 {
     //将缓存区的OrderItem删除
     OrderIremRemove(model.OnSkuID);
     //添加新的OrderItem
     model.SkuItem = dbEntity.ProductInfoItems.Find(model.SkuID);
     model.TobeShip = model.Quantity;
     listNewOrderItem.Add(model);
     return true;
 }
Exemplo n.º 5
0
 /// <summary>
 /// 添加选中的商品,并返回该ONSKU详细信息
 /// </summary>
 /// <param name="OnSkuId"></param>
 /// <returns></returns>
 public ActionResult OrderItemtoAdd(Guid OnSkuId)
 {
     ViewBag.Isediting = IsEditing.ToString();//add by 2011/10/20 tianyou
     OrderItem oOrderItem = new OrderItem();
     ProductOnItem oOnSku = dbEntity.ProductOnItems.Include("SkuItem").Where(p => p.Gid == OnSkuId && p.Deleted == false).FirstOrDefault();
     oOrderItem.OnSkuID = OnSkuId;
     oOrderItem.SkuID = oOnSku.SkuID;
     //找到标准计量单位的价格
     ProductOnUnitPrice oUnitPrice = dbEntity.ProductOnUnitPrices.Where(u => u.OnSkuID == OnSkuId && u.aShowUnit == oOnSku.SkuItem.StdUnit).FirstOrDefault();
     oOrderItem.MarketPrice = oUnitPrice.MarketPrice.GetResource(oNewOrder.aCurrency.Value);
     oOrderItem.SalePrice = oUnitPrice.SalePrice.GetResource(oNewOrder.aCurrency.Value);
     oOrderItem.ExecutePrice = oOrderItem.SalePrice;
     oOrderItem.Name = oOnSku.FullName.GetResource(CurrentSession.Culture);
     ViewBag.StdUnit = getStdUnit(oOnSku.SkuItem.StdUnit);
     return View(oOrderItem);
 }
Exemplo n.º 6
0
 /// <summary>
 /// 商品添加,保存到缓存listNewOrderItem
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 public bool OrderItemAdd(OrderItem model)
 {
     if (listNewOrderItem.Any(li => li.OnSkuID == model.OnSkuID))
     {//已经添加过的OnSku,则数量相加,执行价格按新设置的价格算,待发货数相加
         listNewOrderItem.Find(li => li.OnSkuID == model.OnSkuID).Quantity += model.Quantity;
         listNewOrderItem.Find(li => li.OnSkuID == model.OnSkuID).ExecutePrice = model.ExecutePrice;
         listNewOrderItem.Find(li => li.OnSkuID == model.OnSkuID).TobeShip += model.Quantity;
     }
     else
     {
         model.SkuItem = dbEntity.ProductInfoItems.Find(model.SkuID);
         model.TobeShip =model.Quantity;
         listNewOrderItem.Add(model);
     }
     return true;
 }
Exemplo n.º 7
0
        /// <summary>
        /// 进入购物车结算界面,区分不同的组织
        /// </summary>
        /// <returns></returns>
        public ActionResult Cart(Guid? memberAddGid)
        {
            //清空相关的全局变量
            globalCouponList = new Dictionary<Guid, decimal>();
            //清空全局商品的总执行价格
            globalProductExacuteAmount = 0m;
            //清空全局订单商品的列表
            globalOrderItemList = new Dictionary<Guid, OrderItem>();
            //清空全局订单商品的数量
            globalOrderItemPieces = 0m;
            //需要判断是否需要新建订单
            oNewOrder = new OrderInformation();
            //承运商信息清空
            globalShipperGid = Guid.Empty;
            //将发票信息回复为默认
            bInvoiceOrNot = false;
            //默认不使用承运商(快递或物流)
            bUseShipper = false;

            List<MallCart> listMallCart = dbEntity.MallCarts.Include("Organization").Include("Channel").Include("OnSale").Include("OnSkuItem").Include("CartType").Where(p => p.OrgID == globalOrgGid && p.ChlID == LiveSession.channelID && p.UserID == LiveSession.userID && p.Deleted == false).ToList();
            if (listMallCart.Count > 0)
            {
                //收货人信息
                List<MemberAddress> oUserAddressList = dbEntity.MemberAddresses.Where(p => p.UserID == LiveSession.userID && p.Deleted == false).ToList();
                ViewBag.oAddressList = oUserAddressList;

                //交易类型信息
                List<SelectListItem> oTransList = new List<SelectListItem>();
                oTransList = GetSelectList(oNewOrder.TransTypeList);
                ViewBag.oTransList = oTransList;

                //支付信息
                List<FinancePayType> listPayment = new List<FinancePayType>();
                //取支付方式的交集
                for (int i = 0; i < listMallCart.Count; i++)
                {
                    for (int j = 0; j < listMallCart.ElementAt(i).OnSale.OnPayments.Count; j++)
                    {
                        if (!listPayment.Contains(listMallCart.ElementAt(i).OnSale.OnPayments.ElementAt(j).PayType))
                        {
                            listPayment.Add(listMallCart.ElementAt(i).OnSale.OnPayments.ElementAt(j).PayType);
                        }
                    }
                }
                ViewBag.oPaymentList = listPayment;
                //券和积分的信息
                List<MemberPoint> listMemberCoupon = dbEntity.MemberPoints.Include("Promotion").Include("Coupon").Include("Currency").Where(p => p.Ptype == (byte)ModelEnum.PointType.COUPON && p.aCurrency == globalCurrencyGid && p.UserID == LiveSession.userID && p.OrgID == globalOrgGid && p.Deleted == false && p.Pstatus != (byte)ModelEnum.PointStatus.NONE && p.StartTime <= DateTimeOffset.Now && p.EndTime >= DateTimeOffset.Now && p.Balance > 0 || p.Remain > 0).ToList();
                List<MemberPoint> listArriveCoupon = new List<MemberPoint>();
                foreach (var couponItem in listMemberCoupon)
                {
                    listArriveCoupon.Add(couponItem);
                }
                List<MemberPoint> listMemberPoint = dbEntity.MemberPoints.Include("Promotion").Include("Coupon").Include("Currency").Where(p => p.Ptype == (byte)ModelEnum.PointType.POINT && p.Deleted == false && p.Pstatus != (byte)ModelEnum.PointStatus.NONE).ToList();
                if (listMemberPoint != null)
                {
                    ViewBag.pointList = listMemberPoint;
                }
                if (listArriveCoupon != null)
                {
                    ViewBag.arriveCouponList = listArriveCoupon;
                }

                //物流信息
                //独立页面

                //发票信息
                //从GeneralOptional表中取得,下拉框
                GeneralOptional invoiceOption = dbEntity.GeneralOptionals.Include("OptionalItems").Where(p => p.Deleted == false && p.Otype == (byte)ModelEnum.OptionalType.ORDER && p.Code == "Invoice").FirstOrDefault();
                List<SelectListItem> listInvoiceItem = new List<SelectListItem>();
                if (invoiceOption != null)
                {
                    for (int i = 0; i < invoiceOption.OptionalItems.Count; i++)
                    {
                        listInvoiceItem.Add(new SelectListItem { Text = invoiceOption.OptionalItems.ElementAt(i).Name.GetResource(LiveSession.Culture), Value = invoiceOption.OptionalItems.ElementAt(i).Gid.ToString() });
                    }
                }
                ViewBag.invoiceList = listInvoiceItem;

                //订单备注

                //商品清单
                List<MallCartProduct> listMallProduct = new List<MallCartProduct>();
                for (int j = 0; j < listMallCart.Count; j++)
                {
                    Guid onSkuGid = listMallCart.ElementAt(j).OnSkuID;
                    ProductOnUnitPrice oUnitPrice = dbEntity.ProductOnUnitPrices.Include("OnSkuItem.OnSale").Include("ShowUnit").Include("MarketPrice").Include("SalePrice").Where(p => p.OnSkuID == onSkuGid && p.Deleted == false).OrderByDescending(p => p.IsDefault).OrderByDescending(p => p.CreateTime).FirstOrDefault();
                    MallCartProduct oMallCartProduct = new MallCartProduct();
                    oMallCartProduct.mallCartGid = listMallCart.ElementAt(j).Gid;
                    //转换前的数量
                    oMallCartProduct.productCount = listMallCart.ElementAt(j).SetQty;
                    //折扣,现在默认为1,不打折
                    oMallCartProduct.productDiscount = 1;
                    //套装模式
                    oMallCartProduct.productMode = (byte)listMallCart.ElementAt(j).OnSale.Mode;
                    //套装数量,默认计量单位的数量
                    oMallCartProduct.productSetCount = listMallCart.ElementAt(j).SetQty;
                    //标准计量单位下的数量
                    oMallCartProduct.productQuantity = listMallCart.ElementAt(j).Quantity;
                    //转换后的实际默认计量单位的数量
                    if (oUnitPrice.Percision == 0)
                    {
                        oUnitPrice.Percision = 1;
                    }
                    decimal nPercent = Decimal.Parse("1" + new string('0', oUnitPrice.Percision));
                    oMallCartProduct.productFactCount = Math.Ceiling(listMallCart.ElementAt(j).Quantity / oUnitPrice.UnitRatio * nPercent) / nPercent;
                    //商品信息
                    oMallCartProduct.productName = listMallCart.ElementAt(j).OnSkuItem.FullName.GetResource(LiveSession.Culture);
                    oMallCartProduct.productPicture = listMallCart.ElementAt(j).OnSkuItem.OnSale.Picture;
                    //价格以及价格总计,总计按照实际从标准单位转换回来的数量计算
                    oMallCartProduct.productPriceSum = oUnitPrice.SalePrice.GetResource(globalCurrencyGid) * oMallCartProduct.productFactCount;
                    oMallCartProduct.productSalePrice = oUnitPrice.SalePrice.GetResource(globalCurrencyGid);
                    //对应商品的计量单位
                    oMallCartProduct.defaultUnit = oUnitPrice.ShowUnit.Name.GetResource(LiveSession.Culture);
                    oMallCartProduct.standardUnit = oUnitPrice.OnSkuItem.SkuItem.StandardUnit.Name.GetResource(LiveSession.Culture);
                    listMallProduct.Add(oMallCartProduct);
                    globalProductExacuteAmount = globalProductExacuteAmount + oMallCartProduct.productPriceSum;
                    //生成订单商品列表
                    OrderItem oNewOrderItem = new OrderItem();
                    oNewOrderItem.OnSkuID = onSkuGid;
                    oNewOrderItem.SkuID = listMallCart.ElementAt(j).OnSkuItem.SkuItem.Gid;
                    oNewOrderItem.Name = listMallCart.ElementAt(j).OnSkuItem.FullName.GetResource(LiveSession.Culture);
                    //标准计量单位的数量
                    oNewOrderItem.Quantity = listMallCart.ElementAt(j).Quantity;
                    oNewOrderItem.MarketPrice = oUnitPrice.MarketPrice.GetResource(globalCurrencyGid);
                    oNewOrderItem.SalePrice = oUnitPrice.SalePrice.GetResource(globalCurrencyGid);
                    oNewOrderItem.ExecutePrice = oMallCartProduct.productPriceSum / listMallCart.ElementAt(j).Quantity;
                    globalOrderItemList.Add(listMallCart.ElementAt(j).Gid, oNewOrderItem);
                    globalOrderItemPieces = globalOrderItemPieces + listMallCart.ElementAt(j).Quantity;
                }

                ViewBag.oProductItemList = listMallProduct;

            }
            oNewOrder.OrgID = globalOrgGid;
            oNewOrder.ChlID = LiveSession.channelID;
            oNewOrder.UserID = (Guid)LiveSession.userID;

            ViewBag.nCulture = LiveSession.Culture;
            return View();
        }
Exemplo n.º 8
0
        /// <summary>
        /// 用户确认订单
        /// </summary>
        /// <param name="formCollection"></param>
        /// <returns></returns>
        public string SaveNewOrder(FormCollection formCollection)
        {
            string strReturnInfo = "success";

            //检查收货人信息是否存在
            if (oNewOrder.aLocation == null || oNewOrder.aLocation.Equals(Guid.Empty))
            {
                strReturnInfo = "请选择收货人信息!";
                return strReturnInfo;
            }

            //检查承运商信息是否存在
            if (globalShipperGid == null || globalShipperGid.Equals(Guid.Empty))
            {
                strReturnInfo = "请选择承运商!";
                return strReturnInfo;
            }

            #region 提交订单的信息

            OrderInformation oConfirmOrder = new OrderInformation();
            //订单基本信息
            oConfirmOrder.OrgID = oNewOrder.OrgID;
            oConfirmOrder.ChlID = oNewOrder.ChlID;
            //计算出最佳仓库
            var bestWhID = dbEntity.Database.SqlQuery<Guid>("SELECT dbo.fn_FindBestWarehouse({0}, {1}, {2})", oNewOrder.OrgID, oNewOrder.ChlID, oNewOrder.aLocation).FirstOrDefault();
            oConfirmOrder.WhID = bestWhID;
            oConfirmOrder.UserID = oNewOrder.UserID;
            oConfirmOrder.DocVersion = 0;
            oConfirmOrder.aCurrency = globalCurrencyGid;
            //交易类型
            oConfirmOrder.TransType = byte.Parse(formCollection["TransType"]);
            //当前订单是货到付款,则不需要检查支付方式;否则检查用户是否选择支付方式
            if (oConfirmOrder.TransType != (byte)ModelEnum.TransType.COD)
            {
                if (oNewOrder.PayID == null)
                {
                    strReturnInfo = "请选择支付方式!";
                    return strReturnInfo;
                }
                else
                {
                    oConfirmOrder.PayID = oNewOrder.PayID;
                }
            }
            oConfirmOrder.Pieces = globalOrderItemPieces;
            //计算商品销售总价
            decimal salePriceSum = 0m;
            for (int i = 0; i < globalOrderItemList.Count; i++)
            {
                salePriceSum = salePriceSum + globalOrderItemList.ElementAt(i).Value.SalePrice * globalOrderItemList.ElementAt(i).Value.Quantity;
            }

            #region 订单价格信息

            oConfirmOrder.SaleAmount = salePriceSum;
            //设定订单执行价的总和
            oConfirmOrder.ExecuteAmount = globalProductExacuteAmount;
            oConfirmOrder.ShippingFee = oNewOrder.ShippingFee;
            oConfirmOrder.TaxFee = oNewOrder.TaxFee;
            oConfirmOrder.Insurance = oNewOrder.Insurance;
            oConfirmOrder.PaymentFee = oNewOrder.PaymentFee;
            oConfirmOrder.PackingFee = oNewOrder.PackingFee;
            oConfirmOrder.ResidenceFee = oNewOrder.ResidenceFee;
            oConfirmOrder.LiftGateFee = oNewOrder.LiftGateFee;
            oConfirmOrder.InstallFee = oNewOrder.InstallFee;
            oConfirmOrder.OtherFee = oNewOrder.OtherFee;
            oConfirmOrder.TotalFee = oNewOrder.TotalFee;
            oConfirmOrder.UsePoint = oNewOrder.UsePoint;
            oConfirmOrder.PointPay = oNewOrder.PointPay;
            oConfirmOrder.CouponPay = oNewOrder.CouponPay;
            oConfirmOrder.BounsPay = oNewOrder.BounsPay;
            oConfirmOrder.MoneyPaid = oNewOrder.MoneyPaid;
            oConfirmOrder.Discount = oNewOrder.Discount;
            oConfirmOrder.TotalPaid = oNewOrder.TotalPaid;
            oConfirmOrder.OrderAmount = oNewOrder.OrderAmount;
            oConfirmOrder.Differ = oNewOrder.Differ;

            #endregion

            #region 收货人基本信息

            oConfirmOrder.Consignee = oNewOrder.Consignee;
            oConfirmOrder.aLocation = oNewOrder.aLocation;
            oConfirmOrder.FullAddress = oNewOrder.FullAddress;
            oConfirmOrder.PostCode = oNewOrder.PostCode;
            oConfirmOrder.Telephone = oNewOrder.Telephone;
            oConfirmOrder.Mobile = oNewOrder.Mobile;
            oConfirmOrder.Email = oNewOrder.Email;
            oConfirmOrder.BestDelivery = formCollection["OrderBestDelivery"];
            oConfirmOrder.PostComment = formCollection["OrderPosComment"];

            dbEntity.OrderInformations.Add(oConfirmOrder);
            dbEntity.SaveChanges();

            #endregion

            #endregion

            #region 保存订单商品信息
            //将全局订单商品的列表保存入数据库
            for (int i = 0; i < globalOrderItemList.Count; i++)
            {
                OrderItem oNewOrderItem = new OrderItem();
                oNewOrderItem.OrderID = oConfirmOrder.Gid;
                oNewOrderItem.OnSkuID = globalOrderItemList.ElementAt(i).Value.OnSkuID;
                oNewOrderItem.SkuID = globalOrderItemList.ElementAt(i).Value.SkuID;
                oNewOrderItem.Name = globalOrderItemList.ElementAt(i).Value.Name;
                oNewOrderItem.Quantity = globalOrderItemList.ElementAt(i).Value.Quantity;
                oNewOrderItem.MarketPrice = globalOrderItemList.ElementAt(i).Value.MarketPrice;
                oNewOrderItem.SalePrice = globalOrderItemList.ElementAt(i).Value.SalePrice;
                oNewOrderItem.ExecutePrice = globalOrderItemList.ElementAt(i).Value.ExecutePrice;
                dbEntity.OrderItems.Add(oNewOrderItem);
                //删除购物车
                Guid mallCartGid = globalOrderItemList.ElementAt(i).Key;
                MallCart oCurrrentMallCart = dbEntity.MallCarts.Where(p => p.Gid == mallCartGid && p.Deleted == false).FirstOrDefault();
                if (oCurrrentMallCart != null)
                {
                    oCurrrentMallCart.Deleted = true;
                }
                dbEntity.SaveChanges();
            }

            #endregion

            #region 保存订单承运商信息
            //如果使用承运商,则保存最佳承运商信息
            if (bUseShipper == true)
            {
                OrderShipping oNewOrderShipping = new OrderShipping();
                oNewOrderShipping.OrderID = oConfirmOrder.Gid;
                oNewOrderShipping.ShipID = globalShipperGid;
                dbEntity.OrderShippings.Add(oNewOrderShipping);
                dbEntity.SaveChanges();
            }

            #endregion

            #region 订单的属性

            #endregion

            #region 发票信息
            //有订单发票信息
            if (bInvoiceOrNot == true)
            {
                FinanceInvoice oNewFinanceInvoice = new FinanceInvoice();
                Guid optionItemGid = Guid.Parse(formCollection["InvoiceItem"]);
                GeneralOptItem oInvoiceItem = dbEntity.GeneralOptItems.Include("Name").Where(p => p.Gid == optionItemGid && p.Deleted == false).FirstOrDefault();
                if (oInvoiceItem != null)
                {
                    oNewFinanceInvoice.Matter = oInvoiceItem.Name.GetResource(LiveSession.Culture);
                }
                oNewFinanceInvoice.Title = formCollection["orderInvoice"];
                oNewFinanceInvoice.Amount = oConfirmOrder.OrderAmount;
                dbEntity.FinanceInvoices.Add(oNewFinanceInvoice);
                dbEntity.SaveChanges();
            }

            #endregion

            #region 将使用的券信息写入用户记录

            for (int i = 0; i < globalCouponList.Count; i++)
            {
                Guid pointGid = globalCouponList.ElementAt(i).Key;
                MemberPoint oMemberPoint = dbEntity.MemberPoints.Include("User").Include("Promotion").Include("Coupon").Where(p=>p.Gid == pointGid && p.Deleted==false).FirstOrDefault();
                if (oMemberPoint != null)
                {
                    decimal couponBalance = globalCouponList.ElementAt(i).Value;
                    MemberUsePoint oNewMemberUsePoint = new MemberUsePoint();
                    oNewMemberUsePoint.PointID = pointGid;
                    oNewMemberUsePoint.Pstatus = (byte)ModelEnum.PointUsed.USED;
                    oNewMemberUsePoint.RefType = (byte)ModelEnum.NoteType.ORDER;
                    oNewMemberUsePoint.RefID = oConfirmOrder.Gid;
                    //将原有的金额减去余额即为消费金额
                    oNewMemberUsePoint.Amount = oMemberPoint.Balance - couponBalance;
                    dbEntity.MemberUsePoints.Add(oNewMemberUsePoint);
                    //将积分表的余额变为当前余额
                    oMemberPoint.Balance = couponBalance;
                    //将状态变为已使用
                    oMemberPoint.Pstatus = (byte)ModelEnum.PointStatus.USED;
                    //当余额为0时,是否改变状态
                    //To do 不改变券的状态
                    dbEntity.SaveChanges();
                }
            }

            #endregion

            return strReturnInfo;
        }
Exemplo n.º 9
0
 public StockInSku(WarehouseInItem oInItem, OrderItem oOderItem)
 {
     this.oInItem = oInItem;
     this.oOderItem = oOderItem;
 }
Exemplo n.º 10
0
 public StockOutSku(WarehouseOutItem oOutItem, OrderItem oOderItem)
 {
     this.oOutItem = oOutItem;
     this.oOderItem = oOderItem;
 }