西格玛许 1 өдөр өмнө
parent
commit
5242a6aead
26 өөрчлөгдсөн 3369 нэмэгдсэн , 28 устгасан
  1. 19 6
      ruoyi-admin/src/main/resources/application-dev.yml
  2. 2 0
      ruoyi-admin/src/main/resources/application.yml
  3. 25 0
      ruoyi-admin/src/main/resources/cert/apiclient_cert.pem
  4. 28 0
      ruoyi-admin/src/main/resources/cert/apiclient_key.pem
  5. 12 0
      ruoyi-modules/ruoyi-main/pom.xml
  6. 164 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/config/WxPayConfig.java
  7. 113 5
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/CsOrderCardController.java
  8. 62 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainExamApplyController.java
  9. 53 1
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainOrderController.java
  10. 33 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/miniapp/MiniaappPaymentConfigController.java
  11. 66 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/miniapp/MiniappPaymentConfigController.java
  12. 2 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainOrder.java
  13. 14 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/PaymentConfig.java
  14. 75 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainExamApplyBo.java
  15. 3 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/CsOrderCardVo.java
  16. 78 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainExamApplyVo.java
  17. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/ICsOrderCardService.java
  18. 34 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainExamApplyService.java
  19. 8 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainOrderService.java
  20. 14 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IPaymentConfigService.java
  21. 142 5
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsOrderCardServiceImpl.java
  22. 100 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainExamApplyServiceImpl.java
  23. 55 11
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainOrderServiceImpl.java
  24. 92 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/PaymentConfigServiceImpl.java
  25. 35 0
      ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/utils/WXPayUtility.java
  26. 2132 0
      script/sql/sj.sql

+ 19 - 6
ruoyi-admin/src/main/resources/application-dev.yml

@@ -8,8 +8,8 @@ spring.boot.admin.client:
     metadata:
       username: ${spring.boot.admin.client.username}
       userpassword: ${spring.boot.admin.client.password}
-  username: @monitor.username@
-  password: @monitor.password@
+  username: admin
+  password: admin
 
 --- # snail-job 配置
 snail-job:
@@ -96,8 +96,8 @@ spring:
 spring.data:
   redis:
     # 地址
-    host: 192.168.194.130
-    password: 123456
+    host: localhost
+#    password: 123456
     # 端口,默认为6379
     port: 6379
     # 数据库索引
@@ -192,9 +192,22 @@ sms:
 wechat:
   miniapp:
     # 小程序AppID(在微信公众平台获取)
-    app-id: wxb1effaafaf65ee9c
+    app-id: wx85436d3a1d0b7e14
     # 小程序AppSecret(在微信公众平台获取,注意保密)
-    app-secret: 3acbcb3940c7c873a837e4830782d182
+    app-secret: 6ad73f29564a8dbff78b05822cba202b
+
+
+
+wxpay:
+  appId: wx85436d3a1d0b7e14
+  mchId: 1631069855
+  apiV3Key: avc8Q5s3ALmMfwKGCf6uqgTSD7RnGMk6
+  certSerialNo: 79AD857EFB072D51FD47D9F6A3AE70F1FE22C9BA
+  privateKeyPath: classpath:/cert/apiclient_key.pem
+  privateCertPath: classpath:/cert/apiclient_cert.pem
+  notifyUrl: https://dfd52ce.r31.cpolar.top/order/wx/order/notify
+
+
 
 
 --- # 三方授权

+ 2 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -39,6 +39,8 @@ logging:
     org.apache.fury: warn
     com.baomidou.mybatisplus: DEBUG   # 输出框架本身的日志
     com.example.mapper: DEBUG         # 输出你的 Mapper 包下的 SQL 日志
+    com.github.binarywang: DEBUG
+    org.springframework.boot.autoconfigure: DEBUG
   config: classpath:logback-plus.xml
 
 # 用户配置

+ 25 - 0
ruoyi-admin/src/main/resources/cert/apiclient_cert.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIEITCCAwmgAwIBAgIUea2FfvsHLVH9R9n2o65w8f4iybowDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjQwNDEwMDA0MjM4WhcNMjkwNDA5MDA0MjM4WjB7MRMwEQYDVQQDDAox
+NjMxMDY5ODU1MRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM
+Hua5luWMl+i1oua0vuenkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04xETAP
+BgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+tGGjx+kKhH3yfOonHz2eyKMzE6uwXA5viOtsJ7adEvjBQN/tF2Vd42M1TveUVlit
+hmg7PH0LhQ2y9ov0r9346KAJw+YrvtIdfG7sC4apTsNwtWoALZVeHG10uytm47qo
+6YuLSZqyOqH7Web1G5XNSvFPQQ2ImRpwYX5n3+ew1My21k0/kkV8CiWpbibU9Hj2
+9yFQUhWnY67i6nEHSp9PUL6d2fcPHRVQfPFMtY+WLrmqfjB7z59MrbJNKV5T04FC
+pzdz3r/598zOj+8ynsU+TxK/UOi81hzZJpxY6//F889VOP4xMskOgvSj2qdKKnL4
+kT5Y56fE62irGxYyil7DKQIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0PBAQD
+AgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1cy5j
+b20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3
+NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMzQTg3
+QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBADb9K1Fq41i81XT+
+McI4Ua4kZbFjSeqNNMQVUDzZE1ujgMxbSE2g0t8fxd+SyCuOsWgSZDJNFRoDb9s3
+GBGxWD6Dd1fa2pPfbhEtb4dVSJO6/kKRaq5tNjhcbAzBdr1uAHVY8LrZuCqwDLKn
+vStLfp1YyCHliQ7DLJhGDVqCYoDmec2NLAzZacptOepgJahHP1a+HjTUCGLFpqn4
+aMAR2pWWRzaIGJ4+rD36dBNT96gLCe3hYyr4GE2VJyRUgV1tYhKiHMtnoXKDCeMO
+FA32qWB5QHlh7A1UjQYGh4a9DIaXv0VHfD9lSEfgH+Q2o14BONAFReYveHqESnpR
+G0JHxKo=
+-----END CERTIFICATE-----

+ 28 - 0
ruoyi-admin/src/main/resources/cert/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0YaPH6QqEffJ8
+6icfPZ7IozMTq7BcDm+I62wntp0S+MFA3+0XZV3jYzVO95RWWK2GaDs8fQuFDbL2
+i/Sv3fjooAnD5iu+0h18buwLhqlOw3C1agAtlV4cbXS7K2bjuqjpi4tJmrI6oftZ
+5vUblc1K8U9BDYiZGnBhfmff57DUzLbWTT+SRXwKJaluJtT0ePb3IVBSFadjruLq
+cQdKn09Qvp3Z9w8dFVB88Uy1j5Yuuap+MHvPn0ytsk0pXlPTgUKnN3Pev/n3zM6P
+7zKexT5PEr9Q6LzWHNkmnFjr/8Xzz1U4/jEyyQ6C9KPap0oqcviRPljnp8TraKsb
+FjKKXsMpAgMBAAECggEAW5AQpiKKXzTbiUMGttn9ptUI0Vxeemwte7AdR49v7jht
+SLQiUrT20r0CS2JrXuVGuCpin1LOLS0GAhaLD1a6ycKrElDdNdDMfOSFV1h0yvF0
+XfI/wuPGUOHS1kuyv7h5k4ttGeC3xgGBaGJPW0BQZFFXrKrlAuqjzyluKv8eCPZC
+/GUcmwnTmYkGhEPBX5pxLSSJG4T+H9zwT2WJWCtbHk8OTlwtwj9QYlFUt76WVd1B
+9C49v69zZguhWi7FYyXnpTb1zUcx0TVF2zfRKYAcX8gVEmWN2l0C8f7BisYsNAtX
+6d2cRa7+OpfOpUQkQY7byMVfY1okWPPEhvYZewk88QKBgQDjP9WNkOlUnzTIfsSF
+vnUeSxo15hm/RfhKfbn2lBEs6parx6uGHKyjKkJNaTAL48tqGka40iA5C5OTuOy7
+aqqlOAPeBhP8LMpXG04vGER9lGm4qD4PBgAh2mUZiZHmycb0faR1QvIdHMdM3a62
+Yq0FHWl06sDMF69xAE0BZDAgFQKBgQDLM9f6pd34END5NinWF3lHT4o8tDoSetli
+dHE/aRizoKmDuaQtM2+bDKiOVpcZiZjEA+enWWZlrUkjTCLkF/Ndwy75yJiq7zkc
+TQIgLiicl8A0lqelJBWgUcglbos20eDyiIjKN5S7sGPznD4Xu/XGVHrM4YibTh/T
+LJiCDn+HxQKBgQCFeW/YF35E2sHo5TROjeBCa8A4Wi9TPiiosBHy92LjK+JVgRCI
+0/y+VUreJuM2iJRofIh/c8PDXb5PbLV3Gx6hrjXvSUihvDkYUoxocut/ixVRhVf2
+AQNA3wK0ri3JDUjTP5zB1xFX8hhJWIeOzoRrVawkJOIaveqpB5EzOQJfRQKBgEFC
+zUK6sqdQ/0yKkLUppNG6QfNtDpmQyvBL5XMwFbbbCpY7sPazZkytrBTKyoxxHJcX
+ifa9R52wIaUsdqg66PZcEWI3gpCjc/wa32vmZzSjqB87o2vuQuPSYC1la2CX118N
+aqFHaIU/CVrb+zU0MKMZzrauWGlIlgAEepaKgXrhAoGBAOMLvD0KcuoRJLClStiU
+j1RCEVVwz5yeBrAcn8wVuCjUxp/rYRPso3bKP/SXb2RIMZUu0N54a0OhUBvVCErX
+YzIHYDBXGz1rPZkaALoO34XgDbp6m5XfEmt52yA2VRA0ef9YCPxnA7NRTuw6/r95
+w12cRe32fz/4lMz6MV6eVkpN
+-----END PRIVATE KEY-----

+ 12 - 0
ruoyi-modules/ruoyi-main/pom.xml

@@ -86,6 +86,18 @@
             <version>5.2.5</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-java</artifactId>
+            <version>0.2.14</version>
+        </dependency>
+        <!---回调通知签名校验以及参数解密相关-->
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.4.9</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 164 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/config/WxPayConfig.java

@@ -0,0 +1,164 @@
+package org.dromara.main.config;
+
+import cn.hutool.crypto.PemUtil;
+import com.wechat.pay.java.core.Config;
+import com.wechat.pay.java.core.RSAAutoCertificateConfig;
+import com.wechat.pay.java.service.payments.jsapi.JsapiService;
+import com.wechat.pay.java.service.payments.jsapi.model.Amount;
+import com.wechat.pay.java.service.payments.jsapi.model.Payer;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;
+import com.wechat.pay.java.service.refund.RefundService;
+import jakarta.annotation.PostConstruct;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.main.utils.WXPayUtility;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.security.PrivateKey;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 微信支付配置类
+ */
+@Slf4j
+@Component
+@Data
+@ConfigurationProperties(prefix = "wxpay")
+public class WxPayConfig {
+
+    private String appId;
+    private String mchId;
+    private String apiV3Key;
+    private String privateKeyPath;
+    private String certSerialNo;
+    private String notifyUrl;
+
+    private JsapiService jsapiService;
+    private RefundService refundService;
+    private PrivateKey privateKey;
+
+    @Autowired
+    private ResourceLoader resourceLoader;
+
+    @PostConstruct
+    public void init() {
+        try {
+            log.info("开始初始化微信支付配置...");
+
+            // 检查配置是否完整
+            if (StringUtils.isEmpty(privateKeyPath)) {
+                log.warn("微信支付配置不完整,跳过初始化");
+                return;
+            }
+
+            // 加载商户私钥
+            Resource resource = resourceLoader.getResource(privateKeyPath);
+            if (resource.exists()) {
+                privateKey = PemUtil.readPemPrivateKey(resource.getInputStream());
+                log.info("商户私钥加载成功");
+            } else {
+                log.warn("找不到商户私钥文件:{},跳过微信支付初始化", privateKeyPath);
+                return;
+            }
+
+            // 配置微信支付
+            Config config = new RSAAutoCertificateConfig.Builder()
+                .merchantId(mchId)
+                .privateKey(privateKey)
+                .merchantSerialNumber(certSerialNo)
+                .apiV3Key(apiV3Key)
+                .build();
+
+            // 初始化服务
+            jsapiService = new JsapiService.Builder().config(config).build();
+            refundService = new RefundService.Builder().config(config).build();
+
+            log.info("微信支付配置初始化成功");
+        } catch (Exception e) {
+            log.error("初始化微信支付配置失败", e);
+            // 不抛异常,允许应用启动
+            log.warn("微信支付功能将不可用");
+        }
+    }
+
+    /**
+     * 生成 JSAPI 支付参数
+     */
+    public Map<String, String> createJsapiPayParams(String openid, BigDecimal payPrice, String remark, String orderCode) {
+        if (jsapiService == null) {
+            throw new RuntimeException("微信支付服务未初始化,请检查配置");
+        }
+
+        try {
+            // 构建预支付请求
+            PrepayRequest request = new PrepayRequest();
+            request.setAppid(appId);
+            request.setMchid(mchId);
+            request.setDescription(StringUtils.isEmpty(remark) ? "订单支付" : remark);
+            request.setOutTradeNo(orderCode);
+            request.setNotifyUrl(notifyUrl);
+
+            // 金额设置(转换为分)
+            Amount amount = new Amount();
+            amount.setTotal(payPrice.multiply(new BigDecimal(100)).intValue());
+            request.setAmount(amount);
+
+            // 支付者信息
+            Payer payer = new Payer();
+            payer.setOpenid(openid);
+            request.setPayer(payer);
+
+            // 调用预支付接口
+            PrepayResponse response = jsapiService.prepay(request);
+
+            // 生成前端支付参数
+            return generatePaySign(response.getPrepayId());
+        } catch (Exception e) {
+            throw new RuntimeException("生成JSAPI支付参数失败", e);
+        }
+    }
+
+    /**
+     * 生成支付签名
+     */
+    private Map<String, String> generatePaySign(String prepayId) {
+        try {
+            String timeStamp = String.valueOf(Instant.now().getEpochSecond());
+            String nonceStr = UUID.randomUUID().toString().replaceAll("-", "");
+            String packageStr = "prepay_id=" + prepayId;
+
+            // 构造签名串
+            String signMessage = appId + "\n" + timeStamp + "\n" + nonceStr + "\n" + packageStr + "\n";
+
+            // 使用商户私钥签名
+            String paySign = WXPayUtility.sign(signMessage, "SHA256withRSA", privateKey);
+
+            // 返回支付参数
+            Map<String, String> payParams = new HashMap<>();
+            payParams.put("appId", appId);
+            payParams.put("timeStamp", timeStamp);
+            payParams.put("nonceStr", nonceStr);
+            payParams.put("package", packageStr);
+            payParams.put("signType", "RSA");
+            payParams.put("paySign", paySign);
+            payParams.put("partnerId", mchId);
+            payParams.put("prepayId", prepayId);
+            return payParams;
+        } catch (Exception e) {
+            throw new RuntimeException("生成支付签名失败", e);
+        }
+    }
+
+    public JsapiService getJsapiService() { return jsapiService; }
+    public RefundService getRefundService() { return refundService; }
+}

