2025-10-30 13:35:53 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
namespace app\admin\controller\dashboard;
|
|
|
|
|
|
|
|
|
|
|
|
use app\common\controller\BaseController;
|
2025-10-31 16:22:28 +08:00
|
|
|
|
use app\common\model\FinPaymentApply;
|
2025-10-30 13:35:53 +08:00
|
|
|
|
use app\common\model\FinReceipt;
|
2025-10-31 16:22:28 +08:00
|
|
|
|
use app\common\model\SysCurrency;
|
2025-10-30 13:35:53 +08:00
|
|
|
|
use support\Request;
|
|
|
|
|
|
|
|
|
|
|
|
class FinStatisticsController extends BaseController
|
|
|
|
|
|
{
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 收款记录统计
|
|
|
|
|
|
* @param Request $request
|
|
|
|
|
|
* @return \support\Response
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function statistics(Request $request)
|
|
|
|
|
|
{
|
|
|
|
|
|
try {
|
2025-10-31 16:22:28 +08:00
|
|
|
|
$currency = SysCurrency::where('status',1)->get();
|
2025-10-30 13:35:53 +08:00
|
|
|
|
$query = FinReceipt::where('payment_apply_id','>',0);
|
|
|
|
|
|
|
|
|
|
|
|
$result = [];
|
|
|
|
|
|
//已认领数量
|
|
|
|
|
|
$result['claimed_num'] = $query->count();
|
|
|
|
|
|
//已认领金额
|
2025-10-31 16:22:28 +08:00
|
|
|
|
// $result['claimed_amount'] = $query->sum('amount');
|
|
|
|
|
|
$result['claimed_amount'] = array_values($this->receiptStatisticsSum($query, $currency)); //各币种的已认领金额
|
|
|
|
|
|
$result['claimed_amount_sum'] =$this->amountSum($result['claimed_amount']); //已认领的人民币总金额
|
2025-10-30 13:35:53 +08:00
|
|
|
|
|
2025-10-30 14:26:59 +08:00
|
|
|
|
//未入账数量
|
2025-10-31 16:22:28 +08:00
|
|
|
|
$query2 = FinReceipt::whereNull('received_at');
|
|
|
|
|
|
$result['unreceived_num'] = $query2->count();
|
2025-10-30 14:26:59 +08:00
|
|
|
|
//未入账金额
|
2025-10-31 16:22:28 +08:00
|
|
|
|
// $result['unreceived_amount'] = $query2->sum('amount');
|
|
|
|
|
|
$result['unreceived_amount'] = array_values($this->receiptStatisticsSum($query2, $currency)); //各币种的未入账金额
|
|
|
|
|
|
$result['unreceived_amount_sum'] = $this->amountSum($result['unreceived_amount']); //未入账的已认领的人民币总金额
|
2025-10-30 13:35:53 +08:00
|
|
|
|
|
2025-10-31 16:22:28 +08:00
|
|
|
|
$query3 = FinReceipt::whereNull('payment_apply_id');
|
2025-10-30 13:35:53 +08:00
|
|
|
|
|
|
|
|
|
|
//未认领数量
|
2025-10-31 16:22:28 +08:00
|
|
|
|
$result['unclaimed_num'] = $query3->count();
|
2025-10-30 13:35:53 +08:00
|
|
|
|
//未认领金额
|
2025-10-31 16:22:28 +08:00
|
|
|
|
// $result['unclaimed_amount'] = $query3->sum('amount');
|
|
|
|
|
|
$result['unclaimed_amount'] = $this->receiptStatisticsSum($query3, $currency); //各币种的未认领金额
|
|
|
|
|
|
$result['unclaimed_amount_sum'] = $this->amountSum($result['unclaimed_amount']); //未认领的已认领的人民币总金额
|
2025-10-30 13:35:53 +08:00
|
|
|
|
|
|
|
|
|
|
//已超时未认领数量
|
2025-10-31 16:22:28 +08:00
|
|
|
|
$query4 = $query3->where('created_at','<',time()-24*3600);
|
|
|
|
|
|
$result['timeout'] = $query4->count();
|
2025-10-30 13:35:53 +08:00
|
|
|
|
|
2025-10-31 16:22:28 +08:00
|
|
|
|
//在途资金
|
|
|
|
|
|
//1、没有认领的付款资金
|
|
|
|
|
|
$query5 = FinPaymentApply::where('receipt_id', '=', 0);
|
|
|
|
|
|
$unclaimed_payment_amount = $this->receiptStatisticsSum($query5, $currency);
|
|
|
|
|
|
foreach ($unclaimed_payment_amount as $key => &$value) {
|
|
|
|
|
|
$value['amount'] = $value['amount'] - $result['unclaimed_amount'][$key]['amount'];
|
|
|
|
|
|
}
|
|
|
|
|
|
$result['unclaimed_payment_amount'] = array_values($result['unclaimed_payment_amount']);
|
|
|
|
|
|
$result['unclaimed_payment_amount_sum'] = $this->amountSum($result['unclaimed_payment_amount']);
|
|
|
|
|
|
//在途资金 = 没有认领的付款资金-未认领的收款资金
|
|
|
|
|
|
$result['intransit_amount'] = $result['unclaimed_payment_amount_sum'] - $result['unclaimed_amount_sum'];
|
|
|
|
|
|
|
|
|
|
|
|
//在途数量 = 没有认领的付款数量-未认领的收款数量
|
|
|
|
|
|
$result['intransit_count'] = count($result['unclaimed_payment_amount']) - count($result['unclaimed_amount']);
|
|
|
|
|
|
|
|
|
|
|
|
//未认领金额重新组织索引
|
|
|
|
|
|
$result['unclaimed_amount'] = array_values($result['unclaimed_amount']);
|
2025-10-30 13:35:53 +08:00
|
|
|
|
return $this->success($result);
|
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
|
return $this->error($e->getMessage());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-31 16:22:28 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 根据不同条件查询收款金额
|
|
|
|
|
|
* @param $query
|
|
|
|
|
|
* @param $currency
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function receiptStatisticsSum($query, $currency)
|
|
|
|
|
|
{
|
|
|
|
|
|
$amount = [];
|
|
|
|
|
|
foreach ($currency as $k => $v) {
|
|
|
|
|
|
$amount[$v->currency_code] = [
|
|
|
|
|
|
'currency_code' => $v->currency_code,
|
|
|
|
|
|
'exchange_rate' => $v->exchange_rate,
|
|
|
|
|
|
'amount' => $query->where('currency_id',$v->id)->sum('amount'),
|
|
|
|
|
|
];
|
|
|
|
|
|
}
|
|
|
|
|
|
return $amount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 不同币种汇率换算之后求和
|
|
|
|
|
|
* @param $query
|
|
|
|
|
|
* @param $currency
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function amountSum($amount)
|
|
|
|
|
|
{
|
|
|
|
|
|
$amountSum = 0;
|
|
|
|
|
|
foreach ($amount as $v) {
|
|
|
|
|
|
// 转换为整数(乘以100避免浮点数问题)
|
|
|
|
|
|
$v['amount'] = (int) round($v['amount'] * 100);
|
|
|
|
|
|
$v['exchange_rate'] = (int) round($v['exchange_rate'] * 10000); // 汇率保留4位小数
|
|
|
|
|
|
$amountSum += $v['amount'] * $v['exchange_rate'];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 转换回金额(除以1000000,因为汇率乘了10000)
|
|
|
|
|
|
$result = $amountSum / 1000000;
|
|
|
|
|
|
|
|
|
|
|
|
// 四舍五入到2位小数
|
|
|
|
|
|
return round($amountSum, 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-30 13:35:53 +08:00
|
|
|
|
}
|