462 lines
18 KiB
PHP
462 lines
18 KiB
PHP
<?php
|
|
|
|
namespace app\controller;
|
|
|
|
|
|
use think\facade\Db;
|
|
use think\Request;
|
|
|
|
class UserRefund
|
|
{
|
|
public function UserReimburse($openid, $money)
|
|
{
|
|
$money = round($money, 2);
|
|
|
|
$user_info = Db::table('zxc_user')->where('openid', $openid)->find();
|
|
//判断金额 余额>=提现金额
|
|
if ($user_info['account'] < $money) {
|
|
return json(['code' => 1, 'message' => '余额不足']);
|
|
}
|
|
//正在进行余额充电的订单不可提现
|
|
$count = Db::table('zxc_charge_order')
|
|
->where('openid', $openid)
|
|
->where('type', 2)
|
|
->where('end_time', null)
|
|
->find();
|
|
if ($count > 0) {
|
|
return json(['code' => 1, 'message' => '存在未结算订单']);
|
|
}
|
|
|
|
$table_recharge = 'zxc_recharge';
|
|
$reOrder = $this->SelectReOrder($openid, $money, $table_recharge);
|
|
|
|
if (empty($reOrder)) {
|
|
return json(['code' => 1, 'message' => '提现数据为空']);
|
|
}
|
|
$i = 0;
|
|
$suceess = 0;
|
|
$fail = 0;
|
|
foreach ($reOrder as $key => $value) {
|
|
$transaction_id = $key;
|
|
$OriginalOrderAmount = Db::table($table_recharge)->where('transaction_id', $transaction_id)->value('total');
|
|
$OriginalOrderAmount /= 100;
|
|
$refundAmount = $value / 100;
|
|
$td = new WechatReimburse();
|
|
$kk[] = $td->Refund($transaction_id, $openid, $refundAmount, $OriginalOrderAmount);
|
|
if ($kk[$i]['code'] == 200) {
|
|
$suceess += 1;
|
|
} elseif ($kk[$i]['code'] == 1) {
|
|
$fail += 1;
|
|
}
|
|
$i += 1;
|
|
}
|
|
return json(['code' => 200, 'total' => $i, 'success' => $suceess, 'fail' => $fail, 'message' => $kk, 'reOrder' => $reOrder]);
|
|
|
|
exit();
|
|
|
|
|
|
$account = Db::table($table_user)->where('openid', $openid)->value('account');
|
|
$account = round($account, 2);
|
|
$frozenAmount = Db::table($table_user)->where('openid', $openid)->value('FrozenAccount');
|
|
if ($money <= $account) {
|
|
$OrderList = new ChargeOrder();
|
|
$OrderList->OrderList($openid);//更新一下状态
|
|
//二次确认
|
|
$recharge_all = Db::table($table_recharge)->where('openid', $openid)->sum('total');
|
|
$recharge_all /= 100;
|
|
$refund_all = Db::table($table_refund)->where('openid', $openid)
|
|
->where('status', 'SUCCESS')
|
|
->sum('refund_total');
|
|
$refund_all /= 100;
|
|
$check = Db::table($table_order)->where('openid', $openid)
|
|
->where('status', '<>', 4)
|
|
->where('status', '<>', 5)
|
|
->order('start_time desc')
|
|
->value('end_time');
|
|
if (empty($check)) {
|
|
$order_all = Db::table($table_order)->where('openid', $openid)
|
|
->where('status', 4)
|
|
->sum('TotalMoney');
|
|
$inorder = Db::table($table_order)->where('openid', $openid)
|
|
->where('status', '<>', 4)
|
|
->where('status', '<>', 5)
|
|
->order('start_time desc')
|
|
->value('WithholdingMoney');
|
|
$order_total = $order_all + $inorder;
|
|
} else {
|
|
$order_total = Db::table($table_order)->where('openid', $openid)
|
|
->where('status', 4)
|
|
->sum('TotalMoney');
|
|
}
|
|
$order_total = round($order_total, 2);
|
|
$mask = round($recharge_all - $order_total - $refund_all, 2); //这里还要减已经提现的
|
|
if (round($mask, 2) == round($account, 2)) {
|
|
$reOrder = $this->SelectReOrder($openid, $money, $table_recharge);
|
|
if (empty($reOrder)) {
|
|
return json(['code' => 1, 'message' => '提现数据为空']);
|
|
}
|
|
$i = 0;
|
|
$suceess = 0;
|
|
$fail = 0;
|
|
foreach ($reOrder as $key => $value) {
|
|
$transaction_id = $key;
|
|
$OriginalOrderAmount = Db::table($table_recharge)->where('transaction_id', $transaction_id)->value('total');
|
|
$OriginalOrderAmount /= 100;
|
|
$refundAmount = $value / 100;
|
|
$td = new WechatReimburse();
|
|
$kk[] = $td->Refund($transaction_id, $openid, $refundAmount, $OriginalOrderAmount);
|
|
if ($kk[$i]['code'] == 200) {
|
|
$suceess += 1;
|
|
} elseif ($kk[$i]['code'] == 1) {
|
|
$fail += 1;
|
|
}
|
|
$i += 1;
|
|
}
|
|
return json(['code' => 200, 'total' => $i, 'success' => $suceess, 'fail' => $fail, 'message' => $kk, 'reOrder' => $reOrder]);
|
|
} else {
|
|
Db::table('refundexception')->save([
|
|
'openid' => $openid,
|
|
'order_total' => $order_total,
|
|
'recharge_total' => $recharge_all,
|
|
'refund_total' => $refund_all,
|
|
'mask' => $mask,
|
|
'account' => $account
|
|
]);
|
|
return json(['code' => 1, 'message' => '账户异常', 'order_total' => $order_total, 'recharge_all' => $recharge_all, 'mask' => $mask]);
|
|
}
|
|
} else {
|
|
return json(['code' => 1, 'message' => '提现金额不能大于余额']);
|
|
}
|
|
}
|
|
|
|
public function SelectReOrder($openid, $money, $table_recharge)
|
|
{
|
|
$oneYearAgo = strtotime('-1 year');
|
|
$oneYearAgoDate = date('Y-m-d H:i:s', $oneYearAgo);
|
|
$reOrder = Db::table($table_recharge)->where('openid', $openid)->where('type', 1)->where('success_time', '>=', $oneYearAgoDate)->order('total')->select();
|
|
$money *= 100;
|
|
$money = floor($money);
|
|
$kk = array();
|
|
foreach ($reOrder as $re) {
|
|
if ($re['total'] - $re['total_used'] == 0) {
|
|
continue;
|
|
} else {
|
|
$backMoney = $re['total'] - $re['total_used'];
|
|
if ($money > $backMoney) {
|
|
$kk[$re['transaction_id']] = $backMoney;
|
|
$money = $money - $backMoney;
|
|
} elseif ($money == $backMoney) {
|
|
$kk[$re['transaction_id']] = $money;
|
|
break;
|
|
} else {
|
|
$kk[$re['transaction_id']] = $money;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return $kk;
|
|
}
|
|
|
|
|
|
public function TKRecord($openid)
|
|
{
|
|
|
|
$table_refund = 'zxc_refund';
|
|
|
|
$message = Db::table($table_refund)->where('openid', $openid)->order('create_time desc')->select()->toArray();
|
|
|
|
$statusMap = [
|
|
'SUCCESS' => '退款成功',
|
|
'PROCESSING' => '退款处理中',
|
|
'ABNORMAL' => '退款异常',
|
|
'CLOSED' => '退款关闭',
|
|
];
|
|
|
|
foreach ($message as &$record) {
|
|
$record['refund_total'] = round($record['refund_total'] / 100, 2);
|
|
$record['status'] = $statusMap[$record['status']] ?? $record['status'];
|
|
}
|
|
|
|
return json($message);
|
|
}
|
|
|
|
|
|
public function RefundQuery($start_time = '', $end_time = '', $message = '')
|
|
{
|
|
// 处理结束时间
|
|
if (!empty($end_time)) {
|
|
$end_time = date("Y-m-d", strtotime("+1 day", strtotime($end_time)));
|
|
}
|
|
|
|
|
|
// 生成表名
|
|
$refundTable = 'zxc_refund';
|
|
$userTable = 'zxc_user';
|
|
|
|
|
|
// 构建查询条件
|
|
$query = Db::table($refundTable);
|
|
|
|
// 时间范围条件
|
|
if (!empty($start_time) && !empty($end_time)) {
|
|
$query->whereBetween('create_time', [$start_time, $end_time]);
|
|
}
|
|
|
|
// 消息条件
|
|
if (!empty($message)) {
|
|
if (strlen($message) == 11) {
|
|
$openid = Db::table($userTable)->where('phone', $message)->value('openid');
|
|
if ($openid) {
|
|
$query->where('openid', $openid);
|
|
} else {
|
|
$query->where('out_refund_no', 'like', "%{$message}%");
|
|
}
|
|
} else {
|
|
$query->where('out_refund_no', 'like', "%{$message}%");
|
|
}
|
|
}
|
|
|
|
// 获取数据并合并
|
|
$resultData = $query->order('create_time desc')->select()->toArray();
|
|
|
|
// 处理结果数据
|
|
|
|
foreach ($resultData as $index => &$item) {
|
|
$item['id'] = $index + 1;
|
|
$item['refund_total'] = round($item['refund_total'] / 100, 2);
|
|
|
|
$table = 'zxc_user';
|
|
$phone = Db::table($table)->where('openid', $item['openid'])->value('phone');
|
|
$item['phone'] = $phone;
|
|
}
|
|
|
|
return json($resultData);
|
|
}
|
|
|
|
|
|
public function Refund_Total(Request $request)
|
|
{
|
|
$data = $request->param();
|
|
$time_type = $data['time_type'];
|
|
$str_day = $data['str_time'];
|
|
$time = strtotime($str_day);
|
|
$date_time = date('Y-m-d', $time);
|
|
$area = Db::table('area_three')->column('area');
|
|
if ($time_type == '周') {
|
|
$mess = [];
|
|
$end_time = date("Y-m-d 23:59:59", strtotime("$date_time Saturday"));//结束时间(2020-04-19 23:59:59)
|
|
$start_time = date("Y-m-d 00:00:00", strtotime("$end_time - 6 days"));//开始时间(2020-04-13 00:00:00
|
|
$revenue_total = 0;
|
|
$order_num_total = 0;
|
|
$date = $this->getDateFromRange($start_time, $end_time);
|
|
foreach ($date as $d) {
|
|
$revenue = 0;
|
|
$order_num = 0;
|
|
$table_refund = 'zxc_refund';
|
|
|
|
$result = Db::table($table_refund)->select();
|
|
if (empty($result)) {
|
|
continue;
|
|
} else {
|
|
$recharge = Db::table($table_refund);
|
|
$revenue = $recharge->whereDay('create_time', $d)->sum('refund_total');
|
|
$order_num = $recharge->whereDay('create_time', $d)->count();
|
|
}
|
|
|
|
$mess['per'][] = ['time' => $d, 'data' => ['EnterAccount' => round($revenue / 100, 2), 'AccountNum' => $order_num]];
|
|
$revenue_total += $revenue;
|
|
$order_num_total += $order_num;
|
|
|
|
}
|
|
$mess['total'] = ['EnterAccount' => round($revenue_total / 100, 2), 'AccountNum' => $order_num_total];
|
|
return json($mess);
|
|
} elseif ($time_type == '月') {
|
|
$mess = [];
|
|
$start_time = date("Y-m-d", strtotime(date('Y-m-01', $time)));//开始时间(2020-04-01 00:00:00)
|
|
$date = $this->getMonthDate($start_time);
|
|
$i = 1;
|
|
$revenue_total = 0;
|
|
$order_num_total = 0;
|
|
foreach ($date as $d) {
|
|
$z = '第' . $i . '周';
|
|
$d = date('Y-m-d', strtotime($d));
|
|
$revenue = 0;
|
|
$order_num = 0;
|
|
$table_refund = 'zxc_refund';
|
|
|
|
$result = Db::table($table_refund)->select();
|
|
if (empty($result)) {
|
|
continue;
|
|
} else {
|
|
$recharge = Db::table($table_refund);
|
|
$revenue = $recharge->whereWeek('create_time', $d)->sum('refund_total');
|
|
$order_num = $recharge->whereWeek('create_time', $d)->count();
|
|
|
|
}
|
|
|
|
$mess['per'][] = ['time' => $z, 'data' => ['EnterAccount' => round($revenue / 100, 2), 'AccountNum' => $order_num]];
|
|
$revenue_total += $revenue;
|
|
$order_num_total += $order_num;
|
|
$i += 1;
|
|
}
|
|
$mess['total'] = ['EnterAccount' => round($revenue_total / 100, 2), 'AccountNum' => $order_num_total];
|
|
return json($mess);
|
|
} elseif ($time_type == '季') {
|
|
$season = intval(ceil(date('m', $time) / 3));
|
|
if ($season == 4) {
|
|
$start_time = date("Y-m-d H:i:s", strtotime(date('Y-' . ($season * 3 - 2) . '-01', $time)));//开始时间(2020-04-01 00:00:00)
|
|
$end_time = date("Y-m-d 23:59:59", strtotime(date('Y-m-d', strtotime("$start_time +3 month -1 day"))));//开始时间(2020-04-01 00:00:00)
|
|
} else {
|
|
$start_time = date("Y-m-d H:i:s", strtotime(date('Y-0' . ($season * 3 - 2) . '-01', $time)));//开始时间(2020-04-01 00:00:00)
|
|
$end_time = date("Y-m-d 23:59:59", strtotime(date('Y-m-d', strtotime("$start_time +3 month -1 day"))));//开始时间(2020-04-01 00:00:00)
|
|
}
|
|
$i = date("m", strtotime(date('Y-' . ($season * 3 - 2) . '-01', $time)));
|
|
if ((int)substr($i, 0, 1) == 0) {
|
|
$i = substr($i, -1);
|
|
}
|
|
$date = $this->getSeasonDate($start_time);
|
|
$mess = [];
|
|
$revenue_total = 0;
|
|
$order_num_total = 0;
|
|
foreach ($date as $d) {
|
|
$z = $i . '月';
|
|
$d = date('Y-m-d', strtotime($d));
|
|
$revenue = 0;
|
|
$order_num = 0;
|
|
|
|
$table_refund = 'zxc_refund';
|
|
|
|
$result = Db::table($table_refund)->select();
|
|
if (empty($result)) {
|
|
continue;
|
|
} else {
|
|
$recharge = Db::table($table_refund);
|
|
$revenue = $recharge->whereMonth('create_time', $d)->sum('refund_total');
|
|
$order_num = $recharge->whereMonth('create_time', $d)->count();
|
|
|
|
}
|
|
$mess['per'][] = ['time' => $z, 'data' => ['EnterAccount' => round($revenue / 100, 2), 'AccountNum' => $order_num]];
|
|
$revenue_total += $revenue;
|
|
$order_num_total += $order_num;
|
|
$i += 1;
|
|
}
|
|
$mess['total'] = ['EnterAccount' => round($revenue_total / 100, 2), 'AccountNum' => $order_num_total];
|
|
return json($mess);
|
|
} elseif ($time_type == '年') {
|
|
$start_time = date('Y-01-01 00:00:00', $time);//开始时间
|
|
$date = $this->getYearDate($start_time);
|
|
$mess = [];
|
|
$revenue_total = 0;
|
|
$order_num_total = 0;
|
|
$i = 1;
|
|
foreach ($date as $d) {
|
|
$z = $i . '月';
|
|
$d = date('Y-m', strtotime($d));
|
|
$revenue = 0;
|
|
$order_num = 0;
|
|
|
|
$table_refund = 'zxc_refund';
|
|
|
|
$result = Db::table($table_refund)->select();
|
|
if (empty($result)) {
|
|
continue;
|
|
} else {
|
|
$recharge = Db::table($table_refund);
|
|
$revenue = $recharge->whereMonth('create_time', $d)->sum('refund_total');
|
|
$order_num = $recharge->whereMonth('create_time', $d)->count();
|
|
|
|
}
|
|
|
|
$mess['per'][] = ['time' => $z, 'data' => ['EnterAccount' => round($revenue / 100, 2), 'AccountNum' => $order_num]];
|
|
$revenue_total += $revenue;
|
|
$order_num_total += $order_num;
|
|
$i += 1;
|
|
}
|
|
$mess['total'] = ['EnterAccount' => round($revenue_total / 100, 2), 'AccountNum' => $order_num_total];
|
|
return json($mess);
|
|
}
|
|
}
|
|
|
|
private function getDateFromRange($startdate, $enddate): array
|
|
{
|
|
|
|
$stimestamp = strtotime($startdate);
|
|
$etimestamp = strtotime($enddate);
|
|
// 计算日期段内有多少天
|
|
$days = ($etimestamp - $stimestamp) / 86400;
|
|
// 保存每天日期
|
|
$date = array();
|
|
for ($i = 0; $i < $days; $i++) {
|
|
|
|
$date[] = date('Y-m-d', $stimestamp + (86400 * $i));
|
|
}
|
|
|
|
return $date;
|
|
}
|
|
|
|
private function getMonthDate($date)
|
|
{
|
|
$date_t = array();
|
|
$date_t[] = $date;
|
|
for ($i = 0; $i < 4; $i++) {
|
|
$this_date = strtotime($date);
|
|
$next_date = date("Y-m-d", strtotime('next monday', $this_date));
|
|
$date_t[] = $next_date;
|
|
$date = $next_date;
|
|
}
|
|
return $date_t;
|
|
|
|
}
|
|
|
|
private function getSeasonDate($date)
|
|
{
|
|
$date_t = array();
|
|
$date_t[] = $date;
|
|
for ($i = 0; $i < 2; $i++) {
|
|
$this_date = strtotime($date);
|
|
$next_date = date("Y-m-d", strtotime('next month', $this_date));
|
|
$date_t[] = $next_date;
|
|
$date = $next_date;
|
|
}
|
|
return $date_t;
|
|
|
|
}
|
|
|
|
private function getYearDate($date)
|
|
{
|
|
$date_t = array();
|
|
$date_t[] = $date;
|
|
for ($i = 0; $i < 11; $i++) {
|
|
$this_date = strtotime($date);
|
|
$next_date = date("Y-m-d", strtotime('next month', $this_date));
|
|
$date_t[] = $next_date;
|
|
$date = $next_date;
|
|
}
|
|
return $date_t;
|
|
|
|
}
|
|
|
|
private function getDayDate($date)
|
|
{
|
|
$date_t = array();
|
|
$date_t[] = $date;
|
|
$this_date = strtotime($date);
|
|
$end_date = date("Y-m-d H:i:s", strtotime('+4 hour -1 second', $this_date));
|
|
$date_end[] = $end_date;
|
|
for ($i = 0; $i < 5; $i++) {
|
|
$this_date = strtotime($date);
|
|
$next_date = date("Y-m-d H:i:s", strtotime('+4 hour', $this_date));
|
|
$this_date_end = strtotime($end_date);
|
|
$next_date_end = date("Y-m-d H:i:s", strtotime('+4 hour', $this_date_end));
|
|
$date_end[] = $next_date_end;
|
|
$date_t[] = $next_date;
|
|
$date = $next_date;
|
|
$next_date_end = date("Y-m-d H:59:59", strtotime($next_date_end));
|
|
$end_date = $next_date_end;
|
|
}
|
|
$kk['start_time'] = $date_t;
|
|
$kk['end_time'] = $date_end;
|
|
return $kk;
|
|
|
|
}
|
|
} |