// +---------------------------------------------------------------------- namespace app\common\repositories\user; use app\common\repositories\BaseRepository; use app\common\dao\user\UserExtractDao as dao; use app\common\model\user\User as userModel; use app\common\model\system\config\SystemConfigValue; use app\common\repositories\wechat\WechatUserRepository; use crmeb\jobs\SendSmsJob; use crmeb\services\MiniProgramService; use crmeb\services\SwooleTaskService; use crmeb\services\WechatService; use think\exception\ValidateException; use think\facade\Db; use think\facade\Queue; use app\common\repositories\user\UserRepository; class UserExtractRepository extends BaseRepository { /** * @var dao */ protected $dao; /** * UserExtractRepository constructor. * @param dao $dao */ public function __construct(dao $dao) { $this->dao = $dao; } /** * TODO * @param $id * @return bool * @author Qinii * @day 2020-06-16 */ public function getWhereCount($id) { $where['extract_id'] = $id; $where['status'] = 0; return $this->dao->getWhereCount($where) > 0; } /** * TODO * @param array $where * @param $page * @param $limit * @return array * @author Qinii * @day 2020-06-16 */ public function getList(array $where, $page, $limit) { $query = $this->dao->search($where)->with(['user' => function ($query) { $query->field('uid,avatar,nickname'); }]); $count = $query->count(); $list = $query->page($page, $limit)->select(); return compact('count', 'list'); } public function getTotalExtractPrice() { return $this->dao->search(['status' => 1])->sum('extract_price'); } /** * @param $uid * @return mixed * @author xaboy * @day 2020/6/22 */ public function userTotalExtract($uid) { return $this->dao->search(['status' => 1, 'uid' => $uid])->sum('extract_price'); } /** * TODO * @param $user * @param $data * @author Qinii * @day 2020-06-16 */ public function create($user, $data) { event('user.extract.before', compact('user', 'data')); $userExtract = Db::transaction(function () use ($user, $data) { if ($user['hp_value'] < ($data['extract_price'])) throw new ValidateException('生命值不足,无法提现'); if ($data['extract_price'] < (systemConfig('user_extract_min'))) throw new ValidateException('提现金额不得小于最低额度'); if ($user['brokerage_price'] < $data['extract_price']) throw new ValidateException('可提增值积分不足'); if ($data['extract_type'] == 3) { $make = app()->make(WechatUserRepository::class); $openid = $make->idByOpenId((int)$user['wechat_user_id']); if (!$openid) { $openid = $make->idByRoutineId((int)$user['wechat_user_id']); if (!$openid) throw new ValidateException('openID获取失败,请确认是微信用户'); } } $brokerage_price = bcsub($user['brokerage_price'], $data['extract_price'], 2); $user->brokerage_price = $brokerage_price; $user->save(); $data['extract_sn'] = $this->createSn(); $data['uid'] = $user['uid']; $data['balance'] = $brokerage_price; //扣除生命值 $u = userModel::where('uid', $user->uid)->find(); $u->hp_value -= $data['extract_price']; $u->save(); return $this->dao->create($data); }); event('user.extract', compact('userExtract')); SwooleTaskService::admin('notice', [ 'type' => 'extract', 'title' => '您有一条新的提醒申请', 'id' => $userExtract->extract_id ]); } public function switchStatus($id, $data) { $extract = $this->dao->getWhere(['extract_id' => $id]); $user = app()->make(UserRepository::class)->get($extract['uid']); if (!$user) throw new ValidateException('用户不存在'); $brokerage_price = 0; if ($data['status'] == -1) $brokerage_price = bcadd($user['brokerage_price'], $extract['extract_price'], 2); $type = systemConfig('sys_extension_type'); $ret = []; $service = null; $func = null; if ($data['status'] == 1 && $extract['extract_type'] == 3 && in_array($type, [1, 2])) { $func = $type == 1 ? 'merchantPay' : 'companyPay'; $ret = [ 'sn' => $extract['extract_sn'], 'price' => $extract['extract_price'], 'mark' => '企业付款给用户:' . $user->nickname, 'batch_name' => '企业付款给用户:' . $user->nickname ]; $openid = app()->make(WechatUserRepository::class)->idByOpenId((int)$user['wechat_user_id']); if ($openid) { $ret['openid'] = $openid; $service = WechatService::create(); } else { $routineOpenid = app()->make(WechatUserRepository::class)->idByRoutineId((int)$user['wechat_user_id']); if (!$routineOpenid) throw new ValidateException('非微信用户不支持付款到零钱'); $ret['openid'] = $routineOpenid; $service = MiniProgramService::create(); } } $pre_price = $extract->pre_price; $extract_price = $extract['extract_price']; Db::transaction(function () use ($id, $data, $user, $brokerage_price, $ret, $service, $func, $pre_price, $extract_price) { event('user.extractStatus.before', compact('id', 'data')); if ($ret) $service->{$func}($ret); if ($brokerage_price) { $user->brokerage_price = $brokerage_price; $user->save(); } //拒绝 if ($data['status'] == -1) { //回滚生命值 $user->hp_value += $extract_price; $user->save(); } else { //同意的话 //奖金池 - 申请提现的70% + 申请提现的30% $a = SystemConfigValue::getDB()->where('config_key', 'all_award')->find(); $b = $pre_price * 0.7 - $pre_price * 0.3; $a->value = $a->value - $b; $a->save(); } $userExtract = $this->dao->update($id, $data); event('user.extractStatus', compact('id', 'userExtract')); }); Queue::push(SendSmsJob::class, ['tempId' => 'EXTRACT_NOTICE', 'id' => $id]); } public function createSn() { list($msec, $sec) = explode(' ', microtime()); $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', ''); $sn = 'ue' . $msectime . mt_rand(10000, max(intval($msec * 10000) + 10000, 98369)); return $sn; } public function getHistoryBank($uid) { return $this->dao->getSearch(['uid' => $uid, 'extract_type' => 0])->order('create_time DESC')->field('real_name,bank_code,bank_address,bank_name')->find(); } }