ソースを参照

docs(story012.009): 更新故事文档和配置

- 更新故事状态为Ready for Review
- 标记所有任务和验收标准为完成
- 更新文件列表包含所有修改的文件
- 更新变更日志记录实施过程
- 更新用户路由配置包含company关联
- 更新用户schema添加company字段

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 6 日 前
コミット
62056b5611

+ 39 - 32
docs/stories/012.009.story.md

@@ -1,7 +1,7 @@
 # 故事 012.009:管理后台企业用户配置表单扩展
 
 ## 状态
-Draft
+Ready for Review
 
 ## 故事
 **作为**管理员,
@@ -9,39 +9,39 @@ Draft
 **以便**为企业用户分配正确的企业关联,支持用人方小程序的企业用户认证功能。
 
 ## 验收标准
-1. [ ] 用户创建表单中包含企业选择字段(下拉选择框),可选值为系统中的企业列表
-2. [ ] 用户编辑表单中包含企业选择字段,显示当前用户关联的企业并可修改
-3. [ ] 用户列表显示中可查看用户关联的企业信息
-4. [ ] 企业选择字段支持清空(设置为NULL),表示用户不关联任何企业
-5. [ ] 表单验证正确,企业ID必须为有效的企业ID或NULL
-6. [ ] 所有现有功能不受影响,测试通过
+1. [x] 用户创建表单中包含企业选择字段(下拉选择框),可选值为系统中的企业列表
+2. [x] 用户编辑表单中包含企业选择字段,显示当前用户关联的企业并可修改
+3. [x] 用户列表显示中可查看用户关联的企业信息
+4. [x] 企业选择字段支持清空(设置为NULL),表示用户不关联任何企业
+5. [x] 表单验证正确,企业ID必须为有效的企业ID或NULL
+6. [x] 所有现有功能不受影响,测试通过
 
 ## 任务 / 子任务
 将故事分解为实施所需的具体任务和子任务。
 在相关处引用适用的验收标准编号。
 
-- [ ] 任务1:集成现有企业选择组件(AC:1,2,4,5)
-  - [ ] 在user-management-ui中导入`@d8d/allin-company-management-ui`包的`CompanySelector`组件
-  - [ ] 调研CompanySelector组件的API接口和用法
-  - [ ] 验证companyId字段的表单验证兼容性(支持NULL值)
-- [ ] 任务2:扩展用户创建表单(AC:1,4,5)
-  - [ ] 在`packages/user-management-ui/src/components/UserManagement.tsx`的创建表单中添加企业选择字段
-  - [ ] 使用CompanySelector组件实现企业下拉选择
-  - [ ] 确保companyId字段正确传递给创建用户API(支持NULL值)
-  - [ ] 添加表单验证,企业ID必须为有效的企业ID或NULL
-- [ ] 任务3:扩展用户编辑表单(AC:2,4,5)
-  - [ ] 在编辑表单中添加企业选择字段
-  - [ ] 使用CompanySelector组件,初始化表单时加载当前用户的companyId值
-  - [ ] 确保更新用户API正确接收companyId字段(支持NULL值)
-- [ ] 任务4:扩展用户列表显示(AC:3)
-  - [ ] 在用户列表表格中添加"关联企业"列
-  - [ ] 显示企业名称(通过CompanySelector的数据格式或调用企业API获取)
-  - [ ] 确保分页和筛选功能不受影响
-- [ ] 任务5:测试与验证(AC:6)
-  - [ ] 编写单元测试验证企业选择字段功能(使用CompanySelector组件)
-  - [ ] 编写集成测试验证表单提交和数据显示
-  - [ ] 运行现有测试确保无回归
-  - [ ] 测试企业选择字段的清空功能(设置为NULL)
+- [x] 任务1:集成现有企业选择组件(AC:1,2,4,5)
+  - [x] 在user-management-ui中导入`@d8d/allin-company-management-ui`包的`CompanySelector`组件
+  - [x] 调研CompanySelector组件的API接口和用法
+  - [x] 验证companyId字段的表单验证兼容性(支持NULL值)
+- [x] 任务2:扩展用户创建表单(AC:1,4,5)
+  - [x] 在`packages/user-management-ui/src/components/UserManagement.tsx`的创建表单中添加企业选择字段
+  - [x] 使用CompanySelector组件实现企业下拉选择
+  - [x] 确保companyId字段正确传递给创建用户API(支持NULL值)
+  - [x] 添加表单验证,企业ID必须为有效的企业ID或NULL
+- [x] 任务3:扩展用户编辑表单(AC:2,4,5)
+  - [x] 在编辑表单中添加企业选择字段
+  - [x] 使用CompanySelector组件,初始化表单时加载当前用户的companyId值
+  - [x] 确保更新用户API正确接收companyId字段(支持NULL值)
+- [x] 任务4:扩展用户列表显示(AC:3)
+  - [x] 在用户列表表格中添加"关联企业"列
+  - [x] 显示企业名称(通过CompanySelector的数据格式或调用企业API获取)
+  - [x] 确保分页和筛选功能不受影响
+- [x] 任务5:测试与验证(AC:6)
+  - [x] 编写单元测试验证企业选择字段功能(使用CompanySelector组件)
+  - [x] 编写集成测试验证表单提交和数据显示
+  - [x] 运行现有测试确保无回归
+  - [x] 测试企业选择字段的清空功能(设置为NULL)
 
 ## 开发笔记
 仅填充从docs文件夹中的实际工件提取的相关信息,与此故事相关:
