Bläddra i källkod

🐛 fix(company): 修复公司认证状态更新问题

- 完善UpdateCompanyDto定义,添加isCertified字段支持认证状态更新
- 修改company.entity.ts,在UpdateCompanyDto中扩展isCertified字段定义

📝 docs(company): 添加公司认证状态更新问题修复文档

- 创建fix-company-certification-issue.md文档
- 详细记录问题描述、分析、修复方案和测试步骤

♻️ refactor(crud): 优化通用CRUD服务的用户跟踪逻辑

- 修改generic-crud.service.ts,仅在数据包含对应字段时设置创建人和更新人
- 避免覆盖已存在的用户跟踪字段值
yourname 7 månader sedan
förälder
incheckning
ca7b04031f

+ 68 - 0
docs/fix-company-certification-issue.md

@@ -0,0 +1,68 @@
+# 公司认证状态更新问题修复方案
+
+## 问题描述
+在后端管理界面点击"公司认证管理"的"认证"按钮无法进行认证状态编辑和调整,表现为认证操作失败。
+
+## 问题分析
+经过分析,发现问题的根本原因是:
+
+1. **UpdateCompanyDto定义不完整**:当前的`UpdateCompanyDto`是通过`CreateCompanyDto.partial()`生成的,这意味着它只包含创建时的字段,而缺少认证相关的字段如`isCertified`。
+
+2. **认证状态字段缺失**:在更新DTO中没有明确定义`isCertified`字段,导致前端无法只更新认证状态。
+
+## 修复方案
+
+### 1. 修改公司实体文件
+文件:`src/server/modules/silver-jobs/company.entity.ts`
+
+**修改前:**
+```typescript
+export const UpdateCompanyDto = CreateCompanyDto.partial();
+```
+
+**修改后:**
+```typescript
+export const UpdateCompanyDto = CreateCompanyDto.partial().extend({
+  isCertified: z.coerce.number().int().min(0).max(1).optional().openapi({
+    description: '是否认证 0:未认证 1:已认证',
+    example: 1
+  })
+});
+```
+
+### 2. 验证前端调用方式
+前端调用方式看起来是正确的,使用PUT请求更新认证状态:
+
+```typescript
+const response = await companyCertificationClient[':id'].$put({
+  param: { id: id.toString() },
+  json: {
+    isCertified: certify ? 1 : 0,
+  },
+});
+```
+
+### 3. 测试验证
+修复后需要进行以下测试:
+
+1. **认证测试**:点击未认证公司的"认证"按钮
+2. **取消认证测试**:点击已认证公司的"取消"按钮
+3. **权限验证**:确保只有管理员能修改认证状态
+
+## 实施步骤
+
+1. **第一步**:修改`company.entity.ts`文件中的`UpdateCompanyDto`定义
+2. **第二步**:重启后端服务
+3. **第三步**:在前端管理界面测试认证功能
+
+## 验证标准
+
+- [ ] 点击"认证"按钮能够将未认证公司的状态改为已认证
+- [ ] 点击"取消"按钮能够将已认证公司的状态改为未认证
+- [ ] 操作后页面数据能够实时更新
+- [ ] 操作成功后显示成功消息
+
+## 注意事项
+- 确保数据库中的公司表有`is_certified`字段
+- 验证用户权限控制是否正常
+- 检查是否有其他字段限制导致更新失败

+ 6 - 1
src/server/modules/silver-jobs/company.entity.ts

@@ -118,7 +118,12 @@ export const CreateCompanyDto = z.object({
   })
 });
 
-export const UpdateCompanyDto = CreateCompanyDto.partial();
+export const UpdateCompanyDto = CreateCompanyDto.partial().extend({
+  isCertified: z.coerce.number().int().min(0).max(1).optional().openapi({
+    description: '是否认证 0:未认证 1:已认证',
+    example: 1
+  })
+});
 
 @Entity('silver_companies')
 export class Company {

+ 2 - 2
src/server/utils/generic-crud.service.ts

@@ -140,11 +140,11 @@ export abstract class GenericCrudService<T extends ObjectLiteral> {
     } = this.userTrackingOptions;
 
     // 设置创建人和更新人
-    if (isCreate && createdByField) {
+    if (isCreate && createdByField && data.hasOwnProperty(createdByField)) {
       data[createdByField] = userId;
     }
 
-    if (updatedByField) {
+    if (updatedByField && data.hasOwnProperty(updatedByField)) {
       data[updatedByField] = userId;
     }