Files
fdesk/app/admin/controller/dashboard/FinStatisticsController.php
T
2025-10-31 16:22:28 +08:00

117 lines
4.7 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\controller\dashboard;
use app\common\controller\BaseController;
use app\common\model\FinPaymentApply;
use app\common\model\FinReceipt;
use app\common\model\SysCurrency;
use support\Request;
class FinStatisticsController extends BaseController
{
/**
* 收款记录统计
* @param Request $request
* @return \support\Response
*/
public function statistics(Request $request)
{
try {
$currency = SysCurrency::where('status',1)->get();
$query = FinReceipt::where('payment_apply_id','>',0);
$result = [];
//已认领数量
$result['claimed_num'] = $query->count();
//已认领金额
// $result['claimed_amount'] = $query->sum('amount');
$result['claimed_amount'] = array_values($this->receiptStatisticsSum($query, $currency)); //各币种的已认领金额
$result['claimed_amount_sum'] =$this->amountSum($result['claimed_amount']); //已认领的人民币总金额
//未入账数量
$query2 = FinReceipt::whereNull('received_at');
$result['unreceived_num'] = $query2->count();
//未入账金额
// $result['unreceived_amount'] = $query2->sum('amount');
$result['unreceived_amount'] = array_values($this->receiptStatisticsSum($query2, $currency)); //各币种的未入账金额
$result['unreceived_amount_sum'] = $this->amountSum($result['unreceived_amount']); //未入账的已认领的人民币总金额
$query3 = FinReceipt::whereNull('payment_apply_id');
//未认领数量
$result['unclaimed_num'] = $query3->count();
//未认领金额
// $result['unclaimed_amount'] = $query3->sum('amount');
$result['unclaimed_amount'] = $this->receiptStatisticsSum($query3, $currency); //各币种的未认领金额
$result['unclaimed_amount_sum'] = $this->amountSum($result['unclaimed_amount']); //未认领的已认领的人民币总金额
//已超时未认领数量
$query4 = $query3->where('created_at','<',time()-24*3600);
$result['timeout'] = $query4->count();
//在途资金
//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']);
return $this->success($result);
} catch (\Throwable $e) {
return $this->error($e->getMessage());
}
}
/**
* 根据不同条件查询收款金额
* @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);
}
}