Beispiel #1
0
        /// <summary>
        /// 计算商品返积分,一般展示商品详情的时候用
        /// </summary>
        /// <param name="productId"></param>
        /// <param name="rebateRate"></param>
        /// <returns></returns>
        public decimal CalcProductRebateScore(string productId, decimal rebateRate, int count = 1, bool isGetInt = false)
        {
            BLLMall bllMall     = new BLLMall();
            var     productInfo = bllMall.GetProduct(productId);

            return(CalcProductRebateScore(productInfo, rebateRate, count, isGetInt));
        }
Beispiel #2
0
Datei: BLLMQ.cs Projekt: uvbs/mmp
        /// <summary>
        /// 商品打开统计及计数
        /// </summary>
        /// <param name="messageInfo"></param>
        /// <param name="ramark"></param>
        /// <param name="errMsg"></param>
        public void ShopDetailOpenStatistics(MessageInfo messageInfo, out string ramark, out string errMsg)
        {
            Console.WriteLine("正在处理商品打开统计及计数");
            ramark = "";
            errMsg = "";

            BLLMall bllMall = new BLLMall();

            var msgBody = JsonConvert.DeserializeObject <Model.MQ.ShopDetailOpenStatistics>(messageInfo.Msg);

            var detailInfo = msgBody.GetMonitorEventDetailsInfo();

            detailInfo.MonitorPlanID = msgBody.ProductId;

            bllMall.Add(detailInfo);

            //改成手动更新商品表
            ////随机机率去更新,不用每次都去更新商品详情

            //var rand = new Random().Next(0, 100);

            //if (rand > 10 && rand < 50 && rand % 2 == 0)
            //{
            //    //随机更新商品详情的访问统计
            //    Console.WriteLine("随机更新商品详情的访问统计");
            //    int uvCount = bllMall.GetCount<MonitorEventDetailsInfo>(" EventUserID ", string.Format(" MonitorPlanID={0} ", msgBody.ProductId));
            //    int ipCount = bllMall.GetCount<MonitorEventDetailsInfo>(" SourceIP ", string.Format(" MonitorPlanID={0} ", msgBody.ProductId));
            //    int pv = bllMall.GetCount<MonitorEventDetailsInfo>(string.Format(" MonitorPlanID={0} ", msgBody.ProductId));
            //    bllMall.Update(new WXMallProductInfo(), string.Format(" PV={2},UV={0},IP={1} ", uvCount, ipCount, pv), string.Format(" PID='{0}' ", msgBody.ProductId));
            //}
            Console.WriteLine("商品打开统计及计数处理完毕");
        }
Beispiel #3
0
        /// <summary>
        /// 计算商品获得的积分
        /// </summary>
        /// <param name="product"></param>
        /// <param name="rebateRate"></param>
        /// <param name="count"></param>
        /// <param name="isGetInt"></param>
        /// <returns></returns>
        public decimal CalcProductRebateScore(WXMallProductInfo product, decimal rebateRate, int count = 1, bool isGetInt = false)
        {
            BLLMall bllMall = new BLLMall();

            decimal addScore = 0;

            //如果是特卖中 则不返积分
            if (product.IsPromotionProduct == 1)
            {
                var productSkuList = bllMall.GetProductSkuList(int.Parse(product.PID));//源SKU
                foreach (var item in productSkuList)
                {
                    if (bllMall.IsPromotionTime(item))
                    {
                        return(0);
                    }
                }
            }

            decimal price = product.Price - product.BasePrice;

            if (price < 0)
            {
                price = 0;
            }

            addScore = rebateRate * price * count;

            if (isGetInt)
            {
                addScore = RebateScoreGetInt(addScore);
            }

            return(addScore);
        }
