Ready for Review - 照片上传功能已完善
As a 开发者, I want 将disability_person管理页面从allin_system-master/client移植为独立UI包@d8d/allin-disability-person-management-ui,完成技术栈转换并集成文件上传、区域选择器组件和枚举常量, so that 我们可以将Allin系统的残疾人个人管理UI模块集成到当前项目中,遵循现有的UI包结构和编码标准,并正确集成文件上传、区域选择器和枚举常量功能。
allin-packages/disability-person-management-ui目录结构@d8d/file-management-ui集成@d8d/area-management-ui的区域选择器组件用于残疾人详细地址管理(省份→城市→区县三级联动)@d8d/allin-enums包中的枚举@d8d/area-management-ui)[x] 任务1:创建残疾人个人管理UI包基础结构 (AC: 1, 9)
allin-packages/disability-person-management-ui/allin-packages/disability-person-management-ui/allin-packages/platform-management-ui/目录结构allin-packages/disability-person-management-ui/package.json@d8d/allin-disability-person-management-ui@d8d/allin-disability-module、@d8d/area-management-ui、@d8d/file-management-ui、@d8d/allin-enums、@d8d/shared-ui-components、@tanstack/react-query、react-hook-form、zodallin-packages/platform-management-ui/package.jsontsconfig.jsonallin-packages/disability-person-management-ui/tsconfig.jsonallin-packages/platform-management-ui/tsconfig.jsonvitest.config.tsallin-packages/disability-person-management-ui/vitest.config.tsallin-packages/platform-management-ui/vitest.config.tssrc/index.tsallin-packages/disability-person-management-ui/src/index.tsallin-packages/platform-management-ui/src/index.ts[x] 任务2:分析源系统文件并创建API客户端 (AC: 6)
allin_system-master/client/app/admin/dashboard/disability_person/page.tsxallin_system-master/client/app/admin/dashboard/disability_person/page.tsxallin-packages/disability-module/src/routes/disabled-person-custom.routes.tsallin-packages/disability-module/src/routes/disabled-person-custom.routes.tsallin-packages/disability-module/tests/integration/disability.integration.test.tsallin-packages/disability-module/tests/integration/disability.integration.test.tsallin-packages/disability-module/src/schemas/disabled-person.schema.tsallin-packages/disability-module/src/schemas/disabled-person.schema.tsCreateDisabledPersonSchema、UpdateDisabledPersonSchema、字段定义、验证规则(仅用于了解字段结构,不直接导入)src/api/disabilityClient.tsallin-packages/disability-person-management-ui/src/api/disabilityClient.tsInferRequestType和InferResponseType从RPC客户端推导类型allin-packages/platform-management-ui/src/api/platformClient.ts - 平台管理UI API客户端allin-packages/platform-management-ui/src/api/types.ts - 平台管理UI类型定义allin-packages/disability-management-ui/src/api/disabilityClient.ts - 残疾人管理UI API客户端(最新实现)[x] 任务3:实现文件上传集成 (AC: 3)
allin_system-master/client/app/admin/dashboard/disability_person/AddDisabledPersonModal.tsxallin_system-master/client/app/admin/dashboard/disability_person/AddDisabledPersonModal.tsxphotoType、photoUrl、canDownload字段allin_system-master/client/components/UploadCover/index.tsxallin_system-master/client/components/UploadCover/index.tsxmaxCount: 1,原系统通过多个实例实现多个照片上传packages/file-management-ui/src/components/FileSelector.tsxpackages/file-management-ui/src/components/FileSelector.tsxallin_system-master/client/app/admin/dashboard/disability_person/disabilityPersonService.tsallin_system-master/client/app/admin/dashboard/disability_person/disabilityPersonService.tsPOST /disability-persons/aggregated/create聚合API,照片数据包含photoType、photoUrl、canDownloadallin-packages/disability-module/src/routes/aggregated.routes.ts和src/services/aggregated.service.tsallin-packages/disability-module/src/routes/aggregated.routes.ts、src/services/aggregated.service.tsfileId字段引用文件模块,验证文件ID有效性,自动添加fileUrlsrc/components/PhotoUploadField.tsxallin-packages/disability-person-management-ui/src/components/PhotoUploadField.tsxFileSelector组件,支持多个照片上传、照片类型选择、是否可下载选项packages/file-management-ui/src/components/FileSelector.tsxphotos(照片数组字段)PhotoUploadField组件,表单接收照片数组参数photoType、fileId、canDownload字段src/components/PhotoPreview.tsxallin-packages/disability-person-management-ui/src/components/PhotoPreview.tsxFilePreview组件显示多个照片packages/file-management-ui/src/components/FilePreview.tsx[x] 任务4:实现区域选择器集成 (AC: 4)
packages/area-management-ui/src/components/AreaSelect.tsxpackages/area-management-ui/src/components/AreaSelect.tsxprovinceId、cityId、districtIdAreaSelect组件,支持三级联动[x] 任务5:实现枚举常量集成 (AC: 5)
allin-packages/enums/src/index.tsallin-packages/enums/src/index.tsgender、disabilityType、disabilityLevel等[x] 任务6:实现复杂表单组件 (AC: 2, 7, 8)
src/components/DisabilityPersonManagement.tsxallin-packages/disability-person-management-ui/src/components/DisabilityPersonManagement.tsxallin-packages/platform-management-ui/src/components/PlatformManagement.tsxsrc/components/DisabilityPersonForm.tsxallin-packages/disability-person-management-ui/src/components/DisabilityPersonForm.tsxsrc/components/RemarkManagement.tsxallin-packages/disability-person-management-ui/src/components/RemarkManagement.tsx[x] 任务7:编写集成测试 (AC: 10)
tests/integration/disability-person.integration.test.tsxallin-packages/disability-person-management-ui/tests/integration/disability-person.integration.test.tsxallin-packages/platform-management-ui/tests/integration/platform.integration.test.tsxdata-testid属性,避免使用文本查找[x] 任务8:验证和测试 (AC: 11)
pnpm typecheck确保无类型错误pnpm test确保所有集成测试通过根据故事008.005的UI包开发规范和经验,对原任务进行了优化:
InferRequestType和InferResponseType),无需创建独立的类型文件AreaSelect组件和Select组件,无需额外包装组件InferRequestType和InferResponseType从RPC客户端推导类型,而不是直接导入schema类型。allin-packages/platform-management-ui/src/api/types.ts - 平台管理UI类型定义allin-packages/disability-management-ui/src/api/types.ts - 残疾人管理UI类型定义(最新实现)allin-packages/disability-person-management-ui/(Allin系统专属包目录)allin-packages/platform-management-ui/(已完成的平台管理UI包)allin-packages/channel-management-ui/(已完成的渠道管理UI包)allin-packages/company-management-ui/(已完成的公司管理UI包)allin-packages/salary-management-ui/(已完成的薪资管理UI包)allin-packages/disability-management-ui/(已完成的残疾人管理UI包)allin-packages/disability-module/(对应的后端模块)packages/area-management-ui/(需要集成的区域选择器组件)packages/file-management-ui/(需要集成的文件上传组件)allin-packages/enums/(需要使用的枚举常量)allin_system-master/client/app/admin/dashboard/disability_person/page.tsx - 主页面allin_system-master/client/app/admin/dashboard/disability_person/AddDisabledPersonModal.tsx - 关键文件:包含多个照片上传实现allin_system-master/client/app/admin/dashboard/disability_person/DisabledPersonDetailModal.tsx - 详情模态框allin_system-master/client/app/admin/dashboard/disability_person/disabilityPersonService.ts - 服务层allin_system-master/client/app/admin/dashboard/disability_person/constant.ts - 常量定义allin_system-master/client/components/UploadCover/index.tsx - 照片上传组件(使用阿里云OSS上传)allin_system-master/client/lib/api.ts - API调用工具allin_system-master/client/store/disabilityPerson.ts - 状态管理(包含photosAtom)maxCount: 1(每个UploadCover实例只支持单文件上传)/disablity_system/disability_people/${fileName}allin-packages/platform-management-ui/src/components/PlatformManagement.tsxallin-packages/platform-management-ui/src/api/platformClient.tsallin-packages/platform-management-ui/src/api/types.tsallin-packages/platform-management-ui/tests/integration/platform.integration.test.tsxallin-packages/company-management-ui/src/components/CompanyManagement.tsxallin-packages/company-management-ui/src/api/companyClient.tsallin-packages/company-management-ui/src/types/index.tspackages/area-management-ui/src/components/AreaSelect.tsxpackages/area-management-ui/src/api/areaClient.tspackages/file-management-ui/src/components/FileSelector.tsxpackages/file-management-ui/src/components/FilePreview.tsxpackages/file-management-ui/src/api/fileClient.tsallin-packages/enums/src/index.ts原系统API调用方式(来自allin_system-master/client/app/admin/dashboard/disability_person/disabilityPersonService.ts):
POST /disability-persons/aggregated/create - 聚合创建残疾人所有信息(包含照片)GET /disability-persons/aggregated/:personId - 聚合查询残疾人所有信息(包含照片)GET /disability-persons - 获取残疾人列表DELETE /disability-persons/:personId - 删除残疾人PUT /disability-persons/:personId - 更新残疾人信息照片数据结构(来自CreateDisabledPersonData接口):
photos?: Array<{
photoType: string; // 照片类型
photoUrl: string; // 照片URL(阿里云OSS URL)
canDownload: number; // 是否可下载:1-是,0-否
}>;
照片上传流程:
UploadCover组件上传到阿里云OSS,获取photoUrl聚合API路由(来自allin-packages/disability-module/src/routes/aggregated.routes.ts):
POST /createAggregatedDisabledPerson - 聚合创建残疾人所有信息(包含照片)GET /getAggregatedDisabledPerson/{id} - 聚合查询残疾人所有信息(包含照片)PUT /updateAggregatedDisabledPerson/{id} - 聚合更新残疾人所有信息(包含照片)照片数据结构(来自DisabledPhotoSchema):
{
id?: number; // 照片ID(创建时可选)
personId?: number; // 残疾人ID(创建时可选)
photoType: string; // 照片类型
fileId: number; // **文件ID**(引用@d8d/file-module)
uploadTime?: Date; // 上传时间(创建时自动生成)
canDownload: number; // 是否可下载:1-是,0-否
}
照片验证逻辑(来自AggregatedService):
fileId的有效性(检查文件是否存在)fileUrl字段(从文件模块获取)照片上传流程(新系统):
FileSelector上传到文件模块,获取fileIdfileId)fileId并关联文件实体fileUrl(从文件模块获取)RPC客户端调用方式(来自allin-packages/disability-module/tests/integration/disability.integration.test.ts和allin-packages/disability-module/src/routes/disabled-person-custom.routes.ts):
disabilityClientManager.get().createDisabledPerson.$post({ json: personData }) - 创建残疾人记录disabilityClientManager.get().updateDisabledPerson.$post({ json: personData }) - 更新残疾人记录disabilityClientManager.get().deleteDisabledPerson.$post({ json: { id } }) - 删除残疾人记录disabilityClientManager.get().getDisabledPersonList.$get({ query: { page, pageSize, filters, sortBy, sortOrder } }) - 获取残疾人列表(分页)disabilityClientManager.get().getDisabledPersonById.$get({ query: { id } }) - 获取残疾人详情API路径映射(来自allin-packages/disability-module/src/routes/disabled-person-custom.routes.ts):
POST /createDisabledPerson → disabilityClientManager.get().createDisabledPerson.$postPOST /updateDisabledPerson → disabilityClientManager.get().updateDisabledPerson.$postPOST /deleteDisabledPerson → disabilityClientManager.get().deleteDisabledPerson.$postGET /getDisabledPersonList → disabilityClientManager.get().getDisabledPersonList.$getGET /getDisabledPersonById → disabilityClientManager.get().getDisabledPersonById.$get残疾人数据字段(来自allin-packages/disability-module/src/schemas/disabled-person.schema.ts):
name: string - 姓名gender: string - 性别idCard: string - 身份证号disabilityId: string - 残疾证号disabilityType: string - 残疾类型disabilityLevel: string - 残疾等级idAddress: string - 身份证地址phone: string - 联系电话province: string - 省份city: string - 城市FileSelector和FilePreview组件从@d8d/file-management-uiFileSelector组件限制文件类型为图片AreaSelect组件从@d8d/area-management-uiAreaSelect组件内置的省份→城市→区县三级联动功能AreaSelect组件返回{ provinceId?, cityId?, districtId? }格式AreaSelect组件集成@d8d/allin-enums测试标准:
tests/integration/disability-person.integration.test.tsx测试策略:
data-testid进行元素定位,避免文本查找| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-03 | 1.0 | 初始创建故事008.006 | Scrum Master Bob |
This section is populated by the development agent during implementation
Claude Code (d8d-model)
findByIdCard[':idCard'].$get → findByIdCard[':idCard']['$get'])@d8d/file-management-ui的FileSelector组件,但需要改进以支持多个照片上传@d8d/area-management-ui的AreaSelect组件,支持三级联动@d8d/allin-enums包的残疾类型和残疾等级枚举InferRequestType和InferResponseType),避免直接导入schema类型photoType字段,支持照片类型选择canDownload选项,支持是否可下载设置PhotoUploadField组件,集成FileSelector组件PhotoPreview组件用于照片预览新创建的文件:
allin-packages/disability-person-management-ui/package.json - 包配置文件allin-packages/disability-person-management-ui/tsconfig.json - TypeScript配置allin-packages/disability-person-management-ui/vitest.config.ts - 测试配置allin-packages/disability-person-management-ui/tests/setup.ts - 测试设置文件allin-packages/disability-person-management-ui/src/index.ts - 主入口文件allin-packages/disability-person-management-ui/src/components/index.ts - 组件导出文件allin-packages/disability-person-management-ui/src/api/index.ts - API导出文件allin-packages/disability-person-management-ui/src/api/disabilityClient.ts - API客户端allin-packages/disability-person-management-ui/src/components/DisabilityPersonManagement.tsx - 主管理组件allin-packages/disability-person-management-ui/tests/integration/disability-person.integration.test.tsx - 集成测试文件新创建的文件:
allin-packages/disability-person-management-ui/src/components/PhotoUploadField.tsx - 多个照片上传组件(已创建)allin-packages/disability-person-management-ui/src/components/PhotoPreview.tsx - 多个照片预览组件(已创建)修改的文件:
docs/stories/008.006.transplant-disability-person-management-ui.story.md - 更新任务完成状态和开发记录allin-packages/disability-person-management-ui/src/components/DisabilityPersonManagement.tsx - 已更新以支持多个照片上传allin-packages/disability-person-management-ui/src/api/disabilityClient.ts - 添加聚合API类型定义Results from QA Agent QA review of the completed story implementation