order.mt.schema.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. import { z } from '@hono/zod-openapi';
  2. // 订单状态枚举
  3. export const OrderStatus = {
  4. PENDING: 0, // 未发货
  5. SHIPPED: 1, // 已发货
  6. RECEIVED: 2, // 收货成功
  7. RETURNED: 3, // 已退货
  8. } as const;
  9. // 支付状态枚举
  10. export const PayStatus = {
  11. UNPAID: 0, // 未支付
  12. PAYING: 1, // 支付中
  13. SUCCESS: 2, // 支付成功
  14. REFUNDED: 3, // 已退款
  15. FAILED: 4, // 支付失败
  16. CLOSED: 5, // 订单关闭
  17. } as const;
  18. // 订单类型枚举
  19. export const OrderType = {
  20. PHYSICAL: 1, // 实物订单
  21. VIRTUAL: 2, // 虚拟订单
  22. } as const;
  23. // 支付类型枚举
  24. export const PayType = {
  25. POINTS: 1, // 积分
  26. COUPON: 2, // 礼券
  27. } as const;
  28. // 多租户订单基础Schema
  29. export const OrderSchema = z.object({
  30. id: z.number().int().positive().optional().openapi({
  31. description: '订单ID',
  32. example: 1
  33. }),
  34. tenantId: z.number().int().positive().openapi({
  35. description: '租户ID',
  36. example: 1
  37. }),
  38. orderNo: z.string().min(1, '订单号不能为空').max(50, '订单号最多50个字符').openapi({
  39. description: '订单号',
  40. example: 'ORD20240101123456'
  41. }),
  42. userId: z.number().int().positive().openapi({
  43. description: '用户ID',
  44. example: 1
  45. }),
  46. authCode: z.string().max(32, '付款码最多32个字符').nullable().optional().openapi({
  47. description: '付款码',
  48. example: '12345678901234567890123456789012'
  49. }),
  50. cardNo: z.string().max(32, '卡号最多32个字符').nullable().optional().openapi({
  51. description: '卡号',
  52. example: '6222********1234'
  53. }),
  54. sjtCardNo: z.string().max(32, '盛京通卡号最多32个字符').nullable().optional().openapi({
  55. description: '盛京通卡号',
  56. example: 'SJT1234567890'
  57. }),
  58. amount: z.coerce.number<number>().min(0, '订单金额不能小于0').max(999999.99, '订单金额不能超过999999.99').openapi({
  59. description: '订单金额',
  60. example: 99.99
  61. }),
  62. costAmount: z.coerce.number<number>().min(0, '成本金额不能小于0').max(999999.99, '成本金额不能超过999999.99').default(0).openapi({
  63. description: '成本金额',
  64. example: 50.00
  65. }),
  66. freightAmount: z.coerce.number<number>().min(0, '运费不能小于0').max(999999.99, '运费不能超过999999.99').default(0).openapi({
  67. description: '运费',
  68. example: 10.00
  69. }),
  70. discountAmount: z.coerce.number<number>().min(0, '优惠金额不能小于0').max(999999.99, '优惠金额不能超过999999.99').default(0).openapi({
  71. description: '优惠金额',
  72. example: 5.00
  73. }),
  74. payAmount: z.coerce.number<number>().min(0, '实际支付金额不能小于0').max(999999.99, '实际支付金额不能超过999999.99').default(0).openapi({
  75. description: '实际支付金额',
  76. example: 94.99
  77. }),
  78. deviceNo: z.string().max(255, '设备编号最多255个字符').nullable().optional().openapi({
  79. description: '设备编号',
  80. example: 'DEV001234'
  81. }),
  82. description: z.string().max(255, '订单描述最多255个字符').nullable().optional().openapi({
  83. description: '订单描述',
  84. example: '购买商品'
  85. }),
  86. goodsDetail: z.string().max(2000, '订单详情最多2000个字符').nullable().optional().openapi({
  87. description: '订单详情(json格式)',
  88. example: '[{"goodsId":1,"name":"商品1","price":99.99,"num":1}]'
  89. }),
  90. goodsTag: z.string().max(255, '订单优惠标记最多255个字符').nullable().optional().openapi({
  91. description: '订单优惠标记',
  92. example: '满100减5'
  93. }),
  94. address: z.string().max(255, '地址最多255个字符').nullable().optional().openapi({
  95. description: '地址',
  96. example: '北京市朝阳区xxx路xxx号'
  97. }),
  98. orderType: z.coerce.number().int().min(1, '订单类型最小为1').max(2, '订单类型最大为2').default(1).openapi({
  99. description: '订单类型 1实物订单 2虚拟订单',
  100. example: 1
  101. }),
  102. payType: z.coerce.number().int().min(0, '支付类型最小为0').max(2, '支付类型最大为2').default(0).openapi({
  103. description: '支付类型1积分2礼券',
  104. example: 1
  105. }),
  106. payState: z.coerce.number().int().min(0, '支付状态最小为0').max(5, '支付状态最大为5').default(0).openapi({
  107. description: '支付状态 0未支付1支付中2支付成功3已退款4支付失败5订单关闭',
  108. example: 2
  109. }),
  110. state: z.coerce.number().int().min(0, '订单状态最小为0').max(3, '订单状态最大为3').default(0).openapi({
  111. description: '订单状态 0未发货1已发货2收货成功3已退货',
  112. example: 0
  113. }),
  114. userPhone: z.string().max(50, '用户手机号最多50个字符').nullable().optional().openapi({
  115. description: '用户手机号',
  116. example: '13800138000'
  117. }),
  118. merchantId: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  119. description: '商户id',
  120. example: 1
  121. }),
  122. merchantNo: z.coerce.number().int().min(0, '不能小于0').nullable().optional().openapi({
  123. description: '商户号',
  124. example: 1001
  125. }),
  126. supplierId: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  127. description: '供货商id',
  128. example: 1
  129. }),
  130. addressId: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  131. description: '地址id',
  132. example: 1
  133. }),
  134. receiverMobile: z.string().max(255, '收货人手机号最多255个字符').nullable().optional().openapi({
  135. description: '收货人手机号',
  136. example: '13800138000'
  137. }),
  138. recevierName: z.string().max(255, '收货人姓名最多255个字符').nullable().optional().openapi({
  139. description: '收货人姓名',
  140. example: '张三'
  141. }),
  142. recevierProvince: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  143. description: '收货人所在省',
  144. example: 110000
  145. }),
  146. recevierCity: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  147. description: '收货人所在市',
  148. example: 110100
  149. }),
  150. recevierDistrict: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  151. description: '收货人所在区',
  152. example: 110105
  153. }),
  154. recevierTown: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  155. description: '收货人所在街道',
  156. example: 110105001
  157. }),
  158. refundTime: z.coerce.date().nullable().optional().openapi({
  159. description: '退款时间',
  160. example: '2024-01-01T12:00:00Z'
  161. }),
  162. closeTime: z.coerce.date().nullable().optional().openapi({
  163. description: '订单关闭时间',
  164. example: '2024-01-01T12:00:00Z'
  165. }),
  166. remark: z.string().max(255, '管理员备注信息最多255个字符').nullable().optional().openapi({
  167. description: '管理员备注信息',
  168. example: '请尽快发货'
  169. }),
  170. createdBy: z.number().int().positive().nullable().optional().openapi({
  171. description: '创建人ID',
  172. example: 1
  173. }),
  174. updatedBy: z.number().int().positive().nullable().optional().openapi({
  175. description: '更新人ID',
  176. example: 1
  177. }),
  178. createdAt: z.coerce.date().openapi({
  179. description: '创建时间',
  180. example: '2024-01-01T12:00:00Z'
  181. }),
  182. updatedAt: z.coerce.date().openapi({
  183. description: '更新时间',
  184. example: '2024-01-01T12:00:00Z'
  185. }),
  186. // 关联实体
  187. user: z.object({
  188. id: z.number().int().positive().openapi({ description: '用户ID' }),
  189. username: z.string().openapi({ description: '用户名', example: 'user123' }),
  190. phone: z.string().nullable().openapi({ description: '手机号', example: '13800138000' })
  191. }).nullable().optional().openapi({
  192. description: '用户信息'
  193. }),
  194. merchant: z.object({
  195. id: z.number().int().positive().openapi({ description: '商户ID' }),
  196. name: z.string().openapi({ description: '商户名称', example: '商户A' })
  197. }).nullable().optional().openapi({
  198. description: '商户信息'
  199. }),
  200. supplier: z.object({
  201. id: z.number().int().positive().openapi({ description: '供货商ID' }),
  202. name: z.string().openapi({ description: '供货商名称', example: '供货商A' })
  203. }).nullable().optional().openapi({
  204. description: '供货商信息'
  205. }),
  206. deliveryAddress: z.object({
  207. id: z.number().int().positive().openapi({ description: '地址ID' }),
  208. name: z.string().openapi({ description: '收货人姓名', example: '张三' }),
  209. phone: z.string().openapi({ description: '收货人电话', example: '13800138000' }),
  210. address: z.string().openapi({ description: '详细地址', example: '北京市朝阳区xxx路xxx号' })
  211. }).nullable().optional().openapi({
  212. description: '收货地址信息'
  213. })
  214. });
  215. // 创建订单DTO
  216. export const CreateOrderDto = z.object({
  217. orderNo: z.string().min(1, '订单号不能为空').max(50, '订单号最多50个字符').openapi({
  218. description: '订单号',
  219. example: 'ORD20240101123456'
  220. }),
  221. userId: z.number().int().positive('用户ID必须是正整数').openapi({
  222. description: '用户ID',
  223. example: 1
  224. }),
  225. authCode: z.string().max(32, '付款码最多32个字符').nullable().optional().openapi({
  226. description: '付款码',
  227. example: '12345678901234567890123456789012'
  228. }),
  229. cardNo: z.string().max(32, '卡号最多32个字符').nullable().optional().openapi({
  230. description: '卡号',
  231. example: '6222********1234'
  232. }),
  233. sjtCardNo: z.string().max(32, '盛京通卡号最多32个字符').nullable().optional().openapi({
  234. description: '盛京通卡号',
  235. example: 'SJT1234567890'
  236. }),
  237. amount: z.coerce.number<number>().min(0, '订单金额不能小于0').max(999999.99, '订单金额不能超过999999.99').openapi({
  238. description: '订单金额',
  239. example: 99.99
  240. }),
  241. costAmount: z.coerce.number<number>().min(0, '成本金额不能小于0').max(999999.99, '成本金额不能超过999999.99').default(0).optional().openapi({
  242. description: '成本金额',
  243. example: 50.00
  244. }),
  245. freightAmount: z.coerce.number<number>().min(0, '运费不能小于0').max(999999.99, '运费不能超过999999.99').default(0).optional().openapi({
  246. description: '运费',
  247. example: 10.00
  248. }),
  249. discountAmount: z.coerce.number<number>().min(0, '优惠金额不能小于0').max(999999.99, '优惠金额不能超过999999.99').default(0).optional().openapi({
  250. description: '优惠金额',
  251. example: 5.00
  252. }),
  253. payAmount: z.coerce.number<number>().min(0, '实际支付金额不能小于0').max(999999.99, '实际支付金额不能超过999999.99').default(0).optional().openapi({
  254. description: '实际支付金额',
  255. example: 94.99
  256. }),
  257. deviceNo: z.string().max(255, '设备编号最多255个字符').nullable().optional().openapi({
  258. description: '设备编号',
  259. example: 'DEV001234'
  260. }),
  261. description: z.string().max(255, '订单描述最多255个字符').nullable().optional().openapi({
  262. description: '订单描述',
  263. example: '购买商品'
  264. }),
  265. goodsDetail: z.string().max(2000, '订单详情最多2000个字符').nullable().optional().openapi({
  266. description: '订单详情(json格式)',
  267. example: '[{"goodsId":1,"name":"商品1","price":99.99,"num":1}]'
  268. }),
  269. goodsTag: z.string().max(255, '订单优惠标记最多255个字符').nullable().optional().openapi({
  270. description: '订单优惠标记',
  271. example: '满100减5'
  272. }),
  273. address: z.string().max(255, '地址最多255个字符').nullable().optional().openapi({
  274. description: '地址',
  275. example: '北京市朝阳区xxx路xxx号'
  276. }),
  277. orderType: z.coerce.number().int().min(1, '订单类型最小为1').max(2, '订单类型最大为2').default(1).openapi({
  278. description: '订单类型 1实物订单 2虚拟订单',
  279. example: 1
  280. }),
  281. payType: z.coerce.number().int().min(0, '支付类型最小为0').max(2, '支付类型最大为2').default(0).openapi({
  282. description: '支付类型1积分2礼券',
  283. example: 1
  284. }),
  285. payState: z.coerce.number().int().min(0, '支付状态最小为0').max(5, '支付状态最大为5').default(0).openapi({
  286. description: '支付状态 0未支付1支付中2支付成功3已退款4支付失败5订单关闭',
  287. example: 2
  288. }),
  289. state: z.coerce.number().int().min(0, '订单状态最小为0').max(3, '订单状态最大为3').default(0).openapi({
  290. description: '订单状态 0未发货1已发货2收货成功3已退货',
  291. example: 0
  292. }),
  293. userPhone: z.string().max(50, '用户手机号最多50个字符').nullable().optional().openapi({
  294. description: '用户手机号',
  295. example: '13800138000'
  296. }),
  297. merchantId: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  298. description: '商户id',
  299. example: 1
  300. }),
  301. merchantNo: z.coerce.number().int().min(0, '不能小于0').nullable().optional().openapi({
  302. description: '商户号',
  303. example: 1001
  304. }),
  305. supplierId: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  306. description: '供货商id',
  307. example: 1
  308. }),
  309. addressId: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  310. description: '地址id',
  311. example: 1
  312. }),
  313. receiverMobile: z.string().max(255, '收货人手机号最多255个字符').nullable().optional().openapi({
  314. description: '收货人手机号',
  315. example: '13800138000'
  316. }),
  317. recevierName: z.string().max(255, '收货人姓名最多255个字符').nullable().optional().openapi({
  318. description: '收货人姓名',
  319. example: '张三'
  320. }),
  321. recevierProvince: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  322. description: '收货人所在省',
  323. example: 110000
  324. }),
  325. recevierCity: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  326. description: '收货人所在市',
  327. example: 110100
  328. }),
  329. recevierDistrict: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  330. description: '收货人所在区',
  331. example: 110105
  332. }),
  333. recevierTown: z.coerce.number().int().min(0, '不能小于0').default(0).openapi({
  334. description: '收货人所在街道',
  335. example: 110105001
  336. }),
  337. refundTime: z.coerce.date().nullable().optional().openapi({
  338. description: '退款时间',
  339. example: '2024-01-01T12:00:00Z'
  340. }),
  341. closeTime: z.coerce.date().nullable().optional().openapi({
  342. description: '订单关闭时间',
  343. example: '2024-01-01T12:00:00Z'
  344. }),
  345. remark: z.string().max(255, '管理员备注信息最多255个字符').nullable().optional().openapi({
  346. description: '管理员备注信息',
  347. example: '请尽快发货'
  348. })
  349. });
  350. // 更新订单DTO
  351. export const UpdateOrderDto = z.object({
  352. orderNo: z.string().min(1, '订单号不能为空').max(50, '订单号最多50个字符').optional().openapi({
  353. description: '订单号',
  354. example: 'ORD20240101123456'
  355. }),
  356. userId: z.number().int().positive('用户ID必须是正整数').optional().openapi({
  357. description: '用户ID',
  358. example: 1
  359. }),
  360. authCode: z.string().max(32, '付款码最多32个字符').nullable().optional().openapi({
  361. description: '付款码',
  362. example: '12345678901234567890123456789012'
  363. }),
  364. cardNo: z.string().max(32, '卡号最多32个字符').nullable().optional().openapi({
  365. description: '卡号',
  366. example: '6222********1234'
  367. }),
  368. sjtCardNo: z.string().max(32, '盛京通卡号最多32个字符').nullable().optional().openapi({
  369. description: '盛京通卡号',
  370. example: 'SJT1234567890'
  371. }),
  372. amount: z.coerce.number<number>().min(0, '订单金额不能小于0').max(999999.99, '订单金额不能超过999999.99').optional().openapi({
  373. description: '订单金额',
  374. example: 99.99
  375. }),
  376. costAmount: z.coerce.number<number>().min(0, '成本金额不能小于0').max(999999.99, '成本金额不能超过999999.99').optional().openapi({
  377. description: '成本金额',
  378. example: 50.00
  379. }),
  380. freightAmount: z.coerce.number<number>().min(0, '运费不能小于0').max(999999.99, '运费不能超过999999.99').optional().openapi({
  381. description: '运费',
  382. example: 10.00
  383. }),
  384. discountAmount: z.coerce.number<number>().min(0, '优惠金额不能小于0').max(999999.99, '优惠金额不能超过999999.99').optional().openapi({
  385. description: '优惠金额',
  386. example: 5.00
  387. }),
  388. payAmount: z.coerce.number<number>().min(0, '实际支付金额不能小于0').max(999999.99, '实际支付金额不能超过999999.99').optional().openapi({
  389. description: '实际支付金额',
  390. example: 94.99
  391. }),
  392. deviceNo: z.string().max(255, '设备编号最多255个字符').nullable().optional().openapi({
  393. description: '设备编号',
  394. example: 'DEV001234'
  395. }),
  396. description: z.string().max(255, '订单描述最多255个字符').nullable().optional().openapi({
  397. description: '订单描述',
  398. example: '购买商品'
  399. }),
  400. goodsDetail: z.string().max(2000, '订单详情最多2000个字符').nullable().optional().openapi({
  401. description: '订单详情(json格式)',
  402. example: '[{"goodsId":1,"name":"商品1","price":99.99,"num":1}]'
  403. }),
  404. goodsTag: z.string().max(255, '订单优惠标记最多255个字符').nullable().optional().openapi({
  405. description: '订单优惠标记',
  406. example: '满100减5'
  407. }),
  408. address: z.string().max(255, '地址最多255个字符').nullable().optional().openapi({
  409. description: '地址',
  410. example: '北京市朝阳区xxx路xxx号'
  411. }),
  412. orderType: z.coerce.number().int().min(1, '订单类型最小为1').max(2, '订单类型最大为2').optional().openapi({
  413. description: '订单类型 1实物订单 2虚拟订单',
  414. example: 1
  415. }),
  416. payType: z.coerce.number().int().min(0, '支付类型最小为0').max(2, '支付类型最大为2').optional().openapi({
  417. description: '支付类型1积分2礼券',
  418. example: 1
  419. }),
  420. payState: z.coerce.number().int().min(0, '支付状态最小为0').max(5, '支付状态最大为5').optional().openapi({
  421. description: '支付状态 0未支付1支付中2支付成功3已退款4支付失败5订单关闭',
  422. example: 2
  423. }),
  424. state: z.coerce.number().int().min(0, '订单状态最小为0').max(3, '订单状态最大为3').optional().openapi({
  425. description: '订单状态 0未发货1已发货2收货成功3已退货',
  426. example: 0
  427. }),
  428. userPhone: z.string().max(50, '用户手机号最多50个字符').nullable().optional().openapi({
  429. description: '用户手机号',
  430. example: '13800138000'
  431. }),
  432. merchantId: z.coerce.number().int().positive().optional().openapi({
  433. description: '商户id',
  434. example: 1
  435. }),
  436. merchantNo: z.coerce.number().int().min(0, '不能小于0').nullable().optional().openapi({
  437. description: '商户号',
  438. example: 1001
  439. }),
  440. supplierId: z.coerce.number().int().positive().optional().openapi({
  441. description: '供货商id',
  442. example: 1
  443. }),
  444. addressId: z.coerce.number().int().positive().optional().openapi({
  445. description: '地址id',
  446. example: 1
  447. }),
  448. receiverMobile: z.string().max(255, '收货人手机号最多255个字符').nullable().optional().openapi({
  449. description: '收货人手机号',
  450. example: '13800138000'
  451. }),
  452. recevierName: z.string().max(255, '收货人姓名最多255个字符').nullable().optional().openapi({
  453. description: '收货人姓名',
  454. example: '张三'
  455. }),
  456. recevierProvince: z.coerce.number().int().positive().optional().openapi({
  457. description: '收货人所在省',
  458. example: 110000
  459. }),
  460. recevierCity: z.coerce.number().int().positive().optional().openapi({
  461. description: '收货人所在市',
  462. example: 110100
  463. }),
  464. recevierDistrict: z.coerce.number().int().positive().optional().openapi({
  465. description: '收货人所在区',
  466. example: 110105
  467. }),
  468. recevierTown: z.coerce.number().int().positive().optional().openapi({
  469. description: '收货人所在街道',
  470. example: 110105001
  471. }),
  472. refundTime: z.coerce.date().nullable().optional().openapi({
  473. description: '退款时间',
  474. example: '2024-01-01T12:00:00Z'
  475. }),
  476. closeTime: z.coerce.date().nullable().optional().openapi({
  477. description: '订单关闭时间',
  478. example: '2024-01-01T12:00:00Z'
  479. }),
  480. remark: z.string().max(255, '管理员备注信息最多255个字符').nullable().optional().openapi({
  481. description: '管理员备注信息',
  482. example: '请尽快发货'
  483. })
  484. });
  485. // 订单列表响应Schema
  486. export const OrderListResponse = z.object({
  487. data: z.array(OrderSchema),
  488. pagination: z.object({
  489. total: z.number().openapi({ example: 100, description: '总记录数' }),
  490. current: z.number().openapi({ example: 1, description: '当前页码' }),
  491. pageSize: z.number().openapi({ example: 10, description: '每页数量' })
  492. })
  493. });
  494. // 订单列表Schema - 用于列表查询,只包含必要字段且全部可选
  495. export const OrderListSchema = z.object({
  496. id: z.coerce.number().int().positive().optional().openapi({
  497. description: '订单ID',
  498. example: 1
  499. }),
  500. tenantId: z.number().int().positive().optional().openapi({
  501. description: '租户ID',
  502. example: 1
  503. }),
  504. orderNo: z.string().min(1, '订单号不能为空').max(50, '订单号最多50个字符').optional().openapi({
  505. description: '订单号',
  506. example: 'ORD20240101123456'
  507. }),
  508. userId: z.number().int().positive().optional().openapi({
  509. description: '用户ID',
  510. example: 1
  511. }),
  512. amount: z.coerce.number<number>().min(0, '订单金额不能小于0').max(999999.99, '订单金额不能超过999999.99').optional().openapi({
  513. description: '订单金额',
  514. example: 99.99
  515. }),
  516. payAmount: z.coerce.number<number>().min(0, '实际支付金额不能小于0').max(999999.99, '实际支付金额不能超过999999.99').default(0).optional().openapi({
  517. description: '实际支付金额',
  518. example: 94.99
  519. }),
  520. orderType: z.coerce.number().int().min(1, '订单类型最小为1').max(2, '订单类型最大为2').default(1).optional().openapi({
  521. description: '订单类型 1实物订单 2虚拟订单',
  522. example: 1
  523. }),
  524. payState: z.coerce.number().int().min(0, '支付状态最小为0').max(5, '支付状态最大为5').default(0).optional().openapi({
  525. description: '支付状态 0未支付1支付中2支付成功3已退款4支付失败5订单关闭',
  526. example: 2
  527. }),
  528. state: z.coerce.number().int().min(0, '订单状态最小为0').max(3, '订单状态最大为3').default(0).optional().openapi({
  529. description: '订单状态 0未发货1已发货2收货成功3已退货',
  530. example: 0
  531. }),
  532. createdAt: z.coerce.date().optional().openapi({
  533. description: '创建时间',
  534. example: '2024-01-01T12:00:00Z'
  535. }),
  536. updatedAt: z.coerce.date().optional().openapi({
  537. description: '更新时间',
  538. example: '2024-01-01T12:00:00Z'
  539. }),
  540. // 关联实体
  541. user: z.object({
  542. id: z.number().int().positive().openapi({ description: '用户ID' }),
  543. username: z.string().openapi({ description: '用户名', example: 'user123' }),
  544. phone: z.string().nullable().openapi({ description: '手机号', example: '13800138000' })
  545. }).nullable().optional().openapi({
  546. description: '用户信息'
  547. }),
  548. merchant: z.object({
  549. id: z.number().int().positive().openapi({ description: '商户ID' }),
  550. name: z.string().openapi({ description: '商户名称', example: '商户A' })
  551. }).nullable().optional().openapi({
  552. description: '商户信息'
  553. }),
  554. supplier: z.object({
  555. id: z.number().int().positive().openapi({ description: '供货商ID' }),
  556. name: z.string().openapi({ description: '供货商名称', example: '供货商A' })
  557. }).nullable().optional().openapi({
  558. description: '供货商信息'
  559. }),
  560. deliveryAddress: z.object({
  561. id: z.number().int().positive().openapi({ description: '地址ID' }),
  562. name: z.string().openapi({ description: '收货人姓名', example: '张三' }),
  563. phone: z.string().openapi({ description: '收货人电话', example: '13800138000' }),
  564. address: z.string().openapi({ description: '详细地址', example: '北京市朝阳区xxx路xxx号' })
  565. }).nullable().optional().openapi({
  566. description: '收货地址信息'
  567. })
  568. });