Files
fdesk/app/admin/controller/dashboard/FinStatisticsController.php
T

117 lines
4.7 KiB
PHP
Raw Normal View History

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
}