92 lines
3.0 KiB
PHP
92 lines
3.0 KiB
PHP
<?php
|
||
|
||
namespace Modules\EcommerceFinance\Http\Controllers;
|
||
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Routing\Controller;
|
||
use Modules\EcommerceFinance\AccountBillColumns;
|
||
use Modules\EcommerceFinance\Models\AccountBill;
|
||
|
||
class AccountBills extends Controller
|
||
{
|
||
/**
|
||
* 通用账单列表(店铺收款账户账单 › 各账户类型 tab)。
|
||
* 经 admin 路由组(web 会话)暴露,前端带 CSRF 调用。
|
||
* 按 bill_type 过滤,返回分页数据 + 汇总 + 该类型的列配置。
|
||
*/
|
||
public function index(Request $request, string $bill_type)
|
||
{
|
||
$billType = $bill_type;
|
||
|
||
if (! AccountBillColumns::has($billType)) {
|
||
abort(404, '未知的账户类型。');
|
||
}
|
||
|
||
$query = AccountBill::query()
|
||
->where('company_id', company_id())
|
||
->where('bill_type', $billType);
|
||
|
||
if ($store = $request->get('store_name')) {
|
||
$query->where('store_name', $store);
|
||
}
|
||
|
||
if ($item = $request->get('bill_item')) {
|
||
$query->where('bill_item', $item);
|
||
}
|
||
|
||
if ($start = $request->get('start')) {
|
||
$query->where('occurred_at', '>=', $start);
|
||
}
|
||
|
||
if ($end = $request->get('end')) {
|
||
$query->where('occurred_at', '<=', $end . ' 23:59:59');
|
||
}
|
||
|
||
if ($keyword = $request->get('keyword')) {
|
||
$query->where(function ($q) use ($keyword) {
|
||
$like = '%' . $keyword . '%';
|
||
$q->where('record_code', 'like', $like)
|
||
->orWhere('order_no', 'like', $like)
|
||
->orWhere('remark', 'like', $like)
|
||
->orWhere('bill_item', 'like', $like);
|
||
});
|
||
}
|
||
|
||
$sortable = ['occurred_at', 'income', 'expense', 'balance', 'record_code'];
|
||
$sort = in_array($request->get('sort'), $sortable, true) ? $request->get('sort') : 'occurred_at';
|
||
$dir = $request->get('dir') === 'asc' ? 'asc' : 'desc';
|
||
$query->orderBy($sort, $dir);
|
||
|
||
$perPage = min(max((int) $request->get('limit', 10), 1), 100);
|
||
$rows = $query->paginate($perPage);
|
||
|
||
// 汇总(分页前)
|
||
$summaryRow = (clone $query)->selectRaw(
|
||
'COALESCE(SUM(income), 0) as income, ' .
|
||
'COALESCE(SUM(expense), 0) as expense, ' .
|
||
'COUNT(*) as count'
|
||
)->first();
|
||
|
||
$latestBalance = (clone $query)
|
||
->orderByDesc('occurred_at')
|
||
->orderByDesc('id')
|
||
->value('balance');
|
||
|
||
$data = $rows->toArray();
|
||
$data['summary'] = [
|
||
'income' => (float) ($summaryRow->income ?? 0),
|
||
'expense' => (float) ($summaryRow->expense ?? 0),
|
||
'count' => (int) ($summaryRow->count ?? 0),
|
||
'balance' => $latestBalance !== null ? (float) $latestBalance : 0,
|
||
];
|
||
$data['columns'] = AccountBillColumns::for($billType);
|
||
|
||
return response()->json($data);
|
||
}
|
||
|
||
public function show(AccountBill $bill)
|
||
{
|
||
return response()->json($bill);
|
||
}
|
||
}
|