Example #1
0
        public async Task <ApiResult <OrderBuyOutput> > Buy([FromBody] UserRightsOrderInput parameter)
        {
            if (!this.IsFormValid())
            {
                return(ApiResult.Failure <OrderBuyOutput>(this.FormInvalidReason(),
                                                          MessageCodes.ParameterValidationFailure));
            }
            // var usr = Resolve<IUserService>().GetByIdNoTracking(parameter.UserId);

            var result = await Resolve <IUserRightsService>().Buy(parameter);

            if (!result.Item1.Succeeded)
            {
                return(ApiResult.Failure <OrderBuyOutput>(result.Item1.ToString(), MessageCodes.ServiceFailure));
            }

            var user = Resolve <IUserService>().GetSingle(s => s.Mobile == parameter.Mobile);

            //如果该用户推荐人为空 则直接绑定当前登陆的账户
            if (user != null && user.ParentId <= 0)
            {
                user.ParentId = parameter.UserId;
                Resolve <IUserService>().Update(user);
            }

            return(ApiResult.Success(result.Item2));
        }
Example #2
0
        /// <summary>
        ///     商家服务订购
        /// </summary>
        /// <param name="orderBuyInput"></param>
        /// <returns></returns>
        public async Task <Tuple <ServiceResult, OrderBuyOutput> > Buy(UserRightsOrderInput orderBuyInput)
        {
            #region 安全验证

            var result         = ServiceResult.Success;
            var orderBuyOutput = new OrderBuyOutput();
            var user           = Resolve <IUserService>().GetNomarlUser(orderBuyInput.UserId);
            if (user == null)
            {
                return(Tuple.Create(ServiceResult.Failure("用户不存在,或状态不正常"), orderBuyOutput));
            }

            orderBuyInput.BuyUser = user; // 购买用户等于当前用户

            user.Detail = null;           // 减少体积保存
            user.Map    = null;
            if (orderBuyInput.GradeId.IsGuidNullOrEmpty())
            {
                return(Tuple.Create(ServiceResult.Failure("等级Id不能为空"), orderBuyOutput));
            }

            orderBuyInput.User = user;
            var userGrades = Resolve <IAutoConfigService>().GetList <UserGradeConfig>();
            var buyGrade   = userGrades.FirstOrDefault(r => r.Id == orderBuyInput.GradeId);
            if (buyGrade == null)
            {
                return(Tuple.Create(ServiceResult.Failure("购买的等级不存在"), orderBuyOutput));
            }

            var userRightConfig = Resolve <IAutoConfigService>().GetList <UserRightsConfig>()
                                  .FirstOrDefault(c => c.GradeId == buyGrade.Id);
            if (userRightConfig != null && !userRightConfig.IsOpen)
            {
                return(Tuple.Create(ServiceResult.Failure("该等级暂未开放"), orderBuyOutput));
            }

            orderBuyInput.BuyGrade     = buyGrade;
            orderBuyInput.CurrentGrade = userGrades.FirstOrDefault(r => r.Id == user.GradeId);
            if (orderBuyInput.CurrentGrade == null)
            {
                return(Tuple.Create(ServiceResult.Failure("您的等级不存在"), orderBuyOutput));
            }

            // 准营销中心,和营销中心的开通只能是管理员 动态配置,不用写死
            //if (orderBuyInput.GradeId == Guid.Parse("f2b8d961-3fec-462d-91e8-d381488ea972") || orderBuyInput.GradeId == Guid.Parse("cc873faa-749b-449b-b85a-c7d26f626feb"))
            //{
            if (orderBuyInput.OpenType == UserRightOpenType.AdminOpenHightGrade)
            {
                if (!Resolve <IUserService>().IsAdmin(user.Id))
                {
                    return(Tuple.Create(ServiceResult.Failure("您不是管理员无权开通"), orderBuyOutput));
                }

                if (orderBuyInput.Parent.IsNullOrEmpty())
                {
                    return(Tuple.Create(ServiceResult.Failure("推荐人不能为空"), orderBuyOutput));
                }

                orderBuyInput.ParnetUser = Resolve <IUserService>().GetSingleByUserNameOrMobile(orderBuyInput.Parent);
                if (orderBuyInput.ParnetUser == null)
                {
                    return(Tuple.Create(ServiceResult.Failure("推荐人不能为空,不能开通营销中心"), orderBuyOutput));
                }
            }
            //}

            if (orderBuyInput.OpenType == UserRightOpenType.OpenToOtherByPay ||
                orderBuyInput.OpenType == UserRightOpenType.AdminOpenHightGrade ||
                orderBuyInput.OpenType == UserRightOpenType.OpenToOtherByRight)
            {
                if (orderBuyInput.Mobile.IsNullOrEmpty())
                {
                    return(Tuple.Create(ServiceResult.Failure("请输入手机号码"), orderBuyOutput));
                }

                if (orderBuyInput.Name.IsNullOrEmpty())
                {
                    return(Tuple.Create(ServiceResult.Failure("请输入公司名称或姓名"), orderBuyOutput));
                }

                // 查找是否为注册用户
                var find = Resolve <IUserService>().GetSingleByUserNameOrMobile(orderBuyInput.Mobile);
                if (find != null)
                {
                    var findUserGrade = userGrades.FirstOrDefault(r => r.Id == find.GradeId);
                    if (findUserGrade == null)
                    {
                        return(Tuple.Create(ServiceResult.Failure("激活的用户等级不存在"), orderBuyOutput));
                    }

                    if (findUserGrade.Price > 0.01m)
                    {
                        return(Tuple.Create(ServiceResult.Failure("该用户已激活"), orderBuyOutput));
                    }

                    //var records = Resolve<IRecordService>().GetListNoTracking(s => s.Type == typeof(UserDetail).FullName);
                    //var findRecord = records.FirstOrDefault(s => s.UserId == user.Id);
                    //var findUser = findRecord?.Value?.ToObject<RegInput>();
                    //if (findUser != null)
                    //    orderBuyInput.RegInfo = findUser;
                    //else
                    //{
                    orderBuyInput.RegInfo = new RegInput {
                        Mobile      = find.Mobile,
                        UserName    = find.Mobile,
                        Name        = find.Name,
                        Password    = "******",
                        PayPassword = "******",
                        ParentId    = find.ParentId
                    };
                    // }
                }
                else
                {
                    if (!RegexHelper.CheckMobile(orderBuyInput.Mobile))
                    {
                        return(Tuple.Create(ServiceResult.Failure("手机号码格式不正确"), orderBuyOutput));
                    }
                    // 注册新用户
                    var password    = RandomHelper.PassWord();
                    var payPassword = RandomHelper.PayPassWord();
                    var regInput    = new RegInput {
                        Mobile      = orderBuyInput.Mobile,
                        UserName    = orderBuyInput.Mobile,
                        Name        = orderBuyInput.Name,
                        Password    = password,
                        PayPassword = payPassword,
                        ParentId    = orderBuyInput.UserId
                    };
                    orderBuyInput.RegInfo = regInput;
                    // 如果是管理员,则推荐人Id改为输入的推荐人Id
                    if (orderBuyInput.OpenType == UserRightOpenType.AdminOpenHightGrade)
                    {
                        regInput.ParentId = orderBuyInput.ParnetUser.Id;
                    }
                    //
                    var userRegResult = Resolve <IUserBaseService>().Reg(regInput);
                    if (!userRegResult.Item1.Succeeded)
                    {
                        return(Tuple.Create(ServiceResult.Failure("新会员注册失败" + userRegResult),
                                            orderBuyOutput));
                    }
                    // await Resolve<IRecordService>().AddAsync(new Record() { Type = typeof(UserDetail).FullName, Value = regInput.ToJsons() });

                    find = Resolve <IUserService>().GetSingle(orderBuyInput.Mobile);

                    var message =
                        $"恭喜您,您的账号已注册成功。您的登录账号为:{regInput.Mobile},初始登录密码:{password} 初始支付密码:{payPassword} 请妥善保管.";
                    Resolve <ISmsService>().SendRaw(find.Mobile, message);

                    message =
                        $"您推荐的商家已注册成功.登录账号:{regInput.Mobile},初始登录密码:{password} 初始支付密码:{payPassword} 请尽快让商家悉知,第一时间指导商家使用系统.";

                    var userDetail = Resolve <IUserDetailService>().GetSingle(u => u.UserId == user.Id);
                    userDetail.RegionId = orderBuyInput.RegionId.ToInt64();
                    Resolve <IUserDetailService>().Update(userDetail);
                    Resolve <ISmsService>().SendRaw(user.Mobile, message);
                }

                orderBuyInput.BuyUser = find;
            }

            #endregion 安全验证

            orderBuyInput.UserRightList = GetList(r => r.UserId == user.Id);

            // 如果是帮别人开通
            if (orderBuyInput.OpenType == UserRightOpenType.OpenToOtherByRight)
            {
                return(await OpenToOther(orderBuyInput));
            }

            // 其他三种情况都需要支付 +或者管理员帮他们开通
            return(await OpenSelfOrUpgrade(orderBuyInput));
        }
