// +---------------------------------------------------------------------- namespace app\common\repositories\user; use app\common\dao\user\UserRechargeDao; use app\common\model\user\User; use app\common\model\user\UserRecharge; use app\common\repositories\BaseRepository; use crmeb\jobs\SendSmsJob; use crmeb\services\PayService; use think\facade\Db; use think\facade\Queue; /** * Class UserRechargeRepository * @package app\common\repositories\user * @author xaboy * @day 2020/6/2 * @mixin UserRechargeDao */ class UserRechargeRepository extends BaseRepository { const TYPE_WECHAT = 'weixin'; const TYPE_ROUTINE = 'routine'; /** * UserRechargeRepository constructor. * @param UserRechargeDao $dao */ public function __construct(UserRechargeDao $dao) { $this->dao = $dao; } public function create($uid, float $price, float $givePrice, string $type) { return $this->dao->create([ 'uid' => $uid, 'price' => $price, 'give_price' => $givePrice, 'recharge_type' => $type, 'paid' => 0, 'order_id' => $this->dao->createOrderId($uid) ]); } public function getList($where, $page, $limit) { $query = $this->dao->searchJoinQuery($where)->order('a.pay_time DESC,a.create_time DESC'); $count = $query->count(); $list = $query->page($page, $limit)->select(); return compact('count', 'list'); } public function priceByGive($price) { $quota = systemGroupData('user_recharge_quota'); $give = 0; foreach ($quota as $item) { $min = floatval($item['price']); $_give = floatval($item['give']); if ($price > $min) $give = $_give; } return $give; } /** * @param string $type * @param User $user * @param UserRecharge $recharge * @param string $return_url * @return mixed * @author xaboy * @day 2020/10/22 */ public function pay(string $type, User $user, UserRecharge $recharge, $return_url = '', $isApp = false) { if (in_array($type, ['weixin', 'alipay'], true) && $isApp) { $type .= 'App'; } event('user.recharge.before', compact('user', 'recharge', 'type', 'isApp')); $service = new PayService($type, $recharge->getPayParams($type === 'alipay' ? $return_url : '')); $config = $service->pay($user); return $config + ['recharge_id' => $recharge['recharge_id'], 'type' => $type]; } /** * //TODO 余额充值成功 * * @param $orderId * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author xaboy * @day 2020/6/19 */ public function paySuccess($orderId) { $recharge = $this->dao->getWhere(['order_id' => $orderId]); if ($recharge->paid == 1) return; $recharge->paid = 1; $recharge->pay_time = date('Y-m-d H:i:s'); Db::transaction(function () use ($recharge) { $price = bcadd($recharge->price, $recharge->give_price, 2); $mark = '成功充值余额' . floatval($recharge->price) . '元' . ($recharge->give_price > 0 ? ',赠送' . $recharge->give_price . '元' : ''); app()->make(UserBillRepository::class)->incBill($recharge->user->uid, 'now_money', 'recharge', [ 'link_id' => $recharge->recharge_id, 'status' => 1, 'title' => '余额充值', 'number' => $price, 'mark' => $mark, 'balance' => $recharge->user->now_money ]); $recharge->user->now_money = bcadd($recharge->user->now_money, $price, 2); $recharge->user->save(); $recharge->save(); }); Queue::push(SendSmsJob::class,['tempId' => 'USER_BALANCE_CHANGE', 'id' =>$orderId]); event('user.recharge',compact('recharge')); } }