bourse stock
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.

365 lines
16 KiB

<?php
namespace app\admin\service;
use app\admin\validate\WithdrawValidate;
use app\home\service\ClickPayService;
use app\home\service\HTPayService;
use app\home\service\IndPayService;
use app\home\service\MoPayService;
use app\home\service\NicePayService;
use app\home\service\PayService;
use app\home\service\QeaePayService;
use app\home\service\TrcPayService;
use app\home\service\XdPayService;
use app\model\AdminModel;
use app\model\PaymentListModel;
use app\model\UserBankModel;
use app\model\UserModel;
use app\model\UserWithdrawalModel;
use think\facade\Cache;
use function AlibabaCloud\Client\backgroundRed;
class WithdrawService extends AdminBaseService
{
public function index($param, $adminId)
{
try {
// 参数校验
validate(WithdrawValidate::class)->scene('index')->check($param);
Cache::store('redis')->set('Withdraw_Read_Time'.$adminId,time());
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extend' => UserWithdrawalModel::$statusList]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$whereU = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($whereU)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extend' => UserWithdrawalModel::$statusList]);
}
// 订单号
if (!empty($param['order_id'])) {
$where['order_no'] = $param['order_id'];
}
if (isset($param['status'])) {
$where['status'] = $param['status'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['update_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = UserWithdrawalModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserWithdrawalModel::where($where)->where($whereU)->count();
// 统计 提现成功
$sum = UserWithdrawalModel::where($where)->where($whereU)->where('status', 4)->sum('apply_num');
$rows = [];
if (!$list->isEmpty()) {
// 获取用户号
$userIdArr = [];
foreach ($list as $idItem) {
$userIdArr[] = $idItem['user_id'];
}
$userNoArr = UserModel::where('user_id', 'in', $userIdArr)->column('user_no', 'user_id');
$ifscArr = UserBankModel::where('user_id', 'in', $userIdArr)->column('ifsc', 'user_id');
$rows = $list->toArray();
foreach ($rows as $key => $item) {
$rows[$key]['user_no'] = $userNoArr[$item['user_id']] ?? '-'; // 用户号.
$rows[$key]['ifsc'] = $ifscArr[$item['user_id']] ?? '-'; // ifsc
$rows[$key]['order_id'] = $item['order_no'];
$rows[$key]['status_text'] = UserWithdrawalModel::$statusList[$item['status']];
//$rows[$key]['pay_info'] = json_decode($item['pay_info'],true);
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'sum' => $sum . 'USD', 'extend' => UserWithdrawalModel::$statusList]);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}
}
public function info($param, $adminId)
{
try {
// 参数校验
validate(WithdrawValidate::class)->scene('info')->check($param);
$where = [
'id' => $param['id']
];
$userId = 0;
$where = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($where)) {
return $this->toData('0', 'SUCCESS', []);
}
$order_info = [];
$info = UserWithdrawalModel::where($where)->find();
$ifsc = UserBankModel::where('user_id', $info->user_id)->value('ifsc');
if (!$info->isEmpty()) {
$order_info = $info->toArray();
$order_info['pay_info'] = json_decode($order_info['pay_info'], true);
$channel = PaymentListModel::getPaymentInfo([
'id' => intval($order_info['channel_id'])
]);
$order_info['channel_name'] = isset($channel['channel']) ? $channel['channel'] : '';
$order_info['ifsc'] = $ifsc ?? '-';
}
return $this->toData('0', 'SUCCESS', $order_info);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}
}
public function change_status($param, $adminId)
{
try {
// 参数校验
validate(WithdrawValidate::class)->scene('status')->check($param);
$isAgent = AdminModel::checkUserIsAgent($adminId);
if ($isAgent) {
return $this->toData('10040', '代理无权限操作');
}
$where = [
'id' => $param['id']
];
$userId = 0;
$where = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($where)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$order_info = [];
$info = UserWithdrawalModel::where($where)->find();
if (empty($info)) {
return $this->toData('1004', '订单不存在');
}
$order_info = $info->toArray();
$change_flag = false;
if ($order_info['status'] == 0 && $param['status'] < 3) {
$change_flag = true;
}
if ($order_info['status'] = 1 && ($param['status'] == 3 || $param['status'] == 2)) {
$change_flag = true;
}
if ($order_info['status'] = 3 && $param['status'] == 4) {
$change_flag = true;
}
$pay_flag = false;
$msg = "";
$content = "";
if ($change_flag) {
$update_data['status'] = $param['status'];
$update_data['update_time'] = date('Y-m-d H:i:s');
//拒绝
if ($param['status'] == 2) {
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$updateStatus = $this->updateUserAssetNew($order_info['user_id'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}else{
$updateStatus = $this->updateUserAsset($order_info['user_id'], $order_info['account_type'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}
}
//代付
if ($param['status'] == 3) {
//解冻资金 ,扣除提现
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$updateOne = $this->updateUserAssetNew($order_info['user_id'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}else{
$updateOne = $this->updateUserAsset($order_info['user_id'], $order_info['account_type'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}
if (!empty($updateOne) && $updateOne['status'] == 200) {
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$updateStatus = $this->updateUserAssetNew($order_info['user_id'], 2, -$order_info['market_amount'], 0, $order_info['order_no']);
}else{
$updateStatus = $this->updateUserAsset($order_info['user_id'], $order_info['account_type'], 2, -$order_info['market_amount'], 0, $order_info['order_no']);
}
} else {
//提现事务回滚...
trace("提现失败1 - change_status - order_no=" . $order_info['order_no'] . "---user_id= " . $order_info['user_id'] . "---account_type= " . $order_info['account_type'] . "---market_amount= " . $order_info['market_amount']);
return $this->toData($updateOne['status'] ?? '3251', $updateOne['msg'] ?? $msg, [$content]);
}
if (!empty($updateStatus) && $updateStatus['status'] == 200) {
$channel = PaymentListModel::getPaymentInfo([
'id' => $param['channel']
]);
if ($channel) {
$result = $this->payToUser($order_info, $channel);
if ($result['code'] == 200) {
$update_data['order_idx'] = $result['order_idx'];
$update_data['channel_id'] = $param['channel'];
} else {
$update_data['status'] = 1; //代付失败
$pay_flag = true;
$content = $result['content'];
$msg = $result['msg'];
}
}
//手动支付完成
if ($param['channel'] == 0) {
$update_data['status'] = 4;
$update_data['channel_id'] = $param['channel'];
}
}
}
$update_data['beizhu'] = $param['beizhu'] ?? "";
if ($param['status'] == 1 || (!empty($updateStatus) && $updateStatus['status'] == 200)) {
UserWithdrawalModel::where($where)->update($update_data);
} else {
trace("提现失败2 - change_status - order_no=" . $order_info['order_no'] . "---user_id= " . $order_info['user_id'] . "---account_type= " . $order_info['account_type'] . "---market_amount= " . $order_info['market_amount']);
return $this->toData($updateStatus['status'] ?? '3251', $updateStatus['msg'] ?? $msg, [$content]);
}
if ($pay_flag) {
return $this->toData('3250', $msg, [$content]);
} else {
return $this->toData('0', 'SUCCESS');
}
} else {
return $this->toData('10040', '操作流程不合法');
}
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}
}
private function payToUser($order, $channel)
{
//货币单位换算
$order['total_amount'] = $order['apply_num'] * $channel['exchange_rate'];
$address_info = json_decode($order['pay_info'], true);
switch ($channel['type']) {
//印尼支付
case 2:
return (new IndPayService())->singleIndOrder($order);
break;
//TRC
case 3:
return (new MoPayService())->apply_pay($order['order_no'], $order['total_amount'], $address_info['bank_code'], $address_info['bank_card'], $address_info['true_name'], $address_info['bank_phone'], $address_info['ifsc']);
break;
//合泰
case 4:
return (new HTPayService())->arPay($order['order_no'], $order['total_amount'], $address_info['bank_code'], $address_info['bank_card'], $address_info['true_name']);
break;
//合泰
case 5:
return (new XdPayService())->apply_pay($order['order_no'], $order['total_amount'], $address_info['ifsc'], $address_info['bank_card'], $address_info['true_name']);
break;
//QEAE
case 6:
return (new QeaePayService())->apply_pay($order['order_no'], $order['total_amount'], $address_info['bank_card'], $address_info['true_name'], $address_info['ifsc'], $address_info['bank_code']);
break;
//合泰
case 7:
return (new NicePayService())->apply_pay($order['order_no'], $order['total_amount'], $address_info['bank_card'], $address_info['true_name'], $address_info['ifsc']);
break;
//ClickPay
case 8:
return (new ClickPayService())->apply_pay($order['order_no'], $order['total_amount'], $address_info['bank_card'], $address_info['true_name'], $address_info['ifsc'], $address_info['bank_code']);
break;
default:
break;
}
}
public function get_balance($param, $adminId)
{
$channel = PaymentListModel::getPaymentInfo([
'id' => intval($param['id'])
]);
if ($channel) {
switch ($channel['type']) {
case 1:
//$result=(new IndPayService())->getIndBalance();
$result = [
'amount' => 0
];
break;
case 2:
$result = (new TrcPayService())->getTrcBalance();
break;
case 4:
$result = (new HTPayService())->getHtBalance();
break;
case 5:
$result = (new XdPayService())->getBalance();
break;
case 6:
$result = (new QeaePayService())->getBalance();
break;
case 8:
$result = (new ClickPayService())->getBalance();
break;
default:
$result = [
'amount' => 0
];
break;
}
return $this->toData('0', '请求成功', $result);
} else {
return $this->toData('1', '参数错误,通道不存在', []);
}
}
public function channel_list($param, $adminId)
{
try {
// 参数校验
validate(WithdrawValidate::class)->scene('info')->check($param);
$where = [
'id' => $param['id']
];
$userId = 0;
$where = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($where)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$order_info = UserWithdrawalModel::getUserDrawalInfo($where);
if ($order_info) {
$channel_list = PaymentListModel::getPaymentList([
'is_withdrawal' => 1,
'status' => 1,
'channel_type' => $order_info['apply_type']
]);
} else {
$channel_list = [];
}
return $this->toData('0', '请求成功', $channel_list);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}
}
}