Example #3
0
        public async Task <Tuple <ServiceResult, OrderBuyOutput> > OpenSelfOrUpgrade(UserRightsOrderInput orderInput)
        {
            var result         = ServiceResult.Success;
            var orderBuyOutput = new OrderBuyOutput();
            //if (orderInput.GradeId == Guid.Parse("72be65e6-3000-414d-972e-1a3d4a366001"))
            //{
            //    result = ServiceResult.Failure("标准商家不能自己支付开通");
            //    new Tuple<ServiceResult, OrderBuyOutput>(result, orderBuyOutput);
            //}

            var payPrice = GetPayPrice(orderInput);

            if (!payPrice.Item1.Succeeded)
            {
                return(Tuple.Create(payPrice.Item1, orderBuyOutput));
            }

            var context = Repository <IUserRightsRepository>().RepositoryContext;

            try {
                context.BeginTransaction();

                var order = new Order {
                    UserId        = orderInput.BuyUser.Id,
                    StoreId       = string.Empty,
                    OrderStatus   = OrderStatus.WaitingBuyerPay,
                    OrderType     = OrderType.VirtualOrder,
                    TotalAmount   = payPrice.Item2,
                    TotalCount    = 1,
                    PayId         = 0,
                    PaymentAmount = payPrice.Item2
                };
                // 订单扩展数据
                var userRightOrder = AutoMapping.SetValue <UserRightsOrderInput>(orderInput);

                order.OrderExtension = new OrderExtension {
                    // 价格信息
                    OrderAmount = new OrderAmount {
                        TotalProductAmount = payPrice.Item2, // 商品总价
                        ExpressAmount      = 0m,             // 邮费
                        FeeAmount          = 0m              // 服务费
                    },
                    AttachContent = userRightOrder.ToJsons(),
                    User          = orderInput.BuyUser, // 下单用户
                    Store         = null
                };

                order.AccountPay = order.AccountPayPair.ToJsons();
                order.Extension  = order.OrderExtension.ToJsons();

                // 如果发货人不为空

                Resolve <IOrderService>().Add(order);
                var orderList = new List <Order>
                {
                    order
                };
                var singlePayInput = new SinglePayInput {
                    Orders          = orderList,
                    User            = orderInput.User,
                    OrderUser       = orderInput.BuyUser,
                    ExcecuteSqlList = new BaseServiceMethod {
                        Method      = "ExcecuteSqlList",
                        ServiceName = typeof(IUserRightsService).Name,
                        Parameter   = order.Id
                    },
                    AfterSuccess = new BaseServiceMethod {
                        Method      = "AfterPaySuccess",
                        ServiceName = typeof(IUserRightsService).Name,
                        Parameter   = order.Id
                    },
                    TriggerType = TriggerType.Other,
                    BuyerCount  = 1,
                    RedirectUrl = "/pages/index?path=successful_opening"
                };
                var payResult = Resolve <IOrderAdminService>().AddSinglePay(singlePayInput);
                if (!payResult.Item1.Succeeded)
                {
                    // 支付记录添加失败,回滚
                    context.RollbackTransaction();
                    return(Tuple.Create(payResult.Item1, new OrderBuyOutput()));
                }

                //更新人民币支付记录Id
                var orderIds = orderList.Select(e => e.Id).ToList();
                Resolve <IOrderService>().Update(r => { r.PayId = payResult.Item2.Id; }, e => orderIds.Contains(e.Id));

                // 输出赋值
                orderBuyOutput.PayAmount = payResult.Item2.Amount;
                orderBuyOutput.PayId     = payResult.Item2.Id;
                orderBuyOutput.OrderIds  = orderList.Select(r => r.Id).ToList();

                //开通成功修改UserDetail表地址
                var buyUserDetail = Resolve <IUserDetailService>().GetSingle(u => u.UserId == orderInput.BuyUser.Id);
                if (buyUserDetail.RegionId <= 0)
                {
                    buyUserDetail.RegionId = orderInput.RegionId.ToInt64();
                    Resolve <IUserDetailService>().Update(buyUserDetail);
                }

                context.SaveChanges();
                context.CommitTransaction();
                //var buyUser = Resolve<IUserService>().GetSingle(u => u.Mobile == orderInput.BuyUser.Mobile);

                orderBuyOutput.RegUser  = orderInput.RegInfo;
                orderBuyOutput.BuyGrade =
                    orderInput
                    .BuyGrade;     // Resolve<IAutoConfigService>().GetList<UserGradeConfig>().FirstOrDefault(s => s.Id == orderInput.BuyUser.GradeId);
            } catch (Exception ex) {
                context.RollbackTransaction();
                result = ServiceResult.Failure(ex.Message);
            } finally {
                context.DisposeTransaction();
            }

            // 删除缓存
            Resolve <IUserService>().DeleteUserCache(orderInput.User.Id, orderInput.User.UserName);
            Resolve <IUserService>().DeleteUserCache(orderInput.BuyUser.Id, orderInput.BuyUser.UserName);
            return(new Tuple <ServiceResult, OrderBuyOutput>(result, orderBuyOutput));
        }
