134 lines
5.7 KiB
PHP
134 lines
5.7 KiB
PHP
<?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']); //未入账的已认领的人民币总金额
|
||
|
||
//今日入账
|
||
$query6 = FinReceipt::where('received_at','>',strtotime(date("Y-m-d")));
|
||
//今日入账数量
|
||
$result['received_num'] = $query6->count();
|
||
//未入账金额
|
||
// $result['unreceived_amount'] = $query2->sum('amount');
|
||
$result['received_amount'] = array_values($this->receiptStatisticsSum($query6, $currency)); //各币种的未入账金额
|
||
$result['received_amount_sum'] = $this->amountSum($result['unreceived_amount']); //未入账的已认领的人民币总金额
|
||
|
||
|
||
$query3 = FinReceipt::where('payment_apply_id',0);
|
||
|
||
//未认领数量
|
||
$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_num'] = $query5->count();
|
||
$result['unclaimed_payment_amount'] = array_values($unclaimed_payment_amount);
|
||
$result['unclaimed_payment_amount_sum'] = $this->amountSum($result['unclaimed_payment_amount']);
|
||
//在途资金 = 没有认领的付款资金-未认领的收款资金
|
||
$result['intransit_amount_sum'] = $result['unclaimed_payment_amount_sum'] - $result['unclaimed_amount_sum'];
|
||
$intransit_amount_amount = [];
|
||
//在途资金各币种明细
|
||
foreach ($unclaimed_payment_amount as $key => $value) {
|
||
$value['amount'] = $value['amount'] - $result['unclaimed_amount'][$key]['amount'];
|
||
$intransit_amount_amount[] = $value;
|
||
}
|
||
$result['intransit_amount_amount'] = $intransit_amount_amount;
|
||
//在途数量 = 没有认领的付款数量-未认领的收款数量
|
||
$result['intransit_count'] = $result['unclaimed_payment_num'] - $result['unclaimed_num'];
|
||
|
||
//未认领金额重新组织索引
|
||
$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);
|
||
}
|
||
|
||
} |