webman_duanju/app/admin/model/Cash.php

293 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\admin\model;
use app\common\library\DatabaseRoute;
use ba\Exception;
use think\facade\Db;
use think\Model;
class Cash extends Model
{
public static function statisticsIncomeMoney($time, $flag, $num)
{
$rest = DatabaseRoute::getAllDbData('pay_details', function ($query) use ($time, $flag, $num) {
$query->where(['state' => 1]);
if(!empty($flag)) {
if($flag == 1) {
$query->whereTime('create_time', '>=', strtotime(date('Y-m-d 00:00:00', strtotime($time))));
$query->whereTime('create_time', '<=', strtotime(date('Y-m-d 23:59:59', strtotime($time))));
}
if($flag == 2) {
$query->whereTime('create_time', '>=', strtotime(date('Y-m-01 00:00:00', strtotime($time))));
$query->whereTime('create_time', '<=', strtotime(date('Y-m-t 23:59:59', strtotime($time))));
}
if($flag == 3) {
$query->whereTime('create_time', '>=', strtotime(date('Y-01-01 00:00:00', strtotime($time))));
$query->whereTime('create_time', '<=', strtotime(date('Y-12-31 23:59:59', strtotime($time))));
}
}
return $query;
})->sum('money');
return $rest;
}
public static function selectPayDetails($get)
{
return DatabaseRoute::paginateAllDb('pay_details', function ($query)use($get){
$query->alias('s')
->field([
's.id',
's.classify',
's.order_id as orderId',
's.money',
's.user_id as userId',
's.pay_diamond as payDiamond',
's.diamond',
's.state',
's.create_time as createTime',
's.pay_time as payTime',
'u.user_name as userName',
'u.phone'
])
->leftJoin('tb_user u', 'u.user_id = s.user_id');
// 添加动态查询条件
if (!empty($get['startTime']) && !empty($get['endTime'])) {
$query->whereBetween('s.create_time', [$get['startTime'], $get['endTime']]);
}
if (!empty($get['userName'])) {
$query->where('u.user_name', 'like', "%{$get['userName']}%");
}
if (!empty($get['orderId'])) {
$query->where('s.order_id', 'like', "%{$get['orderId']}%");
}
if (isset($get['userId']) && $get['userId'] !== null) {
$query->where('u.user_id', $get['userId']);
}
if (isset($get['state']) && $get['state'] !== -1) {
$query->where('s.state', $get['state']);
} elseif (!isset($get['state']) || $get['state'] === -1) {
$query->where('s.state', '<>', -1);
}
return $query;
}, $get['page'], $get['limit'], 's.create_time');
}
public static function selectCashOutList($page, $limit, $cashOut, $isApp = false):array
{
$cashOutList = DatabaseRoute::paginateAllDb('cash_out', function ($query)use($page, $limit, $cashOut, $isApp){
// 根据请求端设置不同查询条件
if ($isApp) {
// APP端查询用户自身的提现记录用户类型1
$query->where('user_id', $cashOut['user_id'] ?? 0)
->where('user_type', 1);
} else {
// 管理后台:根据条件查询
if (isset($cashOut['user_id'])) {
$query->where('user_id', $cashOut['user_id']);
} else {
if (!isset($cashOut['sys_user_id'])) {
return $query;
} else {
// 查询系统用户的提现记录用户类型2
$query->where('user_id', $cashOut['sys_user_id'])
->where('user_type', 2);
}
}
}
return $query;
}, $page, $limit, 'create_at');
if (!$isApp) {
// 管理后台:补充用户信息和统计数据
$userIdList = [];
foreach ($cashOutList['list'] as $out) {
$userIdList[] = $out['user_id'];
}
// 查询用户提现总数和总金额
$cashoutSumMap = [];
$cashoutVerifySumMap = [];
$userinfoMap = [];
if (!empty($userIdList)) {
// 获取已完成提现统计
$cashoutSumList = \app\api\model\Cash::selectSumByUserIdList($userIdList, 1);
$cashoutSumMap = array_column($cashoutSumList, null, 'user_id');
// 获取审核中提现统计
$cashoutVerifyList = \app\api\model\Cash::selectSumByUserIdList($userIdList, 3);
$cashoutVerifySumMap = array_column($cashoutVerifyList, null, 'user_id');
// 获取用户信息
$userList = DatabaseRoute::getAllDbData('tb_user', function ($query) use($userIdList) {
return $query->whereIn('user_id', $userIdList)
->field('user_id, user_name');
})->select();
$userinfoMap = array_column($userList->toArray(), 'user_name', 'user_id');
}
// 补充数据到提现记录
foreach ($cashOutList['list'] as &$item) {
$info = $cashoutSumMap[$item['user_id']] ?? null;
$info2 = $cashoutVerifySumMap[$item['user_id']] ?? null;
$item['user_name'] = $userinfoMap[$item['user_id']] ?? '';
$item['count'] = $info ? $info['count'] : 0;
$item['total'] = $info ? $info['total'] : 0.00;
$item['verify_count'] = $info2 ? $info2['count'] : 0;
$item['verify_total'] = $info2 ? $info2['total'] : 0.00;
}
}
if ($isApp) {
// APP端对敏感信息进行脱敏处理
foreach ($cashOutList['list'] as &$item) {
if (!empty($item['bank_name'])) {
// 银行卡号脱敏
$item['zhifubao'] = bankCard($item['zhifubao']);
} elseif (filter_var($item['zhifubao'], FILTER_VALIDATE_EMAIL)) {
// 邮箱脱敏
$item['zhifubao'] = email($item['zhifubao']);
} elseif (preg_match('/^1[3-9]\d{9}$/', $item['zhifubao'])) {
// 手机号脱敏
$item['zhifubao'] = maskPhoneNumber($item['zhifubao']);
}
}
}
return $cashOutList;
}
/**
* 退回提现金额
* @param array $entity 提现实体
* @throws Exception
*/
public static function backCashAmount($entity, $db)
{
// 开启事务确保数据一致性
$db->startTrans();
try {
if ($entity['user_type'] == 2) {
// 代理用户退款逻辑
$detailsData = [
'user_id' => $entity['user_id'],
'operate_id' => $entity['user_id'],
'title' => "提现失败存入余额",
'type' => 4,
'money_type' => 1,
'money' => $entity['money'],
'content' => "提现失败存入余额{$entity['money']}",
'status' => 1,
'create_time' => date('Y-m-d H:i:s')
];
// 记录资金流水
$db->name('sys_user_money_details')->insert($detailsData);
// 更新代理账户余额(增加余额)
self::updateSysMoney(1, $entity['user_id'], $entity['money']);
} else {
// 普通用户退款逻辑
self::updateByUserId($entity, $db);
$detailsData = [
'user_id' => $entity['user_id'],
'sys_user_id' => $entity['sys_user_id'] ?? null,
'title' => "[提现退款]",
'type' => 4,
'money_type' => 1,
'money' => $entity['money'],
'content' => "提现失败,自动退款{$entity['money']}",
'status' => 1,
'cash_out_id' => $entity['id'],
'create_time' => date('Y-m-d H:i:s')
];
// 记录资金流水
$db->name('user_money_details')->insert($detailsData);
// 归还用户余额
self::updateAmount(1, $entity['user_id'], $entity['money'], $db);
}
// 提交事务
$db->commit();
} catch (Exception $e) {
// 回滚事务
$db->rollback();
throw $e;
}
}
public static function updateSysMoney($type, $userId, $money)
{
$query = Db::name('sys_user_money')
->where('user_id', $userId);
// 根据类型决定是增加还是减少余额
if ($type == 1) {
// 增加余额
return $query->inc('money', $money)->update();
} elseif ($type == 2) {
// 减少余额
return $query->dec('money', $money)->update();
}
return 0; // 无效类型返回 0
}
public static function updateAmount($type, $userId, $amount, $db)
{
User::selectUserMoneyByUserId($userId);
// 构建基础查询
$query = $db->name('user_money')
->where('user_id', $userId);
// 根据类型执行增减操作
if ($type == 1) {
// 增加金额amount = amount + #{amount}
return $query->inc('amount', $amount)->update();
} elseif ($type == 2) {
// 减少金额amount = amount - #{amount}
// 可选:添加余额充足校验
return $query->where('amount', '>=', $amount) // 确保余额不小于要减少的金额
->dec('amount', $amount)
->update();
}
return 0; // 无效类型返回0
}
public static function updateByUserId($entity, $db)
{
// 验证userId是否存在
if (empty($entity['user_id'])) {
throw new Exception("cashOut修改失败: userId必须传递");
}
// 构建更新条件
$conditions = [
'user_id' => $entity['user_id'],
'id' => $entity['id']
];
// 过滤掉主键和条件字段,避免更新这些字段
$updateData = $entity;
unset($updateData['user_id'], $updateData['id']);
// 执行更新操作
$db->name('cash_out')
->where($conditions)
->update($updateData);
}
}