user-card-balance-record.schema.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { z } from '@hono/zod-openapi';
  2. import { UserSchema } from '@/server/modules/users/user.schema';
  3. import { UserCardSchema } from '@/server/modules/user-cards/user-card.schema';
  4. // 基础用户卡余额记录Schema
  5. const UserCardBalanceRecordSchema = z.object({
  6. id: z.number().int().positive().openapi({
  7. description: '记录ID',
  8. example: 1
  9. }),
  10. userId: z.number().int().positive().openapi({
  11. description: '用户ID',
  12. example: 1001
  13. }),
  14. cardNo: z.string().min(1, '卡号不能为空').max(20, '卡号最多20个字符').openapi({
  15. description: '卡号',
  16. example: '12345678901234567890'
  17. }),
  18. amount: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99).openapi({
  19. description: '变动金额',
  20. example: 50.50
  21. }),
  22. amountBefore: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99).openapi({
  23. description: '变动前金额',
  24. example: 100.00
  25. }),
  26. amountAfter: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99).openapi({
  27. description: '变动后金额',
  28. example: 150.50
  29. }),
  30. orderNo: z.string().min(1, '订单号不能为空').max(32, '订单号最多32个字符').openapi({
  31. description: '订单号',
  32. example: 'ORD20240101120000'
  33. }),
  34. type: z.coerce.number<number>().int().min(1).max(2).openapi({
  35. description: '类型 1消费 2退款',
  36. example: 1
  37. }),
  38. remark: z.string().max(32, '备注最多32个字符').nullable().openapi({
  39. description: '备注',
  40. example: '消费充值'
  41. }),
  42. createdBy: z.number().int().positive().nullable().openapi({
  43. description: '创建人ID',
  44. example: 1
  45. }),
  46. updatedBy: z.number().int().positive().nullable().openapi({
  47. description: '更新人ID',
  48. example: 1
  49. }),
  50. createdAt: z.coerce.date().openapi({
  51. description: '创建时间',
  52. example: '2024-01-01T12:00:00Z'
  53. }),
  54. updatedAt: z.coerce.date().openapi({
  55. description: '更新时间',
  56. example: '2024-01-01T12:00:00Z'
  57. }),
  58. user: UserSchema.optional(),
  59. userCard: UserCardSchema.optional()
  60. });
  61. // 创建用户卡余额记录DTO
  62. export const CreateUserCardBalanceRecordDto = UserCardBalanceRecordSchema.pick({
  63. userId: true,
  64. cardNo: true,
  65. amount: true,
  66. amountBefore: true,
  67. amountAfter: true,
  68. orderNo: true,
  69. type: true,
  70. remark: true
  71. }).extend({
  72. userId: z.coerce.number<number>().int().positive('用户ID必须是正整数'),
  73. cardNo: z.string().min(1, '卡号不能为空').max(20, '卡号最多20个字符'),
  74. amount: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99),
  75. amountBefore: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99),
  76. amountAfter: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99),
  77. orderNo: z.string().min(1, '订单号不能为空').max(32, '订单号最多32个字符'),
  78. type: z.coerce.number<number>().int().min(1).max(2),
  79. remark: z.string().max(32, '备注最多32个字符').nullable()
  80. });
  81. // 更新用户卡余额记录DTO
  82. export const UpdateUserCardBalanceRecordDto = UserCardBalanceRecordSchema.pick({
  83. userId: true,
  84. cardNo: true,
  85. amount: true,
  86. amountBefore: true,
  87. amountAfter: true,
  88. orderNo: true,
  89. type: true,
  90. remark: true
  91. }).partial().extend({
  92. userId: z.coerce.number<number>().int().positive('用户ID必须是正整数').optional(),
  93. cardNo: z.string().min(1, '卡号不能为空').max(20, '卡号最多20个字符').optional(),
  94. amount: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99).optional(),
  95. amountBefore: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99).optional(),
  96. amountAfter: z.coerce.number<number>().multipleOf(0.01).min(0).max(999999.99).optional(),
  97. orderNo: z.string().min(1, '订单号不能为空').max(32, '订单号最多32个字符').optional(),
  98. type: z.coerce.number<number>().int().min(1).max(2).optional(),
  99. remark: z.string().max(32, '备注最多32个字符').nullable().optional()
  100. });
  101. // 响应Schema(包含关联数据)
  102. export const UserCardBalanceRecordResponseSchema = UserCardBalanceRecordSchema.extend({
  103. user: UserSchema.pick({
  104. id: true,
  105. username: true,
  106. name: true,
  107. phone: true
  108. }).optional(),
  109. userCard: UserCardSchema.pick({
  110. id: true,
  111. cardNo: true,
  112. balance: true
  113. }).optional()
  114. });
  115. export type UserCardBalanceRecord = z.infer<typeof UserCardBalanceRecordSchema>;
  116. export type CreateUserCardBalanceRecordDto = z.infer<typeof CreateUserCardBalanceRecordDto>;
  117. export type UpdateUserCardBalanceRecordDto = z.infer<typeof UpdateUserCardBalanceRecordDto>;
  118. export type UserCardBalanceRecordResponse = z.infer<typeof UserCardBalanceRecordResponseSchema>;
  119. export { UserCardBalanceRecordSchema };