فهرست منبع

Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro

# Conflicts:
#	README.md
#	pom.xml
#	yudao-dependencies/pom.xml
#	yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java
#	yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
#	yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java
#	yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/notify/NotifyMessageServiceImplTest.java
#	yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java
YunaiV 8 ماه پیش
والد
کامیت
9f676fecfa
27فایلهای تغییر یافته به همراه1220 افزوده شده و 608 حذف شده
  1. 179 0
      sql/dm/quartz.sql
  2. 454 486
      sql/dm/ruoyi-vue-pro-dm8.sql
  3. 170 0
      sql/kingbase/quartz.sql
  4. 253 0
      sql/opengauss/quartz.sql
  5. 14 15
      sql/tools/README.md
  6. 17 9
      sql/tools/docker-compose.yaml
  7. 5 5
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java
  8. 12 1
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/DbTypeEnum.java
  9. 0 21
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/SqlConstants.java
  10. 5 13
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
  11. 5 5
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/query/QueryWrapperX.java
  12. 30 2
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java
  13. 0 1
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java
  14. 4 0
      yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java
  15. 4 0
      yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java
  16. 4 0
      yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java
  17. 5 0
      yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java
  18. 17 5
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java
  19. 1 1
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenColumnMapper.java
  20. 6 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/codegen/config/CodegenProperties.java
  21. 14 6
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
  22. 5 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
  23. 1 4
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java
  24. 12 10
      yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java
  25. 1 5
      yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/notify/NotifyMessageServiceImplTest.java
  26. 1 19
      yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java
  27. 1 0
      yudao-server/src/main/resources/application.yaml

+ 179 - 0
sql/dm/quartz.sql

@@ -0,0 +1,179 @@
+--
+-- A hint submitted by a user: Oracle DB MUST be created as "shared" and the
+-- job_queue_processes parameter  must be greater than 2
+-- However, these settings are pretty much standard after any
+-- Oracle install, so most users need not worry about this.
+--
+-- Many other users (including the primary author of Quartz) have had success
+-- running in dedicated mode, so only consider the above as a hint ;-)
+--
+
+drop table if exists qrtz_calendars;
+drop table if exists qrtz_fired_triggers;
+drop table if exists qrtz_blob_triggers;
+drop table if exists qrtz_cron_triggers;
+drop table if exists qrtz_simple_triggers;
+drop table if exists qrtz_simprop_triggers;
+drop table if exists qrtz_triggers;
+drop table if exists qrtz_job_details;
+drop table if exists qrtz_paused_trigger_grps;
+drop table if exists qrtz_locks;
+drop table if exists qrtz_scheduler_state;
+
+CREATE TABLE qrtz_job_details
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    JOB_NAME  VARCHAR2(200) NOT NULL,
+    JOB_GROUP VARCHAR2(200) NOT NULL,
+    DESCRIPTION VARCHAR2(250) NULL,
+    JOB_CLASS_NAME   VARCHAR2(250) NOT NULL,
+    IS_DURABLE VARCHAR2(1) NOT NULL,
+    IS_NONCONCURRENT VARCHAR2(1) NOT NULL,
+    IS_UPDATE_DATA VARCHAR2(1) NOT NULL,
+    REQUESTS_RECOVERY VARCHAR2(1) NOT NULL,
+    JOB_DATA BLOB NULL,
+    CONSTRAINT QRTZ_JOB_DETAILS_PK PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
+);
+CREATE TABLE qrtz_triggers
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    TRIGGER_NAME VARCHAR2(200) NOT NULL,
+    TRIGGER_GROUP VARCHAR2(200) NOT NULL,
+    JOB_NAME  VARCHAR2(200) NOT NULL,
+    JOB_GROUP VARCHAR2(200) NOT NULL,
+    DESCRIPTION VARCHAR2(250) NULL,
+    NEXT_FIRE_TIME NUMBER(19) NULL,
+    PREV_FIRE_TIME NUMBER(19) NULL,
+    PRIORITY NUMBER(13) NULL,
+    TRIGGER_STATE VARCHAR2(16) NOT NULL,
+    TRIGGER_TYPE VARCHAR2(8) NOT NULL,
+    START_TIME NUMBER(19) NOT NULL,
+    END_TIME NUMBER(19) NULL,
+    CALENDAR_NAME VARCHAR2(200) NULL,
+    MISFIRE_INSTR NUMBER(2) NULL,
+    JOB_DATA BLOB NULL,
+    CONSTRAINT QRTZ_TRIGGERS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+    CONSTRAINT QRTZ_TRIGGER_TO_JOBS_FK FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
+        REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
+);
+CREATE TABLE qrtz_simple_triggers
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    TRIGGER_NAME VARCHAR2(200) NOT NULL,
+    TRIGGER_GROUP VARCHAR2(200) NOT NULL,
+    REPEAT_COUNT NUMBER(7) NOT NULL,
+    REPEAT_INTERVAL NUMBER(12) NOT NULL,
+    TIMES_TRIGGERED NUMBER(10) NOT NULL,
+    CONSTRAINT QRTZ_SIMPLE_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+    CONSTRAINT QRTZ_SIMPLE_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+CREATE TABLE qrtz_cron_triggers
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    TRIGGER_NAME VARCHAR2(200) NOT NULL,
+    TRIGGER_GROUP VARCHAR2(200) NOT NULL,
+    CRON_EXPRESSION VARCHAR2(120) NOT NULL,
+    TIME_ZONE_ID VARCHAR2(80),
+    CONSTRAINT QRTZ_CRON_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+    CONSTRAINT QRTZ_CRON_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+CREATE TABLE qrtz_simprop_triggers
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    TRIGGER_NAME VARCHAR2(200) NOT NULL,
+    TRIGGER_GROUP VARCHAR2(200) NOT NULL,
+    STR_PROP_1 VARCHAR2(512) NULL,
+    STR_PROP_2 VARCHAR2(512) NULL,
+    STR_PROP_3 VARCHAR2(512) NULL,
+    INT_PROP_1 NUMBER(10) NULL,
+    INT_PROP_2 NUMBER(10) NULL,
+    LONG_PROP_1 NUMBER(19) NULL,
+    LONG_PROP_2 NUMBER(19) NULL,
+    DEC_PROP_1 NUMERIC(13,4) NULL,
+    DEC_PROP_2 NUMERIC(13,4) NULL,
+    BOOL_PROP_1 VARCHAR2(1) NULL,
+    BOOL_PROP_2 VARCHAR2(1) NULL,
+    TIME_ZONE_ID VARCHAR2(80) NULL,
+    CONSTRAINT QRTZ_SIMPROP_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+    CONSTRAINT QRTZ_SIMPROP_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+CREATE TABLE qrtz_blob_triggers
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    TRIGGER_NAME VARCHAR2(200) NOT NULL,
+    TRIGGER_GROUP VARCHAR2(200) NOT NULL,
+    BLOB_DATA BLOB NULL,
+    CONSTRAINT QRTZ_BLOB_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+    CONSTRAINT QRTZ_BLOB_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+CREATE TABLE qrtz_calendars
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    CALENDAR_NAME  VARCHAR2(200) NOT NULL,
+    CALENDAR BLOB NOT NULL,
+    CONSTRAINT QRTZ_CALENDARS_PK PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
+);
+CREATE TABLE qrtz_paused_trigger_grps
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    TRIGGER_GROUP  VARCHAR2(200) NOT NULL,
+    CONSTRAINT QRTZ_PAUSED_TRIG_GRPS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
+);
+CREATE TABLE qrtz_fired_triggers
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    ENTRY_ID VARCHAR2(140) NOT NULL,
+    TRIGGER_NAME VARCHAR2(200) NOT NULL,
+    TRIGGER_GROUP VARCHAR2(200) NOT NULL,
+    INSTANCE_NAME VARCHAR2(200) NOT NULL,
+    FIRED_TIME NUMBER(19) NOT NULL,
+    SCHED_TIME NUMBER(19) NOT NULL,
+    PRIORITY NUMBER(13) NOT NULL,
+    STATE VARCHAR2(16) NOT NULL,
+    JOB_NAME VARCHAR2(200) NULL,
+    JOB_GROUP VARCHAR2(200) NULL,
+    IS_NONCONCURRENT VARCHAR2(1) NULL,
+    REQUESTS_RECOVERY VARCHAR2(1) NULL,
+    CONSTRAINT QRTZ_FIRED_TRIGGER_PK PRIMARY KEY (SCHED_NAME,ENTRY_ID)
+);
+CREATE TABLE qrtz_scheduler_state
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    INSTANCE_NAME VARCHAR2(200) NOT NULL,
+    LAST_CHECKIN_TIME NUMBER(19) NOT NULL,
+    CHECKIN_INTERVAL NUMBER(13) NOT NULL,
+    CONSTRAINT QRTZ_SCHEDULER_STATE_PK PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
+);
+CREATE TABLE qrtz_locks
+(
+    SCHED_NAME VARCHAR2(120) NOT NULL,
+    LOCK_NAME  VARCHAR2(40) NOT NULL,
+    CONSTRAINT QRTZ_LOCKS_PK PRIMARY KEY (SCHED_NAME,LOCK_NAME)
+);
+
+create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY);
+create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP);
+
+create index idx_qrtz_t_j on qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
+create index idx_qrtz_t_jg on qrtz_triggers(SCHED_NAME,JOB_GROUP);
+create index idx_qrtz_t_c on qrtz_triggers(SCHED_NAME,CALENDAR_NAME);
+create index idx_qrtz_t_g on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP);
+create index idx_qrtz_t_state on qrtz_triggers(SCHED_NAME,TRIGGER_STATE);
+create index idx_qrtz_t_n_state on qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
+create index idx_qrtz_t_n_g_state on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
+create index idx_qrtz_t_next_fire_time on qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME);
+create index idx_qrtz_t_nft_st on qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
+create index idx_qrtz_t_nft_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
+create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
+create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
+
+create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME);
+create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
+create index idx_qrtz_ft_j_g on qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
+create index idx_qrtz_ft_jg on qrtz_fired_triggers(SCHED_NAME,JOB_GROUP);
+create index idx_qrtz_ft_t_g on qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
+create index idx_qrtz_ft_tg on qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 454 - 486
sql/dm/ruoyi-vue-pro-dm8.sql