+ 113 - 5
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/CsOrderCardController.java

@@ -1,22 +1,45 @@
 package org.dromara.main.controller;
 
+import cn.dev33.satoken.annotation.SaIgnore;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.web.core.BaseController;
+import org.dromara.main.config.WxPayConfig;
 import org.dromara.main.domain.bo.CsOrderCardBo;
 import org.dromara.main.domain.vo.CsOrderCardVo;
 import org.dromara.main.service.ICsOrderCardService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.crypto.Cipher;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Map;
+
+import static io.smallrye.common.function.FunctionsLogging.log;
+
+@Slf4j
 @Validated
 @RequiredArgsConstructor
 @RestController
 @RequestMapping("/main/order-card")
 public class CsOrderCardController extends BaseController {
 
+    @Autowired
+    private WxPayConfig wxPayConfig;
+
     private final ICsOrderCardService orderCardService;
 
     /**
@@ -39,11 +62,11 @@ public class CsOrderCardController extends BaseController {
     /**
      * 用户支付结算单
      */
-    @Log(title = "支付结算单", businessType = BusinessType.UPDATE)
-    @PostMapping("/{orderCardId}/pay")
-    public R<Void> payOrderCard(@PathVariable Long orderCardId, @RequestParam Long userId) {
-        return toAjax(orderCardService.payOrderCard(orderCardId, userId));
-    }
+//    @Log(title = "支付结算单", businessType = BusinessType.UPDATE)
+//    @PostMapping("/{orderCardId}/pay")
+//    public R<Void> payOrderCard(@PathVariable Long orderCardId, @RequestParam Long userId) {
+//        return toAjax(orderCardService.payOrderCard(orderCardId, userId));
+//    }
 
     /**
      * 取消结算单
@@ -53,4 +76,89 @@ public class CsOrderCardController extends BaseController {
     public R<Void> cancelOrderCard(@PathVariable Long orderCardId) {
         return toAjax(orderCardService.cancelOrderCard(orderCardId));
     }
+
+
+    @Log(title = "创建支付订单", businessType = BusinessType.INSERT)
+    @PostMapping("/{orderCardId}/create-order")
+    public R<Map<String, Object>> createPayOrder(@PathVariable Long orderCardId, @RequestParam Long userId) {
+        return R.ok(orderCardService.createPayOrder(orderCardId, userId));
+    }
+
+
+    @PostMapping("/wx-pay-notify")
+    @SaIgnore
+    public void wxPayNotify(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            // 微信支付回调验签和解密(技术实现照搬photo)
+            String timestamp = request.getHeader("Wechatpay-Timestamp");
+            String nonce = request.getHeader("Wechatpay-Nonce");
+            String signature = request.getHeader("Wechatpay-Signature");
+
+            // 读取请求体
+            StringBuilder body = new StringBuilder();
+            try (BufferedReader reader = new BufferedReader(
+                new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8))) {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    body.append(line);
+                }
+            }
+
+            String requestBody = body.toString();
+            log.info("微信支付回调:{}", requestBody);
+
+            // 解析支付结果(这里需要实现解密,可以参考photo项目)
+            JSONObject data = JSON.parseObject(requestBody);
+            JSONObject resource = data.getJSONObject("resource");
+            String ciphertext = resource.getString("ciphertext");
+            String associatedData = resource.getString("associated_data");
+            String nonceStr = resource.getString("nonce");
+
+// 解密数据(需要实现AES-GCM解密)
+            String decryptedData = decryptFromWechat(ciphertext, associatedData, nonceStr);
+            JSONObject paymentResult = JSON.parseObject(decryptedData);
+
+            String orderNo = paymentResult.getString("out_trade_no");
+            String tradeState = paymentResult.getString("trade_state");
+
+            if ("SUCCESS".equals(tradeState)) {
+                // 调用你的业务处理方法
+                orderCardService.handlePaySuccess(orderNo);
+            }
+
+            // 响应微信
+            response.setStatus(200);
+            response.setContentType("application/json");
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("code", "SUCCESS");
+            jsonObject.put("message", "SUCCESS");
+            response.getOutputStream().write(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8));
+            response.flushBuffer();
+
+        } catch (Exception e) {
+            log.error("微信支付回调处理失败", e);
+            // 错误响应...
+        }
+    }
+
+    private String decryptFromWechat(String ciphertext, String associatedData, String nonce) throws Exception {
+        // 使用APIv3密钥解密
+        byte[] key = wxPayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8);
+        byte[] nonceBytes = nonce.getBytes(StandardCharsets.UTF_8);
+        byte[] associatedDataBytes = associatedData.getBytes(StandardCharsets.UTF_8);
+        byte[] ciphertextBytes = Base64.getDecoder().decode(ciphertext);
+
+        // 使用AES-GCM解密
+        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
+        GCMParameterSpec spec = new GCMParameterSpec(128, nonceBytes);
+
+        cipher.init(Cipher.DECRYPT_MODE, keySpec, spec);
+        cipher.updateAAD(associatedDataBytes);
+
+        byte[] plainTextBytes = cipher.doFinal(ciphertextBytes);
+        return new String(plainTextBytes, StandardCharsets.UTF_8);
+    }
+
+
 }

+ 62 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainExamApplyController.java

@@ -0,0 +1,62 @@
+package org.dromara.main.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.main.domain.vo.MainExamApplyVo;
+import org.dromara.main.service.IMainExamApplyService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 测评申请Controller
+ */
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/main/exam-apply")
+public class MainExamApplyController extends BaseController {
+
+    private final IMainExamApplyService examApplyService;
+
+    /**
+     * 创建测评申请
+     */
+    @SaIgnore
+    @Log(title = "创建测评申请", businessType = BusinessType.INSERT)
+    @PostMapping("/create")
+    public R<MainExamApplyVo> createExamApply(@RequestParam(required = false) Long evaluationId, @RequestParam Long studentId) {
+        log.info("收到创建测评申请请求,evaluationId: {}, studentId: {}", evaluationId, studentId);
+        
+        if (evaluationId == null) {
+            return R.fail("测评ID不能为空");
+        }
+        
+        MainExamApplyVo result = examApplyService.createExamApply(evaluationId, studentId);
+        return R.ok(result);
+    }
+
+    /**
+     * 根据ID查询测评申请
+     */
+    @GetMapping("/{id}")
+    public R<MainExamApplyVo> getInfo(@PathVariable Long id) {
+        MainExamApplyVo result = examApplyService.queryById(id);
+        return R.ok(result);
+    }
+
+    /**
+     * 更新申请状态
+     */
+    @Log(title = "更新测评申请状态", businessType = BusinessType.UPDATE)
+    @PutMapping("/{id}/status")
+    public R<Void> updateStatus(@PathVariable Long id, @RequestParam String status) {
+        Boolean result = examApplyService.updateApplyStatus(id, status);
+        return toAjax(result);
+    }
+}

+ 53 - 1
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/MainOrderController.java

@@ -1,8 +1,12 @@
 package org.dromara.main.controller;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaIgnore;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.annotation.Log;
@@ -12,9 +16,11 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.main.domain.MainOrder;
 import org.dromara.main.service.IMainOrderService;
+
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.BufferedReader;
 import java.util.List;
 
 /**
@@ -30,6 +36,8 @@ public class MainOrderController extends BaseController {
 
     private final IMainOrderService iMainOrderService;
 
+//    private final WxPayService wxPayService;
+
     /**
      * 查询订单列表
      */
@@ -81,4 +89,48 @@ public class MainOrderController extends BaseController {
     public R<Void> remove(@PathVariable List<Long> ids) {
         return toAjax(iMainOrderService.deleteWithValidByIds(ids, true));
     }
+
+    /**
+     * 支付订单
+     */
+//    @Log(title = "支付订单", businessType = BusinessType.UPDATE)
+//    @PostMapping("/jsapi")
+//    public R<WxPayMpOrderResult> jsapi(@RequestParam Long orderId) {
+//        try {
+//            return R.ok(iMainOrderService.jsapi(orderId));
+//        } catch (WxPayException e) {
+//            throw new ServiceException(e.getMessage());
+//        }
+//    }
+//
+//    @PostMapping("/notify")
+//    //回调接口不校验登录
+//    @SaIgnore
+//    public R<String> callBack(HttpServletRequest request, HttpServletResponse response) {
+//
+//        try{
+//            BufferedReader reader=request.getReader();
+//            StringBuilder sb=new StringBuilder();
+//            String line;
+//            while((line=reader.readLine())!=null){
+//                sb.append(line);
+//            }
+//            WxPayOrderNotifyV3Result result= wxPayService.parseOrderNotifyV3Result(sb.toString(), null);
+//            String orderSn=result.getResult().getOutTradeNo();
+//            String tradeState=result.getResult().getTradeState();
+//
+//            if("SUCCESS".equals(tradeState)){
+//                MainOrder order= iMainOrderService.queryByOrderNo(orderSn);
+//                order.setOrderStatus(1);
+//                order.setPayStatus(2);
+//                iMainOrderService.update(order);
+//            }
+//
+//            return R.ok("{\"code\":\"SUCCESS\",\"message\":\"成功\"}");
+//        }catch (Exception e){
+//            return R.ok("{\"code\":\"FAIL\",\"message\":\"失败\"}");
+//        }
+//
+//    }
+
 }

+ 33 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/miniapp/MiniaappPaymentConfigController.java

@@ -0,0 +1,33 @@
+package org.dromara.main.controller.miniapp;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.main.service.IPaymentConfigService;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.dromara.system.service.ISysOssService;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+@SaIgnore
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/miniaapp/paymentConfig")
+public class MiniaappPaymentConfigController {
+
+    private final IPaymentConfigService paymentConfigService;
+    private final ISysOssService ossService;
+
+    @RepeatSubmit
+    @PostMapping(value = "/uploadCert", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> uploadCert(@RequestPart("file") MultipartFile file) {
+        SysOssVo oss = ossService.upload(file);
+        paymentConfigService.updateWechatCertPath(oss.getUrl());
+        return R.ok();
+    }
+}

+ 66 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/miniapp/MiniappPaymentConfigController.java

@@ -0,0 +1,66 @@
+package org.dromara.main.controller.miniapp;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.main.service.IPaymentConfigService;
+import org.dromara.system.domain.bo.PaymentConfigBo;
+import org.dromara.system.domain.vo.PaymentConfigVo;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.dromara.system.service.ISysOssService;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+@SaIgnore
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/miniapp/paymentConfig")
+public class MiniappPaymentConfigController {
+
+    private final IPaymentConfigService paymentConfigService;
+    private final ISysOssService ossService;
+
+    @GetMapping("/list")
+    public R<PaymentConfigVo> getConfig() {
+        return R.ok(paymentConfigService.getWechatPayConfig());
+    }
+
+    @RepeatSubmit
+    @PutMapping("/wxpay")
+    public R<Void> saveWxPayConfig(@RequestBody PaymentConfigBo bo) {
+        paymentConfigService.saveWechatPayConfig(bo);
+        return R.ok();
+    }
+
+    @RepeatSubmit
+    @PostMapping(value = "/uploadPrivateKey", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> uploadPrivateKey(@RequestPart("file") MultipartFile file) {
+        SysOssVo oss = ossService.upload(file);
+        paymentConfigService.updateWechatPrivateKeyPath(oss.getUrl());
+        return R.ok();
+    }
+
+    @RepeatSubmit
+    @PostMapping(value = "/uploadCert", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> uploadCert(@RequestPart("file") MultipartFile file) {
+        SysOssVo oss = ossService.upload(file);
+        paymentConfigService.updateWechatCertPath(oss.getUrl());
+        return R.ok();
+    }
+
+    @RepeatSubmit
+    @PostMapping(value = "/uploadPublicKey", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<Void> uploadPublicKey(@RequestPart("file") MultipartFile file) {
+        SysOssVo oss = ossService.upload(file);
+        paymentConfigService.updateWechatPublicKeyPath(oss.getUrl());
+        return R.ok();
+    }
+}

+ 2 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/MainOrder.java

@@ -47,6 +47,8 @@ public class MainOrder extends BaseEntity {
     private String tenantId;
     private String remark;
 
+    private String wechatOrderId;
+
     // ===== 非数据库字段,用于前端展示(关联查询填充)=====
     /** 买家手机号(从 main_student 关联查询) */
     @TableField(exist = false)

+ 14 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/PaymentConfig.java

@@ -24,6 +24,20 @@ public class PaymentConfig extends BaseEntity {
 
     private String appId;
 
+    private String mchId;
+
+    private String apiV3Key;
+
+    private String serialNo;
+
+    private String publicKeyId;
+
+    private String certPath;
+
+    private String privateKeyPath;
+
+    private String publicKeyPath;
+
     private String privateKey;
 
     private String publicKey;

+ 75 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/bo/MainExamApplyBo.java

@@ -0,0 +1,75 @@
+package org.dromara.main.domain.bo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 测评申请业务对象 main_exam_apply
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MainExamApplyBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 测评ID
+     */
+    private Long evaluationId;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 学生ID
+     */
+    private Long studentId;
+
+    /**
+     * 申请来源
+     */
+    private String applySource;
+
+    /**
+     * 申请状态
+     */
+    private String applyStatus;
+
+    /**
+     * 预定开始时间
+     */
+    private Date scheduleStartTime;
+
+    /**
+     * 截止时间
+     */
+    private Date deadlineTime;
+
+    /**
+     * 最大尝试次数
+     */
+    private Integer maxAttemptCount;
+
+    /**
+     * 完成时间
+     */
+    private Date finishedTime;
+
+    /**
+     * 最终结果
+     */
+    private String finalResult;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 3 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/CsOrderCardVo.java

@@ -1,7 +1,9 @@
 package org.dromara.main.domain.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.main.domain.CsOrderCard;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -9,6 +11,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
+@AutoMapper(target = CsOrderCard .class)
 public class CsOrderCardVo implements Serializable {
 
     @Serial

+ 78 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainExamApplyVo.java

@@ -0,0 +1,78 @@
+package org.dromara.main.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.main.domain.MainExamApply;
+
+import java.util.Date;
+
+/**
+ * 测评申请视图对象 main_exam_apply
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = MainExamApply.class)
+public class MainExamApplyVo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 测评ID
+     */
+    private Long evaluationId;
+
+    /**
+     * 租户ID
+     */
+    private String tenantId;
+
+    /**
+     * 学生ID
+     */
+    private Long studentId;
+
+    /**
+     * 申请来源
+     */
+    private String applySource;
+
+    /**
+     * 申请状态
+     */
+    private String applyStatus;
+
+    /**
+     * 预定开始时间
+     */
+    private Date scheduleStartTime;
+
+    /**
+     * 截止时间
+     */
+    private Date deadlineTime;
+
+    /**
+     * 最大尝试次数
+     */
+    private Integer maxAttemptCount;
+
+    /**
+     * 完成时间
+     */
+    private Date finishedTime;
+
+    /**
+     * 最终结果
+     */
+    private String finalResult;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/ICsOrderCardService.java

@@ -3,6 +3,8 @@ package org.dromara.main.service;
 import org.dromara.main.domain.bo.CsOrderCardBo;
 import org.dromara.main.domain.vo.CsOrderCardVo;
 
+import java.util.Map;
+
 public interface ICsOrderCardService {
 
     /**
@@ -30,4 +32,10 @@ public interface ICsOrderCardService {
      */
     void checkExpiredOrderCards();
 
+
+    Map<String, Object> createPayOrder(Long orderCardId, Long userId);
+
+    void handlePaySuccess(String orderNo);
+
+
 }

+ 34 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainExamApplyService.java

@@ -0,0 +1,34 @@
+package org.dromara.main.service;
+
+import org.dromara.main.domain.MainExamApply;
+import org.dromara.main.domain.bo.MainExamApplyBo;
+import org.dromara.main.domain.vo.MainExamApplyVo;
+
+/**
+ * 测评申请Service接口
+ */
+public interface IMainExamApplyService {
+
+    /**
+     * 创建测评申请
+     * @param evaluationId 测评ID
+     * @param studentId 学生ID
+     * @return 申请记录
+     */
+    MainExamApplyVo createExamApply(Long evaluationId, Long studentId);
+
+    /**
+     * 根据ID查询测评申请
+     * @param id 申请ID
+     * @return 申请记录
+     */
+    MainExamApplyVo queryById(Long id);
+
+    /**
+     * 更新申请状态
+     * @param id 申请ID
+     * @param status 新状态
+     * @return 是否成功
+     */
+    Boolean updateApplyStatus(Long id, String status);
+}

+ 8 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainOrderService.java

@@ -14,6 +14,11 @@ public interface IMainOrderService {
      */
     MainOrder queryById(Long id);
 
+    /**
+     * 根据订单号查询订单
+     */
+    MainOrder queryByOrderNo(String orderNo);
+
     /**
      * 查询订单列表
      */
@@ -38,4 +43,7 @@ public interface IMainOrderService {
      * 校验并批量删除订单信息
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+//    WxPayMpOrderResult jsapi(Long orderId) throws WxPayException;
+
 }

+ 14 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IPaymentConfigService.java

@@ -1,6 +1,8 @@
 package org.dromara.main.service;
 
 import org.dromara.main.domain.PaymentConfig;
+import org.dromara.system.domain.bo.PaymentConfigBo;
+import org.dromara.system.domain.vo.PaymentConfigVo;
 
 public interface IPaymentConfigService {
 
@@ -9,4 +11,16 @@ public interface IPaymentConfigService {
     PaymentConfig getEnabledReceiveConfig();
 
     PaymentConfig getEnabledTransferConfig();
+
+    PaymentConfig getEnabledWechatConfig();
+
+    PaymentConfigVo getWechatPayConfig();
+
+    void saveWechatPayConfig(PaymentConfigBo bo);
+
+    void updateWechatPrivateKeyPath(String privateKeyPath);
+
+    void updateWechatCertPath(String certPath);
+
+    void updateWechatPublicKeyPath(String publicKeyPath);
 }

+ 142 - 5
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsOrderCardServiceImpl.java

@@ -1,26 +1,32 @@
 package org.dromara.main.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.github.linpeilie.Converter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.main.domain.CsMessage;
-import org.dromara.main.domain.CsOrderCard;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.main.config.WxPayConfig;
+import org.dromara.main.domain.*;
 import org.dromara.main.domain.bo.CsOrderCardBo;
 import org.dromara.main.domain.vo.CsOrderCardVo;
 import org.dromara.main.mapper.CsMessageMapper;
 import org.dromara.main.mapper.CsOrderCardMapper;
+import org.dromara.main.mapper.MainOrderMapper;
+import org.dromara.main.mapper.MainStudentMapper;
 import org.dromara.main.service.ICsOrderCardService;
 import org.dromara.main.service.ICsSessionService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Slf4j
 @RequiredArgsConstructor
@@ -31,6 +37,10 @@ public class CsOrderCardServiceImpl implements ICsOrderCardService {
     private final CsMessageMapper messageMapper;
     private final ICsSessionService sessionService;
     private final Converter converter;
+    private final MainOrderMapper orderMapper;
+    private final MainStudentMapper studentMapper;
+    @Autowired
+    private WxPayConfig wxPayConfig;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -130,4 +140,131 @@ public class CsOrderCardServiceImpl implements ICsOrderCardService {
         }
     }
 
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String,Object>createPayOrder(Long orderCardId,Long userId) {
+        CsOrderCard orderCard = baseMapper.selectById(orderCardId);
+        if (orderCard == null) {
+            throw new RuntimeException("结算单不存在");
+        }
+        if (!"pending".equals(orderCard.getStatus())) {
+            throw new RuntimeException("结算单状态异常");
+        }
+//        if(LocalDateTime.now().isAfter(orderCard.getCreateTime())){
+//            orderCard.setStatus("expired");
+//            baseMapper.updateById(orderCard);
+//            throw new RuntimeException("结算单已过期");
+//        }
+
+
+        MainStudent student = studentMapper.selectById(userId);
+        if (student == null) {
+            throw new ServiceException("用户不存在");
+        }
+        if(StringUtils.isEmpty(student.getOpenid())){
+            throw new ServiceException("用户未绑定微信");
+        }
+        MainOrder mainOrder= new MainOrder();
+
+        mainOrder.setOrderNo(generateOrderNo());
+        mainOrder.setOrderType(2);
+        mainOrder.setBuyerType(2);
+        mainOrder.setBuyerId(userId);
+        mainOrder.setBuyerName(student.getName());
+        mainOrder.setSource("miniapp");
+        mainOrder.setSellerId(1L);
+        mainOrder.setTotalAmount(defaultAmount(orderCard.getOrderPrice()));
+        mainOrder.setPaidAmount(BigDecimal.ZERO);
+        mainOrder.setRefundAmount(BigDecimal.ZERO);
+        mainOrder.setOrderStatus(0);
+        mainOrder.setPayStatus(0);
+        mainOrder.setBusinessId(orderCard.getId());
+        mainOrder.setProductId(orderCard.getId());
+        mainOrder.setTenantId(student.getTenantId());
+        mainOrder.setRemark(orderCard.getOrderName());
+        orderMapper.insert(mainOrder);
+
+        try {
+            Map<String, String> wxPayParams = wxPayConfig.createJsapiPayParams(
+                student.getOpenid(),
+                orderCard.getOrderPrice(),
+                orderCard.getOrderName(),
+                mainOrder.getOrderNo()
+            );
+
+            // 更新订单的预支付ID
+            mainOrder.setWechatOrderId(wxPayParams.get("prepayId"));
+            orderMapper.updateById(mainOrder);
+
+            // 原有的返回格式保持不变
+            Map<String, Object> result = new LinkedHashMap<>();
+            result.put("success", true);
+            result.put("orderCardId", orderCard.getId());
+            result.put("orderId", mainOrder.getId());
+            result.put("orderNo", mainOrder.getOrderNo());
+            result.put("amount", mainOrder.getTotalAmount());
+            result.put("wechatPayParams", wxPayParams); // 新增:返回微信支付参数
+            result.put("message", "支付请求成功");
+            return result;
+
+        } catch (Exception e) {
+            log.error("创建微信支付失败", e);
+            Map<String, Object> result = new LinkedHashMap<>();
+            result.put("success", false);
+            result.put("message", "创建支付失败:" + e.getMessage());
+            return result;
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void handlePaySuccess(String orderNo) {
+        log.info("处理支付成功,订单号:{}", orderNo);
+
+        // 查找主订单
+        MainOrder mainOrder = orderMapper.selectOne(
+            Wrappers.<MainOrder>lambdaQuery().eq(MainOrder::getOrderNo, orderNo)
+        );
+        if (mainOrder == null) {
+            log.error("支付回调:找不到订单,订单号:{}", orderNo);
+            return;
+        }
+
+        // 防重复处理
+        if (mainOrder.getPayStatus() == 1) {
+            log.info("订单已处理过支付成功,订单号:{}", orderNo);
+            return;
+        }
+
+        // 更新主订单状态(按你的业务逻辑)
+        mainOrder.setPayStatus(1); // 已支付
+        mainOrder.setOrderStatus(1); // 已完成
+        mainOrder.setPaidAmount(mainOrder.getTotalAmount());
+        orderMapper.updateById(mainOrder);
+
+        // 更新结算单状态(按你的业务逻辑)
+        CsOrderCard orderCard = baseMapper.selectById(mainOrder.getBusinessId());
+        if (orderCard != null) {
+            orderCard.setStatus("paid");
+            orderCard.setPayTime(LocalDateTime.now());
+            baseMapper.updateById(orderCard);
+
+            log.info("支付成功处理完成,订单号:{},结算单ID:{}", orderNo, orderCard.getId());
+        }
+    }
+
+
+
+
+
+    private String generateOrderNo() {
+        return "ORD" + DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomNumbers(4);
+    }
+
+    private BigDecimal defaultAmount(BigDecimal amount) {
+        return amount == null ? BigDecimal.ZERO : amount;
+    }
+
+
 }

+ 100 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainExamApplyServiceImpl.java

@@ -0,0 +1,100 @@
+package org.dromara.main.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.github.linpeilie.Converter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.main.domain.MainExamApply;
+import org.dromara.main.domain.MainStudent;
+import org.dromara.main.domain.vo.MainExamApplyVo;
+import org.dromara.main.mapper.MainExamApplyMapper;
+import org.dromara.main.mapper.MainStudentMapper;
+import org.dromara.main.service.IMainExamApplyService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+/**
+ * 测评申请Service业务层处理
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class MainExamApplyServiceImpl implements IMainExamApplyService {
+
+    private final MainExamApplyMapper baseMapper;
+    private final MainStudentMapper studentMapper;
+    private final Converter converter;
+
+    @Override
+    public MainExamApplyVo createExamApply(Long evaluationId, Long studentId) {
+        log.info("创建测评申请,evaluationId: {}, studentId: {}", evaluationId, studentId);
+        
+        // 检查学生是否存在
+        MainStudent student = studentMapper.selectById(studentId);
+        if (student == null) {
+            throw new ServiceException("学生不存在");
+        }
+
+        // 检查是否已经申请过
+        LambdaQueryWrapper<MainExamApply> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(MainExamApply::getEvaluationId, evaluationId)
+                   .eq(MainExamApply::getStudentId, studentId)
+                   .eq(MainExamApply::getDelFlag, "0");
+        
+        MainExamApply existingApply = baseMapper.selectOne(queryWrapper);
+        if (existingApply != null) {
+            log.info("学生已申请过该测评,返回现有申请记录");
+            return converter.convert(existingApply, MainExamApplyVo.class);
+        }
+
+        // 创建新的申请记录
+        MainExamApply examApply = new MainExamApply();
+        examApply.setEvaluationId(evaluationId);
+        examApply.setStudentId(studentId);
+        examApply.setTenantId(student.getTenantId());
+        examApply.setApplySource("1"); // 默认来源:小程序
+        examApply.setApplyStatus("0"); // 默认状态:待开始
+        examApply.setScheduleStartTime(new Date()); // 预定开始时间为当前时间
+        examApply.setMaxAttemptCount(1); // 默认最大尝试次数为1
+        examApply.setDelFlag("0");
+        
+        // 设置截止时间(默认24小时后)
+        Date deadlineTime = new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000);
+        examApply.setDeadlineTime(deadlineTime);
+
+        int result = baseMapper.insert(examApply);
+        if (result > 0) {
+            log.info("测评申请创建成功,申请ID: {}", examApply.getId());
+            return converter.convert(examApply, MainExamApplyVo.class);
+        } else {
+            throw new ServiceException("创建测评申请失败");
+        }
+    }
+
+    @Override
+    public MainExamApplyVo queryById(Long id) {
+        MainExamApply examApply = baseMapper.selectById(id);
+        if (examApply == null) {
+            throw new ServiceException("测评申请不存在");
+        }
+        return converter.convert(examApply, MainExamApplyVo.class);
+    }
+
+    @Override
+    public Boolean updateApplyStatus(Long id, String status) {
+        MainExamApply examApply = baseMapper.selectById(id);
+        if (examApply == null) {
+            throw new ServiceException("测评申请不存在");
+        }
+        
+        examApply.setApplyStatus(status);
+        if ("2".equals(status)) { // 如果状态为已完成
+            examApply.setFinishedTime(new Date());
+        }
+        
+        return baseMapper.updateById(examApply) > 0;
+    }
+}

+ 55 - 11
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainOrderServiceImpl.java

@@ -3,14 +3,13 @@ package org.dromara.main.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.main.domain.MainOrder;
-import org.dromara.main.domain.MainPosition;
-import org.dromara.main.domain.MainStudent;
-import org.dromara.main.domain.MainBackCandidate;
+import org.dromara.main.domain.*;
 import org.dromara.system.domain.vo.SysOssVo;
 import org.dromara.system.service.ISysOssService;
 import org.dromara.main.mapper.MainOrderMapper;
@@ -20,8 +19,10 @@ import org.dromara.main.mapper.MainBackCandidateMapper;
 import org.dromara.main.service.IMainOrderService;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 @RequiredArgsConstructor
 @Service
@@ -32,6 +33,8 @@ public class MainOrderServiceImpl implements IMainOrderService {
     private final MainPositionMapper positionMapper;
     private final MainBackCandidateMapper candidateMapper;
     private final ISysOssService ossService;
+    private final MainOrderMapper orderMapper;
+//    private final WxPayService wxPayService;
 
     @Override
     public MainOrder queryById(Long id) {
@@ -40,18 +43,27 @@ public class MainOrderServiceImpl implements IMainOrderService {
         return order;
     }
 
+    @Override
+    public MainOrder queryByOrderNo(String orderNo) {
+        MainOrder order = baseMapper.selectOne(Wrappers.<MainOrder>lambdaQuery()
+            .eq(MainOrder::getOrderNo, orderNo)
+            .last("limit 1"));
+        fillExtendInfo(order);
+        return order;
+    }
+
     @Override
     public TableDataInfo<MainOrder> queryPageList(MainOrder order, PageQuery pageQuery) {
         LambdaQueryWrapper<MainOrder> lqw = buildQueryWrapper(order);
         Page<MainOrder> result = baseMapper.selectPage(pageQuery.build(), lqw);
-        
+
         // 填充扩展信息
         if (result.getRecords() != null && !result.getRecords().isEmpty()) {
             for (MainOrder item : result.getRecords()) {
                 fillExtendInfo(item);
             }
         }
-        
+
         return TableDataInfo.build(result);
     }
 
@@ -59,14 +71,14 @@ public class MainOrderServiceImpl implements IMainOrderService {
     public List<MainOrder> queryList(MainOrder order) {
         LambdaQueryWrapper<MainOrder> lqw = buildQueryWrapper(order);
         List<MainOrder> list = baseMapper.selectList(lqw);
-        
+
         // 填充扩展信息
         if (list != null && !list.isEmpty()) {
             for (MainOrder item : list) {
                 fillExtendInfo(item);
             }
         }
-        
+
         return list;
     }
 
@@ -77,7 +89,7 @@ public class MainOrderServiceImpl implements IMainOrderService {
         if (order == null) {
             return;
         }
-        
+
         // 1. 如果买家是学员,获取学员信息
         if (order.getBuyerType() != null && order.getBuyerType() == 2 && order.getBuyerId() != null) {
             MainStudent student = studentMapper.selectById(order.getBuyerId());
@@ -91,7 +103,7 @@ public class MainOrderServiceImpl implements IMainOrderService {
                 }
             }
         }
-        
+
         // 2. 根据订单类型获取业务信息
         if (order.getOrderType() != null && order.getBusinessId() != null) {
             if (order.getOrderType() == 1) {
@@ -150,4 +162,36 @@ public class MainOrderServiceImpl implements IMainOrderService {
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         return baseMapper.deleteByIds(ids) > 0;
     }
-}
+
+//    @Override
+//    public WxPayMpOrderResult jsapi(Long orderId) throws WxPayException {
+//        MainOrder order = orderMapper.selectById(orderId);
+//        if (order == null) {
+//            throw new ServiceException("订单不存在");
+//        }
+//        MainStudent student = studentMapper.selectById(order.getBuyerId());
+//        if(student == null){
+//            throw new ServiceException("学员不存在");
+//        }
+//
+//        WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
+//        request.setAppid(wxPayService.getConfig().getAppId());
+//        request.setMchid(wxPayService.getConfig().getMchId());
+//
+//        request.setDescription("简介");
+//        request.setOutTradeNo(order.getOrderNo());
+//
+//        WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
+//        amount.setTotal(order.getTotalAmount().multiply(new BigDecimal(100)).intValue());
+//        amount.setCurrency("CNY");
+//        request.setAmount(amount);
+//
+//        WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
+//        payer.setOpenid(student.getOpenid());
+//        request.setPayer(payer);
+//
+//        request.setNotifyUrl(wxPayService.getConfig().getNotifyUrl());
+//        return wxPayService.createOrderV3(TradeTypeEnum.JSAPI,request);
+//
+//     }
+ }

+ 92 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/PaymentConfigServiceImpl.java

@@ -5,7 +5,10 @@ import lombok.RequiredArgsConstructor;
 import org.dromara.main.domain.PaymentConfig;
 import org.dromara.main.mapper.PaymentConfigMapper;
 import org.dromara.main.service.IPaymentConfigService;
+import org.dromara.system.domain.bo.PaymentConfigBo;
+import org.dromara.system.domain.vo.PaymentConfigVo;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 @RequiredArgsConstructor
 @Service
@@ -41,4 +44,93 @@ public class PaymentConfigServiceImpl implements IPaymentConfigService {
                 .last("limit 1")
         );
     }
+
+    @Override
+    public PaymentConfig getEnabledWechatConfig() {
+        return paymentConfigMapper.selectOne(
+            Wrappers.<PaymentConfig>lambdaQuery()
+                .eq(PaymentConfig::getConfigType, 1)
+                .eq(PaymentConfig::getPaymentType, 2)
+                .eq(PaymentConfig::getIsEnabled, 1)
+                .orderByDesc(PaymentConfig::getCreateTime)
+                .last("limit 1")
+        );
+    }
+
+    @Override
+    public PaymentConfigVo getWechatPayConfig() {
+        PaymentConfig config = getOrCreateWechatConfig();
+        PaymentConfigVo vo = new PaymentConfigVo();
+        vo.setMchId(config.getMchId());
+        vo.setApiV3Key(config.getApiV3Key());
+        vo.setNotifyUrl(config.getPayNotifyUrl());
+        vo.setPublicKeyId(config.getPublicKeyId());
+        vo.setPrivateKeyUploaded(config.getPrivateKeyPath() != null && !config.getPrivateKeyPath().isEmpty());
+        vo.setCertUploaded(config.getCertPath() != null && !config.getCertPath().isEmpty());
+        vo.setPublicKeyUploaded(config.getPublicKeyPath() != null && !config.getPublicKeyPath().isEmpty());
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveWechatPayConfig(PaymentConfigBo bo) {
+        PaymentConfig config = getOrCreateWechatConfig();
+        config.setMchId(bo.getMchId());
+        config.setApiV3Key(bo.getApiV3Key());
+        config.setPayNotifyUrl(bo.getNotifyUrl());
+        config.setPublicKeyId(bo.getPublicKeyId());
+        saveOrUpdate(config);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateWechatPrivateKeyPath(String privateKeyPath) {
+        PaymentConfig config = getOrCreateWechatConfig();
+        config.setPrivateKeyPath(privateKeyPath);
+        saveOrUpdate(config);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateWechatCertPath(String certPath) {
+        PaymentConfig config = getOrCreateWechatConfig();
+        config.setCertPath(certPath);
+        saveOrUpdate(config);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateWechatPublicKeyPath(String publicKeyPath) {
+        PaymentConfig config = getOrCreateWechatConfig();
+        config.setPublicKeyPath(publicKeyPath);
+        saveOrUpdate(config);
+    }
+
+    private PaymentConfig getOrCreateWechatConfig() {
+        PaymentConfig config = paymentConfigMapper.selectOne(
+            Wrappers.<PaymentConfig>lambdaQuery()
+                .eq(PaymentConfig::getConfigType, 1)
+                .eq(PaymentConfig::getPaymentType, 2)
+                .orderByDesc(PaymentConfig::getCreateTime)
+                .last("limit 1")
+        );
+        if (config != null) {
+            return config;
+        }
+        PaymentConfig add = new PaymentConfig();
+        add.setConfigName("微信小程序支付配置");
+        add.setConfigType(1);
+        add.setPaymentType(2);
+        add.setIsEnabled(1);
+        paymentConfigMapper.insert(add);
+        return add;
+    }
+
+    private void saveOrUpdate(PaymentConfig config) {
+        if (config.getId() == null) {
+            paymentConfigMapper.insert(config);
+            return;
+        }
+        paymentConfigMapper.updateById(config);
+    }
 }

+ 35 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/utils/WXPayUtility.java

@@ -0,0 +1,35 @@
+package org.dromara.main.utils;
+
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.util.Base64;
+
+/**
+ * 微信支付工具类(完全照搬photo项目)
+ */
+public class WXPayUtility {
+
+    /**
+     * 签名
+     */
+    public static String sign(String message, String algorithm, PrivateKey privateKey) throws Exception {
+        Signature signature = Signature.getInstance(algorithm);
+        signature.initSign(privateKey);
+        signature.update(message.getBytes(StandardCharsets.UTF_8));
+        byte[] signBytes = signature.sign();
+        return Base64.getEncoder().encodeToString(signBytes);
+    }
+
+    /**
+     * 验签
+     */
+    public static boolean verify(String message, String signatureStr, String algorithm, PublicKey publicKey) throws Exception {
+        Signature signature = Signature.getInstance(algorithm);
+        signature.initVerify(publicKey);
+        signature.update(message.getBytes(StandardCharsets.UTF_8));
+        byte[] signBytes = Base64.getDecoder().decode(signatureStr);
+        return signature.verify(signBytes);
+    }
+}

+ 2132 - 0
script/sql/sj.sql

@@ -0,0 +1,2132 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : 审计之家
+ Source Server Type    : MySQL
+ Source Server Version : 80036 (8.0.36)
+ Source Host           : 116.62.136.107:4563
+ Source Schema         : sj
+
+ Target Server Type    : MySQL
+ Target Server Version : 80036 (8.0.36)
+ File Encoding         : 65001
+
+ Date: 10/04/2026 16:03:40
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for cs_message
+-- ----------------------------
+DROP TABLE IF EXISTS `cs_message`;
+CREATE TABLE `cs_message`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '消息ID',
+  `session_id` bigint NOT NULL COMMENT '归属会话ID',
+  `msg_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '消息唯一编号(客户端生成,用于幂等)',
+  `sender_type` tinyint(1) NOT NULL COMMENT '发送方类型: 1=用户/商家, 2=客服, 3=系统',
+  `sender_id` bigint NOT NULL COMMENT '发送者ID',
+  `msg_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '消息类型: text/image/file/job_card/order_card/emoji',
+  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '文本消息内容',
+  `file_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图片/文件URL',
+  `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件原始名称',
+  `file_size` bigint NULL DEFAULT NULL COMMENT '文件大小(字节)',
+  `file_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件MIME类型',
+  `payload` json NULL COMMENT '卡片类消息的结构化数据(job_card/order_card的JSON)',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态: 1=正常, 2=已撤回',
+  `is_read` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已读: 0=未读, 1=已读',
+  `send_time` datetime NOT NULL COMMENT '发送时间',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `msg_no`(`msg_no` ASC) USING BTREE,
+  INDEX `idx_session`(`session_id` ASC) USING BTREE,
+  INDEX `idx_send_time`(`send_time` ASC) USING BTREE,
+  INDEX `idx_msg_type`(`msg_type` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 62 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天消息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for cs_order_card
+-- ----------------------------
+DROP TABLE IF EXISTS `cs_order_card`;
+CREATE TABLE `cs_order_card`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '结算单ID',
+  `msg_id` bigint NOT NULL COMMENT '关联消息ID',
+  `session_id` bigint NOT NULL COMMENT '关联会话ID',
+  `order_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '项目名称',
+  `order_price` decimal(10, 2) NOT NULL COMMENT '支付金额',
+  `order_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单类型说明',
+  `original_order_id` bigint NULL DEFAULT NULL COMMENT '关联平台真实订单ID',
+  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'pending' COMMENT '状态: pending=待支付, paid=已支付, cancelled=已取消, expired=已失效',
+  `expire_time` datetime NOT NULL COMMENT '结算单过期时间(发送时间+60s)',
+  `pay_time` datetime NULL DEFAULT NULL COMMENT '实际支付时间',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_msg_id`(`msg_id` ASC) USING BTREE,
+  INDEX `idx_session`(`session_id` ASC) USING BTREE,
+  INDEX `idx_status`(`status` ASC) USING BTREE,
+  INDEX `idx_expire`(`expire_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '结算单表(order_card)' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for cs_read_record
+-- ----------------------------
+DROP TABLE IF EXISTS `cs_read_record`;
+CREATE TABLE `cs_read_record`  (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `session_id` bigint NOT NULL COMMENT '会话ID',
+  `user_id` bigint NOT NULL COMMENT '用户ID',
+  `last_read_msg_id` bigint NULL DEFAULT 0 COMMENT '已读到的消息ID',
+  `read_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_session_user`(`session_id` ASC, `user_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '消息已读记录表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for cs_seat_config
+-- ----------------------------
+DROP TABLE IF EXISTS `cs_seat_config`;
+CREATE TABLE `cs_seat_config`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '坐席ID',
+  `seat_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '坐席名称(如:客服小A)',
+  `avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '坐席头像URL',
+  `module` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '负责模块: mini(小程序), merchant(商家), all(全部)',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态: 0=停用, 1=启用',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '坐席配置表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for cs_seat_waiter
+-- ----------------------------
+DROP TABLE IF EXISTS `cs_seat_waiter`;
+CREATE TABLE `cs_seat_waiter`  (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `seat_id` bigint NOT NULL COMMENT '坐席ID',
+  `user_id` bigint NOT NULL COMMENT '客服用户ID(关联若依sys_user)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_seat_id`(`seat_id` ASC) USING BTREE,
+  INDEX `idx_user_id`(`user_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '坐席-客服关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for cs_session
+-- ----------------------------
+DROP TABLE IF EXISTS `cs_session`;
+CREATE TABLE `cs_session`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '会话ID',
+  `session_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '会话编号,唯一,用于WS频道路由',
+  `session_type` tinyint(1) NOT NULL COMMENT '会话类型: 1=小程序用户, 2=PC商家',
+  `from_user_id` bigint NOT NULL COMMENT '发起用户ID(小程序用户或商家用户ID)',
+  `from_user_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '发起方昵称',
+  `from_user_avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '发起方头像',
+  `seat_id` bigint NULL DEFAULT NULL COMMENT '当前分配坐席ID',
+  `waiter_id` bigint NULL DEFAULT NULL COMMENT '当前接待客服ID',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态: 1=进行中, 2=已结束',
+  `last_msg` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '最后一条消息摘要(用于列表展示)',
+  `last_msg_time` datetime NULL DEFAULT NULL COMMENT '最后消息时间',
+  `unread_count` int NOT NULL DEFAULT 0 COMMENT '客服侧未读消息数',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `session_no`(`session_no` ASC) USING BTREE,
+  INDEX `idx_from_user`(`from_user_id` ASC) USING BTREE,
+  INDEX `idx_waiter`(`waiter_id` ASC) USING BTREE,
+  INDEX `idx_status`(`status` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '客服会话表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for cs_ticket
+-- ----------------------------
+DROP TABLE IF EXISTS `cs_ticket`;
+CREATE TABLE `cs_ticket`  (
+  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '工单编号(如: 20991216194)',
+  `session_id` bigint NULL DEFAULT NULL COMMENT '关联会话ID(若来自在线沟通)',
+  `user_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '反馈用户ID',
+  `user_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '反馈用户昵称',
+  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '反馈内容',
+  `source` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '反馈渠道: 小程序/商家',
+  `category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '问题分类',
+  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'pending' COMMENT '状态: pending=待处理, processing=处理中, completed=已完成, abandoned=已废弃',
+  `handler_id` bigint NULL DEFAULT NULL COMMENT '处理客服ID',
+  `handler_reply` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '客服处理回复',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_user`(`user_id` ASC) USING BTREE,
+  INDEX `idx_status`(`status` ASC) USING BTREE,
+  INDEX `idx_source`(`source` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '客服工单表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for gen_table
+-- ----------------------------
+DROP TABLE IF EXISTS `gen_table`;
+CREATE TABLE `gen_table`  (
+  `table_id` bigint NOT NULL COMMENT '编号',
+  `data_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '数据源名称',
+  `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表名称',
+  `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表描述',
+  `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联子表的表名',
+  `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子表关联的外键名',
+  `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '实体类名称',
+  `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)',
+  `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成包路径',
+  `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成模块名',
+  `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成业务名',
+  `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能名',
+  `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能作者',
+  `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',
+  `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',
+  `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '其它生成选项',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`table_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for gen_table_column
+-- ----------------------------
+DROP TABLE IF EXISTS `gen_table_column`;
+CREATE TABLE `gen_table_column`  (
+  `column_id` bigint NOT NULL COMMENT '编号',
+  `table_id` bigint NULL DEFAULT NULL COMMENT '归属表编号',
+  `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列名称',
+  `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列描述',
+  `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列类型',
+  `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA类型',
+  `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA字段名',
+  `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否主键(1是)',
+  `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否自增(1是)',
+  `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否必填(1是)',
+  `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)',
+  `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)',
+  `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)',
+  `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)',
+  `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',
+  `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+  `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型',
+  `sort` int NULL DEFAULT NULL COMMENT '排序',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`column_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_ability_config
+-- ----------------------------
+DROP TABLE IF EXISTS `main_ability_config`;
+CREATE TABLE `main_ability_config`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '能力配置ID',
+  `evaluation_id` bigint NOT NULL COMMENT '关联的测评ID',
+  `ability_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '能力名称',
+  `third_exam_info_id` bigint NULL DEFAULT NULL COMMENT '第三方考试ID',
+  `third_exam_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '第三方试卷名称',
+  `third_exam_time` int NULL DEFAULT NULL COMMENT '作答时长(分钟)',
+  `third_exam_pass_mark` decimal(10, 2) NULL DEFAULT NULL COMMENT '及格分',
+  `third_exam_total_score` decimal(10, 2) NULL DEFAULT NULL COMMENT '总分',
+  `third_exam_link` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '考试链接',
+  `sort_order` int NULL DEFAULT 0 COMMENT '排序',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_evaluation_id`(`evaluation_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评能力配置表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_agreement
+-- ----------------------------
+DROP TABLE IF EXISTS `main_agreement`;
+CREATE TABLE `main_agreement`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '协议标题',
+  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '协议富文本内容',
+  `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '协议类型: service-服务协议, privacy-隐私政策',
+  `version` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'v1.0.0' COMMENT '协议版本号',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志 (0代表存在 2代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_type`(`type` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '小程序协议管理表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_audit
+-- ----------------------------
+DROP TABLE IF EXISTS `main_audit`;
+CREATE TABLE `main_audit`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '审核ID',
+  `audit_type` tinyint(1) NOT NULL COMMENT '审核类型(1-公司审核 2-岗位审核)',
+  `target_id` bigint NOT NULL COMMENT '审核目标ID(申请表ID)',
+  `audit_result` tinyint(1) NOT NULL DEFAULT 0 COMMENT '审核结果(0-待审核 1-已通过 2-未通过)',
+  `audit_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '审核备注',
+  `deposit` decimal(10, 2) NULL DEFAULT NULL COMMENT '定金(仅岗位审核)',
+  `final_payment` decimal(10, 2) NULL DEFAULT NULL COMMENT '尾款(仅岗位审核)',
+  `audit_time` datetime NULL DEFAULT NULL COMMENT '审核时间',
+  `audit_by` bigint NULL DEFAULT NULL COMMENT '审核人',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户ID',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_audit_type`(`audit_type` ASC) USING BTREE,
+  INDEX `idx_target_id`(`target_id` ASC) USING BTREE,
+  INDEX `idx_audit_result`(`audit_result` ASC) USING BTREE,
+  INDEX `idx_audit_time`(`audit_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041792456597020674 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '审核信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_back_candidate
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_candidate`;
+CREATE TABLE `main_back_candidate`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '所属租户(企业ID)',
+  `student_id` bigint NOT NULL COMMENT '关联学员ID',
+  `source` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '来源渠道',
+  `enterprise_status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'pending' COMMENT '企业意愿状态(pending-待处理/adopted-录用/rejected-不录用)',
+  `student_status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'pending' COMMENT '学员意愿状态(pending-待确认/accepted-已接受/rejected-已拒绝)',
+  `offer_file_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Offer PDF文件URL',
+  `offer_file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Offer PDF文件名',
+  `offer_time` datetime NULL DEFAULT NULL COMMENT '企业发送Offer时间',
+  `student_reply_time` datetime NULL DEFAULT NULL COMMENT '学员确认或拒绝Offer时间',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '状态(兼容旧数据)',
+  `post_id` bigint NULL DEFAULT NULL COMMENT '岗位ID',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041374899159269379 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '企业候选人关系表,-- 状态组合逻辑:\r\n-- - enterprise_status=pending, student_status=pending: 待审核(企业未处理)\r\n-- - enterprise_status=adopted, student_status=pending: 待确认(Offer已发出)\r\n-- - enterprise_status=adopted, student_status=accepted: 已录用(双方确认)\r\n-- - enterprise_status=adopted, student_status=rejected: 已拒绝(学员拒绝)\r\n-- - enterprise_status=rejected: 不录用(企业拒绝)' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_back_category
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_category`;
+CREATE TABLE `main_back_category`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名称',
+  `price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '分类价格',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '状态(0停用 1正常)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '背调条款分类表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_back_clause
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_clause`;
+CREATE TABLE `main_back_clause`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `category_id` bigint NOT NULL COMMENT '所属分类ID',
+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '条款名称',
+  `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '条款类型(字典:sys_clause_type)',
+  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '条款描述',
+  `price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '条款单价',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '状态(0停用 1正常)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_category_id`(`category_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '背调条款表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_back_interview
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_interview`;
+CREATE TABLE `main_back_interview`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `candidate_id` bigint NOT NULL COMMENT '候选人报名记录ID',
+  `record_id` bigint NOT NULL COMMENT '背调记录ID',
+  `interviewee_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '受访者姓名',
+  `interviewee_relation` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '关系(上级主管/公司HR/同事)',
+  `interviewee_contact` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系方式',
+  `qa_1` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '问答1(认识时间职务与职责)',
+  `qa_2` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '问答2(优势与擅长)',
+  `qa_3` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '问答3(职业道德与不良评价)',
+  `qa_4` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '问答4(人际关系协作)',
+  `qa_5` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '问答5(总体评价与改进建议)',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户ID',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_record_id`(`record_id` ASC) USING BTREE,
+  INDEX `idx_candidate_id`(`candidate_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '背调访谈记录表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_back_order
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_order`;
+CREATE TABLE `main_back_order`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '下单租户(企业ID)',
+  `category_id` bigint NULL DEFAULT NULL COMMENT '背调套餐ID',
+  `category_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '套餐名称快照',
+  `total_amount` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '订单金额',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '订单状态(0待处理 1进行中 2已完成 3已退款)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `clause_ids` json NULL COMMENT '条款ID列表(JSON数组)',
+  `clause_group_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '自定义条款组合唯一标识',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_order_no`(`order_no` ASC) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041690761955115010 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '背调订单表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_back_record
+-- ----------------------------
+DROP TABLE IF EXISTS `main_back_record`;
+CREATE TABLE `main_back_record`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID',
+  `order_id` bigint NOT NULL COMMENT '关联订单ID',
+  `candidate_id` bigint NOT NULL COMMENT '关联企业候选人ID',
+  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '未完成' COMMENT '状态(完成、未完成、失败)',
+  `report_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '报告地址',
+  `finish_time` datetime NULL DEFAULT NULL COMMENT '完成时间',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `report_status` tinyint(1) NULL DEFAULT 0 COMMENT '报告状态(0待填写,1已出具)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_order_id`(`order_id` ASC) USING BTREE,
+  INDEX `idx_candidate_id`(`candidate_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041690762508763139 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '背调执行记录表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_banner
+-- ----------------------------
+DROP TABLE IF EXISTS `main_banner`;
+CREATE TABLE `main_banner`  (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '轮播图标题',
+  `image_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '图片地址',
+  `link_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '跳转链接',
+  `sort_order` int NULL DEFAULT 0 COMMENT '排序权重',
+  `is_enabled` tinyint NULL DEFAULT 1 COMMENT '是否启用:0-禁用 1-启用',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户ID(平台级数据默认为000000)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_sort_order`(`sort_order` ASC) USING BTREE,
+  INDEX `idx_is_enabled`(`is_enabled` ASC) USING BTREE,
+  INDEX `idx_create_time`(`create_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '首页轮播图表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_company_account_flow
+-- ----------------------------
+DROP TABLE IF EXISTS `main_company_account_flow`;
+CREATE TABLE `main_company_account_flow`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '流水ID',
+  `company_id` bigint NOT NULL COMMENT '企业ID',
+  `flow_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '流水号',
+  `flow_type` tinyint NOT NULL COMMENT '流水类型(1-收入 2-支出 3-冻结 4-解冻)',
+  `amount` decimal(10, 2) NOT NULL COMMENT '金额(元)',
+  `balance_type` tinyint NOT NULL COMMENT '余额类型(1-可用余额 2-使用中余额 3-提现中余额 4-累计消费)',
+  `balance_before` decimal(10, 2) NOT NULL COMMENT '操作前余额(元)',
+  `balance_after` decimal(10, 2) NOT NULL COMMENT '操作后余额(元)',
+  `business_type` tinyint NULL DEFAULT NULL COMMENT '业务类型(1-充值 2-背调订单支付 3-背调订单退款 4-背调报酬收入 5-提现申请 6-提现成功 7-提现失败 8-订单完成扣款)',
+  `business_id` bigint NULL DEFAULT NULL COMMENT '关联业务ID(订单ID、任务ID、提现ID等)',
+  `business_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '业务单号(订单号、任务号、提现单号等)',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_company_id`(`company_id` ASC) USING BTREE,
+  INDEX `idx_flow_no`(`flow_no` ASC) USING BTREE,
+  INDEX `idx_business`(`business_type` ASC, `business_id` ASC) USING BTREE,
+  INDEX `idx_create_time`(`create_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041403439510478850 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '企业账户流水表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_company_apply
+-- ----------------------------
+DROP TABLE IF EXISTS `main_company_apply`;
+CREATE TABLE `main_company_apply`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '申请ID',
+  `apply_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '申请编号',
+  `company_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '企业名称',
+  `official_account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '官方邮箱',
+  `office_address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '办公地址',
+  `credit_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '统一社会信用代码',
+  `auth_letter` bigint NULL DEFAULT NULL COMMENT '委托招聘证明URL',
+  `avatar` bigint NULL DEFAULT NULL COMMENT '头像URL',
+  `surname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓氏',
+  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名字',
+  `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号',
+  `apply_status` tinyint(1) NULL DEFAULT 0 COMMENT '申请状态(0-待审核 1-审核中 2-已通过 3-已驳回)',
+  `audit_id` bigint NULL DEFAULT NULL COMMENT '关联审核ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户ID',
+  `reject_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '驳回原因',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `latitude` decimal(10, 8) NULL DEFAULT NULL COMMENT '纬度',
+  `longitude` decimal(11, 8) NULL DEFAULT NULL COMMENT '经度',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_apply_no`(`apply_no` ASC) USING BTREE,
+  UNIQUE INDEX `uk_credit_code`(`credit_code` ASC) USING BTREE,
+  INDEX `idx_apply_status`(`apply_status` ASC) USING BTREE,
+  INDEX `idx_mobile`(`mobile` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041792456253087746 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '企业入驻申请表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_company_withdraw_account
+-- ----------------------------
+DROP TABLE IF EXISTS `main_company_withdraw_account`;
+CREATE TABLE `main_company_withdraw_account`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '账户ID',
+  `company_id` bigint NOT NULL COMMENT '企业ID',
+  `account_type` tinyint NOT NULL COMMENT '账户类型(1-支付宝 2-银行卡 3-微信)',
+  `account_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '账户名称(真实姓名或企业名称)',
+  `account_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '账号(支付宝账号/银行卡号/微信号)',
+  `bank_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '银行名称(仅银行卡需要)',
+  `bank_branch` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开户行支行(仅银行卡需要)',
+  `is_default` tinyint NULL DEFAULT 0 COMMENT '是否默认账户(0-否 1-是)',
+  `status` tinyint NULL DEFAULT 0 COMMENT '审核状态(0-待审核 1-审核通过 2-审核拒绝)',
+  `auditor_id` bigint NULL DEFAULT NULL COMMENT '审核人ID',
+  `audit_time` datetime NULL DEFAULT NULL COMMENT '审核时间',
+  `audit_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '审核备注',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_company_id`(`company_id` ASC) USING BTREE,
+  INDEX `idx_status`(`status` ASC) USING BTREE,
+  INDEX `idx_is_default`(`is_default` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041357336341741570 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '企业收款账户表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_exam_ability_attempt
+-- ----------------------------
+DROP TABLE IF EXISTS `main_exam_ability_attempt`;
+CREATE TABLE `main_exam_ability_attempt`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '能力考试记录ID',
+  `apply_id` bigint NOT NULL COMMENT '报名记录ID(关联 main_exam_apply.id)',
+  `evaluation_id` bigint NOT NULL COMMENT '测评ID(冗余存储,便于查询)',
+  `ability_config_id` bigint NOT NULL COMMENT '能力配置ID(关联 main_ability_config.id)',
+  `third_exam_info_id` bigint NOT NULL COMMENT '第三方考试ID',
+  `third_exam_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '第三方考试名称快照',
+  `third_user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '第三方考生标识',
+  `attempt_no` int NOT NULL DEFAULT 1 COMMENT '当前能力第几次作答',
+  `attempt_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '作答状态(0待开始 1进行中 2已交卷 3已同步 4异常)',
+  `start_time` datetime NULL DEFAULT NULL COMMENT '开始作答时间',
+  `submit_time` datetime NULL DEFAULT NULL COMMENT '交卷时间',
+  `duration_seconds` int NULL DEFAULT NULL COMMENT '作答时长(秒)',
+  `submit_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '交卷方式(1主动交卷 2自动交卷 3后台结束)',
+  `ip_address` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '作答IP地址',
+  `device_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '终端设备类型',
+  `device_os` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '终端操作系统',
+  `browser_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '浏览器名称',
+  `total_score` decimal(10, 2) NULL DEFAULT NULL COMMENT '该能力考试总分',
+  `pass_score` decimal(10, 2) NULL DEFAULT NULL COMMENT '该能力考试及格分',
+  `final_result` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '该能力结果(1通过 2未通过)',
+  `sync_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '题目答案同步状态(0未同步 1已同步 2同步失败)',
+  `sync_time` datetime NULL DEFAULT NULL COMMENT '最近一次同步时间',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_apply_ability_attempt_no`(`apply_id` ASC, `ability_config_id` ASC, `attempt_no` ASC) USING BTREE,
+  INDEX `idx_evaluation_id`(`evaluation_id` ASC) USING BTREE,
+  INDEX `idx_ability_config_id`(`ability_config_id` ASC) USING BTREE,
+  INDEX `idx_third_exam_info_id`(`third_exam_info_id` ASC) USING BTREE,
+  INDEX `idx_attempt_status`(`attempt_status` ASC) USING BTREE,
+  INDEX `idx_final_result`(`final_result` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 960004 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '能力考试作答主记录表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_exam_apply
+-- ----------------------------
+DROP TABLE IF EXISTS `main_exam_apply`;
+CREATE TABLE `main_exam_apply`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '报名记录ID',
+  `evaluation_id` bigint NOT NULL COMMENT '测评ID(关联 main_exam_evaluation.id)',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '所属租户编号',
+  `student_id` bigint NOT NULL COMMENT '学员ID(关联 main_student.id)',
+  `apply_source` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '报名来源(1后台分配 2自主报名 3员工同步)',
+  `apply_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '报名状态(0待开始 1进行中 2已完成 3已关闭)',
+  `schedule_start_time` datetime NULL DEFAULT NULL COMMENT '允许开始时间',
+  `deadline_time` datetime NULL DEFAULT NULL COMMENT '最晚完成时间',
+  `max_attempt_count` int NULL DEFAULT 1 COMMENT '单个能力考试最大可作答次数',
+  `finished_time` datetime NULL DEFAULT NULL COMMENT '整场测评完成时间',
+  `final_result` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '整场测评结果(1通过 2未通过)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_evaluation_tenant_student`(`evaluation_id` ASC, `tenant_id` ASC, `student_id` ASC) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
+  INDEX `idx_apply_status`(`apply_status` ASC) USING BTREE,
+  INDEX `idx_final_result`(`final_result` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2039950266350546946 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评报名与分配表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_exam_attempt_question
+-- ----------------------------
+DROP TABLE IF EXISTS `main_exam_attempt_question`;
+CREATE TABLE `main_exam_attempt_question`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '逐题快照ID',
+  `attempt_id` bigint NOT NULL COMMENT '能力考试记录ID(关联 main_exam_ability_attempt.id)',
+  `third_question_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '第三方题目ID',
+  `question_no` int NOT NULL COMMENT '题号',
+  `question_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '题型快照',
+  `question_stem` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '题干快照',
+  `question_analysis` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '题目解析快照',
+  `standard_answer` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '标准答案快照',
+  `answer_text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '考生作答内容快照',
+  `full_score` decimal(10, 2) NULL DEFAULT NULL COMMENT '题目满分',
+  `score_obtained` decimal(10, 2) NULL DEFAULT NULL COMMENT '该题实得分',
+  `is_correct` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否答对(0否 1是)',
+  `judge_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '判题状态(0未判 1已判)',
+  `judge_time` datetime NULL DEFAULT NULL COMMENT '判题时间',
+  `source_raw_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '第三方原始题目与答案快照JSON',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_attempt_question_no`(`attempt_id` ASC, `question_no` ASC) USING BTREE,
+  INDEX `idx_attempt_id`(`attempt_id` ASC) USING BTREE,
+  INDEX `idx_third_question_id`(`third_question_id` ASC) USING BTREE,
+  INDEX `idx_judge_status`(`judge_status` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 970004 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '第三方题目逐题作答快照表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_exam_attempt_question_option
+-- ----------------------------
+DROP TABLE IF EXISTS `main_exam_attempt_question_option`;
+CREATE TABLE `main_exam_attempt_question_option`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '题目选项快照ID',
+  `attempt_question_id` bigint NOT NULL COMMENT '逐题快照ID(关联 main_exam_attempt_question.id)',
+  `third_option_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '第三方选项ID',
+  `option_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '选项编码(如A、B、C、D)',
+  `option_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '选项内容快照',
+  `is_correct` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '是否标准答案(0否 1是)',
+  `is_selected` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '考生是否选择(0否 1是)',
+  `sort_order` int NULL DEFAULT 0 COMMENT '显示排序',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_attempt_question_option_code`(`attempt_question_id` ASC, `option_code` ASC) USING BTREE,
+  INDEX `idx_attempt_question_id`(`attempt_question_id` ASC) USING BTREE,
+  INDEX `idx_third_option_id`(`third_option_id` ASC) USING BTREE,
+  INDEX `idx_is_selected`(`is_selected` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 980013 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '第三方题目选项快照表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_exam_evaluation
+-- ----------------------------
+DROP TABLE IF EXISTS `main_exam_evaluation`;
+CREATE TABLE `main_exam_evaluation`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '测评ID',
+  `evaluation_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '测评名称',
+  `grade` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '级别',
+  `position` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '岗位',
+  `position_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '岗位类型',
+  `tags` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标签',
+  `main_image` bigint NULL DEFAULT NULL COMMENT '主图',
+  `image_album` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品相册',
+  `detail` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '详情',
+  `price` decimal(10, 0) NULL DEFAULT NULL COMMENT '价格',
+  `on_time` date NULL DEFAULT NULL COMMENT '上架时间',
+  `down_time` date NULL DEFAULT NULL COMMENT '下架时间',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
+  INDEX `idx_status`(`status` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2042118691629834243 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '测评管理表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_goods
+-- ----------------------------
+DROP TABLE IF EXISTS `main_goods`;
+CREATE TABLE `main_goods`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '租户编号',
+  `product_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品名称',
+  `product_type` int NOT NULL DEFAULT 1 COMMENT '商品类型(1=签约)跟main_goods_type',
+  `position_id` bigint NULL DEFAULT NULL COMMENT '绑定岗位ID',
+  `position_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '绑定岗位名称(冗余)',
+  `content_type` int NULL DEFAULT 1 COMMENT '内容类型(1=富文本 2=链接)',
+  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品内容(富文本HTML或链接URL)',
+  `deposit` decimal(10, 2) NULL DEFAULT NULL COMMENT '定金',
+  `final_payment` decimal(10, 2) NULL DEFAULT NULL COMMENT '尾款',
+  `product_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '商品价格(定金+尾款)',
+  `product_image` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品图片链接',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_product_type`(`product_type` ASC) USING BTREE,
+  INDEX `idx_position_id`(`position_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2039660717702926338 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_message
+-- ----------------------------
+DROP TABLE IF EXISTS `main_message`;
+CREATE TABLE `main_message`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '消息ID',
+  `student_id` bigint NOT NULL COMMENT '接收用户ID',
+  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '消息标题',
+  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '消息正文',
+  `position_id` bigint NULL DEFAULT NULL COMMENT '关联岗位ID(main_position.id)',
+  `is_read` tinyint(1) NULL DEFAULT 0 COMMENT '是否已读(0-未读,1-已读)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0-正常,1-删除)',
+  `version` int NULL DEFAULT 0 COMMENT '乐观锁版本号',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_user_read_time`(`student_id` ASC, `is_read` ASC, `create_time` ASC) USING BTREE,
+  INDEX `idx_position_id`(`position_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '消息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_order
+-- ----------------------------
+DROP TABLE IF EXISTS `main_order`;
+CREATE TABLE `main_order`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
+  `order_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号',
+  `customer_sn` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '客户单号',
+  `order_type` tinyint NOT NULL COMMENT '订单类型:1=职位发布,2=简历投递,3=背调服务 , 4=平台下单老东家背调',
+  `buyer_type` tinyint NOT NULL COMMENT '买家类型:0=平台, 1=企业,2=学员',
+  `buyer_id` bigint NOT NULL COMMENT '买家ID(企业ID或学员ID)平台=1',
+  `buyer_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '买家名称',
+  `source` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '小程序' COMMENT '订单来源(小程序/APP/PC)',
+  `seller_id` bigint NULL DEFAULT 0 COMMENT '卖家ID(1=平台,企业=企业id)',
+  `total_amount` decimal(10, 2) NOT NULL COMMENT '订单总金额',
+  `deposit` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '定金金额',
+  `balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '尾款金额',
+  `quantity` int NULL DEFAULT 1 COMMENT '商品数量',
+  `paid_amount` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '已支付金额',
+  `refund_amount` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '已退款金额',
+  `order_status` tinyint NULL DEFAULT 0 COMMENT '订单状态: 0=待支付, 1=已支付, 2=已完成, 3=已取消, 4=已退款, 5=退款中',
+  `pay_status` tinyint NULL DEFAULT 0 COMMENT '支付状态:0=未支付,1=部分支付,2=已支付',
+  `business_id` bigint NULL DEFAULT NULL COMMENT '业务ID(职位ID、投递ID、背调订单ID)',
+  `product_id` bigint NULL DEFAULT NULL COMMENT '商品ID,关联main_product.id',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间',
+  `complete_time` datetime NULL DEFAULT NULL COMMENT '完成时间',
+  `cancel_time` datetime NULL DEFAULT NULL COMMENT '取消时间',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_order_no`(`order_no` ASC) USING BTREE,
+  INDEX `idx_buyer`(`buyer_type` ASC, `buyer_id` ASC) USING BTREE,
+  INDEX `idx_business`(`order_type` ASC, `business_id` ASC) USING BTREE,
+  INDEX `idx_create_time`(`create_time` ASC) USING BTREE,
+  INDEX `idx_product_id`(`product_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041690762320019458 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单主表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_payment
+-- ----------------------------
+DROP TABLE IF EXISTS `main_payment`;
+CREATE TABLE `main_payment`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '支付ID',
+  `payment_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '支付流水号',
+  `order_id` bigint NOT NULL COMMENT '订单ID',
+  `order_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单编号',
+  `payment_type` tinyint NOT NULL COMMENT '支付类型:1=定金,2=尾款,3=全款',
+  `payment_method` tinyint NULL DEFAULT NULL COMMENT '支付方式:1=微信,2=支付宝,3=余额,4=线下',
+  `payment_amount` decimal(10, 2) NOT NULL COMMENT '支付金额',
+  `trade_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '第三方交易号',
+  `qr_code_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付二维码URL(支付宝/微信扫码支付)',
+  `trade_status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '第三方交易状态',
+  `payment_status` tinyint NULL DEFAULT 0 COMMENT '支付状态:0=待支付,1=支付中,2=支付成功,3=支付失败',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `pay_time` datetime NULL DEFAULT NULL COMMENT '支付成功时间',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_payment_no`(`payment_no` ASC) USING BTREE,
+  INDEX `idx_order_id`(`order_id` ASC) USING BTREE,
+  INDEX `idx_trade_no`(`trade_no` ASC) USING BTREE,
+  INDEX `idx_create_time`(`create_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041690763502813187 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付记录表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_payment_config
+-- ----------------------------
+DROP TABLE IF EXISTS `main_payment_config`;
+CREATE TABLE `main_payment_config`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '配置ID',
+  `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '配置名称',
+  `config_type` tinyint NOT NULL COMMENT '配置类型(1=收款配置,2=付款配置)',
+  `payment_type` tinyint NOT NULL COMMENT '支付类型(1=支付宝,2=微信, 3=银行卡)',
+  `gateway_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '网关地址',
+  `app_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '应用ID',
+  `mch_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付商户号',
+  `api_v3_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付APIv3密钥',
+  `serial_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付证书序列号',
+  `public_key_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付公钥ID',
+  `cert_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付证书文件路径',
+  `private_key_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付私钥文件路径',
+  `public_key_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信支付公钥文件路径',
+  `private_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '应用私钥',
+  `public_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '支付宝公钥',
+  `sign_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'RSA2' COMMENT '签名类型',
+  `format` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'json' COMMENT '格式',
+  `charset` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'UTF-8' COMMENT '字符集',
+  `pay_notify_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付回调地址',
+  `transfer_notify_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '转账回调地址',
+  `return_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付完成后跳转地址',
+  `is_enabled` tinyint NULL DEFAULT 1 COMMENT '是否启用(0=否,1=是)',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_config_name`(`config_name` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2042482951342112770 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '支付配置表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_platform_account
+-- ----------------------------
+DROP TABLE IF EXISTS `main_platform_account`;
+CREATE TABLE `main_platform_account`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '账户ID',
+  `available_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '可使用余额(元)',
+  `in_use_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '使用中余额(订单进行中,元)',
+  `withdrawing_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '提现中余额(元)',
+  `total_income` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '累计收入(元)',
+  `total_expense` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '累计支出(元)',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '平台账户表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_platform_account_flow
+-- ----------------------------
+DROP TABLE IF EXISTS `main_platform_account_flow`;
+CREATE TABLE `main_platform_account_flow`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '流水ID',
+  `flow_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '流水号',
+  `flow_type` tinyint NOT NULL COMMENT '流水类型(1-收入 2-支出)',
+  `amount` decimal(10, 2) NOT NULL COMMENT '金额(元)',
+  `balance_before` decimal(10, 2) NOT NULL COMMENT '操作前余额(元)',
+  `balance_after` decimal(10, 2) NOT NULL COMMENT '操作后余额(元)',
+  `business_type` tinyint NOT NULL COMMENT '业务类型(1-背调订单收入-余额支付 2-背调订单收入-支付宝支付 3-背调报酬支出 4-线下背调报酬支出)',
+  `business_id` bigint NULL DEFAULT NULL COMMENT '关联业务ID(订单ID或任务ID)',
+  `business_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '业务单号(订单号或任务号)',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_flow_no`(`flow_no` ASC) USING BTREE,
+  INDEX `idx_business`(`business_type` ASC, `business_id` ASC) USING BTREE,
+  INDEX `idx_create_time`(`create_time` ASC) USING BTREE,
+  INDEX `idx_flow_type`(`flow_type` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '平台账户流水表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_position
+-- ----------------------------
+DROP TABLE IF EXISTS `main_position`;
+CREATE TABLE `main_position`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID',
+  `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
+  `post_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位名称',
+  `post_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '岗位描述',
+  `work_province` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作省份',
+  `work_city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作城市',
+  `work_district` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作区县',
+  `work_address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址',
+  `post_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位类型(字典:main_position_type)',
+  `education_requirement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学历要求',
+  `salary_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '薪资类型',
+  `salary_range` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '薪资范围',
+  `recruit_num` int NOT NULL COMMENT '招聘人数',
+  `registration_start_date` date NULL DEFAULT NULL COMMENT '报名开始时间',
+  `registration_end_date` date NULL DEFAULT NULL COMMENT '报名结束时间',
+  `is_urgent` tinyint(1) NULL DEFAULT 0 COMMENT '是否急招(0-否 1-是)',
+  `school_requirement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学校要求(字典:main_education)',
+  `gender_requirement` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别要求(字典:sys_user_sex)',
+  `grade_requirement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '年级要求(字典:main_experience)',
+  `arrival_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '到岗时间(字典:main_arrival_time)',
+  `internship_duration` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '实习时长(字典:main_internship_duration)',
+  `willing_to_travel` tinyint(1) NULL DEFAULT 0 COMMENT '是否愿意出差(0-否 1-是)',
+  `welfare_tags` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '福利标签',
+  `job_requirement` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '岗位要求',
+  `post_level` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位等级(字典:(main_position_level))',
+  `assessment_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '测评时长',
+  `grade_a` decimal(10, 2) NULL DEFAULT NULL COMMENT '能力A及格分',
+  `grade_b` decimal(10, 2) NULL DEFAULT NULL COMMENT '能力B及格分',
+  `grade_c` decimal(10, 2) NULL DEFAULT NULL COMMENT '能力C及格分',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `min_salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '最小工资',
+  `max_salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '最大工资',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041333602243313667 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位表(这是要发布出去的,与sys_post不同)' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_post_apply
+-- ----------------------------
+DROP TABLE IF EXISTS `main_post_apply`;
+CREATE TABLE `main_post_apply`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '申请ID',
+  `apply_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '申请编号',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户ID',
+  `post_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位名称',
+  `company_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '公司名称',
+  `post_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '岗位描述',
+  `work_province` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作省份',
+  `work_city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作城市',
+  `work_district` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工作区县',
+  `work_address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址',
+  `post_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位类型(字典:main_position_type)',
+  `education_requirement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学历要求',
+  `salary_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '薪资类型',
+  `salary_range` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '薪资范围',
+  `recruit_num` int NOT NULL COMMENT '招聘人数',
+  `registration_start_date` date NULL DEFAULT NULL COMMENT '报名开始时间',
+  `registration_end_date` date NULL DEFAULT NULL COMMENT '报名结束时间',
+  `is_urgent` tinyint(1) NULL DEFAULT 0 COMMENT '是否急招(0-否 1-是)',
+  `school_requirement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '学校要求(字典:main_education)',
+  `gender_requirement` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别要求(字典:sys_user_sex)',
+  `grade_requirement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '年级要求(字典:main_experience)',
+  `arrival_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '到岗时间(字典:main_arrival_time)',
+  `internship_duration` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '实习时长(字典:main_internship_duration)',
+  `willing_to_travel` tinyint(1) NULL DEFAULT 0 COMMENT '是否愿意出差(0-否 1-是)',
+  `welfare_tags` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '福利标签',
+  `job_requirement` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '岗位要求',
+  `post_level` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位等级(字典:(main_position_level))',
+  `assessment_time` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '测评时长',
+  `grade_a` decimal(10, 2) NULL DEFAULT NULL COMMENT '能力A及格分',
+  `grade_b` decimal(10, 2) NULL DEFAULT NULL COMMENT '能力B及格分',
+  `grade_c` decimal(10, 2) NULL DEFAULT NULL COMMENT '能力C及格分',
+  `apply_status` tinyint(1) NULL DEFAULT 0 COMMENT '申请状态(0-待审核 1-审核中 2-已通过 3-已驳回)',
+  `audit_id` bigint NULL DEFAULT NULL COMMENT '关联审核ID',
+  `post_id` bigint NULL DEFAULT NULL COMMENT '审核通过后的岗位ID',
+  `reject_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驳回原因',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '发布状态(0发布,1未发布)',
+  `min_salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '最小工资',
+  `max_salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '最大工资',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_apply_no`(`apply_no` ASC) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
+  INDEX `idx_apply_status`(`apply_status` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041335302127702018 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位发布申请表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_post_candidate_hire_attachment
+-- ----------------------------
+DROP TABLE IF EXISTS `main_post_candidate_hire_attachment`;
+CREATE TABLE `main_post_candidate_hire_attachment`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `candidate_id` bigint NOT NULL COMMENT '报名记录ID',
+  `oss_ids` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '录用附件OSS ID列表',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_candidate_id`(`candidate_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041770155813945347 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '岗位录用附件表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_post_candidate_review
+-- ----------------------------
+DROP TABLE IF EXISTS `main_post_candidate_review`;
+CREATE TABLE `main_post_candidate_review`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `candidate_id` bigint NOT NULL COMMENT '候选关系ID(关联 main_back_candidate.id)',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '企业租户ID',
+  `post_id` bigint NULL DEFAULT NULL COMMENT '岗位ID',
+  `student_id` bigint NOT NULL COMMENT '学员ID',
+  `employment_status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'onboard' COMMENT '任职状态(onboard在职,left已离职)',
+  `entry_time` datetime NULL DEFAULT NULL COMMENT '入职时间',
+  `leave_time` datetime NULL DEFAULT NULL COMMENT '离职时间',
+  `leave_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '离职原因',
+  `total_rate` decimal(2, 1) NULL DEFAULT NULL COMMENT '综合评分(0.0-5.0)',
+  `total_remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '综合评价内容',
+  `ability_a_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能力A名称',
+  `ability_a_rate` decimal(2, 1) NULL DEFAULT NULL COMMENT '能力A评分(0.0-5.0)',
+  `ability_a_remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能力A评价',
+  `ability_b_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能力B名称',
+  `ability_b_rate` decimal(2, 1) NULL DEFAULT NULL COMMENT '能力B评分(0.0-5.0)',
+  `ability_b_remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能力B评价',
+  `ability_c_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能力C名称',
+  `ability_c_rate` decimal(2, 1) NULL DEFAULT NULL COMMENT '能力C评分(0.0-5.0)',
+  `ability_c_remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能力C评价',
+  `review_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '评价状态(0草稿 1已提交)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+  `supervisor_eval` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '上级评价',
+  `strength` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '总体优势',
+  `improvement` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '待改进方面',
+  `ability_d_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能效D名称(职业操守)',
+  `ability_d_rate` decimal(4, 2) NULL DEFAULT NULL COMMENT '能效D评分',
+  `ability_d_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '能效D评语',
+  `colleague_eval` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '同事评价总体',
+  `cooperation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '合作顺畅度',
+  `colleague_ability` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '同事专业能力评价',
+  `hr_eval` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'HR评价总体',
+  `violation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否有违纪/纠纷',
+  `handover` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '离职交接情况',
+  `perform_check_result` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '表现核实结果(良好/一般/需关注)',
+  `perform_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '访谈记录摘要备注',
+  `non_compete_agreement` tinyint(1) NULL DEFAULT NULL COMMENT '竞业禁止协议(1是 0否)',
+  `confidentiality_agreement` tinyint(1) NULL DEFAULT NULL COMMENT '保密协议(1是 0否)',
+  `agreement_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '协议备注',
+  `labor_dispute` tinyint(1) NULL DEFAULT NULL COMMENT '是否存在劳动争议(1是 0否)',
+  `dispute_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '争议渠道备注',
+  `conclusion_result` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '调查结论(推荐入职/有条件推荐/不推荐)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_candidate_id`(`candidate_id` ASC) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
+  INDEX `idx_post_id`(`post_id` ASC) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE,
+  INDEX `idx_review_status`(`review_status` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '岗位候选人任职评价表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_refund
+-- ----------------------------
+DROP TABLE IF EXISTS `main_refund`;
+CREATE TABLE `main_refund`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '退款ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `refund_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '退款单号(RF+日期时间+随机数)',
+  `payment_id` bigint NULL DEFAULT NULL COMMENT '支付记录ID(余额支付时为NULL)',
+  `order_id` bigint NOT NULL COMMENT '订单ID',
+  `order_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单号',
+  `trade_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付宝交易号(支付宝支付时必填)',
+  `refund_amount` decimal(10, 2) NOT NULL COMMENT '退款金额',
+  `refund_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '退款原因',
+  `refund_type` int NOT NULL COMMENT '退款类型(1-全额退款 2-部分退款)',
+  `payment_method` int NOT NULL COMMENT '支付方式(1-支付宝 4-余额)',
+  `refund_status` int NOT NULL DEFAULT 0 COMMENT '退款状态(0-处理中 1-成功 2-失败)',
+  `refund_time` datetime NULL DEFAULT NULL COMMENT '退款成功时间',
+  `fail_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '失败原因',
+  `operator_id` bigint NULL DEFAULT NULL COMMENT '操作人ID',
+  `operator_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作人姓名',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_refund_no`(`refund_no` ASC) USING BTREE,
+  INDEX `idx_payment_id`(`payment_id` ASC) USING BTREE,
+  INDEX `idx_order_id`(`order_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '退款记录表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_student
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student`;
+CREATE TABLE `main_student`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '学员ID',
+  `student_no` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学员展示编号(如U2023071567)',
+  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学员姓名',
+  `mobile` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '联络手机号',
+  `openid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信小程序openid',
+  `union_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信 union_id',
+  `session_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信 session_key',
+  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '电子邮箱',
+  `id_card_number` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '证件号码',
+  `gender` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '性别(0男 1女 2未知)',
+  `avatar` bigint NULL DEFAULT NULL COMMENT '头像ID(关联oss表)',
+  `user_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '2' COMMENT '用户类型(1付费用户 2普通用户 3黑名单)',
+  `total_amount` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '历史累计消费金额',
+  `availability` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '求职状态/到岗时间(如:一周内到岗)',
+  `job_intention` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '求职意向(岗位ID或名称,逗号分隔)',
+  `intention_companies` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '意向公司列表(公司名称,逗号分隔)',
+  `job_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '建议类型(1全职 2实习 3兼职)',
+  `school_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '毕业/就读院校',
+  `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '学历要求(字典:main_education)',
+  `grade` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '当前年级(字典:main_experience)',
+  `internship_duration` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '实习时长(字典:main_internship_duration)',
+  `resume_file` bigint NULL DEFAULT NULL COMMENT '个人简历附件ID(关联oss表)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '账号状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '逻辑删除标志(0存在 1删除)',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '所属租户/企业编号',
+  `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '注册/创建日期',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '最后信息更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注信息',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_student_no`(`student_no` ASC) USING BTREE,
+  UNIQUE INDEX `uk_mobile`(`mobile` ASC) USING BTREE,
+  UNIQUE INDEX `idx_openid`(`openid` ASC) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1002 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员简历与个人信息总表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_student_appendix
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student_appendix`;
+CREATE TABLE `main_student_appendix`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `student_id` bigint NOT NULL COMMENT '学员ID (关联 main_student.id)',
+  `oss_id` bigint NOT NULL COMMENT '附件OSS ID',
+  `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '原始文件名',
+  `file_size` bigint NULL DEFAULT NULL COMMENT '文件大小',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041779013369724931 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员简历附件表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_student_collection
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student_collection`;
+CREATE TABLE `main_student_collection`  (
+  `id` bigint NOT NULL COMMENT '主键',
+  `student_id` bigint NOT NULL COMMENT '学员ID',
+  `target_id` bigint NOT NULL COMMENT '收藏目标ID(岗位ID/测评ID)',
+  `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '收藏类型(job:岗位, assessment:测评)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新者',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_type`(`student_id` ASC, `type` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员收藏表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_student_dislike
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student_dislike`;
+CREATE TABLE `main_student_dislike`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `student_id` bigint NOT NULL COMMENT '学员ID',
+  `dislike_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '屏蔽类型(1-屏蔽岗位 2-屏蔽公司)',
+  `position_id` bigint NULL DEFAULT NULL COMMENT '被屏蔽的岗位ID(type=1时填写)',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '被屏蔽的企业租户ID(type=2时填写)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE,
+  INDEX `idx_position_id`(`position_id` ASC) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2039599711081467906 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员岗位屏蔽记录表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_student_education
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student_education`;
+CREATE TABLE `main_student_education`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `student_id` bigint NOT NULL COMMENT '学员ID (关联 main_student.id)',
+  `school` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学校名称',
+  `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学历',
+  `start_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开始时间 (如 2022.9)',
+  `end_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结束时间 (如 2026.7)',
+  `major` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '专业',
+  `campus_experience` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '在校经历描述',
+  `tenant_id` bigint NULL DEFAULT 0 COMMENT '租户ID',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `cert_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学历证书编号',
+  `edu_verification` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学信网核实情况说明',
+  `check_result` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '核实结果(属实/不属实/无法核实)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2039618508723068930 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员教育经历表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_student_experience
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student_experience`;
+CREATE TABLE `main_student_experience`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `student_id` bigint NOT NULL COMMENT '学员ID (关联 main_student.id)',
+  `company` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '公司名称',
+  `industry` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属行业',
+  `start_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开始时间',
+  `end_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结束时间',
+  `is_internship` tinyint(1) NULL DEFAULT 0 COMMENT '是否实习 (0否 1是)',
+  `job_title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '职位名称',
+  `department` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '所属部门',
+  `work_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '工作内容描述',
+  `tenant_id` bigint NULL DEFAULT 0 COMMENT '租户ID',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  `last_salary` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最后薪酬',
+  `check_result` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '核实结果(属实/部分属实/不属实)',
+  `check_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '证明人核实备注',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2039624830076067842 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员工作经历表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_student_project
+-- ----------------------------
+DROP TABLE IF EXISTS `main_student_project`;
+CREATE TABLE `main_student_project`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `student_id` bigint NOT NULL COMMENT '学员ID (关联 main_student.id)',
+  `project_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '项目名称',
+  `role` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '担任角色',
+  `start_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '开始时间',
+  `end_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结束时间',
+  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '项目描述',
+  `achievement` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '业绩描述',
+  `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '项目链接',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员项目经历表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for main_training
+-- ----------------------------
+DROP TABLE IF EXISTS `main_training`;
+CREATE TABLE `main_training`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '培训ID',
+  `training_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '培训类型: video=视频培训, offline=线下培训, live=直播培训',
+  `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '培训名称',
+  `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '培训描述',
+  `thumbnail` bigint NULL DEFAULT NULL COMMENT '封面图ID(关联 sys_oss.oss_id,仅视频类型)',
+  `job_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '岗位类型(全职/兼职/实习)',
+  `job_level` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '岗位等级(A1/A2/B1/B2,单选)',
+  `job` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '岗位名称',
+  `sort_order` int NULL DEFAULT 0 COMMENT '排序号(仅视频类型)',
+  `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态: 0=下架, 1=上架',
+  `duration` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '总时长(仅视频类型)',
+  `publish_time` datetime NULL DEFAULT NULL COMMENT '上架时间',
+  `city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '培训城市(仅线下类型)',
+  `area` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '培训区域(仅线下类型)',
+  `address_detail` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '详细地址(仅线下类型)',
+  `training_start_time` datetime NULL DEFAULT NULL COMMENT '培训开始时间(仅线下类型)',
+  `training_end_time` datetime NULL DEFAULT NULL COMMENT '培训结束时间(仅线下类型)',
+  `apply_start_time` datetime NULL DEFAULT NULL COMMENT '报名开始时间(仅线下类型)',
+  `apply_end_time` datetime NULL DEFAULT NULL COMMENT '报名结束时间(仅线下类型)',
+  `organizer` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主办单位(仅线下类型)',
+  `tags` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标签(逗号分隔,仅线下类型)',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_training_type`(`training_type` ASC) USING BTREE,
+  INDEX `idx_status`(`status` ASC) USING BTREE,
+  INDEX `idx_tenant_id`(`tenant_id` ASC) USING BTREE,
+  INDEX `idx_publish_time`(`publish_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041694952995946498 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '培训课程主表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_training_enrollment
+-- ----------------------------
+DROP TABLE IF EXISTS `main_training_enrollment`;
+CREATE TABLE `main_training_enrollment`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '报名ID',
+  `training_id` bigint NOT NULL COMMENT '关联培训ID(main_training.id)',
+  `student_id` bigint NOT NULL COMMENT '学员ID(关联 main_student.id)',
+  `enroll_status` tinyint(1) NULL DEFAULT 0 COMMENT '报名状态: 0=待审核, 1=已通过, 2=已拒绝, 3=已签到',
+  `enroll_time` datetime NULL DEFAULT NULL COMMENT '报名时间',
+  `check_in_time` datetime NULL DEFAULT NULL COMMENT '签到时间',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_training_student`(`training_id` ASC, `student_id` ASC) USING BTREE,
+  INDEX `idx_training_id`(`training_id` ASC) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE,
+  INDEX `idx_enroll_status`(`enroll_status` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '线下培训报名表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_training_learn_record
+-- ----------------------------
+DROP TABLE IF EXISTS `main_training_learn_record`;
+CREATE TABLE `main_training_learn_record`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+  `training_id` bigint NOT NULL COMMENT '关联培训ID(main_training.id)',
+  `student_id` bigint NOT NULL COMMENT '学员ID(关联 main_student.id)',
+  `learned_time` int NULL DEFAULT 0 COMMENT '已学习时长(分钟)',
+  `remaining_time` int NULL DEFAULT 0 COMMENT '剩余时长(分钟)',
+  `progress` int NULL DEFAULT 0 COMMENT '学习进度(0-100)',
+  `learn_status` tinyint(1) NULL DEFAULT 0 COMMENT '学习状态: 0=进行中, 1=已完成',
+  `finish_time` datetime NULL DEFAULT NULL COMMENT '完成时间',
+  `last_learn_time` datetime NULL DEFAULT NULL COMMENT '上次学习时间',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_training_student`(`training_id` ASC, `student_id` ASC) USING BTREE,
+  INDEX `idx_training_id`(`training_id` ASC) USING BTREE,
+  INDEX `idx_student_id`(`student_id` ASC) USING BTREE,
+  INDEX `idx_learn_status`(`learn_status` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '培训学习记录表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_training_video
+-- ----------------------------
+DROP TABLE IF EXISTS `main_training_video`;
+CREATE TABLE `main_training_video`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '视频ID',
+  `training_id` bigint NOT NULL COMMENT '关联培训ID(main_training.id)',
+  `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '视频名称',
+  `oss_id` bigint NULL DEFAULT NULL COMMENT '视频文件ID(关联 sys_oss.oss_id)',
+  `file_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '视频文件URL',
+  `file_size` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件大小(如 100.0MB)',
+  `file_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件格式(MP4/AVI/MOV等)',
+  `duration` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '视频时长(如 00:09:00)',
+  `sort_order` int NULL DEFAULT 0 COMMENT '排序',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`) USING BTREE,
+  INDEX `idx_training_id`(`training_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041437473921933315 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '培训视频子表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for main_withdraw
+-- ----------------------------
+DROP TABLE IF EXISTS `main_withdraw`;
+CREATE TABLE `main_withdraw`  (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '提现ID',
+  `withdraw_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '提现单号',
+  `company_id` bigint NOT NULL COMMENT '企业ID',
+  `account_id` bigint NOT NULL COMMENT '收款账户ID',
+  `withdraw_amount` decimal(10, 2) NOT NULL COMMENT '提现金额',
+  `withdraw_status` tinyint NULL DEFAULT 0 COMMENT '提现状态:0=待审核,1=审核通过,2=打款中,3=已完成,4=失败,5=已拒绝',
+  `trade_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付宝/微信流水号',
+  `auditor_id` bigint NULL DEFAULT NULL COMMENT '审核人ID',
+  `audit_time` datetime NULL DEFAULT NULL COMMENT '审核时间',
+  `audit_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '审核备注',
+  `fail_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '失败原因',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建人',
+  `transfer_time` datetime NULL DEFAULT NULL COMMENT '打款时间',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_withdraw_no`(`withdraw_no` ASC) USING BTREE,
+  INDEX `idx_company_id`(`company_id` ASC) USING BTREE,
+  INDEX `idx_create_time`(`create_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2041403429137965059 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '企业提现申请表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for sys_client
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_client`;
+CREATE TABLE `sys_client`  (
+  `id` bigint NOT NULL COMMENT 'id',
+  `client_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端id',
+  `client_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端key',
+  `client_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端秘钥',
+  `grant_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '授权类型',
+  `device_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设备类型',
+  `active_timeout` int NULL DEFAULT 1800 COMMENT 'token活跃超时时间',
+  `timeout` int NULL DEFAULT 604800 COMMENT 'token固定超时',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统授权表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_config
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_config`;
+CREATE TABLE `sys_config`  (
+  `config_id` bigint NOT NULL COMMENT '参数主键',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数名称',
+  `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键名',
+  `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键值',
+  `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`config_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dept`;
+CREATE TABLE `sys_dept`  (
+  `dept_id` bigint NOT NULL COMMENT '部门id',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `parent_id` bigint NULL DEFAULT 0 COMMENT '父部门id',
+  `ancestors` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '祖级列表',
+  `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称',
+  `dept_category` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门类别编码',
+  `order_num` int NULL DEFAULT 0 COMMENT '显示顺序',
+  `leader` bigint NULL DEFAULT NULL COMMENT '负责人',
+  `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
+  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `platform_id` tinyint NOT NULL DEFAULT 0 COMMENT '平台ID 当前用户属于哪一个平台',
+  PRIMARY KEY (`dept_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_dict_data
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dict_data`;
+CREATE TABLE `sys_dict_data`  (
+  `dict_code` bigint NOT NULL COMMENT '字典编码',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `dict_sort` int NULL DEFAULT 0 COMMENT '字典排序',
+  `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典标签',
+  `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典键值',
+  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型',
+  `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)',
+  `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表格回显样式',
+  `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`dict_code`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_dict_type
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dict_type`;
+CREATE TABLE `sys_dict_type`  (
+  `dict_id` bigint NOT NULL COMMENT '字典主键',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典名称',
+  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`dict_id`) USING BTREE,
+  UNIQUE INDEX `tenant_id`(`tenant_id` ASC, `dict_type` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_industry
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_industry`;
+CREATE TABLE `sys_industry`  (
+  `industry_id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类ID',
+  `parent_id` bigint NULL DEFAULT 0 COMMENT '父ID (0一级, 非0二级)',
+  `industry_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称 (如: 互联网/开发)',
+  `order_num` int NULL DEFAULT 0 COMMENT '排序',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`industry_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1007 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '行业分类表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_industry_skill
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_industry_skill`;
+CREATE TABLE `sys_industry_skill`  (
+  `skill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '职位ID',
+  `industry_id` bigint NOT NULL COMMENT '所属二级分类ID',
+  `skill_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '职位名称 (如: 前端/后端)',
+  `order_num` int NULL DEFAULT 0 COMMENT '排序',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`skill_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 146 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '行业职位表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_logininfor
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_logininfor`;
+CREATE TABLE `sys_logininfor`  (
+  `info_id` bigint NOT NULL COMMENT '访问ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户账号',
+  `client_key` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '客户端',
+  `device_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '设备类型',
+  `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录IP地址',
+  `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录地点',
+  `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '浏览器类型',
+  `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作系统',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)',
+  `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '提示消息',
+  `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间',
+  PRIMARY KEY (`info_id`) USING BTREE,
+  INDEX `idx_sys_logininfor_s`(`status` ASC) USING BTREE,
+  INDEX `idx_sys_logininfor_lt`(`login_time` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu`  (
+  `menu_id` bigint NOT NULL COMMENT '菜单ID',
+  `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称',
+  `parent_id` bigint NULL DEFAULT 0 COMMENT '父菜单ID',
+  `order_num` int NULL DEFAULT 0 COMMENT '显示顺序',
+  `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '路由地址',
+  `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径',
+  `query_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由参数',
+  `is_frame` int NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)',
+  `is_cache` int NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)',
+  `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
+  `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '显示状态(0显示 1隐藏)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
+  `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识',
+  `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '菜单图标',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
+  `platform_id` tinyint NOT NULL DEFAULT 0 COMMENT '平台ID 当前用户属于哪一个平台',
+  PRIMARY KEY (`menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_notice
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_notice`;
+CREATE TABLE `sys_notice`  (
+  `notice_id` bigint NOT NULL COMMENT '公告ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题',
+  `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)',
+  `notice_content` longblob NULL COMMENT '公告内容',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`notice_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '通知公告表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_oper_log
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_oper_log`;
+CREATE TABLE `sys_oper_log`  (
+  `oper_id` bigint NOT NULL COMMENT '日志主键',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '模块标题',
+  `business_type` int NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)',
+  `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '方法名称',
+  `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求方式',
+  `operator_type` int NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
+  `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作人员',
+  `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称',
+  `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求URL',
+  `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址',
+  `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作地点',
+  `oper_param` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求参数',
+  `json_result` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '返回参数',
+  `status` int NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)',
+  `error_msg` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '错误消息',
+  `oper_time` datetime NULL DEFAULT NULL COMMENT '操作时间',
+  `cost_time` bigint NULL DEFAULT 0 COMMENT '消耗时间',
+  PRIMARY KEY (`oper_id`) USING BTREE,
+  INDEX `idx_sys_oper_log_bt`(`business_type` ASC) USING BTREE,
+  INDEX `idx_sys_oper_log_s`(`status` ASC) USING BTREE,
+  INDEX `idx_sys_oper_log_ot`(`oper_time` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_oss
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_oss`;
+CREATE TABLE `sys_oss`  (
+  `oss_id` bigint NOT NULL COMMENT '对象存储主键',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件名',
+  `original_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '原名',
+  `file_suffix` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件后缀名',
+  `url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'URL地址',
+  `ext1` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展字段',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '上传人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `service` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'minio' COMMENT '服务商',
+  PRIMARY KEY (`oss_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'OSS对象存储表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_oss_config
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_oss_config`;
+CREATE TABLE `sys_oss_config`  (
+  `oss_config_id` bigint NOT NULL COMMENT '主键',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `config_key` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '配置key',
+  `access_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'accessKey',
+  `secret_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '秘钥',
+  `bucket_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '桶名称',
+  `prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '前缀',
+  `endpoint` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '访问站点',
+  `domain` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '自定义域名',
+  `is_https` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否https(Y=是,N=否)',
+  `region` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '域',
+  `access_policy` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '桶权限类型(0=private 1=public 2=custom)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '是否默认(0=是,1=否)',
+  `ext1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '扩展字段',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`oss_config_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '对象存储配置表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_post
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_post`;
+CREATE TABLE `sys_post`  (
+  `post_id` bigint NOT NULL COMMENT '岗位ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `dept_id` bigint NOT NULL COMMENT '部门id',
+  `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码',
+  `post_category` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位类别编码',
+  `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称',
+  `post_sort` int NOT NULL COMMENT '显示顺序',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  `platform_id` tinyint NOT NULL DEFAULT 0 COMMENT '平台ID 当前用户属于哪一个平台',
+  PRIMARY KEY (`post_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role`;
+CREATE TABLE `sys_role`  (
+  `role_id` bigint NOT NULL COMMENT '角色ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称',
+  `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色权限字符串',
+  `role_sort` int NOT NULL COMMENT '显示顺序',
+  `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限)',
+  `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
+  `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  `platform_id` tinyint NOT NULL DEFAULT 0 COMMENT '平台ID 当前用户属于哪一个平台',
+  PRIMARY KEY (`role_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_role_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_dept`;
+CREATE TABLE `sys_role_dept`  (
+  `role_id` bigint NOT NULL COMMENT '角色ID',
+  `dept_id` bigint NOT NULL COMMENT '部门ID',
+  PRIMARY KEY (`role_id`, `dept_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和部门关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_role_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_menu`;
+CREATE TABLE `sys_role_menu`  (
+  `role_id` bigint NOT NULL COMMENT '角色ID',
+  `menu_id` bigint NOT NULL COMMENT '菜单ID',
+  PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_social
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_social`;
+CREATE TABLE `sys_social`  (
+  `id` bigint NOT NULL COMMENT '主键',
+  `user_id` bigint NOT NULL COMMENT '用户ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户id',
+  `auth_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '平台+平台唯一id',
+  `source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户来源',
+  `open_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '平台编号唯一id',
+  `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录账号',
+  `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户昵称',
+  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户邮箱',
+  `avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址',
+  `access_token` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户的授权令牌',
+  `expire_in` int NULL DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
+  `refresh_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
+  `access_code` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
+  `union_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户的 unionid',
+  `scope` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
+  `token_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
+  `id_token` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'id token,部分平台可能没有',
+  `mac_algorithm` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+  `mac_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
+  `oauth_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+  `oauth_token_secret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '社会化关系表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_student
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_student`;
+CREATE TABLE `sys_student`  (
+  `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '学员ID',
+  `user_number` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学员编号(如U2023xxxx)',
+  `nick_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学员姓名',
+  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户邮箱',
+  `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '手机号码',
+  `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
+  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '头像地址',
+  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '密码',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '最后登陆IP',
+  `login_date` datetime NULL DEFAULT NULL COMMENT '最后登陆时间',
+  `user_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '2' COMMENT '用户类型(1付费用户 2普通用户 3黑名单)',
+  `total_amount` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '累计消费金额',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '注册时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`user_id`) USING BTREE,
+  UNIQUE INDEX `idx_user_number`(`user_number` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 124 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学员管理表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_tag
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_tag`;
+CREATE TABLE `sys_tag`  (
+  `id` bigint NOT NULL COMMENT '主键ID',
+  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '标签名称',
+  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标签说明',
+  `status` tinyint NULL DEFAULT 0 COMMENT '状态 (0:启用, 1:停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '标签定义表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for sys_tenant
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_tenant`;
+CREATE TABLE `sys_tenant`  (
+  `id` bigint NOT NULL COMMENT 'id',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户编号',
+  `contact_user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系人',
+  `contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
+  `company_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业名称',
+  `email` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+  `logo` bigint NULL DEFAULT NULL COMMENT '企业logo',
+  `company_entrust_proof` bigint NULL DEFAULT NULL COMMENT '企业委托证明',
+  `license_number` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '统一社会信用代码',
+  `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
+  `intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业简介',
+  `domain` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '域名',
+  `withdrawing_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '提现中余额',
+  `in_use_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '使用中余额(订单进行中)',
+  `total_consume` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '累计消费(元)',
+  `available_balance` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '可使用余额(元)',
+  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  `package_id` bigint NULL DEFAULT NULL COMMENT '租户套餐编号',
+  `expire_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
+  `account_count` int NULL DEFAULT -1 COMMENT '用户数量(-1不限制)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '租户状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `longitude` decimal(10, 7) NULL DEFAULT NULL COMMENT '经度(例如:116.397128)',
+  `latitude` decimal(10, 7) NULL DEFAULT NULL COMMENT '纬度(例如:39.916527)',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_tenant_package
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_tenant_package`;
+CREATE TABLE `sys_tenant_package`  (
+  `package_id` bigint NOT NULL COMMENT '租户套餐id',
+  `package_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '套餐名称',
+  `menu_ids` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联菜单id',
+  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`package_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户套餐表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user`  (
+  `user_id` bigint NOT NULL COMMENT '用户ID',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
+  `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号',
+  `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称',
+  `user_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'sys_user' COMMENT '用户类型(sys_user系统用户)',
+  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户邮箱',
+  `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码',
+  `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
+  `avatar` bigint NULL DEFAULT NULL COMMENT '头像地址',
+  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '账号状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+  `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '最后登录IP',
+  `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+  `platform_id` tinyint NOT NULL DEFAULT 0 COMMENT '平台ID 当前用户属于哪一个平台',
+  PRIMARY KEY (`user_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_user_post
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_post`;
+CREATE TABLE `sys_user_post`  (
+  `user_id` bigint NOT NULL COMMENT '用户ID',
+  `post_id` bigint NOT NULL COMMENT '岗位ID',
+  PRIMARY KEY (`user_id`, `post_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sys_user_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_role`;
+CREATE TABLE `sys_user_role`  (
+  `user_id` bigint NOT NULL COMMENT '用户ID',
+  `role_id` bigint NOT NULL COMMENT '角色ID',
+  PRIMARY KEY (`user_id`, `role_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for test_demo
+-- ----------------------------
+DROP TABLE IF EXISTS `test_demo`;
+CREATE TABLE `test_demo`  (
+  `id` bigint NOT NULL COMMENT '主键',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `dept_id` bigint NULL DEFAULT NULL COMMENT '部门id',
+  `user_id` bigint NULL DEFAULT NULL COMMENT '用户id',
+  `order_num` int NULL DEFAULT 0 COMMENT '排序号',
+  `test_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'key键',
+  `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值',
+  `version` int NULL DEFAULT 0 COMMENT '版本',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` int NULL DEFAULT 0 COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试单表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for test_tree
+-- ----------------------------
+DROP TABLE IF EXISTS `test_tree`;
+CREATE TABLE `test_tree`  (
+  `id` bigint NOT NULL COMMENT '主键',
+  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+  `parent_id` bigint NULL DEFAULT 0 COMMENT '父id',
+  `dept_id` bigint NULL DEFAULT NULL COMMENT '部门id',
+  `user_id` bigint NULL DEFAULT NULL COMMENT '用户id',
+  `tree_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '值',
+  `version` int NULL DEFAULT 0 COMMENT '版本',
+  `create_dept` bigint NULL DEFAULT NULL COMMENT '创建部门',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `create_by` bigint NULL DEFAULT NULL COMMENT '创建人',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `update_by` bigint NULL DEFAULT NULL COMMENT '更新人',
+  `del_flag` int NULL DEFAULT 0 COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '测试树表' ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;