Example #4
0
        /// <summary>
        ///     帮别人开通
        /// </summary>
        /// <param name="orderBuyInput"></param>
        /// <returns></returns>
        public async Task <Tuple <ServiceResult, OrderBuyOutput> > OpenToOther(UserRightsOrderInput orderBuyInput)
        {
            var result         = ServiceResult.Success;
            var orderBuyOutput = new OrderBuyOutput();

            // 检查用户的名额
            var userGrades = Resolve <IAutoConfigService>().GetList <UserGradeConfig>();
            var userRight  = GetSingle(r => r.UserId == orderBuyInput.User.Id && r.GradeId == orderBuyInput.GradeId);

            if (userRight == null)
            {
                return(Tuple.Create(ServiceResult.Failure($"您无{orderBuyInput.BuyGrade?.Name}名额端口"),
                                    orderBuyOutput));
            }

            if (userRight.TotalCount - userRight.TotalUseCount < 1)
            {
                return(Tuple.Create(ServiceResult.Failure($"您{orderBuyInput.BuyGrade?.Name}名额端口,已用完"),
                                    orderBuyOutput));
            }

            if (orderBuyInput.BuyUser == null)
            {
                return(Tuple.Create(ServiceResult.Failure("新会员未注册成功"), orderBuyOutput));
            }

            var context = Repository <IUserRightsRepository>().RepositoryContext;

            try {
                context.BeginTransaction();
                var kpi = new Kpi {
                    ModuleId = orderBuyInput.GradeId,
                    UserId   = orderBuyInput.UserId,
                    Type     = TimeType.NoLimit,
                    Value    = 1
                };
                var lastKpiSingle = Resolve <IKpiService>()
                                    .GetSingle(r => r.ModuleId == orderBuyInput.GradeId && r.Type == TimeType.NoLimit);
                if (lastKpiSingle != null)
                {
                    kpi.TotalValue = lastKpiSingle.TotalValue + kpi.Value;
                }

                // 新增Kpi记录,使用Kpi 记录表保存记录数据
                Resolve <IKpiService>().Add(kpi);

                // 使用数+1
                userRight.TotalUseCount += 1;
                Update(userRight);

                // 修改等级
                var updateUser = Resolve <IUserService>().GetSingle(r => r.Id == orderBuyInput.BuyUser.Id);
                updateUser.GradeId = orderBuyInput.GradeId;
                Resolve <IUserService>().Update(updateUser);

                // 增加相关权益
                // 添加用户权益
                var userRightConfigList = Resolve <IAutoConfigService>().GetList <UserRightsConfig>();
                var userRightConfig     = userRightConfigList.FirstOrDefault(r => r.GradeId == orderBuyInput.GradeId);
                if (userRightConfig != null)
                {
                    var addList = new List <UserRights>();
                    foreach (var rightItem in userRightConfig.UserRightItems)
                    {
                        var addItem = new UserRights {
                            GradeId    = rightItem.GradeId,
                            TotalCount = rightItem.Count,
                            UserId     = orderBuyInput.BuyUser.Id
                        };
                        addList.Add(addItem);
                    }

                    if (addList.Count > 0)
                    {
                        AddMany(addList);
                    }
                }

                //开通成功修改UserDetail表地址
                var buyUserDetail = Resolve <IUserDetailService>().GetSingle(u => u.UserId == orderBuyInput.BuyUser.Id);
                if (buyUserDetail.RegionId <= 0)
                {
                    buyUserDetail.RegionId = orderBuyInput.RegionId.ToInt64();
                    Resolve <IUserDetailService>().Update(buyUserDetail);
                }

                context.SaveChanges();
                context.CommitTransaction();
                //orderBuyOutput.RegUser = orderBuyInput.RegInfo;
                //orderBuyOutput.BuyGrade = orderBuyInput.BuyGrade;
                //var buyUser = Resolve<IUserService>().GetSingle(u => u.Mobile == orderBuyInput.BuyUser.Mobile);

                orderBuyOutput.RegUser  = orderBuyInput.RegInfo;
                orderBuyOutput.BuyGrade =
                    orderBuyInput
                    .BuyGrade;     // Resolve<IAutoConfigService>().GetList<UserGradeConfig>().FirstOrDefault(s => s.Id == orderBuyInput.BuyUser.GradeId);
            } catch (Exception ex) {
                context.RollbackTransaction();
                result = ServiceResult.Failure(ex.Message);
            } finally {
                context.DisposeTransaction();
            }

            SendMessage(orderBuyInput.BuyUser, orderBuyInput.GradeId);
            return(Tuple.Create(result, orderBuyOutput));
        }