+ 170 - 0
sql/kingbase/quartz.sql

@@ -0,0 +1,170 @@
+set client_min_messages = WARNING;
+DROP TABLE IF EXISTS qrtz_fired_triggers;
+DROP TABLE IF EXISTS qrtz_paused_trigger_grps;
+DROP TABLE IF EXISTS qrtz_scheduler_state;
+DROP TABLE IF EXISTS qrtz_locks;
+DROP TABLE IF EXISTS qrtz_simprop_triggers;
+DROP TABLE IF EXISTS qrtz_simple_triggers;
+DROP TABLE IF EXISTS qrtz_cron_triggers;
+DROP TABLE IF EXISTS qrtz_blob_triggers;
+DROP TABLE IF EXISTS qrtz_triggers;
+DROP TABLE IF EXISTS qrtz_job_details;
+DROP TABLE IF EXISTS qrtz_calendars;
+set client_min_messages = NOTICE;
+
+CREATE TABLE qrtz_job_details
+  (
+    sched_name TEXT NOT NULL,
+	job_name  TEXT NOT NULL,
+    job_group TEXT NOT NULL,
+    description TEXT NULL,
+    job_class_name   TEXT NOT NULL, 
+    is_durable BOOL NOT NULL,
+    is_nonconcurrent BOOL NOT NULL,
+    is_update_data BOOL NOT NULL,
+	requests_recovery BOOL NOT NULL,
+    job_data BYTEA NULL,
+    PRIMARY KEY (sched_name,job_name,job_group)
+);
+
+CREATE TABLE qrtz_triggers
+  (
+    sched_name TEXT NOT NULL,
+	trigger_name TEXT NOT NULL,
+    trigger_group TEXT NOT NULL,
+    job_name  TEXT NOT NULL, 
+    job_group TEXT NOT NULL,
+    description TEXT NULL,
+    next_fire_time BIGINT NULL,
+    prev_fire_time BIGINT NULL,
+    priority INTEGER NULL,
+    trigger_state TEXT NOT NULL,
+    trigger_type TEXT NOT NULL,
+    start_time BIGINT NOT NULL,
+    end_time BIGINT NULL,
+    calendar_name TEXT NULL,
+    misfire_instr SMALLINT NULL,
+    job_data BYTEA NULL,
+    PRIMARY KEY (sched_name,trigger_name,trigger_group),
+    FOREIGN KEY (sched_name,job_name,job_group) 
+		REFERENCES qrtz_job_details(sched_name,job_name,job_group) 
+);
+
+CREATE TABLE qrtz_simple_triggers
+  (
+    sched_name TEXT NOT NULL,
+	trigger_name TEXT NOT NULL,
+    trigger_group TEXT NOT NULL,
+    repeat_count BIGINT NOT NULL,
+    repeat_interval BIGINT NOT NULL,
+    times_triggered BIGINT NOT NULL,
+    PRIMARY KEY (sched_name,trigger_name,trigger_group),
+    FOREIGN KEY (sched_name,trigger_name,trigger_group) 
+		REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE QRTZ_SIMPROP_TRIGGERS 
+  (
+    sched_name TEXT NOT NULL,
+    trigger_name TEXT NOT NULL ,
+    trigger_group TEXT NOT NULL ,
+    str_prop_1 TEXT NULL,
+    str_prop_2 TEXT NULL,
+    str_prop_3 TEXT NULL,
+    int_prop_1 INTEGER NULL,
+    int_prop_2 INTEGER NULL,
+    long_prop_1 BIGINT NULL,
+    long_prop_2 BIGINT NULL,
+    dec_prop_1 NUMERIC NULL,
+    dec_prop_2 NUMERIC NULL,
+    bool_prop_1 BOOL NULL,
+    bool_prop_2 BOOL NULL,
+	time_zone_id TEXT NULL,
+	PRIMARY KEY (sched_name,trigger_name,trigger_group),
+    FOREIGN KEY (sched_name,trigger_name,trigger_group) 
+		REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE qrtz_cron_triggers
+  (
+    sched_name TEXT NOT NULL,
+    trigger_name TEXT NOT NULL,
+    trigger_group TEXT NOT NULL,
+    cron_expression TEXT NOT NULL,
+    time_zone_id TEXT,
+    PRIMARY KEY (sched_name,trigger_name,trigger_group),
+    FOREIGN KEY (sched_name,trigger_name,trigger_group) 
+		REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE qrtz_blob_triggers
+  (
+    sched_name TEXT NOT NULL,
+    trigger_name TEXT NOT NULL,
+    trigger_group TEXT NOT NULL,
+    blob_data BYTEA NULL,
+    PRIMARY KEY (sched_name,trigger_name,trigger_group),
+    FOREIGN KEY (sched_name,trigger_name,trigger_group) 
+		REFERENCES qrtz_triggers(sched_name,trigger_name,trigger_group) ON DELETE CASCADE
+);
+
+CREATE TABLE qrtz_calendars
+  (
+    sched_name TEXT NOT NULL,
+    calendar_name  TEXT NOT NULL, 
+    calendar BYTEA NOT NULL,
+    PRIMARY KEY (sched_name,calendar_name)
+);
+
+CREATE TABLE qrtz_paused_trigger_grps
+  (
+    sched_name TEXT NOT NULL,
+    trigger_group TEXT NOT NULL, 
+    PRIMARY KEY (sched_name,trigger_group)
+);
+
+CREATE TABLE qrtz_fired_triggers 
+  (
+    sched_name TEXT NOT NULL,
+    entry_id TEXT NOT NULL,
+    trigger_name TEXT NOT NULL,
+    trigger_group TEXT NOT NULL,
+    instance_name TEXT NOT NULL,
+    fired_time BIGINT NOT NULL,
+	sched_time BIGINT NOT NULL,
+    priority INTEGER NOT NULL,
+    state TEXT NOT NULL,
+    job_name TEXT NULL,
+    job_group TEXT NULL,
+    is_nonconcurrent BOOL NOT NULL,
+    requests_recovery BOOL NULL,
+    PRIMARY KEY (sched_name,entry_id)
+);
+
+CREATE TABLE qrtz_scheduler_state 
+  (
+    sched_name TEXT NOT NULL,
+    instance_name TEXT NOT NULL,
+    last_checkin_time BIGINT NOT NULL,
+    checkin_interval BIGINT NOT NULL,
+    PRIMARY KEY (sched_name,instance_name)
+);
+
+CREATE TABLE qrtz_locks
+  (
+    sched_name TEXT NOT NULL,
+    lock_name  TEXT NOT NULL, 
+    PRIMARY KEY (sched_name,lock_name)
+);
+
+create index idx_qrtz_j_req_recovery on qrtz_job_details(requests_recovery);
+create index idx_qrtz_t_next_fire_time on qrtz_triggers(next_fire_time);
+create index idx_qrtz_t_state on qrtz_triggers(trigger_state);
+create index idx_qrtz_t_nft_st on qrtz_triggers(next_fire_time,trigger_state);
+create index idx_qrtz_ft_trig_name on qrtz_fired_triggers(trigger_name);
+create index idx_qrtz_ft_trig_group on qrtz_fired_triggers(trigger_group);
+create index idx_qrtz_ft_trig_nm_gp on qrtz_fired_triggers(sched_name,trigger_name,trigger_group);
+create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(instance_name);
+create index idx_qrtz_ft_job_name on qrtz_fired_triggers(job_name);
+create index idx_qrtz_ft_job_group on qrtz_fired_triggers(job_group);
+create index idx_qrtz_ft_job_req_recovery on qrtz_fired_triggers(requests_recovery);

+ 253 - 0
sql/opengauss/quartz.sql

@@ -0,0 +1,253 @@
+-- ----------------------------
+-- qrtz_blob_triggers
+-- ----------------------------
+CREATE TABLE qrtz_blob_triggers
+(
+    sched_name    varchar(120) NOT NULL,
+    trigger_name  varchar(190) NOT NULL,
+    trigger_group varchar(190) NOT NULL,
+    blob_data     bytea        NULL,
+    PRIMARY KEY (sched_name, trigger_name, trigger_group)
+);
+
+CREATE INDEX idx_qrtz_blob_triggers_sched_name ON qrtz_blob_triggers (sched_name, trigger_name, trigger_group);
+
+-- ----------------------------
+-- qrtz_calendars
+-- ----------------------------
+CREATE TABLE qrtz_calendars
+(
+    sched_name    varchar(120) NOT NULL,
+    calendar_name varchar(190) NOT NULL,
+    calendar      bytea        NOT NULL,
+    PRIMARY KEY (sched_name, calendar_name)
+);
+
+
+-- ----------------------------
+-- qrtz_cron_triggers
+-- ----------------------------
+CREATE TABLE qrtz_cron_triggers
+(
+    sched_name      varchar(120) NOT NULL,
+    trigger_name    varchar(190) NOT NULL,
+    trigger_group   varchar(190) NOT NULL,
+    cron_expression varchar(120) NOT NULL,
+    time_zone_id    varchar(80)  NULL DEFAULT NULL,
+    PRIMARY KEY (sched_name, trigger_name, trigger_group)
+);
+
+-- @formatter:off
+BEGIN;
+COMMIT;
+-- @formatter:on
+
+-- ----------------------------
+-- qrtz_fired_triggers
+-- ----------------------------
+CREATE TABLE qrtz_fired_triggers
+(
+    sched_name        varchar(120) NOT NULL,
+    entry_id          varchar(95)  NOT NULL,
+    trigger_name      varchar(190) NOT NULL,
+    trigger_group     varchar(190) NOT NULL,
+    instance_name     varchar(190) NOT NULL,
+    fired_time        int8         NOT NULL,
+    sched_time        int8         NOT NULL,
+    priority          int4         NOT NULL,
+    state             varchar(16)  NOT NULL,
+    job_name          varchar(190) NULL DEFAULT NULL,
+    job_group         varchar(190) NULL DEFAULT NULL,
+    is_nonconcurrent  varchar(1)   NULL DEFAULT NULL,
+    requests_recovery varchar(1)   NULL DEFAULT NULL,
+    PRIMARY KEY (sched_name, entry_id)
+);
+
+CREATE INDEX idx_qrtz_ft_trig_inst_name ON qrtz_fired_triggers (sched_name, instance_name);
+CREATE INDEX idx_qrtz_ft_inst_job_req_rcvry ON qrtz_fired_triggers (sched_name, instance_name, requests_recovery);
+CREATE INDEX idx_qrtz_ft_j_g ON qrtz_fired_triggers (sched_name, job_name, job_group);
+CREATE INDEX idx_qrtz_ft_jg ON qrtz_fired_triggers (sched_name, job_group);
+CREATE INDEX idx_qrtz_ft_t_g ON qrtz_fired_triggers (sched_name, trigger_name, trigger_group);
+CREATE INDEX idx_qrtz_ft_tg ON qrtz_fired_triggers (sched_name, trigger_group);
+
+-- ----------------------------
+-- qrtz_job_details
+-- ----------------------------
+CREATE TABLE qrtz_job_details
+(
+    sched_name        varchar(120) NOT NULL,
+    job_name          varchar(190) NOT NULL,
+    job_group         varchar(190) NOT NULL,
+    description       varchar(250) NULL DEFAULT NULL,
+    job_class_name    varchar(250) NOT NULL,
+    is_durable        varchar(1)   NOT NULL,
+    is_nonconcurrent  varchar(1)   NOT NULL,
+    is_update_data    varchar(1)   NOT NULL,
+    requests_recovery varchar(1)   NOT NULL,
+    job_data          bytea        NULL,
+    PRIMARY KEY (sched_name, job_name, job_group)
+);
+
+CREATE INDEX idx_qrtz_j_req_recovery ON qrtz_job_details (sched_name, requests_recovery);
+CREATE INDEX idx_qrtz_j_grp ON qrtz_job_details (sched_name, job_group);
+
+-- @formatter:off
+BEGIN;
+COMMIT;
+-- @formatter:on
+
+-- ----------------------------
+-- qrtz_locks
+-- ----------------------------
+CREATE TABLE qrtz_locks
+(
+    sched_name varchar(120) NOT NULL,
+    lock_name  varchar(40)  NOT NULL,
+    PRIMARY KEY (sched_name, lock_name)
+);
+
+-- @formatter:off
+BEGIN;
+COMMIT;
+-- @formatter:on
+
+-- ----------------------------
+-- qrtz_paused_trigger_grps
+-- ----------------------------
+CREATE TABLE qrtz_paused_trigger_grps
+(
+    sched_name    varchar(120) NOT NULL,
+    trigger_group varchar(190) NOT NULL,
+    PRIMARY KEY (sched_name, trigger_group)
+);
+
+-- ----------------------------
+-- qrtz_scheduler_state
+-- ----------------------------
+CREATE TABLE qrtz_scheduler_state
+(
+    sched_name        varchar(120) NOT NULL,
+    instance_name     varchar(190) NOT NULL,
+    last_checkin_time int8         NOT NULL,
+    checkin_interval  int8         NOT NULL,
+    PRIMARY KEY (sched_name, instance_name)
+);
+
+-- @formatter:off
+BEGIN;
+COMMIT;
+-- @formatter:on
+
+-- ----------------------------
+-- qrtz_simple_triggers
+-- ----------------------------
+CREATE TABLE qrtz_simple_triggers
+(
+    sched_name      varchar(120) NOT NULL,
+    trigger_name    varchar(190) NOT NULL,
+    trigger_group   varchar(190) NOT NULL,
+    repeat_count    int8         NOT NULL,
+    repeat_interval int8         NOT NULL,
+    times_triggered int8         NOT NULL,
+    PRIMARY KEY (sched_name, trigger_name, trigger_group)
+);
+
+-- ----------------------------
+-- qrtz_simprop_triggers
+-- ----------------------------
+CREATE TABLE qrtz_simprop_triggers
+(
+    sched_name    varchar(120)   NOT NULL,
+    trigger_name  varchar(190)   NOT NULL,
+    trigger_group varchar(190)   NOT NULL,
+    str_prop_1    varchar(512)   NULL DEFAULT NULL,
+    str_prop_2    varchar(512)   NULL DEFAULT NULL,
+    str_prop_3    varchar(512)   NULL DEFAULT NULL,
+    int_prop_1    int4           NULL DEFAULT NULL,
+    int_prop_2    int4           NULL DEFAULT NULL,
+    long_prop_1   int8           NULL DEFAULT NULL,
+    long_prop_2   int8           NULL DEFAULT NULL,
+    dec_prop_1    numeric(13, 4) NULL DEFAULT NULL,
+    dec_prop_2    numeric(13, 4) NULL DEFAULT NULL,
+    bool_prop_1   varchar(1)     NULL DEFAULT NULL,
+    bool_prop_2   varchar(1)     NULL DEFAULT NULL,
+    PRIMARY KEY (sched_name, trigger_name, trigger_group)
+);
+
+-- ----------------------------
+-- qrtz_triggers
+-- ----------------------------
+CREATE TABLE qrtz_triggers
+(
+    sched_name     varchar(120) NOT NULL,
+    trigger_name   varchar(190) NOT NULL,
+    trigger_group  varchar(190) NOT NULL,
+    job_name       varchar(190) NOT NULL,
+    job_group      varchar(190) NOT NULL,
+    description    varchar(250) NULL DEFAULT NULL,
+    next_fire_time int8         NULL DEFAULT NULL,
+    prev_fire_time int8         NULL DEFAULT NULL,
+    priority       int4         NULL DEFAULT NULL,
+    trigger_state  varchar(16)  NOT NULL,
+    trigger_type   varchar(8)   NOT NULL,
+    start_time     int8         NOT NULL,
+    end_time       int8         NULL DEFAULT NULL,
+    calendar_name  varchar(190) NULL DEFAULT NULL,
+    misfire_instr  int2         NULL DEFAULT NULL,
+    job_data       bytea        NULL,
+    PRIMARY KEY (sched_name, trigger_name, trigger_group)
+);
+
+CREATE INDEX idx_qrtz_t_j ON qrtz_triggers (sched_name, job_name, job_group);
+CREATE INDEX idx_qrtz_t_jg ON qrtz_triggers (sched_name, job_group);
+CREATE INDEX idx_qrtz_t_c ON qrtz_triggers (sched_name, calendar_name);
+CREATE INDEX idx_qrtz_t_g ON qrtz_triggers (sched_name, trigger_group);
+CREATE INDEX idx_qrtz_t_state ON qrtz_triggers (sched_name, trigger_state);
+CREATE INDEX idx_qrtz_t_n_state ON qrtz_triggers (sched_name, trigger_name, trigger_group, trigger_state);
+CREATE INDEX idx_qrtz_t_n_g_state ON qrtz_triggers (sched_name, trigger_group, trigger_state);
+CREATE INDEX idx_qrtz_t_next_fire_time ON qrtz_triggers (sched_name, next_fire_time);
+CREATE INDEX idx_qrtz_t_nft_st ON qrtz_triggers (sched_name, trigger_state, next_fire_time);
+CREATE INDEX idx_qrtz_t_nft_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time);
+CREATE INDEX idx_qrtz_t_nft_st_misfire ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_state);
+CREATE INDEX idx_qrtz_t_nft_st_misfire_grp ON qrtz_triggers (sched_name, misfire_instr, next_fire_time, trigger_group,
+                                                             trigger_state);
+
+-- @formatter:off
+BEGIN;
+COMMIT;
+-- @formatter:on
+
+
+-- ----------------------------
+-- FK: qrtz_blob_triggers
+-- ----------------------------
+ALTER TABLE qrtz_blob_triggers
+    ADD CONSTRAINT qrtz_blob_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name,
+                                                                                                                             trigger_name,
+                                                                                                                             trigger_group);
+
+-- ----------------------------
+-- FK: qrtz_cron_triggers
+-- ----------------------------
+ALTER TABLE qrtz_cron_triggers
+    ADD CONSTRAINT qrtz_cron_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group);
+
+-- ----------------------------
+-- FK: qrtz_simple_triggers
+-- ----------------------------
+ALTER TABLE qrtz_simple_triggers
+    ADD CONSTRAINT qrtz_simple_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name,
+                                                                                                                               trigger_name,
+                                                                                                                               trigger_group);
+
+-- ----------------------------
+-- FK: qrtz_simprop_triggers
+-- ----------------------------
+ALTER TABLE qrtz_simprop_triggers
+    ADD CONSTRAINT qrtz_simprop_triggers_ibfk_1 FOREIGN KEY (sched_name, trigger_name, trigger_group) REFERENCES qrtz_triggers (sched_name, trigger_name, trigger_group);
+
+-- ----------------------------
+-- FK: qrtz_triggers
+-- ----------------------------
+ALTER TABLE qrtz_triggers
+    ADD CONSTRAINT qrtz_triggers_ibfk_1 FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details (sched_name, job_name, job_group);

