|
|
@@ -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
|
|
|
|