Example #5
0
        /// <summary>
        ///     获取需要支付的价格
        /// </summary>
        public Tuple <ServiceResult, decimal> GetPayPrice(UserRightsOrderInput orderInput)
        {
            var result = ServiceResult.Success;

            if (orderInput.OpenType == UserRightOpenType.OpenToOtherByRight)
            {
                return(Tuple.Create(ServiceResult.Failure("帮他购买时无价格计算"), 0m));
            }

            if (orderInput.OpenType == UserRightOpenType.OpenToOtherByPay)
            {
                if (orderInput.User.Id == orderInput.BuyUser.Id)
                {
                    return(Tuple.Create(ServiceResult.Failure("不能帮自己购买"), 0m));
                }

                var price = orderInput.BuyGrade.Price;
                return(Tuple.Create(result, price));
            }
            else
            {
                if (orderInput.BuyGrade.Price <= orderInput.CurrentGrade.Price &&
                    orderInput.OpenType != UserRightOpenType.AdminOpenHightGrade)
                {
                    return(Tuple.Create(ServiceResult.Failure("购买的等级不能低于当前等级"), 0m));
                }

                var findRight = orderInput.UserRightList.FirstOrDefault(r => r.GradeId == orderInput.BuyGrade.Id);
                if (findRight != null && orderInput.OpenType != UserRightOpenType.AdminOpenHightGrade)
                {
                    return(Tuple.Create(ServiceResult.Failure("用户当前等级权益已存在,不能重复购买"), 0m));
                }

                var userRightsConfigs = Resolve <IAutoConfigService>().GetList <UserRightsConfig>();
                var userGrades        = Resolve <IAutoConfigService>().GetList <UserGradeConfig>();
                // 如果包含,则为升级
                if (userRightsConfigs.Select(r => r.GradeId).Contains(orderInput.User.GradeId))
                {
                    if (orderInput.OpenType != UserRightOpenType.Upgrade &&
                        orderInput.OpenType != UserRightOpenType.AdminOpenHightGrade)
                    {
                        return(Tuple.Create(ServiceResult.Failure("开通方式有错,应该为自身升级"), 0m));
                    }
                }
                else
                {
                    if (orderInput.OpenType != UserRightOpenType.OpenSelf)
                    {
                        return(Tuple.Create(ServiceResult.Failure("开通方式有错,应该为自身购买"), 0m));
                    }
                }

                // 计算价格
                var price = orderInput.BuyGrade.Price;
                if (orderInput.OpenType == UserRightOpenType.Upgrade)
                {
                    price = orderInput.BuyGrade.Price - orderInput.CurrentGrade.Price;
                }

                if (price <= 0)
                {
                    return(Tuple.Create(ServiceResult.Failure("购买等级价格设置为0"), 0m));
                }

                if (price != orderInput.Price)
                {
                    return(Tuple.Create(ServiceResult.Failure("前后台计算价格不一样"), 0m));
                }

                return(Tuple.Create(result, price));
            }
        }