+ 14 - 15
sql/tools/README.md

@@ -19,10 +19,14 @@ docker compose up -d mysql
 #### 1.2 Oracle
 #### 1.2 Oracle
 
 
 ```Bash
 ```Bash
+## x86 版本
 docker compose up -d oracle
 docker compose up -d oracle
+
+## MacBook Apple Silicon
+docker compose up -d oracle_m1
 ```
 ```
 
 
-暂不支持 MacBook Apple Silicon,因为 Oracle 官方没有提供 Apple Silicon 版本的 Docker 镜像。
+> 注意:如果使用 MacBook Apple Silicon 版本,它的 ORACLE_SID 不是 XE,而是 FREE!!!
 
 
 ### 1.3 PostgreSQL
 ### 1.3 PostgreSQL
 
 
@@ -38,16 +42,14 @@ docker compose up -d sqlserver
 docker compose exec sqlserver bash /tmp/create_schema.sh
 docker compose exec sqlserver bash /tmp/create_schema.sh
 ```
 ```
 
 
-暂不支持 MacBook Apple Silicon,因为 SQL Server 官方没有提供 Apple Silicon 版本的 Docker 镜像。
-
 ### 1.5 DM 达梦
 ### 1.5 DM 达梦
 
 
-① 下载达梦 Docker 镜像:https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
+① 下载达梦 Docker 镜像:<https://eco.dameng.com/download/> 地址,点击“Docker 镜像”选项,进行下载。
 
 
 ② 加载镜像文件,在镜像 tar 文件所在目录运行:
 ② 加载镜像文件,在镜像 tar 文件所在目录运行:
 
 
 ```Bash
 ```Bash
-docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
+docker load -i dm8_20240715_x86_rh6_rq_single.tar
 ```
 ```
 
 
 ③ 在项目 `sql/tools` 目录下运行:
 ③ 在项目 `sql/tools` 目录下运行:
@@ -59,22 +61,17 @@ docker compose exec dm8 bash -c '/opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/s
 exit
 exit
 ```
 ```
 
 
-**注意**: `sql/dm/ruoyi-vue-pro-dm8.sql` 文件编码必须为 `GBK` 或者 `GBK` 超集,否则会出现中文乱码。
-
-暂不支持 MacBook Apple Silicon,因为 达梦 官方没有提供 Apple Silicon 版本的 Docker 镜像。
-
 ### 1.6 KingbaseES 人大金仓
 ### 1.6 KingbaseES 人大金仓
 
 
 ① 下载人大金仓 Docker 镜像:
 ① 下载人大金仓 Docker 镜像:
 
 
-> x86_64 版本: https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar
-
-> aarch64 版本:https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar
+* [x86_64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar) 【Windows 选择这个】
+* [aarch64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar) 【MacBook Apple Silicon 选择这个】
 
 
 ② 加载镜像文件,在镜像 tar 文件所在目录运行:
 ② 加载镜像文件,在镜像 tar 文件所在目录运行:
 
 
 ```Bash
 ```Bash
-docker load -i x86_64/kdb_x86_64_V009R001C001B0025.tar
+docker load -i kdb_x86_64_V009R001C001B0025.tar
 ```
 ```
 
 
 ③ 在项目 `sql/tools` 目录下运行:
 ③ 在项目 `sql/tools` 目录下运行:
@@ -106,9 +103,11 @@ docker volume rm ruoyi-vue-pro_postgres
 
 
 ## 2. MySQL 转换其它数据库
 ## 2. MySQL 转换其它数据库
 
 
+项目提供了 `sql/tools/convertor.py` 脚本,支持将 MySQL 转换为 Oracle、PostgreSQL、SQL Server、达梦、人大金仓、OpenGauss 等数据库的脚本。
+
 ### 2.1 实现原理
 ### 2.1 实现原理
 
 
-通过读取 MySQL 的 `sql/mysql/ruoyi-vue-pro.sql` 数据库文件,转换成 Oracle、PostgreSQL、SQL Server、达梦、人大金仓 等数据库的脚本。
+通过读取 MySQL 的 `sql/mysql/ruoyi-vue-pro.sql` 数据库文件,转换成对应的数据库脚本。
 
 
 ### 2.2 使用方法
 ### 2.2 使用方法
 
 
@@ -119,7 +118,7 @@ pip install simple-ddl-parser
 # pip3 install simple-ddl-parser
 # pip3 install simple-ddl-parser
 ```
 ```
 
 
