From 29ba35f9b6309c04c9c2beac1420d71963e64d45 Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Fri, 31 Oct 2025 16:22:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E4=BB=98=E6=AC=BE=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/FinStatisticsController.php | 83 +++++++++++++++++-- 1 file changed, 76 insertions(+), 7 deletions(-) diff --git a/app/admin/controller/dashboard/FinStatisticsController.php b/app/admin/controller/dashboard/FinStatisticsController.php index 95cf09d..59965da 100644 --- a/app/admin/controller/dashboard/FinStatisticsController.php +++ b/app/admin/controller/dashboard/FinStatisticsController.php @@ -3,7 +3,9 @@ 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 @@ -16,33 +18,100 @@ class FinStatisticsController extends BaseController 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'] = $query->sum('amount'); + $result['claimed_amount'] = array_values($this->receiptStatisticsSum($query, $currency)); //各币种的已认领金额 + $result['claimed_amount_sum'] =$this->amountSum($result['claimed_amount']); //已认领的人民币总金额 //未入账数量 - $result['unreceived_num'] = FinReceipt::whereNull('received_at')->count(); + $query2 = FinReceipt::whereNull('received_at'); + $result['unreceived_num'] = $query2->count(); //未入账金额 - $result['unreceived_amount'] = FinReceipt::whereNull('received_at')->sum('amount'); +// $result['unreceived_amount'] = $query2->sum('amount'); + $result['unreceived_amount'] = array_values($this->receiptStatisticsSum($query2, $currency)); //各币种的未入账金额 + $result['unreceived_amount_sum'] = $this->amountSum($result['unreceived_amount']); //未入账的已认领的人民币总金额 - $query = FinReceipt::whereNull('payment_apply_id'); + $query3 = FinReceipt::whereNull('payment_apply_id'); //未认领数量 - $result['unclaimed_num'] = $query->count(); + $result['unclaimed_num'] = $query3->count(); //未认领金额 - $result['unclaimed_amount'] = $query->sum('amount'); +// $result['unclaimed_amount'] = $query3->sum('amount'); + $result['unclaimed_amount'] = $this->receiptStatisticsSum($query3, $currency); //各币种的未认领金额 + $result['unclaimed_amount_sum'] = $this->amountSum($result['unclaimed_amount']); //未认领的已认领的人民币总金额 //已超时未认领数量 - $result['timeout'] = $query->where('created_at','<',time()-24*3600)->count(); + $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); + } + } \ No newline at end of file