You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yanzong/app/api/model/dealer/Withdraw.php

166 lines
5.9 KiB

<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\api\model\dealer;
use app\api\model\dealer\User as DealerUserModel;
use app\api\service\User as UserService;
use app\common\model\dealer\Withdraw as WithdrawModel;
use app\common\enum\dealer\withdraw\PayType as PayTypeEnum;
use app\common\enum\dealer\withdraw\ApplyStatus as ApplyStatusEnum;
use cores\exception\BaseException;
use yiovo\captcha\facade\CaptchaApi;
use app\api\model\user\BalanceLog;
/**
* 分销商提现明细模型
* Class Withdraw
* @package app\api\model\dealer
*/
class Withdraw extends WithdrawModel
{
/**
* 隐藏字段
* @var array
*/
protected $hidden = [
'store_id',
'create_time',
'update_time',
];
/**
* 获取分销商提现明细
* @param int $applyStatus 申请状态
* @return \think\Paginator
* @throws BaseException
* @throws \think\db\exception\DbException
*/
public function getList(int $applyStatus = -1): \think\Paginator
{
// 当前用户ID
$userId = UserService::getCurrentLoginUserId();
// 构建查询对象
$query = $this->getNewQuery();
$applyStatus > -1 && $query->where('apply_status', '=', $applyStatus);
// 查询列表数据
return $query->where('user_id', '=', $userId)
->order(['create_time' => 'desc'])
->paginate(15);
}
/**
* 提交申请
* @param DealerUserModel $dealer
* @param array $data
* @return bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function submit(DealerUserModel $dealer, array $data): bool
{
// 数据验证
if (!$this->validation($dealer, $data)) {
return false;
}
//手续费
if (empty($data['is_invoice'])) {
$commission = \app\api\model\Setting::getFinanceCommission();
if (empty($commission)) {
$data['commission_price'] = bcmath($data['money'], $commission / 100, 2);
}
}
// 事务处理
$this->transaction(function () use ($dealer, $data) {
// 新增申请记录
$this->save(array_merge($data, [
'user_id' => (int)$dealer['user_id'],
'apply_status' => ApplyStatusEnum::WAIT,
'platform' => getPlatform(),
'store_id' => self::$storeId
]));
// 新增操作记录
BalanceLog::insert([
'user_id' => $dealer['user_id'],
'scene' => 50,
'money' => -$data['money'],
'describe' => '分销佣金提现',
'store_id' => self::$storeId,
'create_time' => time(),
]);
// 冻结用户资金
DealerUserModel::freezeMoney((int)$dealer['user_id'], (string)$data['money']);
});
return true;
}
/**
* 数据验证
* @param DealerUserModel $dealer
* @param array $data
* @return bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
private function validation(DealerUserModel $dealer, array $data): bool
{
// 结算设置
$settlement = Setting::getItem('settlement');
// 最低提现佣金
if (!is_numeric($data['money']) || $data['money'] <= 0) {
$this->error = '提现金额不正确';
return false;
}
if ($dealer['money'] <= 0) {
$this->error = '当前用户没有可提现佣金';
return false;
}
if ($data['money'] > $dealer['money']) {
$this->error = '提现金额不能大于可提现佣金';
return false;
}
if ($data['money'] < $settlement['min_money']) {
$this->error = '最低提现金额为' . $settlement['min_money'];
return false;
}
if (!in_array($data['pay_type'], $settlement['pay_type'])) {
$this->error = '提现方式不正确';
return false;
}
if ($data['pay_type'] == PayTypeEnum::ALIPAY) {
if (empty($data['alipay_name']) || empty($data['alipay_account'])) {
$this->error = '请补全提现信息';
return false;
}
} elseif ($data['pay_type'] == PayTypeEnum::BANK_CARD) {
if (empty($data['bank_name']) || empty($data['bank_account']) || empty($data['bank_card']) || empty($data['bank_user']) || empty($data['bank_phone'])) {
$this->error = '请补全提现信息';
return false;
}
// 验证短信验证码是否匹配
try {
CaptchaApi::checkSms($data['smsCode'], $data['bank_phone']);
} catch (\Exception $e) {
$this->error = $e->getMessage() ?? '短信验证码不正确';
return false;
}
}
if (!empty($data['is_invoice']) && empty($data['invoice_img_id'])) {
$this->error = '请上传发票信息';
return false;
}
return true;
}
}