# 催缴登记 (Arrearage Reminder) 前端对接 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 将两个前端页面(欠费催缴池 + 催缴记录)从 mock 数据切换到真实后端 API,包括 API 层补齐、催缴表单对接、汇总统计、导出功能。 **Architecture:** 后端 9 个接口均已就绪 (`POST /create`, `GET /page`, `GET /pending-page`, `GET /get`, `GET /detail-list`, `POST /batch-create`, `GET /pending-summary`, `GET /pending-export`, `GET /pending-detail-export`)。前端按 "API 层 → 催缴表单 → 欠费池页面 → 催缴记录页面" 的顺序逐层对接,每层完成后可独立验证。 **Tech Stack:** Vue 3, TypeScript, Element Plus, Axios (`@/config/axios`), pnpm --- ## File Structure ### API layer - Modify: `../water-frontend/src/api/collectionManage/arrears/index.ts` - 新增所有请求/响应 VO 类型 + 7 个缺失的 API 方法 ### Components - Modify: `../water-frontend/src/views/collectionManage/arrears/components/RemindForm.vue` - 对接 `batchCreate` API,接收父组件传入的选中行数据 ### Views - Modify: `../water-frontend/src/views/collectionManage/arrears/index.vue` - 汇总统计条对接 `getPendingSummary`、导出对接 `getPendingExportList`、催缴按钮传递选中数据给 RemindForm - Modify: `../water-frontend/src/views/collectionManage/collectionRecord/index.vue` - 列表对接 `getPage`、详情展开对接 `getDetailList`、导出对接后端(如有对应接口) - 查询表单字段对齐 `ArrearageReminderPageReqVO` --- ### Task 1: 补齐 API 层 — 类型定义与全部接口方法 **Files:** - Modify: `../water-frontend/src/api/collectionManage/arrears/index.ts` - [ ] **Step 1: 添加所有 VO 类型定义和 API 方法** ```typescript import request from '@/config/axios' import download from '@/utils/download' // ========== 请求 VO ========== export interface ArrearagePendingPageReqVO { pageNo: number pageSize: number deptId?: number code?: string name?: string address?: string mobile?: string custStates?: number[] custType?: number billMonthStart?: number billMonthEnd?: number meterReaderId?: number bookCode?: string arrearsCountMin?: number arrearsCountMax?: number arrearsAmountMin?: number arrearsAmountMax?: number remindFilter?: string } export interface ArrearageReminderPageReqVO { pageNo: number pageSize: number custId?: number reminderUser?: string reminderType?: number reminderReason?: number reminderResult?: number } export interface ArrearageReminderCreateReqVO { custId: number chargeIds: number[] reminderType: number reminderReason: number reminderResult: number reminderUser: string reminderTemplate?: number remark?: string } export interface ArrearageReminderBatchCreateReqVO { customers: { custId: number chargeIds: number[] }[] reminderType: number reminderReason: number reminderResult: number reminderUser: string reminderTemplate?: number remark?: string } // ========== 响应 VO ========== export interface ArrearagePendingPageRespVO { custId: number custCode: string custName: string custAddress: string meterCaliber: string waterNature: string arrearsCount: number waterVolume: number totalAmount: number penaltyAmount: number receivableAmount: number billAmount: number accountMonthRange: string custStatus: string prestoreAmount: number mobile: string isRemindedThisMonth: boolean agreementNo: string contractNo: string details: ArrearagePendingChargeDetailRespVO[] } export interface ArrearagePendingChargeDetailRespVO { chargeId: number billMonth: string lastReading: number currentReading: number waterVolume: number billAmount: number penaltyAmount: number readingDate: string } export interface ArrearagePendingSummaryRespVO { custCount: number arrearsCount: number waterVolume: number billAmount: number penaltyAmount: number totalAmount: number receivableAmount: number } export interface ArrearageReminderPageRespVO { id: number custId: number custCode: string custName: string reminderType: number reminderReason: number reminderUser: string remark: string reminderTemplate: number completeTime: string pushState: number pushResults: string reminderResult: number batchStamp: string totalBillWater: number totalExtendedAmount: number totalLateFee: number deposit: number mobile: string createTime: string updateTime: string } export interface ArrearageReminderRespVO extends ArrearageReminderPageRespVO {} export interface ArrearageReminderDetailRespVO { id: number arrearageReminderId: number chargeId: number lateFee: number createTime: string updateTime: string } export interface ArrearageReminderCreateRespVO { id: number detailCount: number } export interface ArrearageReminderBatchCreateRespVO { successCount: number failCount: number successItems: { custId: number; reminderId: number; detailCount: number }[] failItems: { custId: number; reason: string }[] } // ========== API 方法 ========== export const ArrearsApi = { // 待催欠费池 getPendingPage: async (params: ArrearagePendingPageReqVO) => { return await request.get<{ list: ArrearagePendingPageRespVO[]; total: number }>({ url: '/business/arrearage-reminder/pending-page', params }) }, getPendingSummary: async (params: ArrearagePendingPageReqVO) => { return await request.get({ url: '/business/arrearage-reminder/pending-summary', params }) }, // 催缴登记 CRUD create: async (data: ArrearageReminderCreateReqVO) => { return await request.post({ url: '/business/arrearage-reminder/create', data }) }, batchCreate: async (data: ArrearageReminderBatchCreateReqVO) => { return await request.post({ url: '/business/arrearage-reminder/batch-create', data }) }, getPage: async (params: ArrearageReminderPageReqVO) => { return await request.get<{ list: ArrearageReminderPageRespVO[]; total: number }>({ url: '/business/arrearage-reminder/page', params }) }, get: async (id: number) => { return await request.get({ url: '/business/arrearage-reminder/get', params: { id } }) }, getDetailList: async (reminderId: number) => { return await request.get({ url: '/business/arrearage-reminder/detail-list', params: { reminderId } }) }, // 导出 exportPending: async (params: ArrearagePendingPageReqVO) => { const res = await request.download({ url: '/business/arrearage-reminder/pending-export', params }) download.response(res, '待催欠费客户.xlsx') }, exportPendingDetail: async (params: ArrearagePendingPageReqVO) => { const res = await request.download({ url: '/business/arrearage-reminder/pending-detail-export', params }) download.response(res, '待催欠费明细.xlsx') } } ``` - [ ] **Step 2: 验证 API 层编译** Run: `cd ../water-frontend && npx vue-tsc --noEmit src/api/collectionManage/arrears/index.ts 2>&1 | head -20` Expected: No type errors --- ### Task 2: RemindForm 对接 batchCreate API **Files:** - Modify: `../water-frontend/src/views/collectionManage/arrears/components/RemindForm.vue` - [ ] **Step 1: 重写 RemindForm 脚本,接收选中行 props 并调 batchCreate** 将 `