| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- import { z } from 'zod';
- import { DisabledStatus } from '@/share/types';
- // 地点信息Schema - 用于其他模块引用
- export const locationInfoSchema = z.object({
- id: z.number().int().positive('地点ID必须为正整数'),
- name: z.string().min(1, '地点名称不能为空'),
- address: z.string().optional().nullable(),
- province: z.object({
- id: z.number().int().positive('省份ID必须为正整数'),
- name: z.string().min(1, '省份名称不能为空'),
- level: z.number().int().min(1).max(3),
- code: z.string().optional().nullable(),
- }).optional().nullable(),
- city: z.object({
- id: z.number().int().positive('城市ID必须为正整数'),
- name: z.string().min(1, '城市名称不能为空'),
- level: z.number().int().min(1).max(3),
- code: z.string().optional().nullable(),
- }).optional().nullable(),
- district: z.object({
- id: z.number().int().positive('区县ID必须为正整数'),
- name: z.string().min(1, '区县名称不能为空'),
- level: z.number().int().min(1).max(3),
- code: z.string().optional().nullable(),
- }).optional().nullable(),
- });
- // 地点创建Schema
- export const createLocationSchema = z.object({
- name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
- provinceId: z.number().int().positive('省份ID必须为正整数'),
- cityId: z.number().int().positive('城市ID必须为正整数'),
- districtId: z.number().int().positive('区县ID必须为正整数'),
- address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
- latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable().optional(),
- longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable().optional(),
- isDisabled: z.nativeEnum(DisabledStatus).default(DisabledStatus.ENABLED),
- });
- // 地点更新Schema
- export const updateLocationSchema = z.object({
- name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符').optional(),
- provinceId: z.number().int().positive('省份ID必须为正整数').optional(),
- cityId: z.number().int().positive('城市ID必须为正整数').optional(),
- districtId: z.number().int().positive('区县ID必须为正整数').optional(),
- address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符').optional(),
- latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable().optional(),
- longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable().optional(),
- isDisabled: z.nativeEnum(DisabledStatus).optional(),
- });
- // 地点获取Schema
- export const getLocationSchema = z.object({
- id: z.number().int().positive('ID必须为正整数'),
- name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
- provinceId: z.number().int().positive('省份ID必须为正整数'),
- cityId: z.number().int().positive('城市ID必须为正整数'),
- districtId: z.number().int().positive('区县ID必须为正整数'),
- address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
- latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable(),
- longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable(),
- isDisabled: z.nativeEnum(DisabledStatus),
- isDeleted: z.number().int(),
- createdAt: z.coerce.date(),
- updatedAt: z.coerce.date(),
- createdBy: z.number().int().nullable(),
- updatedBy: z.number().int().nullable(),
- });
- // 地点列表查询Schema
- export const listLocationsSchema = z.object({
- keyword: z.string().optional(),
- provinceId: z.coerce.number().int().positive().optional(),
- cityId: z.coerce.number().int().positive().optional(),
- districtId: z.coerce.number().int().positive().optional(),
- isDisabled: z.coerce.number().int().optional(),
- page: z.coerce.number().int().min(1).default(1),
- pageSize: z.coerce.number().int().min(1).max(100).default(20),
- sortBy: z.enum(['name', 'provinceId', 'cityId', 'districtId', 'createdAt']).default('createdAt'),
- sortOrder: z.enum(['ASC', 'DESC']).default('DESC'),
- });
- // 地点列表返回Schema
- export const locationListResponseSchema = z.object({
- id: z.number().int().positive('ID必须为正整数'),
- name: z.string().min(1, '地点名称不能为空').max(255, '地点名称不能超过255个字符'),
- provinceId: z.number().int().positive('省份ID必须为正整数'),
- cityId: z.number().int().positive('城市ID必须为正整数'),
- districtId: z.number().int().positive('区县ID必须为正整数'),
- address: z.string().min(1, '详细地址不能为空').max(500, '详细地址不能超过500个字符'),
- latitude: z.coerce.number().min(-90, '纬度必须在-90到90之间').max(90, '纬度必须在-90到90之间').nullable(),
- longitude: z.coerce.number().min(-180, '经度必须在-180到180之间').max(180, '经度必须在-180到180之间').nullable(),
- isDisabled: z.nativeEnum(DisabledStatus),
- isDeleted: z.number().int(),
- createdAt: z.coerce.date(),
- updatedAt: z.coerce.date(),
- createdBy: z.number().int().nullable(),
- updatedBy: z.number().int().nullable(),
- // 关联的省市区信息
- province: z.object({
- id: z.number().int().positive('省份ID必须为正整数'),
- name: z.string().min(1, '省份名称不能为空').max(100, '省份名称不能超过100个字符'),
- level: z.coerce.number().int().min(1).max(1, '省份层级必须为1'),
- code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
- }).nullable(),
- city: z.object({
- id: z.number().int().positive('城市ID必须为正整数'),
- name: z.string().min(1, '城市名称不能为空').max(100, '城市名称不能超过100个字符'),
- level: z.coerce.number().int().min(2).max(2, '城市层级必须为2'),
- code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
- }).nullable(),
- district: z.object({
- id: z.number().int().positive('区县ID必须为正整数'),
- name: z.string().min(1, '区县名称不能为空').max(100, '区县名称不能超过100个字符'),
- level: z.coerce.number().int().min(2).max(3, '区县层级必须在2-3之间'),
- code: z.string().min(1, '行政区划代码不能为空').max(20, '行政区划代码不能超过20个字符'),
- }).nullable(),
- });
- // 地点删除Schema
- export const deleteLocationSchema = z.object({
- id: z.number().int().positive('ID必须为正整数'),
- });
- // 地点启用/禁用Schema
- export const toggleLocationStatusSchema = z.object({
- id: z.number().int().positive('ID必须为正整数'),
- isDisabled: z.nativeEnum(DisabledStatus),
- });
- // 地点搜索Schema
- export const searchLocationsSchema = z.object({
- keyword: z.string().optional(),
- provinceId: z.coerce.number().int().positive().optional(),
- cityId: z.coerce.number().int().positive().optional(),
- districtId: z.coerce.number().int().positive().optional(),
- limit: z.coerce.number().int().min(1).max(50).default(20),
- });
- // 导出类型
- export type CreateLocationInput = z.infer<typeof createLocationSchema>;
- export type UpdateLocationInput = z.infer<typeof updateLocationSchema>;
- export type GetLocationInput = z.infer<typeof getLocationSchema>;
- export type ListLocationsInput = z.infer<typeof listLocationsSchema>;
- export type DeleteLocationInput = z.infer<typeof deleteLocationSchema>;
- export type ToggleLocationStatusInput = z.infer<typeof toggleLocationStatusSchema>;
- export type SearchLocationsInput = z.infer<typeof searchLocationsSchema>;
|