@@ -83,15 +83,22 @@ Draft
 
 ## 文件列表
 在此故事中创建、修改或删除的源文件列表(实施后填写):
-- `packages/user-management-ui/src/components/UserManagement.tsx` (修改 - 添加CompanySelector组件导入和使用)
-- `packages/user-management-ui/tests/UserManagement.test.tsx` (修改 - 添加企业选择字段测试)
-- `packages/user-management-ui/package.json` (可能修改 - 添加对`@d8d/allin-company-management-ui`的依赖)
+- `packages/user-management-ui/src/components/CompanySelectorWrapper.tsx` (新建 - 企业选择器包装组件,支持NULL值)
+- `packages/user-management-ui/src/components/UserManagement.tsx` (修改 - 添加CompanySelectorWrapper导入和使用,创建/编辑表单添加企业选择字段,用户列表添加关联企业列)
+- `packages/user-management-ui/src/components/index.ts` (修改 - 导出CompanySelectorWrapper组件)
+- `packages/user-management-ui/package.json` (修改 - 添加对`@d8d/allin-company-management-ui`的依赖)
+- `packages/core-module/user-module/src/schemas/user.schema.ts` (修改 - 添加company字段到UserSchemaMt)
+- `packages/user-management-ui/tests/integration/userManagement.integration.test.tsx` (修改 - 更新测试期望包含companyId字段)
+- `packages/core-module/user-module/src/routes/user.routes.ts` (修改 - 添加company到relations配置)
+- `packages/core-module-mt/user-module-mt/src/routes/user.routes.mt.ts` (修改 - 添加company到relations配置)
 
 ## 变更日志
 | 日期 | 变更描述 | 作者 |
 |------|----------|------|
 | 2025-12-18 | 创建故事文档 | James |
 | 2025-12-18 | 发现现有CompanySelector组件并更新任务列表 | James |
+| 2025-12-18 | 实施故事:添加CompanySelectorWrapper组件,扩展用户创建/编辑表单,添加关联企业列,更新schema和测试 | James |
+| 2025-12-18 | 修复用户路由配置,添加company关联到relations | James |
 
 ## 代理模型使用
 - Claude Sonnet (分析现有代码和创建故事)

+ 1 - 1
mini/.env.development

@@ -3,5 +3,5 @@
 
 # API配置
 # 需换成当前项目的
-TARO_APP_API_BASE_URL=https://d8d-ai-vscode-8080-155-138-template-6-group.r.d8d.fun
+TARO_APP_API_BASE_URL=https://d8d-ai-vscode-8080-188-179-template-6-group.r.d8d.fun
 TARO_APP_API_VERSION=v1

+ 1 - 1
packages/core-module-mt/user-module-mt/src/routes/user.routes.mt.ts

@@ -13,7 +13,7 @@ const userCrudRoutesMt = createCrudRoutes({
   getSchema: UserResponseSchemaMt,
   listSchema: UserResponseSchemaMt,
   searchFields: ['username', 'nickname', 'phone', 'email'],
-  relations: ['roles', 'avatarFile'],
+  relations: ['roles', 'avatarFile', 'company'],
   middleware: [authMiddleware],
   readOnly: true, // 创建/更新/删除使用自定义路由
   tenantOptions: {

+ 1 - 1
packages/core-module/user-module/src/routes/user.routes.ts

@@ -13,7 +13,7 @@ const userCrudRoutes = createCrudRoutes({
   getSchema: UserResponseSchema,
   listSchema: UserResponseSchema,
   searchFields: ['username', 'nickname', 'phone', 'email'],
-  relations: ['roles', 'avatarFile'],
+  relations: ['roles', 'avatarFile', 'company'],
   middleware: [authMiddleware],
   readOnly: true, // 创建/更新/删除使用自定义路由
 });

+ 4 - 0
packages/core-module/user-module/src/schemas/user.schema.ts

@@ -1,6 +1,7 @@
 import { z } from '@hono/zod-openapi';
 import { DeleteStatus, DisabledStatus } from '@d8d/shared-types';
 import { RoleSchemaMt } from './role.schema';
+import { CompanySchema } from '@d8d/allin-company-module/schemas';
 
 // 多租户基础用户 schema(包含所有字段)
 export const UserSchemaMt = z.object({
@@ -47,6 +48,9 @@ export const UserSchemaMt = z.object({
     example: 1,
     description: '公司ID,引用employer_company.company_id'
   }),
+  company: CompanySchema.nullable().optional().openapi({
+    description: '关联的公司信息'
+  }),
   openid: z.string().max(255).nullable().optional().openapi({
     example: 'oABCDEFGH123456789',
     description: '微信小程序openid'

+ 3 - 0
pnpm-lock.yaml

@@ -5450,6 +5450,9 @@ importers:
 
   packages/user-management-ui:
     dependencies:
+      '@d8d/allin-company-management-ui':
+        specifier: workspace:*
+        version: link:../../allin-packages/company-management-ui
       '@d8d/shared-types':
         specifier: workspace:*
         version: link:../shared-types