profiles->currentRow($expcode); abort_if($row === null, 404); $rules = []; foreach (CourierProfile::EDITABLE as $field => $label) { $rules[$field] = match (true) { in_array($field, CourierProfile::BOOLEAN_FIELDS, true) => ['nullable', 'in:0,1'], in_array($field, CourierProfile::DATE_FIELDS, true) => ['nullable', 'date'], $field === 'expname' => ['required', 'string', 'max:100'], default => ['nullable', 'string', 'max:255'], }; } $data = $request->validate($rules, ['expname.required' => '快递公司名称不能为空。'], CourierProfile::EDITABLE); $count = $this->profiles->update($expcode, $row->expname ?? null, $row, $data, (int) user_id()); return redirect($this->pageUrl($expcode, 'logs')) ->with('success', $count > 0 ? "已保存 {$count} 项修改(财务系统维护,不回写工作平台),修改记录见下方操作日志。" : '没有修改任何字段。'); } /** 打款信息页签里发起:快递公司代码在表单里填。 */ public function storePaymentAccountForCode(Request $request): RedirectResponse { $data = $request->validate( ['expcode' => ['required', 'string', 'max:64', 'regex:/^[0-9A-Za-z_\-]+$/']], ['expcode.required' => '请填写快递公司代码。', 'expcode.regex' => '快递公司代码只能是字母、数字、下划线或短横线。'], ); return $this->storePaymentAccount($request, trim($data['expcode'])); } public function storePaymentAccount(Request $request, string $expcode): RedirectResponse { $row = $this->profiles->currentRow($expcode); if ($row === null) { throw \Illuminate\Validation\ValidationException::withMessages(['expcode' => "快递资料里没有快递公司代码「{$expcode}」,请核对。"]); } $change = $request->input('action') === CourierPaymentAccount::ACTION_CHANGE; $number = ['required', 'string', 'max:64', 'regex:/^[0-9A-Za-z\- ]+$/']; $data = $request->validate([ 'action' => ['required', 'in:add,change'], 'account_type' => ['required', 'in:' . implode(',', CourierPaymentAccount::ACCOUNT_TYPES)], 'account_name' => ['required', 'string', 'max:255'], 'bank_name' => ['required', 'string', 'max:255'], 'account_number' => $number, 'effective_date' => ['required', 'date'], 'old_account_name' => [$change ? 'required' : 'nullable', 'string', 'max:255'], 'old_account_number' => $change ? $number : ['nullable', 'string', 'max:64'], 'old_stop_date' => [$change ? 'required' : 'nullable', 'date'], 'change_date' => [$change ? 'required' : 'nullable', 'date'], 'note' => ['nullable', 'string', 'max:500'], ], [ 'account_number.regex' => '银行账号只能包含数字、字母和短横线。', 'old_account_number.regex' => '原账号只能包含数字、字母和短横线。', ], [ 'account_type' => '账户类型', 'account_name' => $change ? '新开户名称' : '开户名称', 'bank_name' => $change ? '新开户银行' : '开户银行', 'account_number' => $change ? '新银行账号' : '银行账号', 'effective_date' => $change ? '新账户启用日期' : '生效日期', 'old_account_name' => '原开户名称', 'old_account_number' => '原账号', 'old_stop_date' => '原账户停止使用日期', 'change_date' => '账户变更日期', ]); $strip = static fn (?string $value): ?string => $value === null ? null : (string) preg_replace('/\s+/u', '', $value); $record = CourierPaymentAccount::query()->create([ 'company_id' => company_id(), 'expcode' => $expcode, 'courier_name' => $row->expname ?? null, 'action' => $data['action'], 'account_type' => $data['account_type'], 'account_name' => trim($data['account_name']), 'bank_name' => trim($data['bank_name']), 'account_number' => $strip($data['account_number']), 'effective_date' => $data['effective_date'], 'old_account_name' => $change ? trim((string) $data['old_account_name']) : null, 'old_account_number' => $change ? $strip($data['old_account_number']) : null, 'old_stop_date' => $change ? $data['old_stop_date'] : null, 'change_date' => $change ? $data['change_date'] : null, 'note' => $data['note'] ?? null, 'created_by' => (int) user_id(), 'updated_by' => (int) user_id(), ]); $summary = $change ? "打款信息变更:{$record->old_account_name} → {$record->account_name}({$record->account_type})" : "打款信息新增:{$record->account_name}({$record->account_type},{$record->bank_name})"; $this->profiles->log($expcode, $change ? 'account_change' : 'account_add', $summary . ',待推送' . ($change ? '收款账户变更' : '收款账户证明') . '协议', null, (int) user_id()); return redirect()->route('business.pages.show', [ 'section' => 'courier-payables', 'page' => 'agreement-signing', 'agreement_view' => 'create', 'payment_account' => $record->id, ])->with('success', $summary . '已保存。请核对下方预填的协议内容,补齐签署人信息后推送给快递签署;签署完成后这条打款信息显示为「已生效」。'); } private function pageUrl(string $expcode, string $detailTab): string { return route('business.pages.show', [ 'section' => 'courier-payables', 'page' => 'courier-information', 'selected' => $expcode, 'detail_tab' => $detailTab, ]) . '#courier-detail'; } }