where('uid', 'in', $uids); else $model = $model->where('uid', $uids); return $model->count(); } /** * 设置查询初始化条件 * @param string $alias 表别名 * @param null $model 模型实例化对象 * @return UserLevel */ public static function valiWhere($alias = '', $model = null) { $model = is_null($model) ? new self() : $model; if ($alias) { $model = $model->alias($alias); $alias .= '.'; } return $model->where("{$alias}status", 1)->where("{$alias}is_del", 0); } /** * 设置会员等级 * @param int $uid 用户uid * @param int $level_id 等级id * @return UserLevel|bool|Model * @throws DataNotFoundException * @throws ModelNotFoundException * @throws \think\exception\DbException */ public static function setUserLevel($uid, $level_id) { $vipinfo = SystemUserLevel::get($level_id); if (!$vipinfo) return false; $userinfo = User::find($uid); if (!$userinfo) return false; $add_valid_time = (int)$vipinfo->valid_date * 86400; $uservipinfo = self::valiWhere()->where('uid', $uid)->where('level_id', $level_id)->find(); //检查是否购买过 if ($uservipinfo) { $stay = 0; //剩余时间 if (time() < $uservipinfo->valid_time) $stay = $uservipinfo->valid_time - time(); //如果购买过当前等级的会员过期了.从当前时间开始计算 //过期时效: 剩余时间+当前会员等级时间+当前time $add_valid_time = $stay + $add_valid_time + time(); $data['is_forever'] = $vipinfo->is_forever; $data['valid_time'] = $add_valid_time; User::where('uid', $uid)->update(['level' => $level_id]); return self::where('uid', $uid)->where('level_id', $level_id)->update($data); } else { $data = [ 'is_forever' => $vipinfo->is_forever, 'status' => 1, 'is_del' => 0, 'grade' => $vipinfo->grade, 'uid' => $uid, 'add_time' => time(), 'level_id' => $level_id, 'discount' => $vipinfo->discount, ]; if ($data['is_forever']) $data['valid_time'] = 0; else $data['valid_time'] = $add_valid_time + time(); $data['mark'] = '尊敬的用户' . $userinfo['nickname'] . '在' . date('Y-m-d H:i:s', time()) . '成为了' . $vipinfo['name']; $res = self::create($data); if (!$res) return false; User::where('uid', $uid)->update(['level' => $level_id]); return $res; } } /** * 获取当前用户会员等级返回当前用户等级id * @param int $uid 用户uid * @param int $grade 会员id * @return bool|mixed * @throws DataNotFoundException * @throws ModelNotFoundException * @throws \think\exception\DbException */ public static function getUserLevel($uid, $grade = 0) { $model = self::valiWhere(); if ($grade) $model = $model->where('grade', '<', $grade); $level = $model->where('uid', $uid)->order('grade desc')->field('level_id,is_forever,valid_time,id,status,grade')->find(); if (!$level) return false; if ($level->is_forever) return $level->id; //会员已经过期 if (time() > $level->valid_time) { if ($level->status == 1) { $level->status = 0; $level->save(); } return self::getUserLevel($uid, $level->grade); } else //会员没有过期 return $level->id; } /** * 获取会员详细信息 * @param $id 会员记录id * @param string $keyName 字段名 * @return array|mixed|string|Model|null * @throws DataNotFoundException * @throws ModelNotFoundException * @throws \think\exception\DbException */ public static function getUserLevelInfo($id, $keyName = '') { $vipinfo = self::valiWhere('a')->where('a.id', $id)->field('l.id,a.add_time,l.discount,a.level_id,l.name,l.money,l.icon,l.is_pay,l.grade') ->join('system_user_level l', 'l.id=a.level_id')->find(); if ($keyName) if (isset($vipinfo[$keyName])) return $vipinfo[$keyName]; else return ''; return $vipinfo; } /** * 获取当前用户已成为的vip id * @param $uid 用户id * @return array */ public static function getUserLevelIds($uid) { return self::valiWhere()->group('level_id')->where('uid', $uid)->order('grade asc')->column('level_id', 'level_id'); } /** * 余额支付 * @param $order_id * @param $uid * @param string $formId * @return bool * @throws \think\Exception * @throws DataNotFoundException * @throws ModelNotFoundException * @throws \think\exception\DbException */ public static function yuePay($order_id, $uid, $formId = '') { $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->where('is_del', 0)->find(); if (!$orderInfo) return self::setErrorInfo('订单不存在!'); if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!'); // if($orderInfo['pay_type'] != 'yue') return self::setErrorInfo('该订单不能使用余额支付!'); $userInfo = User::getUserInfo($uid); if ($userInfo['now_money'] < $orderInfo['pay_price']) return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '余额不足' . floatval($orderInfo['pay_price'])]); self::beginTrans(); $res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_price'], 'uid'); $res2 = UserBill::expend('购买会员', $uid, 'now_money', 'pay_level', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_price']) . '元购买会员'); $res3 = self::paySuccess($order_id, 'yue', $formId);//余额支付成功 try { PaymentRepositories::yuePayLevel($userInfo, $orderInfo); } catch (\Exception $e) { self::rollbackTrans(); return self::setErrorInfo($e->getMessage()); } $res = $res1 && $res2 && $res3; self::checkTrans($res); return $res; } /** * 微信支付 为 0元时 * @param $order_id * @param $uid * @param string $formId * @return bool * @throws \think\Exception * @throws DataNotFoundException * @throws ModelNotFoundException * @throws \think\exception\DbException */ public static function jsPayPrice($order_id, $uid, $formId = '') { $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->where('is_del', 0)->find(); if (!$orderInfo) return self::setErrorInfo('订单不存在!'); if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!'); $userInfo = User::getUserInfo($uid); self::beginTrans(); $res1 = UserBill::expend('购买会员', $uid, 'now_money', 'pay_level', $orderInfo['pay_price'], $orderInfo['id'], $userInfo['now_money'], '微信支付' . floatval($orderInfo['pay_price']) . '元购买会员'); $res2 = self::paySuccess($order_id, 'weixin', $formId);//微信支付为0时 $res = $res1 && $res2; self::checkTrans($res); return $res; } /** * //TODO 支付成功后 * @param $orderId * @param string $paytype * @param string $formId * @return bool * @throws DataNotFoundException * @throws DbException * @throws ModelNotFoundException */ public static function paySuccess($orderId, $paytype = 'weixin', $formId = '') { $order = self::where('order_id', $orderId)->find(); $resPink = true; $res1 = self::where('order_id', $orderId)->update(['paid' => 1, 'pay_type' => $paytype, 'pay_time' => time(), 'is_del' => 0]);//订单改为支付 // if ($order->combination_id && $res1 && !$order->refund_status) $resPink = StorePink::createPink($order);//创建拼团 $oid = self::where('order_id', $orderId)->value('id'); // StoreOrderStatus::status($oid, 'pay_success', '用户付款成功'); $now_money = User::where('uid', $order['uid'])->value('now_money'); UserBill::expend('购买会员', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元购买会员'); //支付成功后 // event('OrderPaySuccess', [$order, $formId]); self::save_give_level($order['uid'], $order['level_id']); // 邀请返利 self::rebates($order['uid'], $order['level_id'],$order['id']); $res = $res1; // $res = $res1 && $resPink && UserSpread::setSpreadSure($order['uid']) && User::backOrderBrokerage($order); return false !== $res; } /* * 购买获得会员等级 * @paran int $uid * @return json * */ public static function save_give_level($uid = 0,$level_id = 0) { if (!$uid) return Json::fail('缺少参数'); //查询当前选择的会员等级 $systemLevel = \app\admin\model\system\SystemUserLevel::where(['is_show' => 1, 'is_del' => 0, 'id' => $level_id])->find(); if (!$systemLevel) return Json::fail('您选择赠送的会员等级不存在!'); //检查是否拥有此会员等级 $level = UserLevel::where(['uid' => $uid, 'level_id' => $level_id, 'is_del' => 0])->field('valid_time,is_forever')->find(); // if ($level) if (!$level['is_forever'] && time() < $level['valid_time']) return Json::fail('此用户已有该会员等级,无法再次赠送'); //设置会员过期时间 $add_valid_time = (int)$systemLevel->valid_date * 86400; UserModel::commitTrans(); try { //保存会员信息 $res = UserLevel::create([ 'is_forever' => $systemLevel->is_forever, 'status' => 1, 'is_del' => 0, 'grade' => $systemLevel->grade, 'uid' => $uid, 'add_time' => time(), 'level_id' => $level_id, 'discount' => $systemLevel->discount, 'valid_time' => $systemLevel->discount ? $add_valid_time + time() : 0, 'mark' => '尊敬的用户【' . UserModel::where('uid', $uid)->value('nickname') . '】在' . date('Y-m-d H:i:s', time()) . '购买会员等级成为' . $systemLevel['name'] . '会员', ]); //提取等级任务并记录完成情况 $levelIds = [$level_id]; $lowGradeLevelIds = SystemUserLevel::where('grade', '<', $systemLevel->grade)->where(['is_show' => 1, 'is_del' => 0])->column('id', 'id'); if (count($lowGradeLevelIds)) $levelIds = array_merge($levelIds, $lowGradeLevelIds); $taskIds = \app\admin\model\system\SystemUserTask::where('level_id', 'in', $levelIds)->column('id', 'id'); $inserValue = []; foreach ($taskIds as $id) { $inserValue[] = ['uid' => $uid, 'task_id' => $id, 'status' => 1, 'add_time' => time()]; } $res = $res && UserModel::where('uid', $uid)->update(['level' => $level_id]); if ($inserValue) $res && UserTaskFinish::insertAll($inserValue); $user = UserModel::where('uid', $uid)->find(); if ($systemLevel['integral']>0) {//赠送积分 $edit['integral'] = bcadd($user['integral'], $systemLevel['integral'], 2); $res2 = UserBillAdmin::income('购买会员增加积分', $user['uid'], 'integral', 'system_add', $systemLevel['integral'], 0, $edit['integral'], '购买会员增加了' . floatval($systemLevel['integral']) . '积分'); try { UserRepository::adminAddIntegral($user, $systemLevel['integral']); } catch (\Exception $e) { // BaseModel::rollbackTrans(); return Json::fail($e->getMessage()); } } if ($res) { UserModel::commitTrans(); return Json::successful('购买成功'); } else { UserModel::rollbackTrans(); return Json::successful('购买失败'); } } catch (\Exception $e) { UserModel::rollbackTrans(); return Json::fail('购买失败'); } } // 邀请返利 public static function rebates($uid, $level_id,$order_id){ // $spread_id = User::where('uid', $uid)->value('spread_id'); $userInfo = User::getUserInfo($uid); $level_info=SystemUserLevel::where('id', $level_id)->find(); if ($level_info['rebate']>0){ $brokerage = bcmul($level_info['rebate'], $level_info['money'], 2); $balance = bcadd($userInfo['now_money'], $brokerage, 2); $mark = $userInfo['nickname'] . '成功消费' . floatval($level_info['money']) . '元,购买会员,奖励推广佣金' . floatval($brokerage); $res1 = UserBill::income('获得推广佣金', $userInfo['spread_uid'], 'now_money', 'brokerage', $brokerage, $order_id, $balance, $mark); $res2 = self::bcInc($userInfo['spread_uid'], 'now_money', $brokerage, 'uid'); } return true; } /** * 生成订单唯一id * @param $uid 用户uid * @return string */ public static function getNewOrderId() { do { list($msec, $sec) = explode(' ', microtime()); $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', ''); $orderId = 'hy' . $msectime . mt_rand(10000, 99999); } while (self::be(['order_id' => $orderId]));// $orderId = 'wx' . $msectime . mt_rand(10000, 99999); return $orderId; } // 创建会员订单 public static function CreateOrder($uid, $level_id,$recharge_type) { self::beginTrans(); try { // `grade` int(10) unsigned zerofill NOT NULL COMMENT '会员等级', // `price` decimal(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '充值金额', // `give_price` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '购买赠送金额', // `recharge_type` varchar(32) NOT NULL COMMENT '充值类型', // `paid` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '是否支付0未支付1已支付', // `pay_time` timestamp NULL DEFAULT NULL COMMENT '充值支付时间', // `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '充值时间', // `refund_price` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '退款金额', $levelInfo = SystemUserLevel::get($level_id); if ($levelInfo['is_spread']==1){ //限定邀请 $userSpread = \app\admin\model\user\User::where('uid', $uid)->value('spread_id'); if ($userSpread<=0){ return self::setErrorInfo('只有受邀请用户才能购买该等级的会员', true); } } $orderInfo = [ 'uid' => $uid, 'order_id' => self::getNewOrderId(), 'level_id' =>$level_id, 'grade' => $levelInfo['grade'], 'give_price' => $levelInfo['give_price'], ]; $order = self::create($orderInfo); if (!$order) return self::setErrorInfo('订单生成失败!', true); self::commitTrans(); // StoreOrderStatus::status($order['id'], 'cache_key_create_order', '订单生成'); return $order; } catch (\PDOException $e) { self::rollbackTrans(); return self::setErrorInfo('生成订单时SQL执行错误错误原因:' . $e->getMessage()); } catch (\Exception $e) { self::rollbackTrans(); return self::setErrorInfo('生成订单时系统错误错误原因:' . $e->getMessage()); } } }