Beispiel #4
0
        /// <summary>
        /// 根据本地订单映射出驿氪订单
        /// </summary>
        /// <param name="orderSrc"></param>
        /// <returns></returns>
        public Entity.OrderInfo GeiMappingOrderInfo(ZentCloud.BLLJIMP.Model.WXMallOrderInfo orderSrc)
        {
            BLLMall bllMall = new BLLMall();

            Entity.OrderInfo order = new Entity.OrderInfo();

            order.ShopCode   = CurrEfastShopId.ToString();
            order.Code       = orderSrc.OrderID;
            order.OrderTime  = orderSrc.InsertDate.ToString();
            order.TotalQty   = orderSrc.ProductCount;
            order.TotalMoney = 0;// (double)orderSrc.TotalAmount;
            order.IsPayed    = orderSrc.PaymentStatus == 1;
            order.PayAmount  = (double)orderSrc.TotalAmount;

            var userInfo = new BLLUser().GetUserInfo(orderSrc.OrderUserID);

            order.BuyerCode = userInfo.Ex2;

            order.OrderStatus = GetOrderStatusCode(orderSrc.Status);
            order.StatusTime  = DateTime.Now.ToString();
            order.SellerId    = orderSrc.SellerId;
            order.DataOrigin  = 1;
            order.PayTime     = DateTime.Now.ToString();
            order.ExpressFee  = (double)orderSrc.Transport_Fee;

            order.RecvAddress   = orderSrc.Address;
            order.RecvCity      = orderSrc.ReceiverCity;
            order.RecvConsignee = orderSrc.Consignee;
            order.RecvCounty    = orderSrc.ReceiverDist;
            order.RecvMobile    = orderSrc.Phone;
            order.RecvProvince  = orderSrc.ReceiverProvince;

            List <ZentCloud.BLLJIMP.Model.WXMallOrderDetailsInfo> detailList = bllMall.GetOrderDetailsList(orderSrc.OrderID);
            List <Entity.OrderDetail> dtls = new List <Entity.OrderDetail>();

            int saleProdQty = 0;

            foreach (var item in detailList)
            {
                Entity.OrderDetail dtl = new Entity.OrderDetail();
                saleProdQty++;

                dtl.BarCode       = bllMall.GetEfastBarcode(item.SkuId.Value);
                dtl.PriceOriginal = (double)item.OrderPrice;
                dtl.PriceSell     = (double)item.OrderPrice;
                dtl.Quantity      = item.TotalCount;
                dtl.Amount        = dtl.PriceSell * dtl.Quantity;
                dtl.IsGift        = false;

                order.TotalMoney += dtl.Amount;

                dtls.Add(dtl);
            }

            order.Dtls = dtls;


            return(order);
        }
Beispiel #5
0
        /// <summary>
        /// 计算每一个sku获得的积分
        /// </summary>
        /// <param name="skuId"></param>
        /// <param name="rebateRate"></param>
        /// <param name="payRate">
        /// 实付比例,
        /// 在需要均摊计算的时候用到
        /// </param>
        /// <param name="count">数量</param>
        /// <param name="isGetInt">
        /// 是否取整
        /// 如果多件商品计算获得积分,在最终总分里面做取整处理
        /// </param>
        /// <returns></returns>
        public decimal CalcProductSkuRebateScore(int skuId, decimal rebateRate, decimal?payRate = null, int count = 1, bool isGetInt = false)
        {
            BLLMall         bllMall  = new BLLMall();
            BLLDistribution bllDist  = new BLLDistribution();
            decimal         addScore = 0;

            var skuInfo = bllMall.GetProductSku(skuId);

            //判断如果是特卖中的商品则不给返积分
            if (bllMall.IsPromotionTime(skuInfo))
            {
                return(0);
            }

            var price = bllMall.GetSkuPrice(skuInfo);

            if (skuInfo.BasePrice <= 0)
            {
                var productInfo = bllMall.GetProduct(skuInfo.ProductId);
                skuInfo.BasePrice = productInfo.BasePrice;
            }

            price = price - skuInfo.BasePrice;

            if (payRate != null)
            {
                price = price * payRate.Value;
            }

            if (price < 0)
            {
                price = 0;
            }

            //全额获得的积分=售价*参与返积分的比例*积分返利比例  -- 已废除
            //按价格比例获得的积分=均摊价*参与返积分的比例*积分返利比例 -- 已废除
            //addScore = (int)(rebateRate * (productInfo.RebateScoreRate * 0.01M) * skuPrice * count);

            //获得的积分=实际售价(如果非全额则需要计算均摊差价:售价-基础价)* 返积分比例 * 数量
            addScore = rebateRate * price * count;

            if (isGetInt)
            {
                addScore = RebateScoreGetInt(addScore);
            }

            return(addScore);
        }
