Quellcode durchsuchen

♻️ refactor(areas): 修改区域父级ID处理方式为null

- 将parentId字段从默认0改为null,以更准确表示顶级区域无父级
- 更新createAreaSchema和updateAreaSchema的验证规则,确保省/直辖市层级parentId为null
- 调整前端表单组件,将父级ID默认值从0改为null,并添加"顶级区域(无父级)"占位提示
- 更新区域编辑页面,修复parentId默认值处理逻辑
yourname vor 3 Monaten
Ursprung
Commit
fc0852e508

+ 8 - 8
packages/server/src/modules/areas/area.schema.ts

@@ -4,7 +4,7 @@ import { AreaLevel } from './area.entity';
 
 // 省市区创建Schema
 export const createAreaSchema = z.object({
-  parentId: z.number().int().min(0, '父级ID不能为负数').default(0),
+  parentId: z.number().int().min(0, '父级ID不能为负数').nullable().default(null),
   name: z.string().min(1, '区域名称不能为空').max(100, '区域名称不能超过100个字符'),
   level: z.nativeEnum(AreaLevel, {
     message: '层级必须是1(省/直辖市)、2(市)或3(区/县)'
@@ -13,21 +13,21 @@ export const createAreaSchema = z.object({
   isDisabled: z.nativeEnum(DisabledStatus).default(DisabledStatus.ENABLED),
 }).refine((data) => {
   // 验证层级和父级ID的关系
-  if (data.level === AreaLevel.PROVINCE && data.parentId !== 0) {
+  if (data.level === AreaLevel.PROVINCE && data.parentId !== null) {
     return false;
   }
-  if (data.level !== AreaLevel.PROVINCE && data.parentId === 0) {
+  if (data.level !== AreaLevel.PROVINCE && data.parentId === null) {
     return false;
   }
   return true;
 }, {
-  message: '层级和父级ID关系不正确:省/直辖市(parentId=0),市/区县(parentId>0)',
+  message: '层级和父级ID关系不正确:省/直辖市(parentId=null),市/区县(parentId>0)',
   path: ['parentId'],
 });
 
 // 省市区更新Schema
 export const updateAreaSchema = z.object({
-  parentId: z.number().int().min(0, '父级ID不能为负数').optional(),
+  parentId: z.number().int().min(0, '父级ID不能为负数').nullable().optional(),
   name: z.string().min(1, '区域名称不能为空').max(100, '区域名称不能超过100个字符').optional(),
   level: z.nativeEnum(AreaLevel, {
     message: '层级必须是1(省/直辖市)、2(市)或3(区/县)'
@@ -37,16 +37,16 @@ export const updateAreaSchema = z.object({
 }).refine((data) => {
   // 验证层级和父级ID的关系
   if (data.level && data.parentId !== undefined) {
-    if (data.level === AreaLevel.PROVINCE && data.parentId !== 0) {
+    if (data.level === AreaLevel.PROVINCE && data.parentId !== null) {
       return false;
     }
-    if (data.level !== AreaLevel.PROVINCE && data.parentId === 0) {
+    if (data.level !== AreaLevel.PROVINCE && data.parentId === null) {
       return false;
     }
   }
   return true;
 }, {
-  message: '层级和父级ID关系不正确:省/直辖市(parentId=0),市/区县(parentId>0)',
+  message: '层级和父级ID关系不正确:省/直辖市(parentId=null),市/区县(parentId>0)',
   path: ['parentId'],
 });
 

+ 3 - 2
web/src/client/admin/components/AreaForm.tsx

@@ -54,7 +54,7 @@ export const AreaForm: React.FC<AreaFormProps> = ({
       code: area.code,
       isDisabled: area.isDisabled,
     } : {
-      parentId: smartParentId || 0,
+      parentId: smartParentId || null,
       name: '',
       level: smartLevel ?? AreaLevel.PROVINCE,
       code: '',
@@ -103,9 +103,10 @@ export const AreaForm: React.FC<AreaFormProps> = ({
                 <FormControl>
                   <Input
                     type="number"
-                    value={field.value || 0}
+                    value={field.value || ''}
                     disabled
                     className="bg-muted"
+                    placeholder="顶级区域(无父级)"
                   />
                 </FormControl>
                 <FormDescription>

+ 1 - 1
web/src/client/admin/pages/Areas.tsx

@@ -577,7 +577,7 @@ export const AreasPage: React.FC = () => {
             <AreaForm
               area={{
                 id: selectedArea.id,
-                parentId: selectedArea.parentId || 0,
+                parentId: selectedArea.parentId || null,
                 name: selectedArea.name,
                 level: selectedArea.level,
                 code: selectedArea.code,