-② 执行如下命令打印生成 postgres 的脚本内容,其他可选参数有:`oracle`、`sqlserver`、`dm8`、`kingbase`:
+② 在 `sql/tools/` 目录下,执行如下命令打印生成 postgres 的脚本内容,其他可选参数有:`oracle`、`sqlserver`、`dm8`、`kingbase`、`opengauss`:
 
 
 ```Bash
 ```Bash
 python3 convertor.py postgres
 python3 convertor.py postgres

+ 17 - 9
sql/tools/docker-compose.yaml

@@ -58,6 +58,20 @@ services:
             - ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
             - ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
             - ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
             - ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
 
 
+    oracle_m1:
+      image: einslib/oracle-19c:19.3.0-ee-slim-faststart
+      restart: unless-stopped
+      environment:
+        ## 登录信息 SID: FREE user: system password: oracle
+        ORACLE_PASSWORD: oracle
+      ports:
+        - "1521:1521"
+      volumes:
+        - ../oracle/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
+        # 创建app用户: ROOT/123456@//localhost/XEPDB1
+        - ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
+        - ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
+
     sqlserver:
     sqlserver:
         image: mcr.microsoft.com/mssql/server:2017-latest
         image: mcr.microsoft.com/mssql/server:2017-latest
         restart: unless-stopped
         restart: unless-stopped
@@ -73,11 +87,9 @@ services:
             # docker compose exec sqlserver bash /tmp/create_schema.sh
             # docker compose exec sqlserver bash /tmp/create_schema.sh
             - ./sqlserver/create_schema.sh:/tmp/create_schema.sh:ro
             - ./sqlserver/create_schema.sh:/tmp/create_schema.sh:ro
 
 
-
     dm8:
     dm8:
-        # wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
-        # docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
-        image: dm8_single:dm8_20230808_rev197096_x86_rh6_64
+        # docker load -i dm8_20240715_x86_rh6_rq_single.tar
+        image: dm8_single:dm8_20240715_rev232765_x86_rh6_64
         restart: unless-stopped
         restart: unless-stopped
         environment:
         environment:
             PAGE_SIZE: 16
             PAGE_SIZE: 16
@@ -93,13 +105,10 @@ services:
         volumes:
         volumes:
             - dm8:/opt/dmdbms/data
             - dm8:/opt/dmdbms/data
             - ../dm/ruoyi-vue-pro-dm8.sql:/tmp/schema.sql:ro
             - ../dm/ruoyi-vue-pro-dm8.sql:/tmp/schema.sql:ro
-            # docker compose exec dm8 bash -c '/opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql'
 
 
     kingbase:
     kingbase:
-        # x86_64: https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar
-        # aarch64: https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar
-        # docker load -i kdb_x86_64_V009R001C001B0025.tar
         image: kingbase_v009r001c001b0025_single_x86:v1
         image: kingbase_v009r001c001b0025_single_x86:v1
+#        image: kingbase_v009r001c001b0025_single_arm:v1
         restart: unless-stopped
         restart: unless-stopped
         environment:
         environment:
             DB_USER: root
             DB_USER: root
@@ -109,7 +118,6 @@ services:
         volumes:
         volumes:
             - kingbase:/home/kingbase/userdata
             - kingbase:/home/kingbase/userdata
             - ../kingbase/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
             - ../kingbase/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
-            # docker compose exec kingbase bash -c 'ksql -U $DB_USER -d test -f /tmp/schema.sql'
 
 
     opengauss:
     opengauss:
         image: opengauss/opengauss:5.0.0
         image: opengauss/opengauss:5.0.0

+ 5 - 5
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java

@@ -2,7 +2,6 @@ package cn.iocoder.yudao.framework.mybatis.config;
 
 
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
-import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
 import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
 import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -42,9 +41,6 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor
         // TODO 芋艿:暂时没有找到特别合适的地方,先放在这里
         // TODO 芋艿:暂时没有找到特别合适的地方,先放在这里
         setJobStoreDriverIfPresent(environment, dbType);
         setJobStoreDriverIfPresent(environment, dbType);
 
 
-        // 初始化 SQL 静态变量
-        SqlConstants.init(dbType);
-
         // 如果非 NONE,则不进行处理
         // 如果非 NONE,则不进行处理
         IdType idType = getIdType(environment);
         IdType idType = getIdType(environment);
         if (idType != IdType.NONE) {
         if (idType != IdType.NONE) {
@@ -55,7 +51,7 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor
             setIdType(environment, IdType.INPUT);
             setIdType(environment, IdType.INPUT);
             return;
             return;
         }
         }
-        // 情况二,自增 ID,适合 MySQL 等直接自增的数据库
+        // 情况二,自增 ID,适合 MySQL、DM 达梦等直接自增的数据库
         setIdType(environment, IdType.AUTO);
         setIdType(environment, IdType.AUTO);
     }
     }
 
 
@@ -86,6 +82,10 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor
             case SQL_SERVER2005:
             case SQL_SERVER2005:
                 driverClass = "org.quartz.impl.jdbcjobstore.MSSQLDelegate";
                 driverClass = "org.quartz.impl.jdbcjobstore.MSSQLDelegate";
                 break;
                 break;