Beispiel #6
0
        /// <summary>
        /// 订单上传
        /// </summary>
        /// <param name="orderSrc"></param>
        /// <param name="saleType"></param>
        /// <returns></returns>
        public Entity.ReqBase OrderUpload(ZentCloud.BLLJIMP.Model.WXMallOrderInfo orderSrc, string saleType = "S")
        {
            Entity.ReqBase result = new Entity.ReqBase();

            BLLMall bllMall = new BLLMall();

            List <Entity.OrderInfo> orderList = new List <Entity.OrderInfo>();

            Entity.OrderInfo order = GeiMappingOrderInfo(orderSrc);

            orderList.Add(order);

            result = GetCommand <Entity.ReqBase>(JsonConvert.SerializeObject(orderList), APIUrl + "api/morder/ordadd", "post");

            return(result);
        }
Beispiel #7
0
        ///// <summary>
        ///// 生成外部订单号
        ///// </summary>
        ///// <returns></returns>
        //private string CreateOutOrderId(string orderId)
        //{

        //    if (orderId.Length > 10)
        //    {
        //        orderId = orderId.Substring(0, 10);
        //    }
        //    return string.Format("{0}_{1}", DateTime.Now.ToString("yyyyMMddhhmmss"), orderId.PadLeft(10, '0'));

        //}

        ///// <summary>
        ///// 生成签名
        ///// </summary>
        ///// <param name="appId"></param>
        ///// <param name="timeStamp"></param>
        ///// <param name="appkey"></param>
        ///// <returns></returns>
        //public string CreateSign(string appId, string timeStamp, string appkey)
        //{
        //    string sign = ZentCloud.Common.SHA1.SHA1_Encrypt(string.Format("appid={0}&appkey={1}&timestamp={2}", appId, appkey, timeStamp)).ToUpper();
        //    return sign;

        //}


        protected void Button1_Click(object sender, EventArgs e)
        {
            BLLMall bllMall = new BLLMall();

            /// <summary>
            /// Efast
            /// </summary>
            Open.EfastSDK.Client efastClient = new Open.EfastSDK.Client();
            ProductSku           skuInfo     = bllMall.Get <ProductSku>(string.Format("SkuSN='{0}'", txtOrderId.Text));

            if (skuInfo == null)
            {
                txtOrderId.Text = string.Format("条码不存在");
                return;
            }
            var eFastSku = efastClient.GetSkuStock(9, skuInfo.OutBarCode);

            if (eFastSku != null)
            {
                if (eFastSku.sl != skuInfo.Stock)
                {
                    skuInfo.Stock = eFastSku.sl;

                    if (ZentCloud.ZCBLLEngine.BLLBase.ExecuteSql(string.Format("update ZCJ_ProductSku set Stock={0} where SkuId={1}", skuInfo.Stock, skuInfo.SkuId)) >= 0)
                    {
                        txtOrderId.Text = string.Format("同步成功,条码:{0}库存:{1}", skuInfo.OutBarCode, skuInfo.Stock);
                    }
                }
                else
                {
                    txtOrderId.Text = string.Format("库存一致,跳过 条码:{0}库存:{1}", skuInfo.OutBarCode, skuInfo.Stock);
                }
            }
            else
            {
                txtOrderId.Text = "未查到";
            }
        }
