Procházet zdrojové kódy

✨ feat(story): 更新银行卡管理优化故事文档

- 细化任务结构,将银行选择组件任务拆分为四个具体子任务【创建银行名称模块、创建银行名称管理UI、更新残疾人模块建立关联、创建银行选择组件】
- 新增模块结构信息,详细描述银行名称模块和银行名称管理UI的文件结构
- 扩展数据模型信息,新增银行名称实体Schema定义
- 更新UI包开发规范,添加银行名称模块特定规范要求
- 新增技术实现方案章节,详细说明基于广告类型模块的复制与适配方案
- 更新变更日志,记录版本1.1的更新内容
yourname před 2 týdny
rodič
revize
3b72d82a5c

+ 168 - 5
docs/stories/009.004.bank-card-management-optimization.story.md

@@ -15,10 +15,25 @@ Draft
 4. 仅保留"公司名字"为必填项,其他字段设为非必填
 
 ## Tasks / Subtasks
-- [ ] 修改银行选择组件为选项式 (AC: 1)
-  - [ ] 创建银行选择组件,支持选项选择和用户自定义输入
-  - [ ] 参考AreaSelect组件的省份选择逻辑实现
-  - [ ] 添加银行选项数据管理(可配置的银行列表)
+- [ ] 创建银行名称模块(基于广告类型模块) (AC: 1)
+  - [ ] 复制 `packages/advertisements-module` → `packages/bank-names-module`
+  - [ ] 修改实体:`AdvertisementType` → `BankName`,表名:`ad_type` → `bank_name`
+  - [ ] 适配字段:name→银行名称,code→银行代码,remark→备注,status→状态
+  - [ ] 更新路由、服务、schema等所有相关文件
+- [ ] 创建银行名称管理UI(基于广告类型管理UI) (AC: 1)
+  - [ ] 复制 `packages/advertisement-type-management-ui` → `packages/bank-name-management-ui`
+  - [ ] 重命名组件:`AdvertisementTypeManagement` → `BankNameManagement`
+  - [ ] 重命名组件:`AdvertisementTypeSelector` → `BankNameSelector`
+  - [ ] 更新API客户端和类型定义
+- [ ] 更新残疾人模块建立银行名称关联 (AC: 1)
+  - [ ] 修改 `DisabledBankCard` 实体,将 `bankName` 字段改为外键关联
+  - [ ] 更新相关schema和DTO,支持银行名称ID引用
+  - [ ] 更新数据库迁移脚本
+- [ ] 创建银行选择组件 (AC: 1)
+  - [ ] 基于 `BankNameSelector` 组件创建 `BankSelect` 组件
+  - [ ] 支持选项式选择(从银行名称模块获取数据)
+  - [ ] 支持用户自定义输入(参考AreaSelect组件的省份选择逻辑)
+  - [ ] 集成到 `BankCardManagement` 组件中
 - [ ] 修复银行卡照片上传功能 (AC: 2)
   - [ ] 检查FileSelector组件的集成问题
   - [ ] 修复文件ID绑定逻辑
@@ -33,6 +48,7 @@ Draft
   - [ ] 更新前端验证逻辑和后端schema
 - [ ] 更新测试用例 (AC: 1, 2, 3, 4)
   - [ ] 更新BankCardManagement组件的集成测试
+  - [ ] 添加银行选择组件测试
   - [ ] 添加银行卡类型选择测试
   - [ ] 验证照片上传功能测试
   - [ ] 验证表单验证规则更新
@@ -56,6 +72,19 @@ Draft
 - **后端模块**: `allin-packages/disability-module/`
 - **Schema文件**: `allin-packages/disability-module/src/schemas/disabled-person.schema.ts`
 
