Browse Source

Phase2: 新增报名/订单/转介/资料包表实体与Mapper

liaoxg 2 weeks ago
parent
commit
8b82ea9

+ 23 - 0
train-backend/src/main/java/com/train/entity/TrainCourseMaterial.java

@@ -0,0 +1,23 @@
+package com.train.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("train_course_material")
+public class TrainCourseMaterial implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long classId; // 为空=通用资料
+    private String title;
+    private String fileUrl;
+    private Integer sort;
+    private Date createdAt;
+}

+ 30 - 0
train-backend/src/main/java/com/train/entity/TrainEnrollment.java

@@ -0,0 +1,30 @@
+package com.train.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("train_enrollment")
+public class TrainEnrollment implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long uid;
+    private Long classId;
+    private String name;
+    private String phone;
+    private Integer bringLaptop; // 1=带电脑
+    private String dataReady; // 已备数据类别(逗号分隔)
+    private String topProblems; // 最想解决的3个问题JSON
+    private String source; // scene/invite
+    private String inviteCode;
+    private String status; // pending/paid/confirmed/cancelled
+    private Date createdAt;
+    private Date updatedAt;
+}

+ 25 - 0
train-backend/src/main/java/com/train/entity/TrainInvite.java

@@ -0,0 +1,25 @@
+package com.train.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("train_invite")
+public class TrainInvite implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long inviterId;
+    private Long inviteeId;
+    private String inviteCode;
+    private Long orderId;
+    private Integer successful; // 1=已付费
+    private String rewardStatus; // pending/granted
+    private Date createdAt;
+}

+ 33 - 0
train-backend/src/main/java/com/train/entity/TrainOrder.java

@@ -0,0 +1,33 @@
+package com.train.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("train_order")
+public class TrainOrder implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private String orderNo;
+    private Long enrollmentId;
+    private Long uid;
+    private Long classId;
+    private Integer amount; // 实付金额(分)
+    private Integer originalAmount; // 原价(分)
+    private Integer discountAmount; // 优惠(分)
+    private String payChannel; // wechat
+    private String status; // unpaid/paid/refunded/failed/closed
+    private Date payTime;
+    private String wechatTxnId;
+    private String prepayId;
+    private Integer refundAmount; // 已退金额(分)
+    private Date createdAt;
+    private Date updatedAt;
+}

+ 9 - 0
train-backend/src/main/java/com/train/mapper/TrainCourseMaterialMapper.java

@@ -0,0 +1,9 @@
+package com.train.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.train.entity.TrainCourseMaterial;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TrainCourseMaterialMapper extends BaseMapper<TrainCourseMaterial> {
+}

+ 9 - 0
train-backend/src/main/java/com/train/mapper/TrainEnrollmentMapper.java

@@ -0,0 +1,9 @@
+package com.train.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.train.entity.TrainEnrollment;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TrainEnrollmentMapper extends BaseMapper<TrainEnrollment> {
+}

+ 9 - 0
train-backend/src/main/java/com/train/mapper/TrainInviteMapper.java

@@ -0,0 +1,9 @@
+package com.train.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.train.entity.TrainInvite;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TrainInviteMapper extends BaseMapper<TrainInvite> {
+}

+ 9 - 0
train-backend/src/main/java/com/train/mapper/TrainOrderMapper.java

@@ -0,0 +1,9 @@
+package com.train.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.train.entity.TrainOrder;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TrainOrderMapper extends BaseMapper<TrainOrder> {
+}

+ 70 - 0
train-backend/src/main/resources/schema.sql

@@ -265,3 +265,73 @@ CREATE TABLE IF NOT EXISTS train_audit_log (
     INDEX idx_actor (actor_uid),
     INDEX idx_target (target_type, target_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审计日志';
+
+-- 报名单表(报名/付费/裂变一期)
+CREATE TABLE IF NOT EXISTS train_enrollment (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    uid BIGINT COMMENT '学员ID(登录后)',
+    class_id BIGINT COMMENT '所选班次ID',
+    name VARCHAR(50) COMMENT '姓名',
+    phone VARCHAR(11) COMMENT '手机号',
+    bring_laptop TINYINT DEFAULT 0 COMMENT '1=带电脑',
+    data_ready VARCHAR(50) COMMENT '已备数据类别(逗号分隔)',
+    top_problems TEXT COMMENT '最想解决的3个问题JSON',
+    source VARCHAR(20) DEFAULT 'scene' COMMENT '来源:scene/invite',
+    invite_code VARCHAR(50) COMMENT '邀请码(基于train_user.invite_code)',
+    status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid/confirmed/cancelled',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_uid (uid),
+    INDEX idx_class_id (class_id),
+    INDEX idx_status (status)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报名单';
+
+-- 支付订单表
+CREATE TABLE IF NOT EXISTS train_order (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号',
+    enrollment_id BIGINT COMMENT '关联报名单',
+    uid BIGINT COMMENT '学员ID',
+    class_id BIGINT COMMENT '班次ID',
+    amount INT NOT NULL COMMENT '实付金额(分)',
+    original_amount INT COMMENT '原价(分)',
+    discount_amount INT DEFAULT 0 COMMENT '优惠(分)',
+    pay_channel VARCHAR(20) DEFAULT 'wechat' COMMENT '支付渠道',
+    status VARCHAR(20) DEFAULT 'unpaid' COMMENT 'unpaid/paid/refunded/failed/closed',
+    pay_time DATETIME,
+    wechat_txn_id VARCHAR(64) COMMENT '微信交易号',
+    prepay_id VARCHAR(64) COMMENT '预支付ID',
+    refund_amount INT DEFAULT 0 COMMENT '已退金额(分)',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    INDEX idx_uid (uid),
+    INDEX idx_class_id (class_id),
+    INDEX idx_status (status),
+    INDEX idx_enrollment_id (enrollment_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付订单';
+
+-- 转介绍关系表
+CREATE TABLE IF NOT EXISTS train_invite (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    inviter_id BIGINT NOT NULL COMMENT '邀请人(train_user.id)',
+    invitee_id BIGINT COMMENT '被邀请人(train_user.id)',
+    invite_code VARCHAR(50) COMMENT '邀请码',
+    order_id BIGINT COMMENT '被邀请人的订单ID',
+    successful TINYINT DEFAULT 0 COMMENT '1=被邀请人已完成付费',
+    reward_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/granted',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_inviter (inviter_id),
+    INDEX idx_invitee (invitee_id),
+    UNIQUE KEY uk_code_invitee (invite_code, invitee_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='转介绍关系';
+
+-- 课前资料包表(二期)
+CREATE TABLE IF NOT EXISTS train_course_material (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    class_id BIGINT COMMENT '班次ID(为空=通用资料)',
+    title VARCHAR(100) NOT NULL,
+    file_url VARCHAR(255) COMMENT 'PDF/附件URL',
+    sort INT DEFAULT 0,
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+    INDEX idx_class_id (class_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课前资料包';