ajax()) { return view('admin/finance/index'); } $inputs = $request->input(); !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']]; !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']]; $filters[] = ['is_settle', '=', 0]; $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(amount) as total_amount,GROUP_CONCAT(id) as ids') ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE); $items = $records->items(); $userIds = array_column($items, 'user_id'); $invoices = Agent::query()->whereIn('user_id', $userIds) ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray(); $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray(); array_walk($items, function ($item) use ($invoices, $userMaps) { $item->settle_amount = bcadd($item->total_amount, ($invoices[$item->user_id]['discount']??0), 2); $item->settle_amount = bcmul($item->total_amount, ($invoices[$item->user_id]['discount'] ?? 100) / 100, 2); $item->username = $userMaps[$item->user_id] ?? ''; $item->ids = explode(',', ($item->ids??'')); }); return response()->json([ 'rows' => $items, 'total' => $records->total() ]); } /** * 结算 * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function settle(Request $request) { $ids = $request->input('ids'); $records = LadingBill::query()->with('agent')->whereIn('id', $ids)->get(); foreach ($records as $record) { if (!empty($record->agent)) { $settleAmount = bcmul($record->amount, ($record->agent->discount ?? 100) / 100, 2); $record->update([ 'settle_amount' => $settleAmount, 'is_settle' => 1, 'settle_at' => date('Y-m-d H:i:s') ]); } } return response()->json(['message' => '操作成功']); } /** * 结算历史 * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View */ public function history(Request $request) { if (!$request->ajax()) { $settleTotal = LadingBill::query()->where(['is_settle' => 1])->sum('settle_amount'); return view('admin/finance/history', [ 'settleTotal' => $settleTotal ]); } $inputs = $request->input(); !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']]; !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']]; $filters[] = ['is_settle', '=', 1]; $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(settle_amount) as settle_total_amount,GROUP_CONCAT(id) as ids') ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE); $items = $records->items(); $userIds = array_column($items, 'user_id'); $invoices = Agent::query()->whereIn('user_id', $userIds) ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray(); $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray(); array_walk($items, function ($item) use ($invoices, $userMaps) { $item->username = $userMaps[$item->user_id] ?? ''; $item->ids = explode(',', $item->ids); }); return response()->json([ 'rows' => $items, 'total' => $records->total(), 'settle_total' => time() ]); } public function detail(Request $request) { $isSettle = $request->input('isSettle'); $ladingBillIds = $request->input('ladingBillIds') ?? []; if (!$request->ajax()) { return view('admin/finance/detail', [ 'ladingBillIds' => array_map(function ($item) { return intval($item); }, $ladingBillIds) ]); } $records = LadingBill::query()->with(['agent', 'site'])->whereIn('id', $ladingBillIds) ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE); $items = $records->items(); array_walk($items, function ($item) use ($isSettle) { if (!$isSettle) { $item->settle_amount = bcmul($item->amount, ($item->agent->discount ?? 100) / 100, 2); } $item->relate_site = $item->site->cn_title ?? ''; }); return response()->json([ 'rows' => $items, 'total' => $records->total() ]); } }