Beispiel #8
0
        /// <summary>
        /// 审核通过打款
        /// </summary>
        /// <param name="autoId">记录Id</param>
        /// <param name="userId">操作人账号</param>
        /// <param name="msg">提示信息</param>
        /// <returns></returns>
        public bool Pass(int autoId, string userId, out string msg)
        {
            msg = "";
            var record = Get(autoId);

            if (record.Status == 1)
            {
                msg = "该记录已打款";
                return(false);
            }

            switch (record.Type)
            {
                #region 分销提现
            case "DistributionWithdraw":    //分销提现
                BLLDistribution     bllDis = new BLLDistribution();
                List <WithdrawCash> list   = new List <WithdrawCash>();
                WithdrawCash        model  = Get <WithdrawCash>(string.Format("TranId='{0}'", record.TranId));
                if (model == null)
                {
                    msg = "该记录已标记为失败";
                    return(false);
                }
                list.Add(model);
                if (!bllDis.UpdateWithrawCashStatus(list, 2, out msg))
                {
                    return(false);
                }
                break;
                #endregion

                #region 商城退款
            case "MallRefund":    //退款
                BLLMall      bllMall = new BLLMall();
                WXMallRefund refund  = bllMall.Get <WXMallRefund>(string.Format("RefundId='{0}'", record.TranId));
                switch (refund.Status)
                {
                case 2:
                    msg = "未同意退款";
                    return(false);

                case 5:
                    msg = "未收到货拒绝退款";
                    return(false);

                case 7:
                    msg = "退款申请关闭";
                    return(false);

                default:
                    break;
                }
                if (!bllMall.Refund(refund.OrderDetailId, out msg))
                {
                    return(false);
                }

                break;

                #endregion
            default:
                msg = "未定义的类型";
                return(false);
            }
            record.UpdateTime  = DateTime.Now;
            record.Status      = 1;
            record.OperaUserId = userId;
            if (Update(record))
            {
                return(true);
            }
            return(false);
        }
Beispiel #9
0
        /// <summary>
        /// 计算订单可以返多少积分
        /// </summary>
        /// <param name="orderInfo"></param>
        /// <returns></returns>
        public decimal CalcOrderRebateScore(WXMallOrderInfo orderInfo)
        {
            BLLMall bllMall  = new BLLMall();
            decimal addScore = 0;

            //取出全部sku和数量,相加获取得到的总积分

            //判断当前是否只能全额支付才返积分
            //如果可以不全额,且实付跟应付不一致,则每个商品按照均摊价格去计算积分
            var websiteInfo = GetWebsiteInfoModelFromDataBase(orderInfo.WebsiteOwner);

            if (websiteInfo.IsRebateScoreMustAllCash == 1 && !orderInfo.IsAllCash)
            {
                //如果没有使用优惠券、积分、余额抵扣则为全额付款
                return(0);
            }

            var detalList = bllMall.GetOrderDetailsList(orderInfo.OrderID);

            var rebateRate = GetUserRebateScoreRate(orderInfo.OrderUserID, orderInfo.WebsiteOwner);

            if (rebateRate > 0 && orderInfo.TotalAmount > 0)
            {
                foreach (var item in detalList)
                {
                    decimal payRate = 1;//实付比例

                    if (!orderInfo.IsAllCash)
                    {
                        // 没有全额付款,计算返积分均摊价

                        // 均摊价=单个商品价格/所有商品价格*(实付-运费)- 已废弃
                        //item.OrderPrice = item.OrderPrice.Value / orderInfo.Product_Fee * (orderInfo.TotalAmount - orderInfo.Transport_Fee);

                        /* 积分均摊价
                         *
                         * 实付价格比例=商品实付/商品应付(不算邮费)
                         *
                         * 单个sku应算积分差价比例=单个sku积分差价(一件)/积分差价总和(总件数)
                         *
                         * 差价总额=每个sku的积分差价*数量 加起来
                         *
                         * 单个sku积分差价(无均摊)= 单个sku应算积分差价比例 * 差价总额
                         *
                         * 单个sku积分均摊价 = 实付价格比例 * 单个sku积分差价
                         *                   = 商品实付/商品应付(不算邮费) * 差价总额 * 单个sku应算积分差价比例
                         *
                         * --------------------------------------------------------------------------------------
                         *
                         *
                         * 单个sku积分均摊价 = 实付价格比例 * 单个sku积分差价
                         *
                         *
                         */

                        payRate = (orderInfo.TotalAmount - orderInfo.Transport_Fee) / orderInfo.Product_Fee;
                    }

                    addScore += CalcProductSkuRebateScore(item.SkuId.Value, rebateRate, payRate, item.TotalCount);
                }
            }

            addScore = RebateScoreGetInt(addScore);

            return(addScore);
        }