+            case DM:
+            case KINGBASE_ES:
+                driverClass = "org.quartz.impl.jdbcjobstore.StdJDBCDelegate";
+                break;
         }
         }
         // 设置 driverClass 变量
         // 设置 driverClass 变量
         if (StrUtil.isNotEmpty(driverClass)) {
         if (StrUtil.isNotEmpty(driverClass)) {

+ 12 - 1
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/DbTypeEnum.java

@@ -18,10 +18,17 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 @AllArgsConstructor
 public enum DbTypeEnum {
 public enum DbTypeEnum {
 
 
+    /**
+     * H2
+     *
+     * 注意:H2 不支持 find_in_set 函数
+     */
+    H2(DbType.H2, "H2", ""),
+
     /**
     /**
      * MySQL
      * MySQL
      */
      */
-    MY_SQL( DbType.MYSQL, "MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0"),
+    MY_SQL(DbType.MYSQL, "MySQL", "FIND_IN_SET('#{value}', #{column}) <> 0"),
 
 
     /**
     /**
      * Oracle
      * Oracle
@@ -39,6 +46,10 @@ public enum DbTypeEnum {
      * SQL Server
      * SQL Server
      */
      */
     SQL_SERVER(DbType.SQL_SERVER, "Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"),
     SQL_SERVER(DbType.SQL_SERVER, "Microsoft SQL Server", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"),
+    /**
+     * SQL Server 2005
+     */
+    SQL_SERVER2005(DbType.SQL_SERVER2005, "Microsoft SQL Server 2005", "CHARINDEX(',' + #{value} + ',', ',' + #{column} + ',') <> 0"),
 
 
     /**
     /**
      * 达梦
      * 达梦

+ 0 - 21
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/enums/SqlConstants.java

@@ -1,21 +0,0 @@
-package cn.iocoder.yudao.framework.mybatis.core.enums;
-
-import com.baomidou.mybatisplus.annotation.DbType;
-
-/**
- * SQL相关常量类
- *
- * @author 芋道源码
- */
-public class SqlConstants {
-
-    /**
-     * 数据库的类型
-     */
-    public static DbType DB_TYPE;
-
-    public static void init(DbType dbType) {
-        DB_TYPE = dbType;
-    }
-
-}

+ 5 - 13
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java

@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
 import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
 import cn.iocoder.yudao.framework.common.pojo.SortingField;
 import cn.iocoder.yudao.framework.common.pojo.SortingField;
-import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
+import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -22,7 +22,6 @@ import org.apache.ibatis.annotations.Param;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
-import java.util.Objects;
 
 
 /**
 /**
  * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
  * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
@@ -135,11 +134,6 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
         return selectList(new LambdaQueryWrapper<T>().in(field, values));
         return selectList(new LambdaQueryWrapper<T>().in(field, values));
     }
     }
 
 
-    @Deprecated
-    default List<T> selectList(SFunction<T, ?> leField, SFunction<T, ?> geField, Object value) {
-        return selectList(new LambdaQueryWrapper<T>().le(leField, value).ge(geField, value));
-    }
-
     default List<T> selectList(SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2) {
     default List<T> selectList(SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2) {
         return selectList(new LambdaQueryWrapper<T>().eq(field1, value1).eq(field2, value2));
         return selectList(new LambdaQueryWrapper<T>().eq(field1, value1).eq(field2, value2));
     }
     }
@@ -151,7 +145,8 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
      */
      */
     default Boolean insertBatch(Collection<T> entities) {
     default Boolean insertBatch(Collection<T> entities) {
         // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
         // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
-        if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) {
+        DbType dbType = JdbcUtils.getDbType();
+        if (JdbcUtils.isSQLServer(dbType)) {
             entities.forEach(this::insert);
             entities.forEach(this::insert);
             return CollUtil.isNotEmpty(entities);
             return CollUtil.isNotEmpty(entities);
         }
         }
@@ -166,7 +161,8 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
      */
      */
     default Boolean insertBatch(Collection<T> entities, int size) {
     default Boolean insertBatch(Collection<T> entities, int size) {
         // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
         // 特殊:SQL Server 批量插入后,获取 id 会报错,因此通过循环处理
-        if (Objects.equals(SqlConstants.DB_TYPE, DbType.SQL_SERVER)) {
+        DbType dbType = JdbcUtils.getDbType();
+        if (JdbcUtils.isSQLServer(dbType)) {
             entities.forEach(this::insert);
             entities.forEach(this::insert);
             return CollUtil.isNotEmpty(entities);
             return CollUtil.isNotEmpty(entities);
         }
         }
@@ -185,10 +181,6 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
         return Db.updateBatchById(entities, size);
         return Db.updateBatchById(entities, size);
     }
     }
 
 
-    default Boolean insertOrUpdateBatch(Collection<T> collection) {
-        return Db.saveOrUpdateBatch(collection);
-    }
-
     default int delete(String field, String value) {
     default int delete(String field, String value) {
         return delete(new QueryWrapper<T>().eq(field, value));
         return delete(new QueryWrapper<T>().eq(field, value));
     }
     }

+ 5 - 5
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/query/QueryWrapperX.java

@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.framework.mybatis.core.query;
 package cn.iocoder.yudao.framework.mybatis.core.query;
 
 
-import cn.hutool.core.lang.Assert;
-import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
+import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
+import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
 import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -147,8 +147,8 @@ public class QueryWrapperX<T> extends QueryWrapper<T> {
      * @return this
      * @return this
      */
      */
     public QueryWrapperX<T> limitN(int n) {
     public QueryWrapperX<T> limitN(int n) {
-        Assert.notNull(SqlConstants.DB_TYPE, "获取不到数据库的类型");
-        switch (SqlConstants.DB_TYPE) {
+        DbType dbType = JdbcUtils.getDbType();
+        switch (dbType) {
             case ORACLE:
             case ORACLE:
             case ORACLE_12C:
             case ORACLE_12C:
                 super.le("ROWNUM", n);
                 super.le("ROWNUM", n);
@@ -157,7 +157,7 @@ public class QueryWrapperX<T> extends QueryWrapper<T> {
             case SQL_SERVER2005:
             case SQL_SERVER2005:
                 super.select("TOP " + n + " *"); // 由于 SQL Server 是通过 SELECT TOP 1 实现限制一条,所以只好使用 * 查询剩余字段
                 super.select("TOP " + n + " *"); // 由于 SQL Server 是通过 SELECT TOP 1 实现限制一条,所以只好使用 * 查询剩余字段
                 break;
                 break;
-            default:
+            default: // MySQL、PostgreSQL、DM 达梦、KingbaseES 大金都是采用 LIMIT 实现
                 super.last("LIMIT " + n);
                 super.last("LIMIT " + n);
         }
         }
         return this;
         return this;

+ 30 - 2
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java

@@ -1,9 +1,11 @@
 package cn.iocoder.yudao.framework.mybatis.core.util;
 package cn.iocoder.yudao.framework.mybatis.core.util;
 
 
+import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
 import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
 import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
 import cn.iocoder.yudao.framework.mybatis.core.enums.DbTypeEnum;
 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.annotation.DbType;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 
 
 import javax.sql.DataSource;
 import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.Connection;
@@ -49,8 +51,13 @@ public class JdbcUtils {
      * @return DB 类型
      * @return DB 类型
      */
      */
     public static DbType getDbType() {
     public static DbType getDbType() {
-        DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class);
-        DataSource dataSource = dynamicRoutingDataSource.determineDataSource();
+        DataSource dataSource;
+        try {
+            DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtils.getBean(DynamicRoutingDataSource.class);
+            dataSource = dynamicRoutingDataSource.determineDataSource();
+        } catch (NoSuchBeanDefinitionException e) {
+            dataSource = SpringUtils.getBean(DataSource.class);
+        }
         try (Connection conn = dataSource.getConnection()) {
         try (Connection conn = dataSource.getConnection()) {
             return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName());
             return DbTypeEnum.find(conn.getMetaData().getDatabaseProductName());
         } catch (SQLException e) {
         } catch (SQLException e) {
@@ -58,4 +65,25 @@ public class JdbcUtils {
         }
         }
     }
     }
 
 
+    /**
+     * 判断 JDBC 连接是否为 SQLServer 数据库
+     *
+     * @param url JDBC 连接
+     * @return 是否为 SQLServer 数据库
+     */
+    public static boolean isSQLServer(String url) {
+        DbType dbType = getDbType(url);
+        return isSQLServer(dbType);
+    }
+
+    /**
+     * 判断 JDBC 连接是否为 SQLServer 数据库
+     *
+     * @param url JDBC 连接
+     * @return 是否为 SQLServer 数据库
+     */
+    public static boolean isSQLServer(DbType dbType) {
+        return ObjectUtils.equalsAny(dbType, DbType.SQL_SERVER, DbType.SQL_SERVER2005);
+    }
+
 }
 }

+ 0 - 1
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java

@@ -96,7 +96,6 @@ public class MyBatisUtils {
      * @return sql
      * @return sql
      */
      */
     public static String findInSet(String column, Object value) {
     public static String findInSet(String column, Object value) {
-        // 这里不用SqlConstants.DB_TYPE,因为它是使用 primary 数据源的 url 推断出来的类型
         DbType dbType = JdbcUtils.getDbType();
         DbType dbType = JdbcUtils.getDbType();
         return DbTypeEnum.getFindInSetTemplate(dbType)
         return DbTypeEnum.getFindInSetTemplate(dbType)
                 .replace("#{column}", column)
                 .replace("#{column}", column)

+ 4 - 0
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.framework.test.core.ut;
 package cn.iocoder.yudao.framework.test.core.ut;
 
 
+import cn.hutool.extra.spring.SpringUtil;
 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
@@ -44,6 +45,9 @@ public class BaseDbAndRedisUnitTest {
             YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
             YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
             RedisAutoConfiguration.class, // Spring Redis 自动配置类
             RedisAutoConfiguration.class, // Spring Redis 自动配置类
             RedissonAutoConfiguration.class, // Redisson 自动配置类
             RedissonAutoConfiguration.class, // Redisson 自动配置类
+
+            // 其它配置类
+            SpringUtil.class
     })
     })
     public static class Application {
     public static class Application {
     }
     }

+ 4 - 0
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.framework.test.core.ut;
 package cn.iocoder.yudao.framework.test.core.ut;
 
 
+import cn.hutool.extra.spring.SpringUtil;
 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
 import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
 import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
 import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
 import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
@@ -36,6 +37,9 @@ public class BaseDbUnitTest {
             YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
             YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
             MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
             MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
             MybatisPlusJoinAutoConfiguration.class, // MyBatis 的Join配置类
             MybatisPlusJoinAutoConfiguration.class, // MyBatis 的Join配置类
+
+            // 其它配置类
+            SpringUtil.class
     })
     })
     public static class Application {
     public static class Application {
     }
     }

+ 4 - 0
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.framework.test.core.ut;
 package cn.iocoder.yudao.framework.test.core.ut;
 
 
+import cn.hutool.extra.spring.SpringUtil;
 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
 import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
 import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
 import org.redisson.spring.starter.RedissonAutoConfiguration;
 import org.redisson.spring.starter.RedissonAutoConfiguration;
@@ -25,6 +26,9 @@ public class BaseRedisUnitTest {
             RedisAutoConfiguration.class, // Spring Redis 自动配置类
             RedisAutoConfiguration.class, // Spring Redis 自动配置类
             YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
             YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
             RedissonAutoConfiguration.class, // Redisson 自动配置类
             RedissonAutoConfiguration.class, // Redisson 自动配置类
+
+            // 其它配置类
+            SpringUtil.class
     })
     })
     public static class Application {
     public static class Application {
     }
     }

+ 5 - 0
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java

@@ -137,6 +137,11 @@ public class RandomUtils {
     @SafeVarargs
     @SafeVarargs
     public static <T> List<T> randomPojoList(Class<T> clazz, Consumer<T>... consumers) {
     public static <T> List<T> randomPojoList(Class<T> clazz, Consumer<T>... consumers) {
         int size = RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH);
         int size = RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH);
+        return randomPojoList(clazz, size, consumers);
+    }
+
+    @SafeVarargs
+    public static <T> List<T> randomPojoList(Class<T> clazz, int size, Consumer<T>... consumers) {
         return Stream.iterate(0, i -> i).limit(size).map(o -> randomPojo(clazz, consumers))
         return Stream.iterate(0, i -> i).limit(size).map(o -> randomPojo(clazz, consumers))
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
     }
     }

+ 17 - 5
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java

@@ -2,19 +2,19 @@ package cn.iocoder.yudao.module.infra.controller.app.file;
 
 
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FileCreateReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresignedUrlRespVO;
 import cn.iocoder.yudao.module.infra.controller.app.file.vo.AppFileUploadReqVO;
 import cn.iocoder.yudao.module.infra.controller.app.file.vo.AppFileUploadReqVO;
 import cn.iocoder.yudao.module.infra.service.file.FileService;
 import cn.iocoder.yudao.module.infra.service.file.FileService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
-import javax.annotation.Resource;
-
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 
 @Tag(name = "用户 App - 文件存储")
 @Tag(name = "用户 App - 文件存储")
@@ -35,4 +35,16 @@ public class AppFileController {
         return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
         return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
     }
     }
 
 
