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($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); } }