+### 新模块结构信息
+- **银行名称模块**: `packages/bank-names-module/`
+  - 实体文件: `src/entities/bank-name.entity.ts`
+  - 路由文件: `src/routes/bank-names.ts`
+  - Schema文件: `src/schemas/bank-name.schema.ts`
+  - 服务文件: `src/services/bank-name.service.ts`
+- **银行名称管理UI**: `packages/bank-name-management-ui/`
+  - 管理组件: `src/components/BankNameManagement.tsx`
+  - 选择器组件: `src/components/BankNameSelector.tsx`
+  - API客户端: `src/api/bankNameClient.ts`
+  - 类型定义: `src/types/bankName.ts`
+- **银行选择组件**: `allin-packages/disability-person-management-ui/src/components/BankSelect.tsx`
+
 ### 数据模型信息 [Source: architecture/data-model-schema-changes.md]
 **银行卡实体Schema** (来自disabled-person.schema.ts:268-319):
 ```typescript
@@ -82,6 +111,82 @@ export const DisabledBankCardSchema = z.object({
 
 **需要新增字段**:
 - `cardType`: 银行卡类型(一类卡/二类卡)
+- `bankNameId`: 银行名称ID(外键关联,替换原来的bankName字符串字段)
+
+**银行名称实体Schema** (基于广告类型实体适配):
+```typescript
+@Entity('bank_name')
+export class BankName {
+  @PrimaryGeneratedColumn({ unsigned: true })
+  id!: number;
+
+  @Column({
+    name: 'name',
+    type: 'varchar',
+    length: 50,
+    comment: '银行名称'
+  })
+  name!: string;
+
+  @Column({
+    name: 'code',
+    type: 'varchar',
+    length: 20,
+    unique: true,
+    comment: '银行代码'
+  })
+  code!: string;
+
+  @Column({
+    name: 'remark',
+    type: 'varchar',
+    length: 100,
+    nullable: true,
+    comment: '备注'
+  })
+  remark!: string | null;
+
+  @CreateDateColumn({
+    name: 'created_at',
+    type: 'timestamp',
+    comment: '创建时间'
+  })
+  createdAt!: Date;
+
+  @UpdateDateColumn({
+    name: 'updated_at',
+    type: 'timestamp',
+    comment: '更新时间'
+  })
+  updatedAt!: Date;
+
+  @Column({
+    name: 'created_by',
+    type: 'int',
+    unsigned: true,
+    nullable: true,
+    comment: '创建用户ID'
+  })
+  createdBy!: number | null;
+
+  @Column({
+    name: 'updated_by',
+    type: 'int',
+    unsigned: true,
+    nullable: true,
+    comment: '更新用户ID'
+  })
+  updatedBy!: number | null;
+
+  @Column({
+    name: 'status',
+    type: 'int',
+    default: 0,
+    comment: '状态 0禁用 1启用'
+  })
+  status!: number;
+}
+```
 
 ### UI包开发规范 [Source: architecture/ui-package-standards.md]
 **必须遵循的规范**:
@@ -94,7 +199,15 @@ export const DisabledBankCardSchema = z.object({
 **参考现有组件模式**:
 - **AreaSelect组件**: 参考省份选择逻辑实现银行选择组件
 - **PlatformManagement组件**: 参考表单处理模式,确保一致性
-- **广告管理UI包**: `packages/advertisement-management-ui` 作为参考实现
+- **广告类型管理UI包**: `packages/advertisement-type-management-ui` 作为银行名称模块的参考实现
+- **广告类型选择器**: `AdvertisementTypeSelector` 组件作为 `BankNameSelector` 的参考实现
+
+**银行名称模块特定规范**:
+1. **模块复制规范**: 必须完整复制广告类型模块结构,保持一致的目录组织和文件命名
+2. **实体适配规范**: 修改实体时需同步更新表名、字段注释和业务含义
+3. **API路径映射**: 银行名称模块的API路径需与广告类型模块保持一致模式
+4. **类型安全**: 使用RPC推断类型,确保前端类型与后端schema同步
+5. **测试覆盖**: 新模块需达到与广告类型模块相同的测试覆盖率
 
 ### 组件架构信息 [Source: architecture/component-architecture.md]
 **前端组件架构**:
@@ -156,10 +269,60 @@ export const DisabledBankCardSchema = z.object({
 
 **结构一致性**: 符合现有UI包结构规范,无需调整项目结构。
 
+### 技术实现方案(基于广告类型模块)
+
+**银行名称模块架构**:
+基于现有广告类型模块(`packages/advertisements-module`)和广告类型管理UI(`packages/advertisement-type-management-ui`)进行复制和适配:
+
+1. **后端模块复制与适配**:
+   - 复制 `packages/advertisements-module` → `packages/bank-names-module`
+   - 修改实体:`AdvertisementType` → `BankName`
+   - 修改表名:`ad_type` → `bank_name`
+   - 字段适配:
+     - `name`: 银行名称(如:中国工商银行)
+     - `code`: 银行代码(如:ICBC)
+     - `remark`: 备注信息
+     - `status`: 状态(0禁用/1启用)
+
+2. **管理UI复制与适配**:
+   - 复制 `packages/advertisement-type-management-ui` → `packages/bank-name-management-ui`
+   - 组件重命名:`AdvertisementTypeManagement` → `BankNameManagement`
+   - 组件重命名:`AdvertisementTypeSelector` → `BankNameSelector`
+   - API客户端适配:`advertisementTypeClient` → `bankNameClient`
+   - 类型定义适配:`AdvertisementType` → `BankName`
+
+3. **与残疾人银行卡实体关联**:
+   - 在 `allin-packages/disability-module` 中建立关联
+   - 修改 `DisabledBankCard` 实体,将 `bankName` 字段改为外键关联
+   - 更新相关schema和DTO,支持银行名称ID引用
+
+4. **银行选择组件实现**:
+   - 基于 `BankNameSelector` 组件创建 `BankSelect` 组件
+   - 支持选项式选择(从银行名称模块获取数据)
+   - 支持用户自定义输入(参考省份选择逻辑)
+   - 集成到 `BankCardManagement` 组件中
+
+**实施步骤**:
+1. 创建银行名称模块(后端)
+2. 创建银行名称管理UI(管理界面)
+3. 更新残疾人模块,建立银行名称关联
+4. 创建银行选择组件
+5. 更新BankCardManagement组件集成银行选择
+6. 修复照片上传功能
+7. 添加银行卡类型字段
+8. 优化表单验证规则
+9. 更新测试用例
+
+**参考实现**:
+- 广告类型模块:`packages/advertisements-module/`
+- 广告类型管理UI:`packages/advertisement-type-management-ui/`
+- 省份选择组件:参考AreaSelect组件逻辑
+
 ## Change Log
 | Date | Version | Description | Author |
 |------|---------|-------------|--------|
 | 2025-12-10 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
+| 2025-12-10 | 1.1 | 添加基于广告类型模块的技术实现方案<br>- 银行名称模块架构设计<br>- 银行名称管理UI复制方案<br>- 与残疾人银行卡实体关联方案<br>- 详细实施步骤和文件结构 | John (Product Manager) |
 
 ## Dev Agent Record