+    @GetMapping("/presigned-url")
+    @Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器")
+    public CommonResult<FilePresignedUrlRespVO> getFilePresignedUrl(@RequestParam("path") String path) throws Exception {
+        return success(fileService.getFilePresignedUrl(path));
+    }
+
+    @PostMapping("/create")
+    @Operation(summary = "创建文件", description = "模式二:前端上传文件:配合 presigned-url 接口,记录上传了上传的文件")
+    public CommonResult<Long> createFile(@Valid @RequestBody FileCreateReqVO createReqVO) {
+        return success(fileService.createFile(createReqVO));
+    }
+
 }
 }

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenColumnMapper.java

@@ -13,7 +13,7 @@ public interface CodegenColumnMapper extends BaseMapperX<CodegenColumnDO> {
     default List<CodegenColumnDO> selectListByTableId(Long tableId) {
     default List<CodegenColumnDO> selectListByTableId(Long tableId) {
         return selectList(new LambdaQueryWrapperX<CodegenColumnDO>()
         return selectList(new LambdaQueryWrapperX<CodegenColumnDO>()
                 .eq(CodegenColumnDO::getTableId, tableId)
                 .eq(CodegenColumnDO::getTableId, tableId)
-                .orderByAsc(CodegenColumnDO::getId));
+                .orderByAsc(CodegenColumnDO::getOrdinalPosition));
     }
     }
 
 
     default void deleteListByTableId(Long tableId) {
     default void deleteListByTableId(Long tableId) {

+ 6 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/codegen/config/CodegenProperties.java

@@ -34,4 +34,10 @@ public class CodegenProperties {
     @NotNull(message = "代码生成的前端类型不能为空")
     @NotNull(message = "代码生成的前端类型不能为空")
     private Integer frontType;
     private Integer frontType;
 
 
+    /**
+     * 是否生成单元测试
+     */
+    @NotNull(message = "是否生成单元测试不能为空")
+    private Boolean unitTestEnable;
+
 }
 }

+ 14 - 6
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java

@@ -22,13 +22,14 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import com.baomidou.mybatisplus.generator.config.po.TableField;
 import com.baomidou.mybatisplus.generator.config.po.TableField;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.annotations.VisibleForTesting;
+import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
-import javax.annotation.Resource;
 import java.util.*;
 import java.util.*;
 import java.util.function.BiPredicate;
 import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
@@ -179,11 +180,18 @@ public class CodegenServiceImpl implements CodegenService {
                         && tableField.getMetaInfo().isNullable() == codegenColumn.getNullable()
                         && tableField.getMetaInfo().isNullable() == codegenColumn.getNullable()
                         && tableField.isKeyFlag() == codegenColumn.getPrimaryKey()
                         && tableField.isKeyFlag() == codegenColumn.getPrimaryKey()
                         && tableField.getComment().equals(codegenColumn.getColumnComment());
                         && tableField.getComment().equals(codegenColumn.getColumnComment());
-        Set<String> modifyFieldNames = tableFields.stream()
-                .filter(tableField -> codegenColumnDOMap.get(tableField.getColumnName()) != null
-                        && !primaryKeyPredicate.test(tableField, codegenColumnDOMap.get(tableField.getColumnName())))
-                .map(TableField::getColumnName)
-                .collect(Collectors.toSet());
+        Set<String> modifyFieldNames = IntStream.range(0, tableFields.size()).mapToObj(index -> {
+            TableField tableField = tableFields.get(index);
+            String columnName = tableField.getColumnName();
+            CodegenColumnDO codegenColumn = codegenColumnDOMap.get(columnName);
+            if (codegenColumn == null) {
+                return null;
+            }
+            if (!primaryKeyPredicate.test(tableField, codegenColumn) || codegenColumn.getOrdinalPosition() != index) {
+                return columnName;
+            }
+            return null;
+        }).filter(Objects::nonNull).collect(Collectors.toSet());
         // 3.2 计算需要【删除】的字段
         // 3.2 计算需要【删除】的字段
         Set<String> tableFieldNames = convertSet(tableFields, TableField::getName);
         Set<String> tableFieldNames = convertSet(tableFields, TableField::getName);
         Set<Long> deleteColumnIds = codegenColumns.stream()
         Set<Long> deleteColumnIds = codegenColumns.stream()

+ 5 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java

@@ -398,6 +398,11 @@ public class CodegenEngine {
         Map<String, String> templates = new LinkedHashMap<>();
         Map<String, String> templates = new LinkedHashMap<>();
         templates.putAll(SERVER_TEMPLATES);
         templates.putAll(SERVER_TEMPLATES);
         templates.putAll(FRONT_TEMPLATES.row(frontType));
         templates.putAll(FRONT_TEMPLATES.row(frontType));
+        // 如果禁用单元测试,则移除对应的模版
+        if (Boolean.FALSE.equals(codegenProperties.getUnitTestEnable())) {
+            templates.remove(javaTemplatePath("test/serviceTest"));
+            templates.remove("codegen/sql/h2.vm");
+        }
         return templates;
         return templates;
     }
     }
 
 

+ 1 - 4
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java

@@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
 import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
 import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
-import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.GlobalConfig;
 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
@@ -18,7 +17,6 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.Comparator;
 import java.util.Comparator;
 import java.util.List;
 import java.util.List;
-import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -49,12 +47,11 @@ public class DatabaseTableServiceImpl implements DatabaseTableService {
         // 获得数据源配置
         // 获得数据源配置
         DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
         DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
         Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
         Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
-        DbType dbType = JdbcUtils.getDbType(config.getUrl());
 
 
         // 使用 MyBatis Plus Generator 解析表结构
         // 使用 MyBatis Plus Generator 解析表结构
         DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
         DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
                 config.getPassword());
                 config.getPassword());
-        if (Objects.equals(dbType, DbType.SQL_SERVER)) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419
+        if (JdbcUtils.isSQLServer(config.getUrl())) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419
             dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class);
             dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class);
         }
         }
         StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到
         StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到

+ 12 - 10
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImplTest.java

@@ -24,12 +24,11 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import com.baomidou.mybatisplus.generator.config.po.TableField;
 import com.baomidou.mybatisplus.generator.config.po.TableField;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
-import org.junit.jupiter.api.Disabled;
+import jakarta.annotation.Resource;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Import;
 
 
-import javax.annotation.Resource;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
@@ -234,17 +233,16 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
     }
     }
 
 
     @Test
     @Test
-    @Disabled // TODO @芋艿:这个单测会随机性失败,需要定位下;
     public void testSyncCodegenFromDB() {
     public void testSyncCodegenFromDB() {
         // mock 数据(CodegenTableDO)
         // mock 数据(CodegenTableDO)
         CodegenTableDO table = randomPojo(CodegenTableDO.class, o -> o.setTableName("t_yunai")
         CodegenTableDO table = randomPojo(CodegenTableDO.class, o -> o.setTableName("t_yunai")
                 .setDataSourceConfigId(1L).setScene(CodegenSceneEnum.ADMIN.getScene()));
                 .setDataSourceConfigId(1L).setScene(CodegenSceneEnum.ADMIN.getScene()));
         codegenTableMapper.insert(table);
         codegenTableMapper.insert(table);
         CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
         CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
-                .setColumnName("id"));
+                .setColumnName("id").setPrimaryKey(true).setOrdinalPosition(0));
         codegenColumnMapper.insert(column01);
         codegenColumnMapper.insert(column01);
         CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
         CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