Beispiel #10
0
        /// <summary>
        /// 冻结积分结算
        /// </summary>
        /// <param name="orderInfo"></param>
        /// <returns></returns>
        public bool SettlementOrderLockScore(WXMallOrderInfo orderInfo, out string msg)
        {
            BLLMall bllMall = new BLLMall();
            BLLWebsiteDomainInfo bllWebsiteDomain = new BLLWebsiteDomainInfo();
            BLLWeixin            bllWeixin        = new BLLWeixin();

            msg = "";
            var lockModel = GetLockScoreByOrder(orderInfo.OrderID);

            int addScore = (int)lockModel.Score;

            if (addScore > 0)
            {
                UserInfo orderUserInfo = bllUser.GetUserInfo(orderInfo.OrderUserID, orderInfo.WebsiteOwner);
                if (orderUserInfo == null)
                {
                    return(false);
                }
                WebsiteInfo websiteInfo = bllMall.Get <WebsiteInfo>(string.Format(" WebsiteOwner='{0}'", orderInfo.WebsiteOwner));

                ZentCloud.ZCBLLEngine.BLLTransaction tran = new ZentCloud.ZCBLLEngine.BLLTransaction();
                try
                {
                    UserScoreDetailsInfo scoreRecord = new UserScoreDetailsInfo();
                    scoreRecord.AddTime      = DateTime.Now;
                    scoreRecord.Score        = addScore;
                    scoreRecord.TotalScore   = orderUserInfo.TotalScore;
                    scoreRecord.ScoreType    = "OrderSuccess";
                    scoreRecord.UserID       = orderInfo.OrderUserID;
                    scoreRecord.AddNote      = "微商城-交易成功获得积分";
                    scoreRecord.WebSiteOwner = orderInfo.WebsiteOwner;
                    scoreRecord.RelationID   = orderInfo.OrderID;

                    if (!bllMall.Add(scoreRecord, tran))
                    {
                        tran.Rollback();
                        return(false);
                    }
                    if (bllUser.Update(orderUserInfo, string.Format(" TotalScore+={0},HistoryTotalScore+={0}", addScore), string.Format(" AutoID={0}", orderUserInfo.AutoID), tran) <= 0)
                    {
                        tran.Rollback();
                        return(false);
                    }

                    #region 宏巍加积分
                    if (websiteInfo.IsUnionHongware == 1)
                    {
                        Open.HongWareSDK.Client hongWareClient = new Open.HongWareSDK.Client(orderInfo.WebsiteOwner);
                        var hongWareMemberInfo = hongWareClient.GetMemberInfo(orderUserInfo.WXOpenId);
                        if (hongWareMemberInfo.member != null)
                        {
                            if (!hongWareClient.UpdateMemberScore(hongWareMemberInfo.member.mobile, orderUserInfo.WXOpenId, addScore))
                            {
                                tran.Rollback();
                                return(false);
                            }
                        }
                    }
                    #endregion

                    //积分解冻
                    if (!string.IsNullOrWhiteSpace(lockModel.Memo))
                    {
                        lockModel.Memo += ";交易成功获得积分解冻";
                    }
                    else
                    {
                        lockModel.Memo = "交易成功获得积分解冻";
                    }

                    if (Update(
                            new ScoreLockInfo(),
                            string.Format(" Memo+='{0}',LockStatus=1,UnLockTime=GETDATE() ", lockModel.Memo),
                            string.Format(" ForeignkeyId='{0}' AND LockType = 1 ", orderInfo.OrderID),
                            tran
                            ) > 0)
                    {
                        #region 微信通知
                        try
                        {
                            string url = string.Format("http://{0}/customize/shop/?v=1.0&ngroute=/myscores#/myscores", bllWebsiteDomain.GetWebsiteDoMain(orderInfo.WebsiteOwner));
                            bllWeixin.SendTemplateMessageNotifyCommTask(orderUserInfo.WXOpenId, "您有一笔积分已经到账", string.Format("积分:{0}分", (int)lockModel.Score), url, "", "", "", orderInfo.WebsiteOwner);
                        }
                        catch
                        {
                        }
                        #endregion
                    }
                    else
                    {
                        msg = string.Format("处理即将到账积分失败!订单号:{0}", orderInfo.OrderID);
                        tran.Rollback();
                        return(false);
                    }
                }
                catch (Exception ex)
                {
                    msg = ex.Message;
                    tran.Rollback();
                    return(false);
                }

                tran.Commit();
            }

            return(true);
        }
