submission-records.entity.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
  2. import { z } from '@hono/zod-openapi';
  3. @Entity('submission_records')
  4. export class SubmissionRecords {
  5. @PrimaryGeneratedColumn({ unsigned: true })
  6. id!: number;
  7. @Column({ name: 'classroom_no', type: 'varchar', length: 255, nullable: true, comment: '教室号' })
  8. classroomNo!: string | null;
  9. @Column({ name: 'user_id', type: 'varchar', length: 255, nullable: true, comment: '用户id' })
  10. userId!: string | null;
  11. @Column({ name: 'nickname', type: 'varchar', length: 255, nullable: true, comment: '昵称' })
  12. nickname!: string | null;
  13. @Column({ name: 'score', type: 'decimal', precision: 10, scale: 2, nullable: true, comment: '成绩' })
  14. score!: number | null;
  15. @Column({ name: 'code', type: 'varchar', length: 255, nullable: true, comment: '代码' })
  16. code!: string | null;
  17. @Column({ name: 'training_date', type: 'timestamp', nullable: true, comment: '训练日期' })
  18. trainingDate!: Date | null;
  19. @Column({ name: 'mark', type: 'varchar', length: 255, nullable: true, comment: '标记' })
  20. mark!: string | null;
  21. @Column({ name: 'status', type: 'int', nullable: true, comment: '状态' })
  22. status!: number | null;
  23. @Column({ name: 'holding_stock', type: 'varchar', length: 255, nullable: true, comment: '持股' })
  24. holdingStock!: string | null;
  25. @Column({ name: 'holding_cash', type: 'varchar', length: 255, nullable: true, comment: '持币' })
  26. holdingCash!: string | null;
  27. @Column({ name: 'price', type: 'decimal', precision: 10, scale: 2, nullable: true, comment: '价格' })
  28. price!: number | null;
  29. @Column({ name: 'profit_amount', type: 'decimal', precision: 10, scale: 2, nullable: true, comment: '收益金额' })
  30. profitAmount!: number | null;
  31. @Column({ name: 'profit_percent', type: 'decimal', precision: 10, scale: 2, nullable: true, comment: '收益率' })
  32. profitPercent!: number | null;
  33. @Column({ name: 'total_profit_amount', type: 'decimal', precision: 10, scale: 2, nullable: true, comment: '累计收益金额' })
  34. totalProfitAmount!: number | null;
  35. @Column({ name: 'total_profit_percent', type: 'decimal', precision: 10, scale: 2, nullable: true, comment: '累计收益率' })
  36. totalProfitPercent!: number | null;
  37. @Column({ name: 'created_at', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  38. createdAt!: Date;
  39. @Column({ name: 'updated_at', type: 'timestamp', default: () => 'CURRENT_TIMESTAMP', onUpdate: 'CURRENT_TIMESTAMP' })
  40. updatedAt!: Date;
  41. }
  42. export const SubmissionRecordsSchema = z.object({
  43. id: z.number().int().positive().openapi({ description: '数据ID', example: 1 }),
  44. classroomNo: z.string().max(255).nullable().openapi({ description: '教室号', example: 'class01' }),
  45. userId: z.string().max(255).nullable().openapi({ description: '用户id', example: '1001' }),
  46. nickname: z.string().max(255).nullable().openapi({ description: '昵称', example: 'student1' }),
  47. score: z.number().nullable().openapi({ description: '成绩', example: 95.5 }),
  48. code: z.string().max(255).nullable().openapi({ description: '代码', example: '001339' }),
  49. trainingDate: z.date().nullable().openapi({ description: '训练日期', example: '2025-05-21T08:00:00Z' }),
  50. mark: z.string().max(255).nullable().openapi({ description: '标记', example: '优秀' }),
  51. status: z.number().nullable().openapi({ description: '状态', example: 1 }),
  52. holdingStock: z.string().max(255).nullable().openapi({ description: '持股', example: '100股' }),
  53. holdingCash: z.string().max(255).nullable().openapi({ description: '持币', example: '10000元' }),
  54. price: z.number().nullable().openapi({ description: '价格', example: 15.68 }),
  55. profitAmount: z.number().nullable().openapi({ description: '收益金额', example: 500.00 }),
  56. profitPercent: z.number().nullable().openapi({ description: '收益率', example: 5.25 }),
  57. totalProfitAmount: z.number().nullable().openapi({ description: '累计收益金额', example: 2500.00 }),
  58. totalProfitPercent: z.number().nullable().openapi({ description: '累计收益率', example: 12.5 }),
  59. createdAt: z.date().openapi({ description: '创建时间', example: '2025-05-21T16:44:36Z' }),
  60. updatedAt: z.date().openapi({ description: '更新时间', example: '2025-05-21T21:22:06Z' })
  61. });
  62. export const CreateSubmissionRecordsDto = z.object({
  63. classroomNo: z.string().max(255).nullable().openapi({ description: '教室号', example: 'class01' }),
  64. userId: z.string().max(255).nullable().openapi({ description: '用户id', example: '1001' }),
  65. nickname: z.string().max(255).nullable().openapi({ description: '昵称', example: 'student1' }),
  66. score: z.number().nullable().openapi({ description: '成绩', example: 95.5 }),
  67. code: z.string().max(255).nullable().openapi({ description: '代码', example: '001339' }),
  68. trainingDate: z.date().nullable().openapi({ description: '训练日期', example: '2025-05-21T08:00:00Z' }),
  69. mark: z.string().max(255).nullable().openapi({ description: '标记', example: '优秀' }),
  70. status: z.number().nullable().openapi({ description: '状态', example: 1 }),
  71. holdingStock: z.string().max(255).nullable().openapi({ description: '持股', example: '100股' }),
  72. holdingCash: z.string().max(255).nullable().openapi({ description: '持币', example: '10000元' }),
  73. price: z.number().nullable().openapi({ description: '价格', example: 15.68 }),
  74. profitAmount: z.number().nullable().openapi({ description: '收益金额', example: 500.00 }),
  75. profitPercent: z.number().nullable().openapi({ description: '收益率', example: 5.25 }),
  76. totalProfitAmount: z.number().nullable().openapi({ description: '累计收益金额', example: 2500.00 }),
  77. totalProfitPercent: z.number().nullable().openapi({ description: '累计收益率', example: 12.5 })
  78. });
  79. export const UpdateSubmissionRecordsDto = z.object({
  80. classroomNo: z.string().max(255).nullable().openapi({ description: '教室号', example: 'class01' }),
  81. userId: z.string().max(255).nullable().openapi({ description: '用户id', example: '1001' }),
  82. nickname: z.string().max(255).nullable().openapi({ description: '昵称', example: 'student1' }),
  83. score: z.number().nullable().openapi({ description: '成绩', example: 95.5 }),
  84. code: z.string().max(255).nullable().openapi({ description: '代码', example: '001339' }),
  85. trainingDate: z.date().nullable().openapi({ description: '训练日期', example: '2025-05-21T08:00:00Z' }),
  86. mark: z.string().max(255).nullable().openapi({ description: '标记', example: '优秀' }),
  87. status: z.number().nullable().openapi({ description: '状态', example: 1 }),
  88. holdingStock: z.string().max(255).nullable().openapi({ description: '持股', example: '100股' }),
  89. holdingCash: z.string().max(255).nullable().openapi({ description: '持币', example: '10000元' }),
  90. price: z.number().nullable().openapi({ description: '价格', example: 15.68 }),
  91. profitAmount: z.number().nullable().openapi({ description: '收益金额', example: 500.00 }),
  92. profitPercent: z.number().nullable().openapi({ description: '收益率', example: 5.25 }),
  93. totalProfitAmount: z.number().nullable().openapi({ description: '累计收益金额', example: 2500.00 }),
  94. totalProfitPercent: z.number().nullable().openapi({ description: '累计收益率', example: 12.5 })
  95. });