-                .setColumnName("name"));
+                .setColumnName("name").setOrdinalPosition(1));
         codegenColumnMapper.insert(column02);
         codegenColumnMapper.insert(column02);
         // 准备参数
         // 准备参数
         Long tableId = table.getId();
         Long tableId = table.getId();
@@ -263,7 +261,7 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
         when(databaseTableService.getTable(eq(1L), eq("t_yunai")))
         when(databaseTableService.getTable(eq(1L), eq("t_yunai")))
                 .thenReturn(tableInfo);
                 .thenReturn(tableInfo);
         // mock 方法(CodegenTableDO)
         // mock 方法(CodegenTableDO)
-        List<CodegenColumnDO> newColumns = randomPojoList(CodegenColumnDO.class);
+        List<CodegenColumnDO> newColumns = randomPojoList(CodegenColumnDO.class, 2);
         when(codegenBuilder.buildColumns(eq(table.getId()), argThat(tableFields -> {
         when(codegenBuilder.buildColumns(eq(table.getId()), argThat(tableFields -> {
             assertEquals(2, tableFields.size());
             assertEquals(2, tableFields.size());
             assertSame(tableInfo.getFields(), tableFields);
             assertSame(tableInfo.getFields(), tableFields);
@@ -457,9 +455,11 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
                         .setTemplateType(CodegenTemplateTypeEnum.ONE.getType()));
                         .setTemplateType(CodegenTemplateTypeEnum.ONE.getType()));
         codegenTableMapper.insert(table);
         codegenTableMapper.insert(table);
         // mock 数据(CodegenColumnDO)
         // mock 数据(CodegenColumnDO)
-        CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
+        CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
+                .setOrdinalPosition(1));
         codegenColumnMapper.insert(column01);
         codegenColumnMapper.insert(column01);
-        CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
+        CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
+                .setOrdinalPosition(2));
         codegenColumnMapper.insert(column02);
         codegenColumnMapper.insert(column02);
         // mock 执行生成
         // mock 执行生成
         Map<String, String> codes = MapUtil.of(randomString(), randomString());
         Map<String, String> codes = MapUtil.of(randomString(), randomString());
@@ -486,9 +486,11 @@ public class CodegenServiceImplTest extends BaseDbUnitTest {
                         .setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
                         .setTemplateType(CodegenTemplateTypeEnum.MASTER_NORMAL.getType()));
         codegenTableMapper.insert(table);
         codegenTableMapper.insert(table);
         // mock 数据(CodegenColumnDO)
         // mock 数据(CodegenColumnDO)
-        CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
+        CodegenColumnDO column01 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
+                .setOrdinalPosition(1));
         codegenColumnMapper.insert(column01);
         codegenColumnMapper.insert(column01);
-        CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId()));
+        CodegenColumnDO column02 = randomPojo(CodegenColumnDO.class, o -> o.setTableId(table.getId())
+                .setOrdinalPosition(2));
         codegenColumnMapper.insert(column02);
         codegenColumnMapper.insert(column02);
         // mock 数据(sub CodegenTableDO)
         // mock 数据(sub CodegenTableDO)
         CodegenTableDO subTable = randomPojo(CodegenTableDO.class,
         CodegenTableDO subTable = randomPojo(CodegenTableDO.class,

+ 1 - 5
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/notify/NotifyMessageServiceImplTest.java

@@ -3,18 +3,16 @@ package cn.iocoder.yudao.module.system.service.notify;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyTemplateDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyTemplateDO;
 import cn.iocoder.yudao.module.system.dal.mysql.notify.NotifyMessageMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.notify.NotifyMessageMapper;
-import com.baomidou.mybatisplus.annotation.DbType;
+import jakarta.annotation.Resource;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Import;
 
 
-import javax.annotation.Resource;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
@@ -158,7 +156,6 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
 
 
     @Test
     @Test
     public void testGetUnreadNotifyMessageList() {
     public void testGetUnreadNotifyMessageList() {
-        SqlConstants.init(DbType.MYSQL);
         // mock 数据
         // mock 数据
         NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
         NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
             o.setUserId(1L);
             o.setUserId(1L);
@@ -187,7 +184,6 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
 
 
     @Test
     @Test
     public void testGetUnreadNotifyMessageCount() {
     public void testGetUnreadNotifyMessageCount() {
-        SqlConstants.init(DbType.MYSQL);
         // mock 数据
         // mock 数据
         NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
         NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
             o.setUserId(1L);
             o.setUserId(1L);

+ 1 - 19
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java

@@ -1,7 +1,6 @@
 package cn.iocoder.yudao.module.system.service.sms;
 package cn.iocoder.yudao.module.system.service.sms;
 
 
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.map.MapUtil;
-import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
@@ -10,13 +9,12 @@ import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
 import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
 import cn.iocoder.yudao.module.system.framework.sms.config.SmsCodeProperties;
 import cn.iocoder.yudao.module.system.framework.sms.config.SmsCodeProperties;
-import com.baomidou.mybatisplus.annotation.DbType;
+import jakarta.annotation.Resource;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.Import;
 
 
-import javax.annotation.Resource;
 import java.time.Duration;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 
 
@@ -61,8 +59,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
             o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
         });
         });
-        // mock 方法
-        SqlConstants.init(DbType.MYSQL);
 
 
         // 调用
         // 调用
         smsCodeService.sendSmsCode(reqDTO);
         smsCodeService.sendSmsCode(reqDTO);
@@ -88,8 +84,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
             o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
         });
         });
-        // mock 方法
-        SqlConstants.init(DbType.MYSQL);
 
 
         // 调用,并断言异常
         // 调用,并断言异常
         assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
         assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
@@ -107,8 +101,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
             o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
         });
         });
-        // mock 方法
-        SqlConstants.init(DbType.MYSQL);
         when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMillis(0));
         when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMillis(0));
 
 
         // 调用,并断言异常
         // 调用,并断言异常
@@ -123,8 +115,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
         });
         });
-        // mock 数据
-        SqlConstants.init(DbType.MYSQL);
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> {
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> {
             o.setMobile(reqDTO.getMobile()).setScene(reqDTO.getScene())
             o.setMobile(reqDTO.getMobile()).setScene(reqDTO.getScene())
                     .setCode(reqDTO.getCode()).setUsed(false);
                     .setCode(reqDTO.getCode()).setUsed(false);
@@ -146,8 +136,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
         });
         });
-        // mock 数据
-        SqlConstants.init(DbType.MYSQL);
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
                 .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)));
                 .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)));
 
 
@@ -162,8 +150,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
         });
         });
-        // mock 数据
-        SqlConstants.init(DbType.MYSQL);
 
 
         // 调用,并断言异常
         // 调用,并断言异常
         assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
         assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
@@ -177,8 +163,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
         });
         });
-        // mock 数据
-        SqlConstants.init(DbType.MYSQL);
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
                 .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)
                 .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)
                 .setCreateTime(LocalDateTime.now().minusMinutes(6))));
                 .setCreateTime(LocalDateTime.now().minusMinutes(6))));
@@ -195,8 +179,6 @@ public class SmsCodeServiceImplTest extends BaseDbUnitTest {
             o.setMobile("15601691300");
             o.setMobile("15601691300");
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
             o.setScene(randomEle(SmsSceneEnum.values()).getScene());
         });
         });
-        // mock 数据
-        SqlConstants.init(DbType.MYSQL);
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
         smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
                 .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(true)
                 .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(true)
                 .setCreateTime(LocalDateTime.now())));
                 .setCreateTime(LocalDateTime.now())));

+ 1 - 0
yudao-server/src/main/resources/application.yaml

@@ -246,6 +246,7 @@ yudao:
     base-package: ${yudao.info.base-package}
     base-package: ${yudao.info.base-package}
     db-schemas: ${spring.datasource.dynamic.datasource.master.name}
     db-schemas: ${spring.datasource.dynamic.datasource.master.name}
     front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类
     front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类
+    unit-test-enable: false # 是否生成单元测试
   tenant: # 多租户相关配置项
   tenant: # 多租户相关配置项
     enable: true
     enable: true
     ignore-urls:
     ignore-urls:

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است