Beispiel #11
0
        /// <summary>
        /// 前台发放的储值卡可用状态
        /// </summary>
        /// <param name="card">储值卡主卡</param>
        /// <param name="record">发放的储值卡</param>
        /// <param name="curUser">当前登录用户</param>
        /// <param name="fromUser">发放用户</param>
        /// <param name="toUser">转赠用户</param>
        /// <param name="isGive">是否转赠</param>
        /// <returns>
        /// 可用状态
        /// 0可用
        /// 1已使用
        /// 2已过期
        /// 10待接收转赠 (接口判断查看人构造)
        /// 11已转赠 (接口判断查看人构造)
        /// 12已转赠他人(接口判断查看人构造)
        /// 9已停用 (接口判断查看人构造)
        /// 99非法状态 (未知)
        /// </returns>
        public int GetUseStatus(StoredValueCard card, StoredValueCardRecord record, UserInfo curUser, UserInfo fromUser, UserInfo toUser, bool isGive)
        {
            BLLMall bllMall   = new BLLMall();
            int     useStatus = 99; //正常

            if (card.Status == 1)
            {
                useStatus = 9; //已停用
            }
            else if (record.Status == 0)
            {
                if (curUser.AutoID == fromUser.AutoID)
                {
                    useStatus = 0; //已转赠
                }
                else if (isGive)
                {
                    useStatus = 10; //待接收转赠
                }
            }
            else if (record.Status == 1)
            {
                if (curUser.AutoID == toUser.AutoID)
                {
                    useStatus = 0; //正常
                }
                else if (curUser.AutoID == fromUser.AutoID)
                {
                    useStatus = 11; //已转赠
                }
                else
                {
                    useStatus = 12; //已转赠它人
                }
            }
            else if (record.Status == 9)
            {
                if (curUser.AutoID == fromUser.AutoID && toUser != null)
                {
                    useStatus = 11; //已转赠
                }
                else
                {
                    useStatus = 1; //已使用
                }

                // 储值卡有余额还可转赠
                decimal canUseAmount = string.IsNullOrEmpty(record.ToUserId) ? bllMall.GetStoreValueCardCanUseAmount(record.AutoId.ToString(), record.UserId) : bllMall.GetStoreValueCardCanUseAmount(record.AutoId.ToString(), record.UserId);
                if (canUseAmount > 0)
                {
                    useStatus = 0;
                    if (isGive)
                    {
                        useStatus = 10;
                    }
                }

                // 储值卡有余额还可转赠
            }

            if (useStatus == 0 && record.ValidTo.HasValue && record.ValidTo.Value < DateTime.Now)
            {
                useStatus = 2;
            }
            return(useStatus);
        }