From 73b3a394952353c318a8712d2cc1efec03dc009d Mon Sep 17 00:00:00 2001
From: 潘志宝 <979469083@qq.com>
Date: 星期四, 10 四月 2025 16:40:14 +0800
Subject: [PATCH] Merge branch 'master' of http://dlindusit.com:53929/r/iailab-plat

---
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAutoAdjustConfigDao.java                     |   27 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultLastPointServiceImpl.java        |   25 +
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthService.java                             |   23 -
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/pre/MmPredictAutoAdjustConfigDao.xml                                          |   22 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java                     |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigVO.java                       |   92 ++++
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthServiceImpl.java                         |   58 --
 iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/IailabClient.java                                                                          |    2 
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java                                               |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/utils/MeasurementUtils.java                       |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustTriggerRuleEnum.java                      |   30 +
 pom.xml                                                                                                                                             |    4 
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java                               |    3 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultLastPointService.java                 |    6 
 iailab-module-model/iailab-module-model-biz/db/mysql.sql                                                                                            |   17 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigPageReqVO.java                |   25 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java                          |    2 
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java                      |   49 --
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/job/config/ServerInfoConfiguration.java                        |   30 +
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/CommonConstant.java                                         |    2 
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/UserProfileController.java               |    8 
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java        |   16 
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/MmPredictAutoAdjustReqVO.java                         |   15 
 iailab-module-system/iailab-module-system-biz/src/main/resources/application-dev.yaml                                                               |   11 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/enums/DataMeasurement.java                        |    1 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultLastBakSimPOJO.java                |   18 
 iailab-module-infra/iailab-module-infra-api/src/main/java/com/iailab/module/infra/enums/ErrorCodeConstants.java                                     |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataTypeEnum.java                                    |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/schedule/impl/ScheduleModelHandlerImpl.java                   |   13 
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/auth/AuthConvert.java                                  |    9 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java                                               |   13 
 /dev/null                                                                                                                                           |  173 -------
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/controller/admin/MmPredictAutoAdjustConfigController.java |   79 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java                 |   28 +
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/user/UserConvert.java                                  |    4 
 iailab-cloud/iailab-gateway/src/main/resources/application.yaml                                                                                     |    7 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java    |  216 +++++++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustValueRuleEnum.java                        |   54 ++
 iailab-module-system/iailab-module-system-biz/pom.xml                                                                                               |   94 +++-
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictAutoAdjustConfigEntity.java               |   87 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java             |   32 +
 iailab-module-system/iailab-module-system-biz/src/main/resources/application.yaml                                                                   |   11 
 42 files changed, 943 insertions(+), 377 deletions(-)

diff --git a/iailab-cloud/iailab-gateway/src/main/resources/application.yaml b/iailab-cloud/iailab-gateway/src/main/resources/application.yaml
index 4ecec4f..02f0004 100644
--- a/iailab-cloud/iailab-gateway/src/main/resources/application.yaml
+++ b/iailab-cloud/iailab-gateway/src/main/resources/application.yaml
@@ -150,6 +150,13 @@
             - Path=/admin-api/xmcsms/**
           filters:
             - RewritePath=/admin-api/xmcsms/v3/api-docs, /v3/api-docs
+        ## shangangrizhao 服务
+        - id: shangangrizhao-admin-api # 路由的编号
+          uri: grayLb://shangangrizhao-server
+          predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+            - Path=/admin-api/shangangrizhao/**
+          filters:
+            - RewritePath=/admin-api/shangangrizhao/v3/api-docs, /v3/api-docs
       x-forwarded:
         prefix-enabled: true # 避免 Swagger 重复带上额外的 /admin-api/system 前缀
 
diff --git a/iailab-module-infra/iailab-module-infra-api/src/main/java/com/iailab/module/infra/enums/ErrorCodeConstants.java b/iailab-module-infra/iailab-module-infra-api/src/main/java/com/iailab/module/infra/enums/ErrorCodeConstants.java
index 3ac6f1b..ede728c 100644
--- a/iailab-module-infra/iailab-module-infra-api/src/main/java/com/iailab/module/infra/enums/ErrorCodeConstants.java
+++ b/iailab-module-infra/iailab-module-infra-api/src/main/java/com/iailab/module/infra/enums/ErrorCodeConstants.java
@@ -46,6 +46,10 @@
     ErrorCode DATA_SOURCE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_007_000, "数据源配置不存在");
     ErrorCode DATA_SOURCE_CONFIG_NOT_OK = new ErrorCode(1_001_007_001, "数据源配置不正确,无法进行连接");
 
+    // ========== 资源监控 1-001-008-000 ==========
+    ErrorCode MONITOR_DISK_NOT_EXISTS = new ErrorCode(1_001_008_000, "磁盘监控不存在");
+    ErrorCode MONITOR_MEM_NOT_EXISTS = new ErrorCode(1_001_008_001, "内存监控不存在");
+
     // ========== 学生 1-001-201-000 ==========
     ErrorCode DEMO01_CONTACT_NOT_EXISTS = new ErrorCode(1_001_201_000, "示例联系人不存在");
     ErrorCode DEMO02_CATEGORY_NOT_EXISTS = new ErrorCode(1_001_201_001, "示例分类不存在");
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
index 1a9fb2f..eb16320 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
@@ -161,4 +161,8 @@
     @Operation(summary = "获取15分钟内最新预警建议信息")
     List<ScheduleSuggestRespDTO> getLastSuggest(@RequestParam Map<String, Object> params);
 
+    @PostMapping(PREFIX + "/predict-item/autoAdjustByCode")
+    @Operation(summary = "自动调整")
+    Boolean autoAdjustByCode(@RequestBody MmPredictAutoAdjustReqVO reqVO);
+
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/MmPredictAutoAdjustReqVO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/MmPredictAutoAdjustReqVO.java
new file mode 100644
index 0000000..d717a6e
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/MmPredictAutoAdjustReqVO.java
@@ -0,0 +1,15 @@
+package com.iailab.module.model.api.mcs.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/4/9 16:15
+ **/
+@Data
+public class MmPredictAutoAdjustReqVO {
+
+    private String configCode;
+    private Long adjustStartTime;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
index 40662a2..63e1d89 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
@@ -111,6 +111,9 @@
     @Schema(description = "T+L预测值,L表示预测长度")
     private List<Object[]> preDataL;
 
+    @Schema(description = "原始T+L预测值(未经过自动调整)")
+    private List<Object[]> preDataLOriginal;
+
     @Schema(description = "当时预测值")
     private List<Object[]> curData;
 
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/CommonConstant.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/CommonConstant.java
index e266814..4eeb54d 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/CommonConstant.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/CommonConstant.java
@@ -63,4 +63,6 @@
 
     // 模型输出调整值
     String OUT_ADJUST_VALUES = "adjustValues";
+
+    String DECIMAL_PLACES = "DECIMAL_PLACES";
 }
diff --git a/iailab-module-model/iailab-module-model-biz/db/mysql.sql b/iailab-module-model/iailab-module-model-biz/db/mysql.sql
index e49a221..a0a416a 100644
--- a/iailab-module-model/iailab-module-model-biz/db/mysql.sql
+++ b/iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -1011,3 +1011,20 @@
 
 -- t_st_schedule_record 创建复合索引
 CREATE INDEX idx_st_schedule_record_scheme_result_time ON t_st_schedule_record (scheme_id, result_code, schedule_time DESC, create_time DESC);
+
+CREATE TABLE `t_mm_predict_auto_adjust_config` (
+                                                   `id` varchar(36) NOT NULL,
+                                                   `config_name` varchar(255) DEFAULT NULL COMMENT '配置名称',
+                                                   `config_code` varchar(255) DEFAULT NULL COMMENT '配置编码',
+                                                   `output_id` varchar(36) DEFAULT NULL COMMENT '预测输出id',
+                                                   `point_id` varchar(36) DEFAULT NULL COMMENT '测点id',
+                                                   `t` int DEFAULT NULL COMMENT '取值时间范围',
+                                                   `trigger_rule` varchar(36) DEFAULT NULL COMMENT '触发规则',
+                                                   `trigger_value` double DEFAULT NULL COMMENT '触发值',
+                                                   `adjust_direction` tinyint DEFAULT '1' COMMENT '调整方向(1:正向,-1:反向)',
+                                                   `adjust_length` int DEFAULT NULL COMMENT '调整长度',
+                                                   `adjust_value_rule` varchar(36) DEFAULT NULL COMMENT '调整值计算规则',
+                                                   `is_enable` tinyint DEFAULT NULL COMMENT '是否启用(0禁用 1启用)',
+                                                   `create_time` datetime DEFAULT NULL,
+                                                   PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测结果自动调整配置表';
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
index bf0c67d..7018392 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -119,7 +119,7 @@
     private StScheduleModelSettingService stScheduleModelSettingService;
 
     @Autowired
-    private StAdjustConfigService stAdjustConfigService;
+    private MmPredictAutoAdjustConfigService autoAdjustService;
     private int HOUR_MINS = 60;
 
     @Override
@@ -219,6 +219,7 @@
             viewDto.setRealData(getHisData(output.getPointid(), startTime, endTime, reqVO.getPrec()));
             viewDto.setPreDataN(mmItemResultService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
             viewDto.setPreDataL(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
+            viewDto.setPreDataLOriginal(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND,DataTypeEnum.FLOAT_LAST_BAK));
             viewDto.setCurData(mmItemResultJsonService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
             // 模拟调整曲线
             viewDto.setAdjData(stAdjustResultService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
@@ -385,6 +386,7 @@
         BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? null : new BigDecimal(chartParams.get(CommonConstant.LIMIT_L));
         int lengthLeft = chartParams.get(CommonConstant.LENGTH_LEFT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_LEFT)).intValue();
         int lengthRight = chartParams.get(CommonConstant.LENGTH_RIGHT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_RIGHT)).intValue();
+        int decimalPlaces = chartParams.get(CommonConstant.DECIMAL_PLACES) == null ? 3 : new BigDecimal(chartParams.get(CommonConstant.DECIMAL_PLACES)).intValue();
 
         Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight);
         Date predictTime = timeArray[0];
@@ -429,8 +431,8 @@
                 dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), startTime, endTime, timeFormat));
                 break;
             case TL:
-                dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), predictTime, endTime, timeFormat));
-                dataView.setPreDataL(mmItemResultLastPointService.getData(outPut.getId(), startTime, endTime, timeFormat));
+                dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), predictTime, endTime, timeFormat, decimalPlaces));
+                dataView.setPreDataL(mmItemResultLastPointService.getData(outPut.getId(), startTime, endTime, timeFormat, decimalPlaces));
                 break;
             default:
                 break;
@@ -918,6 +920,11 @@
         return stScheduleSuggestService.getLastSuggest(params);
     }
 
+    @Override
+    public Boolean autoAdjustByCode(MmPredictAutoAdjustReqVO reqVO) {
+        return autoAdjustService.autoAdjustByCode(reqVO.getConfigCode(),reqVO.getAdjustStartTime());
+    }
+
     private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {
         Date[] result = new Date[3];
         Date predictTime = predictItem.getLastTime();
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataTypeEnum.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataTypeEnum.java
index 2d6deb1..070e2d7 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataTypeEnum.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataTypeEnum.java
@@ -18,6 +18,8 @@
 
     FLOAT_LAST("float_last"),
 
+    FLOAT_LAST_BAK("float_last_bak"),
+
     BOOLEAN("boolean");
 
     private String code;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/enums/DataMeasurement.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/enums/DataMeasurement.java
index 7e2fb65..4eb9496 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/enums/DataMeasurement.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/enums/DataMeasurement.java
@@ -10,6 +10,7 @@
 public enum DataMeasurement {
     t_md_sim_value,
     t_md_last_sim_value,
+    t_md_last_bak_sim_value,
     t_md_dig_value,
     t_md_bool_value,
     t_md_str_value,
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/utils/MeasurementUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/utils/MeasurementUtils.java
index 6e54db1..66a59dd 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/utils/MeasurementUtils.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/utils/MeasurementUtils.java
@@ -19,6 +19,8 @@
             return DataMeasurement.t_md_bool_value.name();
         } else if (DataTypeEnum.FLOAT_LAST.getCode().equals(type)) {
             return DataMeasurement.t_md_last_sim_value.name();
+        }  else if (DataTypeEnum.FLOAT_LAST_BAK.getCode().equals(type)) {
+            return DataMeasurement.t_md_last_bak_sim_value.name();
         } else {
             return DataMeasurement.t_md_str_value.name();
         }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultLastBakSimPOJO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultLastBakSimPOJO.java
new file mode 100644
index 0000000..a9dbc7d
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultLastBakSimPOJO.java
@@ -0,0 +1,18 @@
+package com.iailab.module.model.influxdb.pojo;
+
+import com.influxdb.annotations.Column;
+import com.influxdb.annotations.Measurement;
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/1/7 13:43
+ **/
+@Data
+@Measurement(name = "t_md_last_bak_sim_value")
+public class InfluxModelResultLastBakSimPOJO extends InfluxModelResultPOJO {
+
+    @Column
+    private Double value;
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/controller/admin/MmPredictAutoAdjustConfigController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/controller/admin/MmPredictAutoAdjustConfigController.java
new file mode 100644
index 0000000..827a6ff
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/controller/admin/MmPredictAutoAdjustConfigController.java
@@ -0,0 +1,79 @@
+package com.iailab.module.model.mcs.pre.controller.admin;
+
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.util.object.BeanUtils;
+import com.iailab.module.model.api.mcs.McsApi;
+import com.iailab.module.model.api.mcs.dto.MmPredictAutoAdjustReqVO;
+import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
+import com.iailab.module.model.mcs.pre.service.MmPredictAutoAdjustConfigService;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/4/8 13:30
+ **/
+@RestController
+@RequestMapping("/model/pre/auto-adjust-config")
+public class MmPredictAutoAdjustConfigController {
+
+    @Autowired
+    private MmPredictAutoAdjustConfigService autoAdjustConfigService;
+
+    @Autowired
+    private McsApi mcsApi;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建自动调整配置")
+    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:create')")
+    public CommonResult<Boolean> create(@RequestBody MmPredictAutoAdjustConfigEntity entity) {
+        autoAdjustConfigService.create(entity);
+        return success(true);
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新自动调整配置")
+    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:update')")
+    public CommonResult<Boolean> update(@RequestBody MmPredictAutoAdjustConfigEntity entity) {
+        autoAdjustConfigService.update(entity);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除自动调整配置")
+    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:delete')")
+    public CommonResult<Boolean> delete(@RequestParam("id") String id) {
+        autoAdjustConfigService.delete(id);
+        return success(true);
+    }
+
+    @GetMapping("/get/{id}")
+    @Operation(summary = "获得自动调整配置")
+    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:query')")
+    public CommonResult<MmPredictAutoAdjustConfigVO> getInfo(@PathVariable("id") String id) {
+        MmPredictAutoAdjustConfigEntity entity = autoAdjustConfigService.getInfo(id);
+        return success(BeanUtils.toBean(entity, MmPredictAutoAdjustConfigVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得自动调整配置分页")
+    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:query')")
+    public CommonResult<PageResult<MmPredictAutoAdjustConfigVO>> page(MmPredictAutoAdjustConfigPageReqVO params) {
+        PageResult<MmPredictAutoAdjustConfigVO> pageResult = autoAdjustConfigService.page(params);
+        return success(pageResult);
+    }
+
+    @PostMapping("/autoAdjustByCode")
+    @Operation(summary = "通过configCode自动调整")
+    public Boolean autoAdjustByCode(@RequestBody MmPredictAutoAdjustReqVO params) {
+        return autoAdjustConfigService.autoAdjustByCode(params.getConfigCode(),params.getAdjustStartTime());
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAutoAdjustConfigDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAutoAdjustConfigDao.java
new file mode 100644
index 0000000..cd82fa9
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAutoAdjustConfigDao.java
@@ -0,0 +1,27 @@
+package com.iailab.module.model.mcs.pre.dao;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmConfigRespVO;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/4/8 14:16
+ **/
+@TenantDS
+@Mapper
+public interface MmPredictAutoAdjustConfigDao extends BaseMapperX<MmPredictAutoAdjustConfigEntity> {
+
+    IPage<MmPredictAutoAdjustConfigVO> getPage(IPage<MmPredictAutoAdjustConfigEntity> page, @Param("params") MmPredictAutoAdjustConfigPageReqVO reqVO);
+
+    default IPage<MmPredictAutoAdjustConfigVO> selectPage(MmPredictAutoAdjustConfigPageReqVO params) {
+        return getPage(getPage(params), params);
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictAutoAdjustConfigEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictAutoAdjustConfigEntity.java
new file mode 100644
index 0000000..2365736
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictAutoAdjustConfigEntity.java
@@ -0,0 +1,87 @@
+package com.iailab.module.model.mcs.pre.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/4/8 11:59
+ **/
+@Data
+@TableName("t_mm_predict_auto_adjust_config")
+public class MmPredictAutoAdjustConfigEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id",type = IdType.INPUT)
+    private String id;
+
+    /**
+     * 配置名称
+     */
+    private String configName;
+
+    /**
+     * 配置编码
+     */
+    private String configCode;
+
+    /**
+     * 预测输出id
+     */
+    private String outputId;
+
+    /**
+     * 测点id
+     */
+    private String pointId;
+
+    /**
+     * 取值时间范围
+     */
+    private Integer t;
+
+    /**
+     * 触发规则
+     */
+    private String triggerRule;
+
+    /**
+     * 触发值
+     */
+    private Double triggerValue;
+
+    /**
+     * 调整方向(1:正向,-1:反向)
+     */
+    private Integer adjustDirection;
+
+    /**
+     * 调整长度
+     */
+    private Integer adjustLength;
+
+    /**
+     * 调整值计算规则
+     */
+    private String adjustValueRule;
+
+    /**
+     * 是否启用(0禁用 1启用)
+     */
+    private Integer isEnable;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustTriggerRuleEnum.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustTriggerRuleEnum.java
new file mode 100644
index 0000000..05f9e9d
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustTriggerRuleEnum.java
@@ -0,0 +1,30 @@
+package com.iailab.module.model.mcs.pre.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 自动调整 触发规则
+ */
+@Getter
+@AllArgsConstructor
+public enum AutoAdjustTriggerRuleEnum {
+
+    // 斜率
+    SLOPE("slope"),
+    // 平均差
+    AVERAGE_GAP("average_gap"),
+    UNKNOW("unknow");
+
+
+    private final String code;
+
+    public static AutoAdjustTriggerRuleEnum fromCode(String code) {
+        for (AutoAdjustTriggerRuleEnum unit : values()) {
+            if (unit.code.equals(code)) {
+                return unit;
+            }
+        }
+        return UNKNOW;
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustValueRuleEnum.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustValueRuleEnum.java
new file mode 100644
index 0000000..e4b50d8
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustValueRuleEnum.java
@@ -0,0 +1,54 @@
+package com.iailab.module.model.mcs.pre.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.function.Function;
+
+/**
+ * 自动调整 调整值计算规则
+ */
+@Getter
+@AllArgsConstructor
+public enum AutoAdjustValueRuleEnum {
+
+    // 均值差
+    AVERAGE_GAP_VALUE("average_gap_value",(map) -> {
+        if (!map.containsKey("startValue") || !map.containsKey("endValue")) {
+            return 0.0;
+        }
+        Double startValue = Double.valueOf(map.get("startValue").toString());
+        Double endValue = Double.valueOf(map.get("endValue").toString());
+        return endValue - startValue;
+    });
+
+
+    private final String code;
+    private final Function<HashMap<String,Object>, Double> calculator;
+
+    public Double calculate(HashMap<String,Object> map) {
+        return calculator.apply(map);
+    }
+
+    public static AutoAdjustValueRuleEnum fromCode(String code) {
+        for (AutoAdjustValueRuleEnum unit : values()) {
+            if (unit.code.equals(code)) {
+                return unit;
+            }
+        }
+        return null;
+    }
+
+    public static Double getAdjustValue(String code,HashMap<String,Object> map) {
+
+        AutoAdjustValueRuleEnum rule = AutoAdjustValueRuleEnum.fromCode(code);
+
+        if (rule == null) {
+            return 0.0;
+        }
+        return rule.calculate(map);
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultLastPointService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultLastPointService.java
index 89b1d62..6dce03a 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultLastPointService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultLastPointService.java
@@ -1,5 +1,7 @@
 package com.iailab.module.model.mcs.pre.service;
 
+import com.iailab.module.model.common.enums.DataTypeEnum;
+
 import java.util.Date;
 import java.util.List;
 
@@ -11,4 +13,8 @@
 public interface MmItemResultLastPointService {
 
     List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat);
+
+    List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat, DataTypeEnum dataTypeEnum);
+
+    List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat, int decimalPlaces);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
index 609aa5e..f425d7f 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
@@ -19,4 +19,6 @@
     List<DataValueVO> getPredictValueLast(String outputid, Date startTime, int mins);
 
     List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat);
+
+    List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat, int decimalPlaces);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
new file mode 100644
index 0000000..b77d6e2
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
@@ -0,0 +1,32 @@
+package com.iailab.module.model.mcs.pre.service;
+
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/4/8 13:44
+ **/
+public interface MmPredictAutoAdjustConfigService extends BaseService<MmPredictAutoAdjustConfigEntity> {
+
+    PageResult<MmPredictAutoAdjustConfigVO> page(MmPredictAutoAdjustConfigPageReqVO params);
+
+    MmPredictAutoAdjustConfigEntity getInfo(String id);
+
+    MmPredictAutoAdjustConfigEntity getByCode(String code);
+
+    void create(MmPredictAutoAdjustConfigEntity entity);
+
+    void update(MmPredictAutoAdjustConfigEntity entity);
+
+    void delete(String id);
+
+    boolean autoAdjustByCode(String configCode,long adjustStartTime);
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultLastPointServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultLastPointServiceImpl.java
index ff83a11..2970c7a 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultLastPointServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultLastPointServiceImpl.java
@@ -10,6 +10,7 @@
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -26,6 +27,28 @@
 
     @Override
     public List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat) {
+        return getData(outputid,startTime,endTime,timeFormat,null);
+    }
+
+    public List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat,DataTypeEnum dataTypeEnum) {
+        List<Object[]> result = new ArrayList<>();
+        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
+        if (dataTypeEnum == null) {
+            dataTypeEnum = DataTypeEnum.FLOAT_LAST;
+        }
+        pojo.setType(dataTypeEnum.getCode());
+        pojo.setOutPutId(outputid);
+        List<InfluxModelResultVO> influxModelResultVOS = influxDBService.queryModelResults(pojo, startTime, endTime);
+        influxModelResultVOS.forEach(item -> {
+            Object[] dataItem = new Object[2];
+            dataItem[0] = DateUtils.format(Date.from(item.getTimestamp()), timeFormat);
+            dataItem[1] = BigDecimal.valueOf(Double.valueOf(item.getValue().toString())).setScale(3, BigDecimal.ROUND_HALF_UP);
+            result.add(dataItem);
+        });
+        return result;
+    }
+
+    public List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat, int decimalPlaces) {
         List<Object[]> result = new ArrayList<>();
         InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
         pojo.setType(DataTypeEnum.FLOAT_LAST.getCode());
@@ -34,7 +57,7 @@
         influxModelResultVOS.forEach(item -> {
             Object[] dataItem = new Object[2];
             dataItem[0] = DateUtils.format(Date.from(item.getTimestamp()), timeFormat);
-            dataItem[1] = BigDecimal.valueOf(Double.valueOf(item.getValue().toString())).setScale(3, BigDecimal.ROUND_HALF_UP);
+            dataItem[1] = BigDecimal.valueOf(Double.parseDouble(item.getValue().toString())).setScale(decimalPlaces, RoundingMode.HALF_UP);
             result.add(dataItem);
         });
         return result;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java
index ce85a55..b55cfcf 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSONArray;
 import com.iailab.framework.common.util.date.DateUtils;
 import com.iailab.module.model.common.enums.DataTypeEnum;
+import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastBakSimPOJO;
 import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastSimPOJO;
 import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO;
 import com.iailab.module.model.influxdb.pojo.InfluxModelResultSimPOJO;
@@ -36,6 +37,7 @@
     public void savePredictValue(Map<String, List<DataValueVO>> predictValueMap, int t, String nIndex, Date predictTime) {
         List<InfluxModelResultPOJO> importList = new ArrayList<>();
         List<InfluxModelResultPOJO> lastList = new ArrayList<>();
+        List<InfluxModelResultPOJO> lastBakList = new ArrayList<>();
         List<MmItemResultJsonEntity> resultJsonList = new ArrayList<>();
 
         for (Map.Entry<String, List<DataValueVO>> entry : predictValueMap.entrySet()) {
@@ -44,7 +46,6 @@
                 pojo.setValue(dataVo.getDataValue());
                 pojo.setTimestamp(dataVo.getDataTime().toInstant());
                 pojo.setOutPutId(entry.getKey());
-                pojo.setType(DataTypeEnum.FLOAT.getCode());
                 importList.add(pojo);
             }
 
@@ -67,8 +68,13 @@
                 pojo.setValue(dataVo.getDataValue());
                 pojo.setTimestamp(dataVo.getDataTime().toInstant());
                 pojo.setOutPutId(entry.getKey());
-                pojo.setType(DataTypeEnum.FLOAT.getCode());
                 lastList.add(pojo);
+
+                InfluxModelResultLastBakSimPOJO bakSimPojo = new InfluxModelResultLastBakSimPOJO();
+                bakSimPojo.setValue(dataVo.getDataValue());
+                bakSimPojo.setTimestamp(dataVo.getDataTime().toInstant());
+                bakSimPojo.setOutPutId(entry.getKey());
+                lastBakList.add(bakSimPojo);
             }
 
             MmItemResultJsonEntity resultJson = new MmItemResultJsonEntity();
@@ -85,6 +91,8 @@
         // double结果存入influxdb
         influxDBService.asyncWriteModelResults(importList);
         influxDBService.asyncWriteModelResults(lastList);
+        // t+l备份
+        influxDBService.asyncWriteModelResults(lastBakList);
     }
 
     @Override
@@ -139,4 +147,20 @@
         });
         return result;
     }
+
+    @Override
+    public List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat, int decimalPlaces) {
+        List<Object[]> result = new ArrayList<>();
+        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
+        pojo.setType(DataTypeEnum.FLOAT.getCode());
+        pojo.setOutPutId(outputid);
+        List<InfluxModelResultVO> influxModelResultVOS = influxDBService.queryModelResults(pojo, startTime, endTime);
+        influxModelResultVOS.forEach(item -> {
+            Object[] dataItem = new Object[2];
+            dataItem[0] = DateUtils.format(Date.from(item.getTimestamp()), timeFormat);
+            dataItem[1] = BigDecimal.valueOf(Double.valueOf(item.getValue().toString())).setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP);
+            result.add(dataItem);
+        });
+        return result;
+    }
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
new file mode 100644
index 0000000..510b5f4
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
@@ -0,0 +1,216 @@
+package com.iailab.module.model.mcs.pre.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.module.data.api.point.DataPointApi;
+import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
+import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
+import com.iailab.module.model.common.enums.DataTypeEnum;
+import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastSimPOJO;
+import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO;
+import com.iailab.module.model.influxdb.service.InfluxDBService;
+import com.iailab.module.model.influxdb.vo.InfluxModelResultVO;
+import com.iailab.module.model.mcs.pre.dao.MmPredictAutoAdjustConfigDao;
+import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
+import com.iailab.module.model.mcs.pre.enums.AutoAdjustTriggerRuleEnum;
+import com.iailab.module.model.mcs.pre.enums.AutoAdjustValueRuleEnum;
+import com.iailab.module.model.mcs.pre.service.MmPredictAutoAdjustConfigService;
+import com.iailab.module.model.mcs.pre.service.MmPredictItemService;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
+import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
+import com.iailab.module.model.mdk.vo.ItemVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2024年11月19日
+ */
+@Slf4j
+@Service
+public class MmPredictAutoAdjustConfigServiceImpl extends BaseServiceImpl<MmPredictAutoAdjustConfigDao, MmPredictAutoAdjustConfigEntity>
+        implements MmPredictAutoAdjustConfigService {
+
+    @Autowired
+    private MmPredictItemService mmPredictItemService;
+    @Autowired
+    private InfluxDBService influxDBService;
+    @Autowired
+    private DataPointApi dataPointApi;
+
+    @Override
+    public PageResult<MmPredictAutoAdjustConfigVO> page(MmPredictAutoAdjustConfigPageReqVO params) {
+        IPage<MmPredictAutoAdjustConfigVO> page = baseDao.selectPage(params);
+        return new PageResult<>(page.getRecords(), page.getTotal());
+    }
+
+    @Override
+    public MmPredictAutoAdjustConfigEntity getInfo(String id) {
+        return baseDao.selectById(id);
+    }
+
+    @Override
+    public MmPredictAutoAdjustConfigEntity getByCode(String code) {
+        return baseDao.selectOne("config_code",code);
+    }
+
+    @Override
+    public void create(MmPredictAutoAdjustConfigEntity entity) {
+        entity.setId(UUID.randomUUID().toString());
+        baseDao.insert(entity);
+    }
+
+    @Override
+    public void update(MmPredictAutoAdjustConfigEntity entity) {
+        baseDao.updateById(entity);
+    }
+
+    @Override
+    public void delete(String id) {
+        baseDao.deleteById(id);
+    }
+
+    @Override
+    public boolean autoAdjustByCode(String configCode,long adjustStartTime) {
+        // 查询调整配置
+        MmPredictAutoAdjustConfigEntity configEntity = getByCode(configCode);
+        if (configEntity == null) {
+            log.info("自动调整失败原因:configEntity为null");
+            return false;
+        }
+
+        Double adjustValue = 0.0;
+        ApiPointValueQueryDTO queryDTO;
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(adjustStartTime);
+        Date endTime;
+        Date startTime;
+        List<ApiPointValueDTO> apiPointValueDTOS;
+        // 判断是否调整
+        AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
+        switch (triggerRuleEnum) {
+            case SLOPE:
+                queryDTO = new ApiPointValueQueryDTO();
+                queryDTO.setPointNo(dataPointApi.getInfoById(configEntity.getPointId()).getPointNo());
+                endTime = calendar.getTime();
+                queryDTO.setEnd(endTime);
+                calendar.add(Calendar.MINUTE,-1 * configEntity.getT());
+                startTime = calendar.getTime();
+                queryDTO.setStart(startTime);
+                apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
+                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
+                    log.info("自动调整失败原因:测点数据长度为0");
+                    return false;
+                }
+                apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> e.getV() != -2).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
+                    log.info("自动调整失败原因:测点数据长度为0");
+                    return false;
+                }
+                Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(startTime)).findFirst();
+                if (!startOptional.isPresent()) {
+                    log.info("自动调整失败原因:计算斜率startTime时间点测点值为null,startTime:" + startTime);
+                    return false;
+                }
+                Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(endTime)).findFirst();
+                if (!endOptional.isPresent()) {
+                    log.info("自动调整失败原因:计算斜率endTime时间点测点值为null,endTime:" + endTime);
+                    return false;
+                }
+                ApiPointValueDTO startPointValue = startOptional.get();
+                ApiPointValueDTO endPointValue = endOptional.get();
+
+                // 计算斜率,有正负之分,代表上升或下降
+                double slope = BigDecimal.valueOf(endPointValue.getV() - startPointValue.getV()).divide(BigDecimal.valueOf(configEntity.getT())).doubleValue();
+                //斜率绝对值大于等于触发值则进行调整
+                if (Double.valueOf(Math.abs(slope)).compareTo(configEntity.getTriggerValue()) >= 0) {
+                    //计算调整值
+                    HashMap<String,Object> map = new HashMap<>();
+                    map.put("startValue",startPointValue.getV());
+                    map.put("endValue",endPointValue.getV());
+                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), map);
+                } else {
+                    log.info("自动调整失败原因:斜率小于调整值,斜率:" + slope);
+                    return false;
+                }
+                break;
+            case AVERAGE_GAP:
+                queryDTO = new ApiPointValueQueryDTO();
+                queryDTO.setPointNo(dataPointApi.getInfoById(configEntity.getPointId()).getPointNo());
+                endTime = calendar.getTime();
+                queryDTO.setEnd(endTime);
+                calendar.add(Calendar.MINUTE,-1 * configEntity.getT() * 2 + 1);
+                startTime = calendar.getTime();
+                queryDTO.setStart(startTime);
+                apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
+                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
+                    log.info("自动调整失败原因:测点数据长度为0");
+                    return false;
+                }
+                apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> e.getV() != -2).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
+                    log.info("自动调整失败原因:测点数据长度为0");
+                    return false;
+                }
+                calendar.add(Calendar.MINUTE,configEntity.getT());
+                double startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().before(calendar.getTime())).collect(Collectors.summarizingDouble(ApiPointValueDTO::getV)).getAverage();
+                double endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().compareTo(calendar.getTime()) >= 0).collect(Collectors.summarizingDouble(ApiPointValueDTO::getV)).getAverage();
+                // 计算均值差,大于等于触发值则进行调整
+                if (Double.valueOf(Math.abs(startAverage - endAverage)).compareTo(configEntity.getTriggerValue()) >= 0) {
+                    //计算调整值
+                    HashMap<String,Object> map = new HashMap<>();
+                    map.put("startValue",startAverage);
+                    map.put("endValue",endAverage);
+                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), map);
+                } else {
+                    log.info("自动调整失败原因:均值差小于调整值,均值差:" + (startAverage - endAverage));
+                    return false;
+                }
+                break;
+            default:
+                log.info("自动调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
+                return false;
+        }
+
+        // 调整方向
+        adjustValue = adjustValue * configEntity.getAdjustDirection();
+
+        // 获取历史结果
+        ItemVO item = mmPredictItemService.getItemByOutPutId(configEntity.getOutputId());
+        if (item == null) {
+            log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + configEntity.getOutputId());
+            return false;
+        }
+        Calendar resultCalendar = Calendar.getInstance();
+        resultCalendar.setTimeInMillis(adjustStartTime);
+        Date resultStartTime = resultCalendar.getTime();
+        resultCalendar.add(Calendar.SECOND,configEntity.getAdjustLength() * item.getGranularity());
+        Date resultEndTime = resultCalendar.getTime();
+        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
+        pojo.setType(DataTypeEnum.FLOAT_LAST_BAK.getCode());
+        pojo.setOutPutId(configEntity.getOutputId());
+        List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, resultStartTime, resultEndTime);
+
+        List<InfluxModelResultPOJO> lastList = new ArrayList<>();
+        for (InfluxModelResultVO resultVO : influxModelResult) {
+            InfluxModelResultLastSimPOJO adjustPojo = new InfluxModelResultLastSimPOJO();
+            // 设置新的调整值
+            adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + adjustValue);
+            adjustPojo.setTimestamp(resultVO.getTimestamp());
+            adjustPojo.setOutPutId(configEntity.getOutputId());
+            lastList.add(adjustPojo);
+        }
+        // 相同时间直接覆盖旧值
+        influxDBService.asyncWriteModelResults(lastList);
+        log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + adjustValue + ",resultStartTime:" + resultStartTime + ",resultEndTime:" + resultEndTime + "调整长度:" + lastList.size());
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigPageReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigPageReqVO.java
new file mode 100644
index 0000000..54c5a94
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigPageReqVO.java
@@ -0,0 +1,25 @@
+package com.iailab.module.model.mcs.pre.vo;
+
+import com.iailab.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/4/8 14:35
+ **/
+@Schema(description = "预测结果自动调整配置 - Page Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MmPredictAutoAdjustConfigPageReqVO extends PageParam {
+
+    @Schema(description = "配置名称")
+    private String configName;
+
+    @Schema(description = "配置编码")
+    private String configCode;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigVO.java
new file mode 100644
index 0000000..3e9b855
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigVO.java
@@ -0,0 +1,92 @@
+package com.iailab.module.model.mcs.pre.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/4/8 11:59
+ **/
+@Data
+public class MmPredictAutoAdjustConfigVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 配置名称
+     */
+    private String configName;
+
+    /**
+     * 配置编码
+     */
+    private String configCode;
+
+    /**
+     * 预测输出id
+     */
+    private String outputId;
+
+    /**
+     * 测点id
+     */
+    private String pointId;
+
+    /**
+     * 取值时间范围
+     */
+    private Integer t;
+
+    /**
+     * 触发规则
+     */
+    private String triggerRule;
+
+    /**
+     * 触发值
+     */
+    private Double triggerValue;
+
+    /**
+     * 调整方向(1:正向,-1:反向)
+     */
+    private Integer adjustDirection;
+
+    /**
+     * 调整长度
+     */
+    private Integer adjustLength;
+
+    /**
+     * 调整值计算规则
+     */
+    private String adjustValueRule;
+
+    /**
+     * 是否启用(0禁用 1启用)
+     */
+    private Integer isEnable;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 预测项名称
+     */
+    private String itemName;
+
+    /**
+     * 预测项输出名称
+     */
+    private String outputName;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java
index 9c7bd75..40d5a39 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java
@@ -96,7 +96,7 @@
             //打印结果
             log.info("预测模型计算完成:modelId=" + modelId + ",modelName=" + predictModel.getModelname() + ",modelResult=" + JSON.toJSONString(modelResult));
             //判断模型结果
-            if (!modelResult.containsKey(CommonConstant.MDK_STATUS_CODE) || !modelResult.containsKey(CommonConstant.MDK_RESULT) ||
+            if (modelResult == null || !modelResult.containsKey(CommonConstant.MDK_STATUS_CODE) || !modelResult.containsKey(CommonConstant.MDK_RESULT) ||
                     !modelResult.get(CommonConstant.MDK_STATUS_CODE).toString().equals(CommonConstant.MDK_STATUS_100)) {
                 throw new ModelResultErrorException("模型结果异常:" + modelResult);
             }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/schedule/impl/ScheduleModelHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/schedule/impl/ScheduleModelHandlerImpl.java
index aa14af6..6823247 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/schedule/impl/ScheduleModelHandlerImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/schedule/impl/ScheduleModelHandlerImpl.java
@@ -95,11 +95,22 @@
             log.info("参数: " + JSON.toJSONString(param2Values));
             //IAILMDK.run
             HashMap<String, Object> modelResult = DllUtils.run(newModelBean, param2Values, scheduleScheme.getMpkprojectid());
+            HashMap<String, Object> result = new HashMap<>();
+            if (modelResult == null) {
+                //返回调度结果
+                scheduleResult.setResultCode("null");
+                scheduleResult.setResult(result);
+                scheduleResult.setModelId(modelId);
+                scheduleResult.setSchemeId(scheduleScheme.getId());
+                scheduleResult.setScheduleTime(scheduleTime);
+                return scheduleResult;
+            }
+
             if (!modelResult.containsKey(CommonConstant.MDK_STATUS_CODE) || !modelResult.containsKey(CommonConstant.MDK_RESULT)) {
                 log.info("模型结果异常:" + modelResult);
             }
             String statusCode = modelResult.get(CommonConstant.MDK_STATUS_CODE).toString();
-            HashMap<String, Object> result = new HashMap<>();
+
             if (modelResult.containsKey(CommonConstant.MDK_RESULT) && modelResult.get(CommonConstant.MDK_RESULT) != null &&
                     CommonConstant.MDK_STATUS_100.equals(modelResult.get(CommonConstant.MDK_STATUS_CODE).toString())) {
                 result = (HashMap<String, Object>) modelResult.get(CommonConstant.MDK_RESULT);
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/pre/MmPredictAutoAdjustConfigDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/pre/MmPredictAutoAdjustConfigDao.xml
new file mode 100644
index 0000000..2f87064
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/pre/MmPredictAutoAdjustConfigDao.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.mcs.pre.dao.MmPredictAutoAdjustConfigDao">
+    <select id="getPage" resultType="com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO">
+        select
+        t1.*,
+        t2.result_name output_name,
+        t3.itemname item_name
+        from t_mm_predict_auto_adjust_config t1
+        left join t_mm_item_output t2 on t1.output_id = t2.id
+        left join t_mm_predict_item t3 on t2.itemid = t3.id
+        <where>
+            <if test="params.configName != null and params.configName != ''">
+                and t1.config_name like CONCAT('%', #{params.configName},'%')
+            </if>
+            <if test="params.configCode != null and params.configCode != ''">
+                and t1.config_code like CONCAT('%', #{params.configCode},'%')
+            </if>
+        </where>
+        order by t1.create_time desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/SocialClientApi.java b/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/SocialClientApi.java
deleted file mode 100644
index 7d9f998..0000000
--- a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/SocialClientApi.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.iailab.module.system.api.social;
-
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO;
-import com.iailab.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
-import com.iailab.module.system.enums.ApiConstants;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-@FeignClient(name = ApiConstants.NAME)
-@Tag(name = "RPC 服务 - 社交应用")
-public interface SocialClientApi {
-
-    String PREFIX = ApiConstants.PREFIX + "/social-client";
-
-    @GetMapping(PREFIX + "/get-authorize-url")
-    @Operation(summary = "获得社交平台的授权 URL")
-    @Parameters({
-            @Parameter(name = "socialType", description = "社交平台的类型", example = "1", required = true),
-            @Parameter(name = "userType", description = "用户类型", example = "1", required = true),
-            @Parameter(name = "redirectUri", description = "重定向 URL", example = "https://www.baidu.com", required = true)
-    })
-    CommonResult<String> getAuthorizeUrl(@RequestParam("socialType") Integer socialType,
-                                         @RequestParam("userType") Integer userType,
-                                         @RequestParam("redirectUri") String redirectUri);
-
-    @GetMapping(PREFIX + "/create-wx-mp-jsapi-signature")
-    @Operation(summary = "创建微信公众号 JS SDK 初始化所需的签名")
-    @Parameters({
-            @Parameter(name = "userType", description = "用户类型", example = "1", required = true),
-            @Parameter(name = "url", description = "访问 URL", example = "https://www.baidu.com", required = true)
-    })
-    CommonResult<SocialWxJsapiSignatureRespDTO> createWxMpJsapiSignature(@RequestParam("userType") Integer userType,
-                                                                         @RequestParam("url") String url);
-
-    @GetMapping(PREFIX + "/create-wx-ma-phone-number-info")
-    @Operation(summary = "获得微信小程序的手机信息")
-    @Parameters({
-            @Parameter(name = "userType", description = "用户类型", example = "1", required = true),
-            @Parameter(name = "phoneCode", description = "手机授权码", example = "iailab11", required = true)
-    })
-    CommonResult<SocialWxPhoneNumberInfoRespDTO> getWxMaPhoneNumberInfo(@RequestParam("userType") Integer userType,
-                                                                        @RequestParam("phoneCode") String phoneCode);
-
-}
diff --git a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/SocialUserApi.java b/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/SocialUserApi.java
deleted file mode 100644
index eae329c..0000000
--- a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/SocialUserApi.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.iailab.module.system.api.social;
-
-import com.iailab.framework.common.exception.ServiceException;
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
-import com.iailab.module.system.api.social.dto.SocialUserRespDTO;
-import com.iailab.module.system.api.social.dto.SocialUserUnbindReqDTO;
-import com.iailab.module.system.enums.ApiConstants;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-
-@FeignClient(name = ApiConstants.NAME)
-@Tag(name = "RPC 服务 - 社交用户")
-public interface SocialUserApi {
-
-    String PREFIX = ApiConstants.PREFIX + "/social-user";
-
-    @PostMapping(PREFIX + "/bind")
-    @Operation(summary = "绑定社交用户")
-    CommonResult<String> bindSocialUser(@Valid @RequestBody SocialUserBindReqDTO reqDTO);
-
-    @DeleteMapping(PREFIX + "/unbind")
-    @Operation(summary = "取消绑定社交用户")
-    CommonResult<Boolean> unbindSocialUser(@Valid @RequestBody SocialUserUnbindReqDTO reqDTO);
-
-    @GetMapping(PREFIX + "/get-by-user-id")
-    @Operation(summary = "获得社交用户,基于 userId")
-    @Parameters({
-            @Parameter(name = "userType", description = "用户类型", example = "2", required = true),
-            @Parameter(name = "userId", description = "用户编号", example = "1024", required = true),
-            @Parameter(name = "socialType", description = "社交平台的类型", example = "1", required = true),
-    })
-    CommonResult<SocialUserRespDTO> getSocialUserByUserId(@RequestParam("userType") Integer userType,
-                                                          @RequestParam("userId") Long userId,
-                                                          @RequestParam("socialType") Integer socialType);
-
-    @GetMapping(PREFIX + "/get-by-code")
-    @Operation(summary = "获得社交用") // 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
-    @Parameters({
-            @Parameter(name = "userType", description = "用户类型", example = "2", required = true),
-            @Parameter(name = "socialType", description = "社交平台的类型", example = "1", required = true),
-            @Parameter(name = "code", description = "授权码", example = "88888", required = true),
-            @Parameter(name = "state", description = "state", example = "666", required = true),
-    })
-    CommonResult<SocialUserRespDTO> getSocialUserByCode(@RequestParam("userType") Integer userType,
-                                                        @RequestParam("socialType") Integer socialType,
-                                                        @RequestParam("code") String code,
-                                                        @RequestParam("state") String state);
-
-}
diff --git a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserBindReqDTO.java b/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserBindReqDTO.java
deleted file mode 100644
index b2e7392..0000000
--- a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserBindReqDTO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.iailab.module.system.api.social.dto;
-
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.common.validation.InEnum;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "RPC 服务 - 取消绑定社交用户 Request DTO")
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class SocialUserBindReqDTO {
-
-    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @NotNull(message = "用户编号不能为空")
-    private Long userId;
-    @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @InEnum(UserTypeEnum.class)
-    @NotNull(message = "用户类型不能为空")
-    private Integer userType;
-
-    @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @InEnum(SocialTypeEnum.class)
-    @NotNull(message = "社交平台的类型不能为空")
-    private Integer socialType;
-    @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "zsw")
-    @NotEmpty(message = "授权码不能为空")
-    private String code;
-    @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "qtw")
-    @NotEmpty(message = "state 不能为空")
-    private String state;
-
-}
diff --git a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserRespDTO.java b/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserRespDTO.java
deleted file mode 100644
index 8eaffc0..0000000
--- a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserRespDTO.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.iailab.module.system.api.social.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Schema(description = "RPC 服务 - 社交用户 Response DTO")
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class SocialUserRespDTO {
-
-    @Schema(description = "社交用户 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "zsw")
-    private String openid;
-
-    @Schema(description = "社交用户的昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    private String nickname;
-
-    @Schema(description = "社交用户的头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.baidu.com/1.jpg")
-    private String avatar;
-
-    @Schema(description = "关联的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    private Long userId;
-
-}
diff --git a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserUnbindReqDTO.java b/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserUnbindReqDTO.java
deleted file mode 100644
index 6f76ba4..0000000
--- a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialUserUnbindReqDTO.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.iailab.module.system.api.social.dto;
-
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.common.validation.InEnum;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "RPC 服务 - 取消绑定社交用户 Request DTO")
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class SocialUserUnbindReqDTO {
-
-    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @NotNull(message = "用户编号不能为空")
-    private Long userId;
-    @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @InEnum(UserTypeEnum.class)
-    @NotNull(message = "用户类型不能为空")
-    private Integer userType;
-
-    @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @InEnum(SocialTypeEnum.class)
-    @NotNull(message = "社交平台的类型不能为空")
-    private Integer socialType;
-    @Schema(description = "社交平台的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "zsw")
-    @NotEmpty(message = "社交平台的 openid 不能为空")
-    private String openid;
-
-}
diff --git a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialWxJsapiSignatureRespDTO.java b/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialWxJsapiSignatureRespDTO.java
deleted file mode 100644
index c7cbd3d..0000000
--- a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialWxJsapiSignatureRespDTO.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.iailab.module.system.api.social.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "RPC 服务 - 微信公众号 JSAPI 签名 Response DTO")
-@Data
-public class SocialWxJsapiSignatureRespDTO {
-
-    @Schema(description = "微信公众号的 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx123456")
-    private String appId;
-
-    @Schema(description = "匿名串", requiredMode = Schema.RequiredMode.REQUIRED, example = "zsw")
-    private String nonceStr;
-
-    @Schema(description = "时间戳", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456789")
-    private Long timestamp;
-
-    @Schema(description = "URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.baidu.com")
-    private String url;
-
-    @Schema(description = "签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "zsw")
-    private String signature;
-
-}
diff --git a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialWxPhoneNumberInfoRespDTO.java b/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialWxPhoneNumberInfoRespDTO.java
deleted file mode 100644
index 2fdeefc..0000000
--- a/iailab-module-system/iailab-module-system-api/src/main/java/com/iailab/module/system/api/social/dto/SocialWxPhoneNumberInfoRespDTO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.iailab.module.system.api.social.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "RPC 服务 - 微信小程序的手机信息 Response DTO")
-@Data
-public class SocialWxPhoneNumberInfoRespDTO {
-
-    @Schema(description = "用户绑定的手机号(国外手机号会有区号)", requiredMode = Schema.RequiredMode.REQUIRED, example = "021-13579246810")
-    private String phoneNumber;
-
-    @Schema(description = "没有区号的手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13579246810")
-    private String purePhoneNumber;
-    @Schema(description = "区号", requiredMode = Schema.RequiredMode.REQUIRED, example = "021")
-    private String countryCode;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/pom.xml b/iailab-module-system/iailab-module-system-biz/pom.xml
index 70eed45..c92d927 100644
--- a/iailab-module-system/iailab-module-system-biz/pom.xml
+++ b/iailab-module-system/iailab-module-system-biz/pom.xml
@@ -90,6 +90,12 @@
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
 
+        <!-- Job 定时任务相关 -->
+<!--        <dependency>-->
+<!--            <groupId>com.iailab</groupId>-->
+<!--            <artifactId>iailab-common-job</artifactId>-->
+<!--        </dependency>-->
+
         <!-- 消息队列相关 -->
         <dependency>
             <groupId>com.iailab</groupId>
@@ -126,38 +132,35 @@
             <artifactId>iailab-common-monitor</artifactId>
         </dependency>
 
-        <!-- 三方云服务相关 -->
-        <dependency>
-            <groupId>com.xingyuv</groupId>
-            <artifactId>spring-boot-starter-justauth</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) -->
-        </dependency>
+<!--        &lt;!&ndash; 三方云服务相关 &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.xingyuv</groupId>-->
+<!--            <artifactId>spring-boot-starter-justauth</artifactId> &lt;!&ndash; 社交登陆(例如说,个人微信、企业微信等等) &ndash;&gt;-->
+<!--        </dependency>-->
 
-        <dependency>
-            <groupId>com.github.binarywang</groupId>
-            <artifactId>wx-java-mp-spring-boot-starter</artifactId> <!-- 微信登录(公众号) -->
-        </dependency>
-        <dependency>
-            <groupId>com.github.binarywang</groupId>
-            <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>  <!-- 微信登录(小程序) -->
-        </dependency>
-
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>aliyun-java-sdk-core</artifactId> <!-- 短信(阿里云) -->
-        </dependency>
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <!-- 短信(阿里云) -->
-        </dependency>
-        <dependency>
-            <groupId>com.tencentcloudapi</groupId>
-            <artifactId>tencentcloud-sdk-java-sms</artifactId> <!-- 短信(腾讯云) -->
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.aliyun</groupId>-->
+<!--            <artifactId>aliyun-java-sdk-core</artifactId> &lt;!&ndash; 短信(阿里云) &ndash;&gt;-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.aliyun</groupId>-->
+<!--            <artifactId>aliyun-java-sdk-dysmsapi</artifactId> &lt;!&ndash; 短信(阿里云) &ndash;&gt;-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.tencentcloudapi</groupId>-->
+<!--            <artifactId>tencentcloud-sdk-java-sms</artifactId> &lt;!&ndash; 短信(腾讯云) &ndash;&gt;-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>com.xingyuv</groupId>
             <artifactId>spring-boot-starter-captcha-plus</artifactId> <!-- 验证码,一般用于登录使用 -->
         </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>com.iailab</groupId>-->
+<!--            <artifactId>iailab-plat-sdk</artifactId>-->
+<!--            <version>1.0.0</version>-->
+<!--        </dependency>-->
 
     </dependencies>
 
@@ -165,6 +168,45 @@
         <!-- 设置构建的 jar 包名 -->
         <finalName>${project.artifactId}</finalName>
         <plugins>
+            <plugin>
+                <groupId>com.github.wvengen</groupId>
+                <artifactId>proguard-maven-plugin</artifactId>
+                <version>2.7.0</version>
+                <executions>
+                    <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>proguard</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
+                    <injar>${project.build.finalName}.jar</injar>
+                    <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
+                    <outjar>${project.build.finalName}.jar</outjar>
+                    <!-- 是否混淆 默认是true -->
+                    <obfuscate>true</obfuscate>
+                    <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
+                    <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
+                    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
+                    <!-- 额外的jar包,通常是项目编译所需要的jar -->
+                    <libs>
+                        <lib>${java.home}/lib/rt.jar</lib>
+                        <lib>${java.home}/lib/jce.jar</lib>
+                        <lib>${java.home}/lib/jsse.jar</lib>
+                    </libs>
+                    <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
+                    <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
+                    <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
+                    <outputDirectory>${project.basedir}/target</outputDirectory>
+                    <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
+                    <options>
+                        <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
+                    </options>
+                </configuration>
+            </plugin>
             <!-- 打包 -->
             <plugin>
                 <groupId>org.springframework.boot</groupId>
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/sms/SmsCodeApiImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/sms/SmsCodeApiImpl.java
deleted file mode 100644
index 4f31dda..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/sms/SmsCodeApiImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.iailab.module.system.api.sms;
-
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
-import com.iailab.module.system.service.sms.SmsCodeService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@RestController // 提供 RESTful API 接口,给 Feign 调用
-@Validated
-public class SmsCodeApiImpl implements SmsCodeApi {
-
-    @Resource
-    private SmsCodeService smsCodeService;
-
-    @Override
-    public CommonResult<Boolean> sendSmsCode(SmsCodeSendReqDTO reqDTO) {
-        smsCodeService.sendSmsCode(reqDTO);
-        return success(true);
-    }
-
-    @Override
-    public CommonResult<Boolean> useSmsCode(SmsCodeUseReqDTO reqDTO) {
-        smsCodeService.useSmsCode(reqDTO);
-        return success(true);
-    }
-
-    @Override
-    public CommonResult<Boolean> validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
-        smsCodeService.validateSmsCode(reqDTO);
-        return success(true);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/sms/SmsSendApiImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/sms/SmsSendApiImpl.java
deleted file mode 100644
index f68c108..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/sms/SmsSendApiImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.iailab.module.system.api.sms;
-
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO;
-import com.iailab.module.system.service.sms.SmsSendService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@RestController // 提供 RESTful API 接口,给 Feign 调用
-@Validated
-public class SmsSendApiImpl implements SmsSendApi {
-
-    @Resource
-    private SmsSendService smsSendService;
-
-    @Override
-    public CommonResult<Long> sendSingleSmsToAdmin(SmsSendSingleToUserReqDTO reqDTO) {
-        return success(smsSendService.sendSingleSmsToAdmin(reqDTO.getMobile(), reqDTO.getUserId(),
-                reqDTO.getTemplateCode(), reqDTO.getTemplateParams()));
-    }
-
-    @Override
-    public CommonResult<Long> sendSingleSmsToMember(SmsSendSingleToUserReqDTO reqDTO) {
-        return success(smsSendService.sendSingleSmsToMember(reqDTO.getMobile(), reqDTO.getUserId(),
-                reqDTO.getTemplateCode(), reqDTO.getTemplateParams()));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/social/SocialClientApiImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/social/SocialClientApiImpl.java
deleted file mode 100644
index 265adc6..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/social/SocialClientApiImpl.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.iailab.module.system.api.social;
-
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO;
-import com.iailab.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
-import com.iailab.module.system.service.social.SocialClientService;
-import me.chanjar.weixin.common.bean.WxJsapiSignature;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-/**
- * 社交应用的 API 实现类
- *
- * @author iailab
- */
-@RestController
-@Validated
-public class SocialClientApiImpl implements SocialClientApi {
-
-    @Resource
-    private SocialClientService socialClientService;
-
-    @Override
-    public CommonResult<String> getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri) {
-        return success(socialClientService.getAuthorizeUrl(socialType, userType, redirectUri));
-    }
-
-    @Override
-    public CommonResult<SocialWxJsapiSignatureRespDTO> createWxMpJsapiSignature(Integer userType, String url) {
-        WxJsapiSignature signature = socialClientService.createWxMpJsapiSignature(userType, url);
-        return success(BeanUtils.toBean(signature, SocialWxJsapiSignatureRespDTO.class));
-    }
-
-    @Override
-    public CommonResult<SocialWxPhoneNumberInfoRespDTO> getWxMaPhoneNumberInfo(Integer userType, String phoneCode) {
-        WxMaPhoneNumberInfo info = socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode);
-        return success(BeanUtils.toBean(info, SocialWxPhoneNumberInfoRespDTO.class));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/social/SocialUserApiImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/social/SocialUserApiImpl.java
deleted file mode 100644
index c8d03f6..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/api/social/SocialUserApiImpl.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.iailab.module.system.api.social;
-
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
-import com.iailab.module.system.api.social.dto.SocialUserRespDTO;
-import com.iailab.module.system.api.social.dto.SocialUserUnbindReqDTO;
-import com.iailab.module.system.service.social.SocialUserService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@RestController // 提供 RESTful API 接口,给 Feign 调用
-@Validated
-public class SocialUserApiImpl implements SocialUserApi {
-
-    @Resource
-    private SocialUserService socialUserService;
-
-    @Override
-    public CommonResult<String> bindSocialUser(SocialUserBindReqDTO reqDTO) {
-        return success(socialUserService.bindSocialUser(reqDTO));
-    }
-
-    @Override
-    public CommonResult<Boolean> unbindSocialUser(SocialUserUnbindReqDTO reqDTO) {
-        socialUserService.unbindSocialUser(reqDTO.getUserId(), reqDTO.getUserType(),
-                reqDTO.getSocialType(), reqDTO.getOpenid());
-        return success(true);
-    }
-
-    @Override
-    public CommonResult<SocialUserRespDTO> getSocialUserByUserId(Integer userType, Long userId, Integer socialType) {
-        return success(socialUserService.getSocialUserByUserId(userType, userId, socialType));
-    }
-
-    @Override
-    public CommonResult<SocialUserRespDTO> getSocialUserByCode(Integer userType, Integer socialType, String code, String state) {
-        return success(socialUserService.getSocialUserByCode(userType, socialType, code, state));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java
index 2fcd758..c3c0e3c 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java
@@ -4,17 +4,12 @@
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.StrUtil;
 import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.common.enums.UserTypeEnum;
 import com.iailab.framework.common.pojo.CommonResult;
 import com.iailab.framework.common.util.object.BeanUtils;
 import com.iailab.framework.security.config.SecurityProperties;
-import com.iailab.framework.security.core.LoginUser;
 import com.iailab.framework.security.core.util.SecurityFrameworkUtils;
-import com.iailab.module.system.controller.admin.app.vo.AppMenuRespVO;
 import com.iailab.module.system.controller.admin.app.vo.AppRespVO;
 import com.iailab.module.system.controller.admin.auth.vo.*;
-import com.iailab.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
-import com.iailab.module.system.controller.admin.permission.vo.menu.MenuRespVO;
 import com.iailab.module.system.convert.auth.AuthConvert;
 import com.iailab.module.system.dal.dataobject.app.AppDO;
 import com.iailab.module.system.dal.dataobject.permission.MenuDO;
@@ -27,14 +22,11 @@
 import com.iailab.module.system.service.permission.MenuService;
 import com.iailab.module.system.service.permission.PermissionService;
 import com.iailab.module.system.service.permission.RoleService;
-import com.iailab.module.system.service.social.SocialClientService;
 import com.iailab.module.system.service.user.AdminUserService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.core.Authentication;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -68,8 +60,6 @@
     private MenuService menuService;
     @Resource
     private PermissionService permissionService;
-    @Resource
-    private SocialClientService socialClientService;
     @Resource
     private SecurityProperties securityProperties;
     @Resource
@@ -264,45 +254,6 @@
         menuVOS = AuthConvert.INSTANCE.buildMenuTree(tempChildren, menuDO.getId(), menuDO.getPath(), info.getType());
         // 2. 拼接结果返回
         return success(menuVOS);
-    }
-
-    // ========== 短信登录相关 ==========
-
-    @PostMapping("/sms-login")
-    @PermitAll
-    @Operation(summary = "使用短信验证码登录")
-    public CommonResult<AuthLoginRespVO> smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) {
-        return success(authService.smsLogin(reqVO));
-    }
-
-    @PostMapping("/send-sms-code")
-    @PermitAll
-    @Operation(summary = "发送手机验证码")
-    public CommonResult<Boolean> sendLoginSmsCode(@RequestBody @Valid AuthSmsSendReqVO reqVO) {
-        authService.sendSmsCode(reqVO);
-        return success(true);
-    }
-
-    // ========== 社交登录相关 ==========
-
-    @GetMapping("/social-auth-redirect")
-    @PermitAll
-    @Operation(summary = "社交授权的跳转")
-    @Parameters({
-            @Parameter(name = "type", description = "社交类型", required = true),
-            @Parameter(name = "redirectUri", description = "回调路径")
-    })
-    public CommonResult<String> socialLogin(@RequestParam("type") Integer type,
-                                            @RequestParam("redirectUri") String redirectUri) {
-        return success(socialClientService.getAuthorizeUrl(
-                type, UserTypeEnum.ADMIN.getValue(), redirectUri));
-    }
-
-    @PostMapping("/social-login")
-    @PermitAll
-    @Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户")
-    public CommonResult<AuthLoginRespVO> socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) {
-        return success(authService.socialLogin(reqVO));
     }
 
 }
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsCallbackController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsCallbackController.java
deleted file mode 100644
index 8eb8495..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsCallbackController.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.iailab.module.system.controller.admin.sms;
-
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.framework.common.util.servlet.ServletUtils;
-import com.iailab.module.system.framework.sms.core.enums.SmsChannelEnum;
-import com.iailab.module.system.service.sms.SmsSendService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import javax.annotation.security.PermitAll;
-import javax.servlet.http.HttpServletRequest;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 短信回调")
-@RestController
-@RequestMapping("/system/sms/callback")
-public class SmsCallbackController {
-
-    @Resource
-    private SmsSendService smsSendService;
-
-    @PostMapping("/aliyun")
-    @PermitAll
-    @Operation(summary = "阿里云短信的回调", description = "参见 https://help.aliyun.com/zh/sms/developer-reference/configure-delivery-receipts-1 文档")
-    public CommonResult<Boolean> receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable {
-        String text = ServletUtils.getBody(request);
-        smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
-        return success(true);
-    }
-
-    @PostMapping("/tencent")
-    @PermitAll
-    @Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/59178 文档")
-    public CommonResult<Boolean> receiveTencentSmsStatus(HttpServletRequest request) throws Throwable {
-        String text = ServletUtils.getBody(request);
-        smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text);
-        return success(true);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsChannelController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsChannelController.java
deleted file mode 100644
index 577245e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsChannelController.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.iailab.module.system.controller.admin.sms;
-
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelRespVO;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelSaveReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelSimpleRespVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsChannelDO;
-import com.iailab.module.system.service.sms.SmsChannelService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import java.util.Comparator;
-import java.util.List;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 短信渠道")
-@RestController
-@RequestMapping("system/sms-channel")
-public class SmsChannelController {
-
-    @Resource
-    private SmsChannelService smsChannelService;
-
-    @PostMapping("/create")
-    @Operation(summary = "创建短信渠道")
-    @PreAuthorize("@ss.hasPermission('system:sms-channel:create')")
-    public CommonResult<Long> createSmsChannel(@Valid @RequestBody SmsChannelSaveReqVO createReqVO) {
-        return success(smsChannelService.createSmsChannel(createReqVO));
-    }
-
-    @PutMapping("/update")
-    @Operation(summary = "更新短信渠道")
-    @PreAuthorize("@ss.hasPermission('system:sms-channel:update')")
-    public CommonResult<Boolean> updateSmsChannel(@Valid @RequestBody SmsChannelSaveReqVO updateReqVO) {
-        smsChannelService.updateSmsChannel(updateReqVO);
-        return success(true);
-    }
-
-    @DeleteMapping("/delete")
-    @Operation(summary = "删除短信渠道")
-    @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('system:sms-channel:delete')")
-    public CommonResult<Boolean> deleteSmsChannel(@RequestParam("id") Long id) {
-        smsChannelService.deleteSmsChannel(id);
-        return success(true);
-    }
-
-    @GetMapping("/get")
-    @Operation(summary = "获得短信渠道")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('system:sms-channel:query')")
-    public CommonResult<SmsChannelRespVO> getSmsChannel(@RequestParam("id") Long id) {
-        SmsChannelDO channel = smsChannelService.getSmsChannel(id);
-        return success(BeanUtils.toBean(channel, SmsChannelRespVO.class));
-    }
-
-    @GetMapping("/page")
-    @Operation(summary = "获得短信渠道分页")
-    @PreAuthorize("@ss.hasPermission('system:sms-channel:query')")
-    public CommonResult<PageResult<SmsChannelRespVO>> getSmsChannelPage(@Valid SmsChannelPageReqVO pageVO) {
-        PageResult<SmsChannelDO> pageResult = smsChannelService.getSmsChannelPage(pageVO);
-        return success(BeanUtils.toBean(pageResult, SmsChannelRespVO.class));
-    }
-
-    @GetMapping({"/list-all-simple", "/simple-list"})
-    @Operation(summary = "获得短信渠道精简列表", description = "包含被禁用的短信渠道")
-    public CommonResult<List<SmsChannelSimpleRespVO>> getSimpleSmsChannelList() {
-        List<SmsChannelDO> list = smsChannelService.getSmsChannelList();
-        list.sort(Comparator.comparing(SmsChannelDO::getId));
-        return success(BeanUtils.toBean(list, SmsChannelSimpleRespVO.class));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsLogController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsLogController.java
deleted file mode 100644
index 0fd6893..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsLogController.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.iailab.module.system.controller.admin.sms;
-
-import com.iailab.framework.apilog.core.annotation.ApiAccessLog;
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.framework.common.pojo.PageParam;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.framework.excel.core.util.ExcelUtils;
-import com.iailab.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.log.SmsLogRespVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsLogDO;
-import com.iailab.module.system.service.sms.SmsLogService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.io.IOException;
-import java.util.List;
-
-import static com.iailab.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 短信日志")
-@RestController
-@RequestMapping("/system/sms-log")
-@Validated
-public class SmsLogController {
-
-    @Resource
-    private SmsLogService smsLogService;
-
-    @GetMapping("/page")
-    @Operation(summary = "获得短信日志分页")
-    @PreAuthorize("@ss.hasPermission('system:sms-log:query')")
-    public CommonResult<PageResult<SmsLogRespVO>> getSmsLogPage(@Valid SmsLogPageReqVO pageReqVO) {
-        PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, SmsLogRespVO.class));
-    }
-
-    @GetMapping("/export-excel")
-    @Operation(summary = "导出短信日志 Excel")
-    @PreAuthorize("@ss.hasPermission('system:sms-log:export')")
-    @ApiAccessLog(operateType = EXPORT)
-    public void exportSmsLogExcel(@Valid SmsLogPageReqVO exportReqVO,
-                                  HttpServletResponse response) throws IOException {
-        exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<SmsLogDO> list = smsLogService.getSmsLogPage(exportReqVO).getList();
-        // 导出 Excel
-        ExcelUtils.write(response, "短信日志.xls", "数据", SmsLogRespVO.class,
-                BeanUtils.toBean(list, SmsLogRespVO.class));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsTemplateController.http b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsTemplateController.http
deleted file mode 100644
index ee24e92..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsTemplateController.http
+++ /dev/null
@@ -1,14 +0,0 @@
-### 请求 /system/sms-template/send-sms 接口 => 成功
-POST {{baseUrl}}/system/sms-template/send-sms
-Authorization: Bearer {{token}}
-Content-Type: application/json
-tenant-id: {{adminTenentId}}
-
-{
-  "templateCode": "test_01",
-  "mobile": "15601691390",
-  "templateParams": {
-    "operation": "value01",
-    "code": "value02"
-  }
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsTemplateController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsTemplateController.java
deleted file mode 100644
index 752d15a..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/SmsTemplateController.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.iailab.module.system.controller.admin.sms;
-
-import com.iailab.framework.apilog.core.annotation.ApiAccessLog;
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.framework.common.pojo.PageParam;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.framework.excel.core.util.ExcelUtils;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplateRespVO;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplateSaveReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplateSendReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsTemplateDO;
-import com.iailab.module.system.service.sms.SmsSendService;
-import com.iailab.module.system.service.sms.SmsTemplateService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.io.IOException;
-import java.util.List;
-
-import static com.iailab.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 短信模板")
-@RestController
-@RequestMapping("/system/sms-template")
-public class SmsTemplateController {
-
-    @Resource
-    private SmsTemplateService smsTemplateService;
-    @Resource
-    private SmsSendService smsSendService;
-
-    @PostMapping("/create")
-    @Operation(summary = "创建短信模板")
-    @PreAuthorize("@ss.hasPermission('system:sms-template:create')")
-    public CommonResult<Long> createSmsTemplate(@Valid @RequestBody SmsTemplateSaveReqVO createReqVO) {
-        return success(smsTemplateService.createSmsTemplate(createReqVO));
-    }
-
-    @PutMapping("/update")
-    @Operation(summary = "更新短信模板")
-    @PreAuthorize("@ss.hasPermission('system:sms-template:update')")
-    public CommonResult<Boolean> updateSmsTemplate(@Valid @RequestBody SmsTemplateSaveReqVO updateReqVO) {
-        smsTemplateService.updateSmsTemplate(updateReqVO);
-        return success(true);
-    }
-
-    @DeleteMapping("/delete")
-    @Operation(summary = "删除短信模板")
-    @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('system:sms-template:delete')")
-    public CommonResult<Boolean> deleteSmsTemplate(@RequestParam("id") Long id) {
-        smsTemplateService.deleteSmsTemplate(id);
-        return success(true);
-    }
-
-    @GetMapping("/get")
-    @Operation(summary = "获得短信模板")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('system:sms-template:query')")
-    public CommonResult<SmsTemplateRespVO> getSmsTemplate(@RequestParam("id") Long id) {
-        SmsTemplateDO template = smsTemplateService.getSmsTemplate(id);
-        return success(BeanUtils.toBean(template, SmsTemplateRespVO.class));
-    }
-
-    @GetMapping("/page")
-    @Operation(summary = "获得短信模板分页")
-    @PreAuthorize("@ss.hasPermission('system:sms-template:query')")
-    public CommonResult<PageResult<SmsTemplateRespVO>> getSmsTemplatePage(@Valid SmsTemplatePageReqVO pageVO) {
-        PageResult<SmsTemplateDO> pageResult = smsTemplateService.getSmsTemplatePage(pageVO);
-        return success(BeanUtils.toBean(pageResult, SmsTemplateRespVO.class));
-    }
-
-    @GetMapping("/export-excel")
-    @Operation(summary = "导出短信模板 Excel")
-    @PreAuthorize("@ss.hasPermission('system:sms-template:export')")
-    @ApiAccessLog(operateType = EXPORT)
-    public void exportSmsTemplateExcel(@Valid SmsTemplatePageReqVO exportReqVO,
-                                       HttpServletResponse response) throws IOException {
-        exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<SmsTemplateDO> list = smsTemplateService.getSmsTemplatePage(exportReqVO).getList();
-        // 导出 Excel
-        ExcelUtils.write(response, "短信模板.xls", "数据", SmsTemplateRespVO.class,
-                BeanUtils.toBean(list, SmsTemplateRespVO.class));
-    }
-
-    @PostMapping("/send-sms")
-    @Operation(summary = "发送短信")
-    @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')")
-    public CommonResult<Long> sendSms(@Valid @RequestBody SmsTemplateSendReqVO sendReqVO) {
-        return success(smsSendService.sendSingleSmsToAdmin(sendReqVO.getMobile(), null,
-                sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams()));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java
deleted file mode 100644
index f719478..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.channel;
-
-import com.iailab.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static com.iailab.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 短信渠道分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SmsChannelPageReqVO extends PageParam {
-
-    @Schema(description = "任务状态", example = "1")
-    private Integer status;
-
-    @Schema(description = "短信签名,模糊匹配", example = "iailab")
-    private String signature;
-
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    @Schema(description = "创建时间")
-    private LocalDateTime[] createTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java
deleted file mode 100644
index 6f6d006..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.channel;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.hibernate.validator.constraints.URL;
-
-import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 短信渠道 Response VO")
-@Data
-public class SmsChannelRespVO {
-
-    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    private Long id;
-
-    @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    @NotNull(message = "短信签名不能为空")
-    private String signature;
-
-    @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN")
-    private String code;
-
-    @Schema(description = "启用状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "启用状态不能为空")
-    private Integer status;
-
-    @Schema(description = "备注", example = "好吃!")
-    private String remark;
-
-    @Schema(description = "短信 API 的账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    @NotNull(message = "短信 API 的账号不能为空")
-    private String apiKey;
-
-    @Schema(description = "短信 API 的密钥", example = "yuanma")
-    private String apiSecret;
-
-    @Schema(description = "短信发送回调 URL", example = "https://www.baidu.com")
-    @URL(message = "回调 URL 格式不正确")
-    private String callbackUrl;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    private LocalDateTime createTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelSaveReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelSaveReqVO.java
deleted file mode 100644
index ae78ff2..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelSaveReqVO.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.channel;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.hibernate.validator.constraints.URL;
-
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 短信渠道创建/修改 Request VO")
-@Data
-public class SmsChannelSaveReqVO {
-
-    @Schema(description = "编号", example = "1024")
-    private Long id;
-
-    @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    @NotNull(message = "短信签名不能为空")
-    private String signature;
-
-    @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN")
-    @NotNull(message = "渠道编码不能为空")
-    private String code;
-
-    @Schema(description = "启用状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "启用状态不能为空")
-    private Integer status;
-
-    @Schema(description = "备注", example = "好吃!")
-    private String remark;
-
-    @Schema(description = "短信 API 的账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    @NotNull(message = "短信 API 的账号不能为空")
-    private String apiKey;
-
-    @Schema(description = "短信 API 的密钥", example = "yuanma")
-    private String apiSecret;
-
-    @Schema(description = "短信发送回调 URL", example = "")
-    @URL(message = "回调 URL 格式不正确")
-    private String callbackUrl;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java
deleted file mode 100644
index 1b441c8..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.channel;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - 短信渠道精简 Response VO")
-@Data
-public class SmsChannelSimpleRespVO {
-
-    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    private Long id;
-
-    @Schema(description = "短信签名", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    private String signature;
-
-    @Schema(description = "渠道编码,参见 SmsChannelEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "YUN_PIAN")
-    private String code;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java
deleted file mode 100644
index 86360ba..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.log;
-
-import com.iailab.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static com.iailab.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 短信日志分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SmsLogPageReqVO extends PageParam {
-
-    @Schema(description = "短信渠道编号", example = "10")
-    private Long channelId;
-
-    @Schema(description = "模板编号", example = "20")
-    private Long templateId;
-
-    @Schema(description = "手机号", example = "15601691300")
-    private String mobile;
-
-    @Schema(description = "发送状态,参见 SmsSendStatusEnum 枚举类", example = "1")
-    private Integer sendStatus;
-
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    @Schema(description = "发送时间")
-    private LocalDateTime[] sendTime;
-
-    @Schema(description = "接收状态,参见 SmsReceiveStatusEnum 枚举类", example = "0")
-    private Integer receiveStatus;
-
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    @Schema(description = "接收时间")
-    private LocalDateTime[] receiveTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java
deleted file mode 100644
index 99e5570..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.log;
-
-import com.iailab.framework.excel.core.annotations.DictFormat;
-import com.iailab.framework.excel.core.convert.DictConvert;
-import com.iailab.framework.excel.core.convert.JsonConvert;
-import com.iailab.module.system.enums.DictTypeConstants;
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.Map;
-
-@Schema(description = "管理后台 - 短信日志 Response VO")
-@Data
-@ExcelIgnoreUnannotated
-public class SmsLogRespVO {
-
-    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @ExcelProperty("编号")
-    private Long id;
-
-    @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-    @ExcelProperty("短信渠道编号")
-    private Long channelId;
-
-    @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN")
-    @ExcelProperty("短信渠道编码")
-    private String channelCode;
-
-    @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20")
-    @ExcelProperty("模板编号")
-    private Long templateId;
-
-    @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test-01")
-    @ExcelProperty("模板编码")
-    private String templateCode;
-
-    @Schema(description = "短信类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @ExcelProperty(value = "短信类型", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE)
-    private Integer templateType;
-
-    @Schema(description = "短信内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你的验证码是 1024")
-    @ExcelProperty("短信内容")
-    private String templateContent;
-
-    @Schema(description = "短信参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "name,code")
-    @ExcelProperty(value = "短信参数", converter = JsonConvert.class)
-    private Map<String, Object> templateParams;
-
-    @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SMS_207945135")
-    @ExcelProperty("短信 API 的模板编号")
-    private String apiTemplateId;
-
-    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300")
-    @ExcelProperty("手机号")
-    private String mobile;
-
-    @Schema(description = "用户编号", example = "10")
-    @ExcelProperty("用户编号")
-    private Long userId;
-
-    @Schema(description = "用户类型", example = "1")
-    @ExcelProperty(value = "用户类型", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.USER_TYPE)
-    private Integer userType;
-
-    @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @ExcelProperty(value = "发送状态", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.SMS_SEND_STATUS)
-    private Integer sendStatus;
-
-    @Schema(description = "发送时间")
-    @ExcelProperty("发送时间")
-    private LocalDateTime sendTime;
-
-    @Schema(description = "短信 API 发送结果的编码", example = "SUCCESS")
-    @ExcelProperty("短信 API 发送结果的编码")
-    private String apiSendCode;
-
-    @Schema(description = "短信 API 发送失败的提示", example = "成功")
-    @ExcelProperty("短信 API 发送失败的提示")
-    private String apiSendMsg;
-
-    @Schema(description = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99")
-    @ExcelProperty("短信 API 发送返回的唯一请求 ID")
-    private String apiRequestId;
-
-    @Schema(description = "短信 API 发送返回的序号", example = "62923244790")
-    @ExcelProperty("短信 API 发送返回的序号")
-    private String apiSerialNo;
-
-    @Schema(description = "接收状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
-    @ExcelProperty(value = "接收状态", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.SMS_RECEIVE_STATUS)
-    private Integer receiveStatus;
-
-    @Schema(description = "接收时间")
-    @ExcelProperty("接收时间")
-    private LocalDateTime receiveTime;
-
-    @Schema(description = "API 接收结果的编码", example = "DELIVRD")
-    @ExcelProperty("API 接收结果的编码")
-    private String apiReceiveCode;
-
-    @Schema(description = "API 接收结果的说明", example = "用户接收成功")
-    @ExcelProperty("API 接收结果的说明")
-    private String apiReceiveMsg;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
-    private LocalDateTime createTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java
deleted file mode 100644
index 364f5ff..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.template;
-
-import com.iailab.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static com.iailab.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 短信模板分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SmsTemplatePageReqVO extends PageParam {
-
-    @Schema(description = "短信签名", example = "1")
-    private Integer type;
-
-    @Schema(description = "开启状态", example = "1")
-    private Integer status;
-
-    @Schema(description = "模板编码,模糊匹配", example = "test_01")
-    private String code;
-
-    @Schema(description = "模板内容,模糊匹配", example = "你好,{name}。你长的太{like}啦!")
-    private String content;
-
-    @Schema(description = "短信 API 的模板编号,模糊匹配", example = "4383920")
-    private String apiTemplateId;
-
-    @Schema(description = "短信渠道编号", example = "10")
-    private Long channelId;
-
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    @Schema(description = "创建时间")
-    private LocalDateTime[] createTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java
deleted file mode 100644
index deb9e40..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.template;
-
-import com.iailab.framework.excel.core.annotations.DictFormat;
-import com.iailab.framework.excel.core.convert.DictConvert;
-import com.iailab.module.system.enums.DictTypeConstants;
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-@Schema(description = "管理后台 - 短信模板 Response VO")
-@Data
-@ExcelIgnoreUnannotated
-public class SmsTemplateRespVO {
-
-    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @ExcelProperty("编号")
-    private Long id;
-
-    @Schema(description = "短信类型,参见 SmsTemplateTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @ExcelProperty(value = "短信签名", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE)
-    private Integer type;
-
-    @Schema(description = "开启状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @ExcelProperty(value = "开启状态", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.COMMON_STATUS)
-    private Integer status;
-
-    @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01")
-    @ExcelProperty("模板编码")
-    private String code;
-
-    @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    @ExcelProperty("模板名称")
-    private String name;
-
-    @Schema(description = "模板内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,{name}。你长的太{like}啦!")
-    @ExcelProperty("模板内容")
-    private String content;
-
-    @Schema(description = "参数数组", example = "name,code")
-    private List<String> params;
-
-    @Schema(description = "备注", example = "哈哈哈")
-    @ExcelProperty("备注")
-    private String remark;
-
-    @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4383920")
-    @ExcelProperty("短信 API 的模板编号")
-    private String apiTemplateId;
-
-    @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-    @ExcelProperty("短信渠道编号")
-    private Long channelId;
-
-    @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN")
-    @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.SMS_CHANNEL_CODE)
-    private String channelCode;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
-    private LocalDateTime createTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateSaveReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateSaveReqVO.java
deleted file mode 100644
index 52a8695..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateSaveReqVO.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.template;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 短信模板创建/修改 Request VO")
-@Data
-public class SmsTemplateSaveReqVO {
-
-    @Schema(description = "编号", example = "1024")
-    private Long id;
-
-    @Schema(description = "短信类型,参见 SmsTemplateTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "短信类型不能为空")
-    private Integer type;
-
-    @Schema(description = "开启状态,参见 CommonStatusEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "开启状态不能为空")
-    private Integer status;
-
-    @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01")
-    @NotNull(message = "模板编码不能为空")
-    private String code;
-
-    @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    @NotNull(message = "模板名称不能为空")
-    private String name;
-
-    @Schema(description = "模板内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,{name}。你长的太{like}啦!")
-    @NotNull(message = "模板内容不能为空")
-    private String content;
-
-    @Schema(description = "备注", example = "哈哈哈")
-    private String remark;
-
-    @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4383920")
-    @NotNull(message = "短信 API 的模板编号不能为空")
-    private String apiTemplateId;
-
-    @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-    @NotNull(message = "短信渠道编号不能为空")
-    private Long channelId;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java
deleted file mode 100644
index 3631878..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.iailab.module.system.controller.admin.sms.vo.template;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import java.util.Map;
-
-@Schema(description = "管理后台 - 短信模板的发送 Request VO")
-@Data
-public class SmsTemplateSendReqVO {
-
-    @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300")
-    @NotNull(message = "手机号不能为空")
-    private String mobile;
-
-    @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01")
-    @NotNull(message = "模板编码不能为空")
-    private String templateCode;
-
-    @Schema(description = "模板参数")
-    private Map<String, Object> templateParams;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/SocialClientController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/SocialClientController.java
deleted file mode 100644
index 685119e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/SocialClientController.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.iailab.module.system.controller.admin.socail;
-
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientRespVO;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO;
-import com.iailab.module.system.dal.dataobject.social.SocialClientDO;
-import com.iailab.module.system.service.social.SocialClientService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 社交客户端")
-@RestController
-@RequestMapping("/system/social-client")
-@Validated
-public class SocialClientController {
-
-    @Resource
-    private SocialClientService socialClientService;
-
-    @PostMapping("/create")
-    @Operation(summary = "创建社交客户端")
-    @PreAuthorize("@ss.hasPermission('system:social-client:create')")
-    public CommonResult<Long> createSocialClient(@Valid @RequestBody SocialClientSaveReqVO createReqVO) {
-        return success(socialClientService.createSocialClient(createReqVO));
-    }
-
-    @PutMapping("/update")
-    @Operation(summary = "更新社交客户端")
-    @PreAuthorize("@ss.hasPermission('system:social-client:update')")
-    public CommonResult<Boolean> updateSocialClient(@Valid @RequestBody SocialClientSaveReqVO updateReqVO) {
-        socialClientService.updateSocialClient(updateReqVO);
-        return success(true);
-    }
-
-    @DeleteMapping("/delete")
-    @Operation(summary = "删除社交客户端")
-    @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('system:social-client:delete')")
-    public CommonResult<Boolean> deleteSocialClient(@RequestParam("id") Long id) {
-        socialClientService.deleteSocialClient(id);
-        return success(true);
-    }
-
-    @GetMapping("/get")
-    @Operation(summary = "获得社交客户端")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('system:social-client:query')")
-    public CommonResult<SocialClientRespVO> getSocialClient(@RequestParam("id") Long id) {
-        SocialClientDO client = socialClientService.getSocialClient(id);
-        return success(BeanUtils.toBean(client, SocialClientRespVO.class));
-    }
-
-    @GetMapping("/page")
-    @Operation(summary = "获得社交客户端分页")
-    @PreAuthorize("@ss.hasPermission('system:social-client:query')")
-    public CommonResult<PageResult<SocialClientRespVO>> getSocialClientPage(@Valid SocialClientPageReqVO pageVO) {
-        PageResult<SocialClientDO> pageResult = socialClientService.getSocialClientPage(pageVO);
-        return success(BeanUtils.toBean(pageResult, SocialClientRespVO.class));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/SocialUserController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/SocialUserController.java
deleted file mode 100644
index 78cd6ee..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/SocialUserController.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.iailab.module.system.controller.admin.socail;
-
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.common.pojo.CommonResult;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserBindReqVO;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserRespVO;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserUnbindReqVO;
-import com.iailab.module.system.convert.social.SocialUserConvert;
-import com.iailab.module.system.dal.dataobject.social.SocialUserDO;
-import com.iailab.module.system.service.social.SocialUserService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-
-import static com.iailab.framework.common.pojo.CommonResult.success;
-import static com.iailab.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - 社交用户")
-@RestController
-@RequestMapping("/system/social-user")
-@Validated
-public class SocialUserController {
-
-    @Resource
-    private SocialUserService socialUserService;
-
-    @PostMapping("/bind")
-    @Operation(summary = "社交绑定,使用 code 授权码")
-    public CommonResult<Boolean> socialBind(@RequestBody @Valid SocialUserBindReqVO reqVO) {
-        socialUserService.bindSocialUser(SocialUserConvert.INSTANCE.convert(
-                getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO));
-        return CommonResult.success(true);
-    }
-
-    @DeleteMapping("/unbind")
-    @Operation(summary = "取消社交绑定")
-    public CommonResult<Boolean> socialUnbind(@RequestBody SocialUserUnbindReqVO reqVO) {
-        socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getOpenid());
-        return CommonResult.success(true);
-    }
-
-    // ==================== 社交用户 CRUD ====================
-
-    @GetMapping("/get")
-    @Operation(summary = "获得社交用户")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('system:social-user:query')")
-    public CommonResult<SocialUserRespVO> getSocialUser(@RequestParam("id") Long id) {
-        SocialUserDO socialUser = socialUserService.getSocialUser(id);
-        return success(BeanUtils.toBean(socialUser, SocialUserRespVO.class));
-    }
-
-    @GetMapping("/page")
-    @Operation(summary = "获得社交用户分页")
-    @PreAuthorize("@ss.hasPermission('system:social-user:query')")
-    public CommonResult<PageResult<SocialUserRespVO>> getSocialUserPage(@Valid SocialUserPageReqVO pageVO) {
-        PageResult<SocialUserDO> pageResult = socialUserService.getSocialUserPage(pageVO);
-        return success(BeanUtils.toBean(pageResult, SocialUserRespVO.class));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java
deleted file mode 100644
index 6f41fe1..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.iailab.module.system.controller.admin.socail.vo.client;
-
-import com.iailab.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Schema(description = "管理后台 - 社交客户端分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SocialClientPageReqVO extends PageParam {
-
-    @Schema(description = "应用名", example = "iailab商城")
-    private String name;
-
-    @Schema(description = "社交平台的类型", example = "31")
-    private Integer socialType;
-
-    @Schema(description = "用户类型", example = "2")
-    private Integer userType;
-
-    @Schema(description = "客户端编号", example = "145442115")
-    private String clientId;
-
-    @Schema(description = "状态", example = "1")
-    private Integer status;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java
deleted file mode 100644
index 470bd35..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.iailab.module.system.controller.admin.socail.vo.client;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 社交客户端 Response VO")
-@Data
-public class SocialClientRespVO {
-
-    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27162")
-    private Long id;
-
-    @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab商城")
-    private String name;
-
-    @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31")
-    private Integer socialType;
-
-    @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    private Integer userType;
-
-    @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "wwd411c69a39ad2e54")
-    private String clientId;
-
-    @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "peter")
-    private String clientSecret;
-
-    @Schema(description = "授权方的网页应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000045")
-    private String agentId;
-
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    private Integer status;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    private LocalDateTime createTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java
deleted file mode 100644
index 8866c64..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.iailab.module.system.controller.admin.socail.vo.client;
-
-import cn.hutool.core.util.StrUtil;
-import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.common.validation.InEnum;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.AssertTrue;
-import javax.validation.constraints.NotNull;
-import java.util.Objects;
-
-@Schema(description = "管理后台 - 社交客户端创建/修改 Request VO")
-@Data
-public class SocialClientSaveReqVO {
-
-    @Schema(description = "编号", example = "27162")
-    private Long id;
-
-    @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab商城")
-    @NotNull(message = "应用名不能为空")
-    private String name;
-
-    @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31")
-    @NotNull(message = "社交平台的类型不能为空")
-    @InEnum(SocialTypeEnum.class)
-    private Integer socialType;
-
-    @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    @NotNull(message = "用户类型不能为空")
-    @InEnum(UserTypeEnum.class)
-    private Integer userType;
-
-    @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "wwd411c69a39ad2e54")
-    @NotNull(message = "客户端编号不能为空")
-    private String clientId;
-
-    @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "peter")
-    @NotNull(message = "客户端密钥不能为空")
-    private String clientSecret;
-
-    @Schema(description = "授权方的网页应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000045")
-    private String agentId;
-
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "状态不能为空")
-    @InEnum(CommonStatusEnum.class)
-    private Integer status;
-
-    @AssertTrue(message = "agentId 不能为空")
-    @JsonIgnore
-    public boolean isAgentIdValid() {
-        // 如果是企业微信,必须填写 agentId 属性
-        return !Objects.equals(socialType, SocialTypeEnum.WECHAT_ENTERPRISE.getType())
-                || !StrUtil.isEmpty(agentId);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java
deleted file mode 100644
index ca9f9af..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserBindReqVO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.iailab.module.system.controller.admin.socail.vo.user;
-
-import com.iailab.framework.common.validation.InEnum;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 社交绑定 Request VO,使用 code 授权码")
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-public class SocialUserBindReqVO {
-
-    @Schema(description = "社交平台的类型,参见 UserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-    @InEnum(SocialTypeEnum.class)
-    @NotNull(message = "社交平台的类型不能为空")
-    private Integer type;
-
-    @Schema(description = "授权码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    @NotEmpty(message = "授权码不能为空")
-    private String code;
-
-    @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62")
-    @NotEmpty(message = "state 不能为空")
-    private String state;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java
deleted file mode 100644
index e422277..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.iailab.module.system.controller.admin.socail.vo.user;
-
-import com.iailab.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static com.iailab.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 社交用户分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SocialUserPageReqVO extends PageParam {
-
-    @Schema(description = "社交平台的类型", example = "30")
-    private Integer type;
-
-    @Schema(description = "用户昵称", example = "李四")
-    private String nickname;
-
-    @Schema(description = "社交 openid", example = "oz-Jdt0kd_jdhUxJHQdBJMlOFN7w")
-    private String openid;
-
-    @Schema(description = "创建时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDateTime[] createTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java
deleted file mode 100644
index 07a0e34..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.iailab.module.system.controller.admin.socail.vo.user;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 社交用户 Response VO")
-@Data
-public class SocialUserRespVO {
-
-    @Schema(description = "主键(自增策略)", requiredMode = Schema.RequiredMode.REQUIRED, example = "14569")
-    private Long id;
-
-    @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "30")
-    private Integer type;
-
-    @Schema(description = "社交 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "666")
-    private String openid;
-
-    @Schema(description = "社交 token", requiredMode = Schema.RequiredMode.REQUIRED, example = "666")
-    private String token;
-
-    @Schema(description = "原始 Token 数据,一般是 JSON 格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}")
-    private String rawTokenInfo;
-
-    @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "iailab")
-    private String nickname;
-
-    @Schema(description = "用户头像", example = "https://www.baidu.com/xxx.png")
-    private String avatar;
-
-    @Schema(description = "原始用户数据,一般是 JSON 格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "{}")
-    private String rawUserInfo;
-
-    @Schema(description = "最后一次的认证 code", requiredMode = Schema.RequiredMode.REQUIRED, example = "666666")
-    private String code;
-
-    @Schema(description = "最后一次的认证 state", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
-    private String state;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    private LocalDateTime createTime;
-
-    @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    private LocalDateTime updateTime;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserUnbindReqVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserUnbindReqVO.java
deleted file mode 100644
index 40ca4fe..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/socail/vo/user/SocialUserUnbindReqVO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.iailab.module.system.controller.admin.socail.vo.user;
-
-import com.iailab.framework.common.validation.InEnum;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 取消社交绑定 Request VO")
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-public class SocialUserUnbindReqVO {
-
-    @Schema(description = "社交平台的类型,参见 UserSocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-    @InEnum(SocialTypeEnum.class)
-    @NotNull(message = "社交平台的类型不能为空")
-    private Integer type;
-
-    @Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
-    @NotEmpty(message = "社交用户的 openid 不能为空")
-    private String openid;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/UserProfileController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/UserProfileController.java
index 339a1ce..ec1b766 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/UserProfileController.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/UserProfileController.java
@@ -1,7 +1,6 @@
 package com.iailab.module.system.controller.admin.user;
 
 import cn.hutool.core.collection.CollUtil;
-import com.iailab.framework.common.enums.UserTypeEnum;
 import com.iailab.framework.common.pojo.CommonResult;
 import com.iailab.framework.datapermission.core.annotation.DataPermission;
 import com.iailab.module.system.controller.admin.user.vo.profile.UserProfileRespVO;
@@ -11,13 +10,11 @@
 import com.iailab.module.system.dal.dataobject.dept.DeptDO;
 import com.iailab.module.system.dal.dataobject.dept.PostDO;
 import com.iailab.module.system.dal.dataobject.permission.RoleDO;
-import com.iailab.module.system.dal.dataobject.social.SocialUserDO;
 import com.iailab.module.system.dal.dataobject.user.AdminUserDO;
 import com.iailab.module.system.service.dept.DeptService;
 import com.iailab.module.system.service.dept.PostService;
 import com.iailab.module.system.service.permission.PermissionService;
 import com.iailab.module.system.service.permission.RoleService;
-import com.iailab.module.system.service.social.SocialUserService;
 import com.iailab.module.system.service.user.AdminUserService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -52,8 +49,6 @@
     private PermissionService permissionService;
     @Resource
     private RoleService roleService;
-    @Resource
-    private SocialUserService socialService;
 
     @GetMapping("/get")
     @Operation(summary = "获得登录用户信息")
@@ -68,8 +63,7 @@
         // 获得岗位信息
         List<PostDO> posts = CollUtil.isNotEmpty(user.getPostIds()) ? postService.getPostList(user.getPostIds()) : null;
         // 获得社交用户信息
-        List<SocialUserDO> socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN.getValue());
-        return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts, socialUsers));
+        return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts));
     }
 
     @PutMapping("/update")
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java
index 69c6fa8..85b5baf 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java
@@ -55,21 +55,5 @@
      * 所属岗位数组
      */
     private List<PostSimpleRespVO> posts;
-    /**
-     * 社交用户数组
-     */
-    private List<SocialUser> socialUsers;
-
-    @Schema(description = "社交用户")
-    @Data
-    public static class SocialUser {
-
-        @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
-        private Integer type;
-
-        @Schema(description = "社交用户的 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
-        private String openid;
-
-    }
 
 }
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/auth/AuthConvert.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/auth/AuthConvert.java
index 5315a17..e7e8573 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/auth/AuthConvert.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/auth/AuthConvert.java
@@ -2,9 +2,6 @@
 
 import cn.hutool.core.collection.CollUtil;
 import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
-import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
 import com.iailab.module.system.controller.admin.auth.vo.*;
 import com.iailab.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
 import com.iailab.module.system.dal.dataobject.permission.MenuDO;
@@ -216,11 +213,5 @@
         }
         return menuVOS;
     }
-
-    SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO);
-
-    SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO);
-
-    SmsCodeUseReqDTO convert(AuthSmsLoginReqVO reqVO, Integer scene, String usedIp);
 
 }
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/social/SocialUserConvert.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/social/SocialUserConvert.java
deleted file mode 100644
index 435c9f0..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/social/SocialUserConvert.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.iailab.module.system.convert.social;
-
-import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserBindReqVO;
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.factory.Mappers;
-
-@Mapper
-public interface SocialUserConvert {
-
-    SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
-
-    @Mapping(source = "reqVO.type", target = "socialType")
-    SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/user/UserConvert.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/user/UserConvert.java
index 3bbd788..2b19556 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/user/UserConvert.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/convert/user/UserConvert.java
@@ -12,7 +12,6 @@
 import com.iailab.module.system.dal.dataobject.dept.DeptDO;
 import com.iailab.module.system.dal.dataobject.dept.PostDO;
 import com.iailab.module.system.dal.dataobject.permission.RoleDO;
-import com.iailab.module.system.dal.dataobject.social.SocialUserDO;
 import com.iailab.module.system.dal.dataobject.user.AdminUserDO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
@@ -46,12 +45,11 @@
     }
 
     default UserProfileRespVO convert(AdminUserDO user, List<RoleDO> userRoles,
-                                      DeptDO dept, List<PostDO> posts, List<SocialUserDO> socialUsers) {
+                                      DeptDO dept, List<PostDO> posts) {
         UserProfileRespVO userVO = BeanUtils.toBean(user, UserProfileRespVO.class);
         userVO.setRoles(BeanUtils.toBean(userRoles, RoleSimpleRespVO.class));
         userVO.setDept(BeanUtils.toBean(dept, DeptSimpleRespVO.class));
         userVO.setPosts(BeanUtils.toBean(posts, PostSimpleRespVO.class));
-        userVO.setSocialUsers(BeanUtils.toBean(socialUsers, UserProfileRespVO.SocialUser.class));
         return userVO;
     }
 
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsChannelDO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsChannelDO.java
deleted file mode 100644
index 9a9ec12..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsChannelDO.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.iailab.module.system.dal.dataobject.sms;
-
-import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.mybatis.core.dataobject.BaseDO;
-import com.iailab.module.system.framework.sms.core.enums.SmsChannelEnum;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-/**
- * 短信渠道 DO
- *
- * @author zzf
- * @since 2021-01-25
- */
-@TableName(value = "system_sms_channel", autoResultMap = true)
-@KeySequence("system_sms_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SmsChannelDO extends BaseDO {
-
-    /**
-     * 渠道编号
-     */
-    private Long id;
-    /**
-     * 短信签名
-     */
-    private String signature;
-    /**
-     * 渠道编码
-     *
-     * 枚举 {@link SmsChannelEnum}
-     */
-    private String code;
-    /**
-     * 启用状态
-     *
-     * 枚举 {@link CommonStatusEnum}
-     */
-    private Integer status;
-    /**
-     * 备注
-     */
-    private String remark;
-    /**
-     * 短信 API 的账号
-     */
-    private String apiKey;
-    /**
-     * 短信 API 的密钥
-     */
-    private String apiSecret;
-    /**
-     * 短信发送回调 URL
-     */
-    private String callbackUrl;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsCodeDO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsCodeDO.java
deleted file mode 100644
index f0417f3..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsCodeDO.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.iailab.module.system.dal.dataobject.sms;
-
-import com.iailab.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-/**
- * 手机验证码 DO
- *
- * idx_mobile 索引:基于 {@link #mobile} 字段
- *
- * @author iailab
- */
-@TableName("system_sms_code")
-@KeySequence("system_sms_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class SmsCodeDO extends BaseDO {
-
-    /**
-     * 编号
-     */
-    private Long id;
-    /**
-     * 手机号
-     */
-    private String mobile;
-    /**
-     * 验证码
-     */
-    private String code;
-    /**
-     * 发送场景
-     *
-     * 枚举 {@link SmsCodeDO}
-     */
-    private Integer scene;
-    /**
-     * 创建 IP
-     */
-    private String createIp;
-    /**
-     * 今日发送的第几条
-     */
-    private Integer todayIndex;
-    /**
-     * 是否使用
-     */
-    private Boolean used;
-    /**
-     * 使用时间
-     */
-    private LocalDateTime usedTime;
-    /**
-     * 使用 IP
-     */
-    private String usedIp;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsLogDO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsLogDO.java
deleted file mode 100644
index a0b027c..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsLogDO.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package com.iailab.module.system.dal.dataobject.sms;
-
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.mybatis.core.dataobject.BaseDO;
-import com.iailab.module.system.enums.sms.SmsReceiveStatusEnum;
-import com.iailab.module.system.enums.sms.SmsSendStatusEnum;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import lombok.*;
-
-import java.time.LocalDateTime;
-import java.util.Map;
-
-/**
- * 短信日志 DO
- *
- * @author zzf
- * @since 2021-01-25
- */
-@TableName(value = "system_sms_log", autoResultMap = true)
-@KeySequence("system_sms_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class SmsLogDO extends BaseDO {
-
-    /**
-     * 自增编号
-     */
-    private Long id;
-
-    // ========= 渠道相关字段 =========
-
-    /**
-     * 短信渠道编号
-     *
-     * 关联 {@link SmsChannelDO#getId()}
-     */
-    private Long channelId;
-    /**
-     * 短信渠道编码
-     *
-     * 冗余 {@link SmsChannelDO#getCode()}
-     */
-    private String channelCode;
-
-    // ========= 模板相关字段 =========
-
-    /**
-     * 模板编号
-     *
-     * 关联 {@link SmsTemplateDO#getId()}
-     */
-    private Long templateId;
-    /**
-     * 模板编码
-     *
-     * 冗余 {@link SmsTemplateDO#getCode()}
-     */
-    private String templateCode;
-    /**
-     * 短信类型
-     *
-     * 冗余 {@link SmsTemplateDO#getType()}
-     */
-    private Integer templateType;
-    /**
-     * 基于 {@link SmsTemplateDO#getContent()} 格式化后的内容
-     */
-    private String templateContent;
-    /**
-     * 基于 {@link SmsTemplateDO#getParams()} 输入后的参数
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private Map<String, Object> templateParams;
-    /**
-     * 短信 API 的模板编号
-     *
-     * 冗余 {@link SmsTemplateDO#getApiTemplateId()}
-     */
-    private String apiTemplateId;
-
-    // ========= 手机相关字段 =========
-
-    /**
-     * 手机号
-     */
-    private String mobile;
-    /**
-     * 用户编号
-     */
-    private Long userId;
-    /**
-     * 用户类型
-     *
-     * 枚举 {@link UserTypeEnum}
-     */
-    private Integer userType;
-
-    // ========= 发送相关字段 =========
-
-    /**
-     * 发送状态
-     *
-     * 枚举 {@link SmsSendStatusEnum}
-     */
-    private Integer sendStatus;
-    /**
-     * 发送时间
-     */
-    private LocalDateTime sendTime;
-    /**
-     * 短信 API 发送结果的编码
-     *
-     * 由于第三方的错误码可能是字符串,所以使用 String 类型
-     */
-    private String apiSendCode;
-    /**
-     * 短信 API 发送失败的提示
-     */
-    private String apiSendMsg;
-    /**
-     * 短信 API 发送返回的唯一请求 ID
-     *
-     * 用于和短信 API 进行定位于排错
-     */
-    private String apiRequestId;
-    /**
-     * 短信 API 发送返回的序号
-     *
-     * 用于和短信 API 平台的发送记录关联
-     */
-    private String apiSerialNo;
-
-    // ========= 接收相关字段 =========
-
-    /**
-     * 接收状态
-     *
-     * 枚举 {@link SmsReceiveStatusEnum}
-     */
-    private Integer receiveStatus;
-    /**
-     * 接收时间
-     */
-    private LocalDateTime receiveTime;
-    /**
-     * 短信 API 接收结果的编码
-     */
-    private String apiReceiveCode;
-    /**
-     * 短信 API 接收结果的提示
-     */
-    private String apiReceiveMsg;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsTemplateDO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsTemplateDO.java
deleted file mode 100644
index 8fb046e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/sms/SmsTemplateDO.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.iailab.module.system.dal.dataobject.sms;
-
-import com.iailab.module.system.enums.sms.SmsTemplateTypeEnum;
-import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.util.List;
-
-/**
- * 短信模板 DO
- *
- * @author zzf
- * @since 2021-01-25
- */
-@TableName(value = "system_sms_template", autoResultMap = true)
-@KeySequence("system_sms_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SmsTemplateDO extends BaseDO {
-
-    /**
-     * 自增编号
-     */
-    private Long id;
-
-    // ========= 模板相关字段 =========
-
-    /**
-     * 短信类型
-     *
-     * 枚举 {@link SmsTemplateTypeEnum}
-     */
-    private Integer type;
-    /**
-     * 启用状态
-     *
-     * 枚举 {@link CommonStatusEnum}
-     */
-    private Integer status;
-    /**
-     * 模板编码,保证唯一
-     */
-    private String code;
-    /**
-     * 模板名称
-     */
-    private String name;
-    /**
-     * 模板内容
-     *
-     * 内容的参数,使用 {} 包括,例如说 {name}
-     */
-    private String content;
-    /**
-     * 参数数组(自动根据内容生成)
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private List<String> params;
-    /**
-     * 备注
-     */
-    private String remark;
-    /**
-     * 短信 API 的模板编号
-     */
-    private String apiTemplateId;
-
-    // ========= 渠道相关字段 =========
-
-    /**
-     * 短信渠道编号
-     *
-     * 关联 {@link SmsChannelDO#getId()}
-     */
-    private Long channelId;
-    /**
-     * 短信渠道编码
-     *
-     * 冗余 {@link SmsChannelDO#getCode()}
-     */
-    private String channelCode;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialClientDO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialClientDO.java
deleted file mode 100644
index 53bf0b4..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialClientDO.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.iailab.module.system.dal.dataobject.social;
-
-import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.tenant.core.db.TenantBaseDO;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.xingyuv.jushauth.config.AuthConfig;
-import lombok.*;
-
-/**
- * 社交客户端 DO
- *
- * 对应 {@link AuthConfig} 配置,满足不同租户,有自己的客户端配置,实现社交(三方)登录
- *
- * @author iailab
- */
-@TableName(value = "system_social_client", autoResultMap = true)
-@KeySequence("system_social_client_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class SocialClientDO extends TenantBaseDO {
-
-    /**
-     * 编号,自增
-     */
-    @TableId
-    private Long id;
-    /**
-     * 应用名
-     */
-    private String name;
-    /**
-     * 社交类型
-     *
-     * 枚举 {@link SocialTypeEnum}
-     */
-    private Integer socialType;
-    /**
-     * 用户类型
-     *
-     * 目的:不同用户类型,对应不同的小程序,需要自己的配置
-     *
-     * 枚举 {@link UserTypeEnum}
-     */
-    private Integer userType;
-    /**
-     * 状态
-     *
-     * 枚举 {@link CommonStatusEnum}
-     */
-    private Integer status;
-
-    /**
-     * 客户端 id
-     */
-    private String clientId;
-    /**
-     * 客户端 Secret
-     */
-    private String clientSecret;
-
-    /**
-     * 代理编号
-     *
-     * 目前只有部分“社交类型”在使用:
-     * 1. 企业微信:对应授权方的网页应用 ID
-     */
-    private String agentId;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialUserBindDO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialUserBindDO.java
deleted file mode 100644
index 7f02ff2..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialUserBindDO.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.iailab.module.system.dal.dataobject.social;
-
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-/**
- * 社交用户的绑定
- * 即 {@link SocialUserDO} 与 UserDO 的关联表
- *
- * @author iailab
- */
-@TableName(value = "system_social_user_bind", autoResultMap = true)
-@KeySequence("system_social_user_bind_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class SocialUserBindDO extends BaseDO {
-
-    /**
-     * 编号
-     */
-    @TableId
-    private Long id;
-    /**
-     * 关联的用户编号
-     *
-     * 关联 UserDO 的编号
-     */
-    private Long userId;
-    /**
-     * 用户类型
-     *
-     * 枚举 {@link UserTypeEnum}
-     */
-    private Integer userType;
-
-    /**
-     * 社交平台的用户编号
-     *
-     * 关联 {@link SocialUserDO#getId()}
-     */
-    private Long socialUserId;
-    /**
-     * 社交平台的类型
-     *
-     * 冗余 {@link SocialUserDO#getType()}
-     */
-    private Integer socialType;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialUserDO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialUserDO.java
deleted file mode 100644
index 3847f07..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/dataobject/social/SocialUserDO.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.iailab.module.system.dal.dataobject.social;
-
-import com.iailab.framework.mybatis.core.dataobject.BaseDO;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-/**
- * 社交(三方)用户
- *
- * @author weir
- */
-@TableName(value = "system_social_user", autoResultMap = true)
-@KeySequence("system_social_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class SocialUserDO extends BaseDO {
-
-    /**
-     * 自增主键
-     */
-    @TableId
-    private Long id;
-    /**
-     * 社交平台的类型
-     *
-     * 枚举 {@link SocialTypeEnum}
-     */
-    private Integer type;
-
-    /**
-     * 社交 openid
-     */
-    private String openid;
-    /**
-     * 社交 token
-     */
-    private String token;
-    /**
-     * 原始 Token 数据,一般是 JSON 格式
-     */
-    private String rawTokenInfo;
-
-    /**
-     * 用户昵称
-     */
-    private String nickname;
-    /**
-     * 用户头像
-     */
-    private String avatar;
-    /**
-     * 原始用户数据,一般是 JSON 格式
-     */
-    private String rawUserInfo;
-
-    /**
-     * 最后一次的认证 code
-     */
-    private String code;
-    /**
-     * 最后一次的认证 state
-     */
-    private String state;
-
-}
-
-
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsChannelMapper.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsChannelMapper.java
deleted file mode 100644
index 48c4cdf..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsChannelMapper.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.iailab.module.system.dal.mysql.sms;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
-import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsChannelDO;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SmsChannelMapper extends BaseMapperX<SmsChannelDO> {
-
-    default PageResult<SmsChannelDO> selectPage(SmsChannelPageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<SmsChannelDO>()
-                .likeIfPresent(SmsChannelDO::getSignature, reqVO.getSignature())
-                .eqIfPresent(SmsChannelDO::getStatus, reqVO.getStatus())
-                .betweenIfPresent(SmsChannelDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(SmsChannelDO::getId));
-    }
-
-    default SmsChannelDO selectByCode(String code) {
-        return selectOne(SmsChannelDO::getCode, code);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsCodeMapper.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsCodeMapper.java
deleted file mode 100644
index a0e8dab..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsCodeMapper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.iailab.module.system.dal.mysql.sms;
-
-import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
-import com.iailab.framework.mybatis.core.query.QueryWrapperX;
-import com.iailab.module.system.dal.dataobject.sms.SmsCodeDO;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SmsCodeMapper extends BaseMapperX<SmsCodeDO> {
-
-    /**
-     * 获得手机号的最后一个手机验证码
-     *
-     * @param mobile 手机号
-     * @param scene 发送场景,选填
-     * @param code 验证码 选填
-     * @return 手机验证码
-     */
-    default SmsCodeDO selectLastByMobile(String mobile, String code, Integer scene) {
-        return selectOne(new QueryWrapperX<SmsCodeDO>()
-                .eq("mobile", mobile)
-                .eqIfPresent("scene", scene)
-                .eqIfPresent("code", code)
-                .orderByDesc("id")
-                .limitN(1));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsLogMapper.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsLogMapper.java
deleted file mode 100644
index d1b7252..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsLogMapper.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.iailab.module.system.dal.mysql.sms;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
-import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.iailab.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsLogDO;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SmsLogMapper extends BaseMapperX<SmsLogDO> {
-
-    default PageResult<SmsLogDO> selectPage(SmsLogPageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<SmsLogDO>()
-                .eqIfPresent(SmsLogDO::getChannelId, reqVO.getChannelId())
-                .eqIfPresent(SmsLogDO::getTemplateId, reqVO.getTemplateId())
-                .likeIfPresent(SmsLogDO::getMobile, reqVO.getMobile())
-                .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getSendStatus())
-                .betweenIfPresent(SmsLogDO::getSendTime, reqVO.getSendTime())
-                .eqIfPresent(SmsLogDO::getReceiveStatus, reqVO.getReceiveStatus())
-                .betweenIfPresent(SmsLogDO::getReceiveTime, reqVO.getReceiveTime())
-                .orderByDesc(SmsLogDO::getId));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsTemplateMapper.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsTemplateMapper.java
deleted file mode 100644
index 98789e5..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/sms/SmsTemplateMapper.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.iailab.module.system.dal.mysql.sms;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
-import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsTemplateDO;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SmsTemplateMapper extends BaseMapperX<SmsTemplateDO> {
-
-    default SmsTemplateDO selectByCode(String code) {
-        return selectOne(SmsTemplateDO::getCode, code);
-    }
-
-    default PageResult<SmsTemplateDO> selectPage(SmsTemplatePageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<SmsTemplateDO>()
-                .eqIfPresent(SmsTemplateDO::getType, reqVO.getType())
-                .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus())
-                .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode())
-                .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent())
-                .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId())
-                .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId())
-                .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(SmsTemplateDO::getId));
-    }
-
-    default Long selectCountByChannelId(Long channelId) {
-        return selectCount(SmsTemplateDO::getChannelId, channelId);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialClientMapper.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialClientMapper.java
deleted file mode 100644
index 8110e24..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialClientMapper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.iailab.module.system.dal.mysql.social;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
-import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
-import com.iailab.module.system.dal.dataobject.social.SocialClientDO;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SocialClientMapper extends BaseMapperX<SocialClientDO> {
-
-    default SocialClientDO selectBySocialTypeAndUserType(Integer socialType, Integer userType) {
-        return selectOne(SocialClientDO::getSocialType, socialType,
-                SocialClientDO::getUserType, userType);
-    }
-
-    default PageResult<SocialClientDO> selectPage(SocialClientPageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<SocialClientDO>()
-                .likeIfPresent(SocialClientDO::getName, reqVO.getName())
-                .eqIfPresent(SocialClientDO::getSocialType, reqVO.getSocialType())
-                .eqIfPresent(SocialClientDO::getUserType, reqVO.getUserType())
-                .likeIfPresent(SocialClientDO::getClientId, reqVO.getClientId())
-                .eqIfPresent(SocialClientDO::getStatus, reqVO.getStatus())
-                .orderByDesc(SocialClientDO::getId));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialUserBindMapper.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialUserBindMapper.java
deleted file mode 100644
index 0ba92b5..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialUserBindMapper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.iailab.module.system.dal.mysql.social;
-
-import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
-import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.iailab.module.system.dal.dataobject.social.SocialUserBindDO;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-@Mapper
-public interface SocialUserBindMapper extends BaseMapperX<SocialUserBindDO> {
-
-    default void deleteByUserTypeAndUserIdAndSocialType(Integer userType, Long userId, Integer socialType) {
-        delete(new LambdaQueryWrapperX<SocialUserBindDO>()
-                .eq(SocialUserBindDO::getUserType, userType)
-                .eq(SocialUserBindDO::getUserId, userId)
-                .eq(SocialUserBindDO::getSocialType, socialType));
-    }
-
-    default void deleteByUserTypeAndSocialUserId(Integer userType, Long socialUserId) {
-        delete(new LambdaQueryWrapperX<SocialUserBindDO>()
-                .eq(SocialUserBindDO::getUserType, userType)
-                .eq(SocialUserBindDO::getSocialUserId, socialUserId));
-    }
-
-    default SocialUserBindDO selectByUserTypeAndSocialUserId(Integer userType, Long socialUserId) {
-        return selectOne(SocialUserBindDO::getUserType, userType,
-                SocialUserBindDO::getSocialUserId, socialUserId);
-    }
-
-    default List<SocialUserBindDO> selectListByUserIdAndUserType(Long userId, Integer userType) {
-        return selectList(new LambdaQueryWrapperX<SocialUserBindDO>()
-                .eq(SocialUserBindDO::getUserId, userId)
-                .eq(SocialUserBindDO::getUserType, userType));
-    }
-
-    default SocialUserBindDO selectByUserIdAndUserTypeAndSocialType(Long userId, Integer userType, Integer socialType) {
-        return selectOne(new LambdaQueryWrapperX<SocialUserBindDO>()
-                .eq(SocialUserBindDO::getUserId, userId)
-                .eq(SocialUserBindDO::getUserType, userType)
-                .eq(SocialUserBindDO::getSocialType, socialType));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialUserMapper.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialUserMapper.java
deleted file mode 100644
index 9a801fb..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/dal/mysql/social/SocialUserMapper.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.iailab.module.system.dal.mysql.social;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
-import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
-import com.iailab.module.system.dal.dataobject.social.SocialUserDO;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SocialUserMapper extends BaseMapperX<SocialUserDO> {
-
-    default SocialUserDO selectByTypeAndCodeAnState(Integer type, String code, String state) {
-        return selectOne(new LambdaQueryWrapper<SocialUserDO>()
-                .eq(SocialUserDO::getType, type)
-                .eq(SocialUserDO::getCode, code)
-                .eq(SocialUserDO::getState, state));
-    }
-
-    default SocialUserDO selectByTypeAndOpenid(Integer type, String openid) {
-        return selectOne(new LambdaQueryWrapper<SocialUserDO>()
-                .eq(SocialUserDO::getType, type)
-                .eq(SocialUserDO::getOpenid, openid));
-    }
-
-    default PageResult<SocialUserDO> selectPage(SocialUserPageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<SocialUserDO>()
-                .eqIfPresent(SocialUserDO::getType, reqVO.getType())
-                .likeIfPresent(SocialUserDO::getNickname, reqVO.getNickname())
-                .likeIfPresent(SocialUserDO::getOpenid, reqVO.getOpenid())
-                .betweenIfPresent(SocialUserDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(SocialUserDO::getId));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/config/SmsCodeProperties.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/config/SmsCodeProperties.java
deleted file mode 100644
index a6c68b5..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/config/SmsCodeProperties.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.iailab.module.system.framework.sms.config;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.validation.annotation.Validated;
-
-import javax.validation.constraints.NotNull;
-import java.time.Duration;
-
-@ConfigurationProperties(prefix = "iailab.sms-code")
-@Validated
-@Data
-public class SmsCodeProperties {
-
-    /**
-     * 过期时间
-     */
-    @NotNull(message = "过期时间不能为空")
-    private Duration expireTimes;
-    /**
-     * 短信发送频率
-     */
-    @NotNull(message = "短信发送频率不能为空")
-    private Duration sendFrequency;
-    /**
-     * 每日发送最大数量
-     */
-    @NotNull(message = "每日发送最大数量不能为空")
-    private Integer sendMaximumQuantityPerDay;
-    /**
-     * 验证码最小值
-     */
-    @NotNull(message = "验证码最小值不能为空")
-    private Integer beginCode;
-    /**
-     * 验证码最大值
-     */
-    @NotNull(message = "验证码最大值不能为空")
-    private Integer endCode;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/config/SmsConfiguration.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/config/SmsConfiguration.java
deleted file mode 100644
index b193136..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/config/SmsConfiguration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.iailab.module.system.framework.sms.config;
-
-import com.iailab.module.system.framework.sms.core.client.SmsClientFactory;
-import com.iailab.module.system.framework.sms.core.client.impl.SmsClientFactoryImpl;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * 短信配置类,包括短信客户端、短信验证码两部分
- *
- * @author iailab
- */
-@Configuration(proxyBeanMethods = false)
-@EnableConfigurationProperties(SmsCodeProperties.class)
-public class SmsConfiguration {
-
-    @Bean
-    public SmsClientFactory smsClientFactory() {
-        return new SmsClientFactoryImpl();
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/SmsClient.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/SmsClient.java
deleted file mode 100644
index af964bb..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/SmsClient.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client;
-
-import com.iailab.framework.common.core.KeyValue;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsSendRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
-
-import java.util.List;
-
-/**
- * 短信客户端,用于对接各短信平台的 SDK,实现短信发送等功能
- *
- * @author zzf
- * @since 2021/1/25 14:14
- */
-public interface SmsClient {
-
-    /**
-     * 获得渠道编号
-     *
-     * @return 渠道编号
-     */
-    Long getId();
-
-    /**
-     * 发送消息
-     *
-     * @param logId 日志编号
-     * @param mobile 手机号
-     * @param apiTemplateId 短信 API 的模板编号
-     * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序
-     * @return 短信发送结果
-     */
-    SmsSendRespDTO sendSms(Long logId, String mobile, String apiTemplateId,
-                           List<KeyValue<String, Object>> templateParams) throws Throwable;
-
-    /**
-     * 解析接收短信的接收结果
-     *
-     * @param text 结果
-     * @return 结果内容
-     * @throws Throwable 当解析 text 发生异常时,则会抛出异常
-     */
-    List<SmsReceiveRespDTO> parseSmsReceiveStatus(String text) throws Throwable;
-
-    /**
-     * 查询指定的短信模板
-     *
-     * @param apiTemplateId 短信 API 的模板编号
-     * @return 短信模板
-     */
-    SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/SmsClientFactory.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/SmsClientFactory.java
deleted file mode 100644
index f3f7e9e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/SmsClientFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client;
-
-import com.iailab.module.system.framework.sms.core.property.SmsChannelProperties;
-
-/**
- * 短信客户端的工厂接口
- *
- * @author zzf
- * @since 2021/1/28 14:01
- */
-public interface SmsClientFactory {
-
-    /**
-     * 获得短信 Client
-     *
-     * @param channelId 渠道编号
-     * @return 短信 Client
-     */
-    SmsClient getSmsClient(Long channelId);
-
-    /**
-     * 获得短信 Client
-     *
-     * @param channelCode 渠道编码
-     * @return 短信 Client
-     */
-    SmsClient getSmsClient(String channelCode);
-
-    /**
-     * 创建短信 Client
-     *
-     * @param properties 配置对象
-     */
-    void createOrUpdateSmsClient(SmsChannelProperties properties);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsReceiveRespDTO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsReceiveRespDTO.java
deleted file mode 100644
index 03c0c25..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsReceiveRespDTO.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.dto;
-
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-/**
- * 消息接收 Response DTO
- *
- * @author iailab
- */
-@Data
-public class SmsReceiveRespDTO {
-
-    /**
-     * 是否接收成功
-     */
-    private Boolean success;
-    /**
-     * API 接收结果的编码
-     */
-    private String errorCode;
-    /**
-     * API 接收结果的说明
-     */
-    private String errorMsg;
-
-    /**
-     * 手机号
-     */
-    private String mobile;
-    /**
-     * 用户接收时间
-     */
-    private LocalDateTime receiveTime;
-
-    /**
-     * 短信 API 发送返回的序号
-     */
-    private String serialNo;
-    /**
-     * 短信日志编号
-     *
-     * 对应 SysSmsLogDO 的编号
-     */
-    private Long logId;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsSendRespDTO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsSendRespDTO.java
deleted file mode 100644
index b47e08e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsSendRespDTO.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.dto;
-
-import lombok.Data;
-
-/**
- * 短信发送 Response DTO
- *
- * @author iailab
- */
-@Data
-public class SmsSendRespDTO {
-
-    /**
-     * 是否成功
-     */
-    private Boolean success;
-
-    /**
-     * API 请求编号
-     */
-    private String apiRequestId;
-
-    // ==================== 成功时字段 ====================
-
-    /**
-     * 短信 API 发送返回的序号
-     */
-    private String serialNo;
-
-    // ==================== 失败时字段 ====================
-
-    /**
-     * API 返回错误码
-     *
-     * 由于第三方的错误码可能是字符串,所以使用 String 类型
-     */
-    private String apiCode;
-    /**
-     * API 返回提示
-     */
-    private String apiMsg;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsTemplateRespDTO.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsTemplateRespDTO.java
deleted file mode 100644
index 6c23252..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/dto/SmsTemplateRespDTO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.dto;
-
-import com.iailab.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
-import lombok.Data;
-
-/**
- * 短信模板 Response DTO
- *
- * @author iailab
- */
-@Data
-public class SmsTemplateRespDTO {
-
-    /**
-     * 模板编号
-     */
-    private String id;
-    /**
-     * 短信内容
-     */
-    private String content;
-    /**
-     * 审核状态
-     *
-     * 枚举 {@link SmsTemplateAuditStatusEnum}
-     */
-    private Integer auditStatus;
-    /**
-     * 审核未通过的理由
-     */
-    private String auditReason;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/AbstractSmsClient.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/AbstractSmsClient.java
deleted file mode 100644
index d50e30b..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/AbstractSmsClient.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.impl;
-
-import com.iailab.module.system.framework.sms.core.client.SmsClient;
-import com.iailab.module.system.framework.sms.core.property.SmsChannelProperties;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 短信客户端的抽象类,提供模板方法,减少子类的冗余代码
- *
- * @author zzf
- * @since 2021/2/1 9:28
- */
-@Slf4j
-public abstract class AbstractSmsClient implements SmsClient {
-
-    /**
-     * 短信渠道配置
-     */
-    protected volatile SmsChannelProperties properties;
-
-    public AbstractSmsClient(SmsChannelProperties properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * 初始化
-     */
-    public final void init() {
-        doInit();
-        log.debug("[init][配置({}) 初始化完成]", properties);
-    }
-
-    /**
-     * 自定义初始化
-     */
-    protected abstract void doInit();
-
-    public final void refresh(SmsChannelProperties properties) {
-        // 判断是否更新
-        if (properties.equals(this.properties)) {
-            return;
-        }
-        log.info("[refresh][配置({})发生变化,重新初始化]", properties);
-        this.properties = properties;
-        // 初始化
-        this.init();
-    }
-
-    @Override
-    public Long getId() {
-        return properties.getId();
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/AliyunSmsClient.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/AliyunSmsClient.java
deleted file mode 100644
index a3f2ab2..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/AliyunSmsClient.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.impl;
-
-import cn.hutool.core.lang.Assert;
-import com.iailab.framework.common.core.KeyValue;
-import com.iailab.framework.common.util.collection.MapUtils;
-import com.iailab.framework.common.util.json.JsonUtils;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsSendRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
-import com.iailab.module.system.framework.sms.core.client.impl.AbstractSmsClient;
-import com.iailab.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
-import com.iailab.module.system.framework.sms.core.property.SmsChannelProperties;
-import com.aliyuncs.DefaultAcsClient;
-import com.aliyuncs.IAcsClient;
-import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest;
-import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateResponse;
-import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
-import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
-import com.aliyuncs.profile.DefaultProfile;
-import com.aliyuncs.profile.IClientProfile;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.annotations.VisibleForTesting;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-
-import static com.iailab.framework.common.util.collection.CollectionUtils.convertList;
-import static com.iailab.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-import static com.iailab.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;
-
-/**
- * 阿里短信客户端的实现类
- *
- * @author zzf
- * @since 2021/1/25 14:17
- */
-@Slf4j
-public class AliyunSmsClient extends AbstractSmsClient {
-
-    /**
-     * 调用成功 code
-     */
-    public static final String API_CODE_SUCCESS = "OK";
-
-    /**
-     * REGION, 使用杭州
-     */
-    private static final String ENDPOINT = "cn-hangzhou";
-
-    /**
-     * 阿里云客户端
-     */
-    private volatile IAcsClient client;
-
-    public AliyunSmsClient(SmsChannelProperties properties) {
-        super(properties);
-        Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空");
-        Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
-    }
-
-    @Override
-    protected void doInit() {
-        IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, properties.getApiKey(), properties.getApiSecret());
-        client = new DefaultAcsClient(profile);
-    }
-
-    @Override
-    public SmsSendRespDTO sendSms(Long sendLogId, String mobile, String apiTemplateId,
-                                  List<KeyValue<String, Object>> templateParams) throws Throwable {
-        // 构建请求
-        SendSmsRequest request = new SendSmsRequest();
-        request.setPhoneNumbers(mobile);
-        request.setSignName(properties.getSignature());
-        request.setTemplateCode(apiTemplateId);
-        request.setTemplateParam(JsonUtils.toJsonString(MapUtils.convertMap(templateParams)));
-        request.setOutId(String.valueOf(sendLogId));
-        // 执行请求
-        SendSmsResponse response = client.getAcsResponse(request);
-        return new SmsSendRespDTO().setSuccess(Objects.equals(response.getCode(), API_CODE_SUCCESS)).setSerialNo(response.getBizId())
-                .setApiRequestId(response.getRequestId()).setApiCode(response.getCode()).setApiMsg(response.getMessage());
-    }
-
-    @Override
-    public List<SmsReceiveRespDTO> parseSmsReceiveStatus(String text) {
-        List<SmsReceiveStatus> statuses = JsonUtils.parseArray(text, SmsReceiveStatus.class);
-        return convertList(statuses, status -> new SmsReceiveRespDTO().setSuccess(status.getSuccess())
-                .setErrorCode(status.getErrCode()).setErrorMsg(status.getErrMsg())
-                .setMobile(status.getPhoneNumber()).setReceiveTime(status.getReportTime())
-                .setSerialNo(status.getBizId()).setLogId(Long.valueOf(status.getOutId())));
-    }
-
-    @Override
-    public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable {
-        // 构建请求
-        QuerySmsTemplateRequest request = new QuerySmsTemplateRequest();
-        request.setTemplateCode(apiTemplateId);
-        // 执行请求
-        QuerySmsTemplateResponse response = client.getAcsResponse(request);
-        if (response.getTemplateStatus() == null) {
-            return null;
-        }
-        return new SmsTemplateRespDTO().setId(response.getTemplateCode()).setContent(response.getTemplateContent())
-                .setAuditStatus(convertSmsTemplateAuditStatus(response.getTemplateStatus())).setAuditReason(response.getReason());
-    }
-
-    @VisibleForTesting
-    Integer convertSmsTemplateAuditStatus(Integer templateStatus) {
-        switch (templateStatus) {
-            case 0: return SmsTemplateAuditStatusEnum.CHECKING.getStatus();
-            case 1: return SmsTemplateAuditStatusEnum.SUCCESS.getStatus();
-            case 2: return SmsTemplateAuditStatusEnum.FAIL.getStatus();
-            default: throw new IllegalArgumentException(String.format("未知审核状态(%d)", templateStatus));
-        }
-    }
-
-    /**
-     * 短信接收状态
-     *
-     * 参见 <a href="https://help.aliyun.com/document_detail/101867.html">文档</a>
-     *
-     * @author iailab
-     */
-    @Data
-    public static class SmsReceiveStatus {
-
-        /**
-         * 手机号
-         */
-        @JsonProperty("phone_number")
-        private String phoneNumber;
-        /**
-         * 发送时间
-         */
-        @JsonProperty("send_time")
-        @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
-        private LocalDateTime sendTime;
-        /**
-         * 状态报告时间
-         */
-        @JsonProperty("report_time")
-        @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
-        private LocalDateTime reportTime;
-        /**
-         * 是否接收成功
-         */
-        private Boolean success;
-        /**
-         * 状态报告说明
-         */
-        @JsonProperty("err_msg")
-        private String errMsg;
-        /**
-         * 状态报告编码
-         */
-        @JsonProperty("err_code")
-        private String errCode;
-        /**
-         * 发送序列号
-         */
-        @JsonProperty("biz_id")
-        private String bizId;
-        /**
-         * 用户序列号
-         *
-         * 这里我们传递的是 SysSmsLogDO 的日志编号
-         */
-        @JsonProperty("out_id")
-        private String outId;
-        /**
-         * 短信长度,例如说 1、2、3
-         *
-         * 140 字节算一条短信,短信长度超过 140 字节时会拆分成多条短信发送
-         */
-        @JsonProperty("sms_size")
-        private Integer smsSize;
-
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/DebugDingTalkSmsClient.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/DebugDingTalkSmsClient.java
deleted file mode 100644
index 33bbfd2..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/DebugDingTalkSmsClient.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.impl;
-
-import cn.hutool.core.codec.Base64;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.crypto.digest.DigestUtil;
-import cn.hutool.crypto.digest.HmacAlgorithm;
-import cn.hutool.http.HttpUtil;
-import com.iailab.framework.common.core.KeyValue;
-import com.iailab.framework.common.util.collection.MapUtils;
-import com.iailab.framework.common.util.json.JsonUtils;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsSendRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
-import com.iailab.module.system.framework.sms.core.client.impl.AbstractSmsClient;
-import com.iailab.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
-import com.iailab.module.system.framework.sms.core.property.SmsChannelProperties;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * 基于钉钉 WebHook 实现的调试的短信客户端实现类
- *
- * 考虑到省钱,我们使用钉钉 WebHook 模拟发送短信,方便调试。
- *
- * @author iailab
- */
-public class DebugDingTalkSmsClient extends AbstractSmsClient {
-
-    public DebugDingTalkSmsClient(SmsChannelProperties properties) {
-        super(properties);
-        Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空");
-        Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
-    }
-
-    @Override
-    protected void doInit() {
-    }
-
-    @Override
-    public SmsSendRespDTO sendSms(Long sendLogId, String mobile,
-                                  String apiTemplateId, List<KeyValue<String, Object>> templateParams) throws Throwable {
-        // 构建请求
-        String url = buildUrl("robot/send");
-        Map<String, Object> params = new HashMap<>();
-        params.put("msgtype", "text");
-        String content = String.format("【模拟短信】\n手机号:%s\n短信日志编号:%d\n模板参数:%s",
-                mobile, sendLogId, MapUtils.convertMap(templateParams));
-        params.put("text", MapUtil.builder().put("content", content).build());
-        // 执行请求
-        String responseText = HttpUtil.post(url, JsonUtils.toJsonString(params));
-        // 解析结果
-        Map<?, ?> responseObj = JsonUtils.parseObject(responseText, Map.class);
-        String errorCode = MapUtil.getStr(responseObj, "errcode");
-        return new SmsSendRespDTO().setSuccess(Objects.equals(errorCode, "0")).setSerialNo(StrUtil.uuid())
-                .setApiCode(errorCode).setApiMsg(MapUtil.getStr(responseObj, "errorMsg"));
-    }
-
-    /**
-     * 构建请求地址
-     *
-     * 参见 <a href="https://developers.dingtalk.com/document/app/custom-robot-access/title-nfv-794-g71">文档</a>
-     *
-     * @param path 请求路径
-     * @return 请求地址
-     */
-    @SuppressWarnings("SameParameterValue")
-    private String buildUrl(String path) {
-        // 生成 timestamp
-        long timestamp = System.currentTimeMillis();
-        // 生成 sign
-        String secret = properties.getApiSecret();
-        String stringToSign = timestamp + "\n" + secret;
-        byte[] signData = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, StrUtil.bytes(secret)).digest(stringToSign);
-        String sign = Base64.encode(signData);
-        // 构建最终 URL
-        return String.format("https://oapi.dingtalk.com/%s?access_token=%s&timestamp=%d&sign=%s",
-                path, properties.getApiKey(), timestamp, sign);
-    }
-
-    @Override
-    public List<SmsReceiveRespDTO> parseSmsReceiveStatus(String text) {
-        throw new UnsupportedOperationException("模拟短信客户端,暂时无需解析回调");
-    }
-
-    @Override
-    public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) {
-        return new SmsTemplateRespDTO().setId(apiTemplateId).setContent("")
-                .setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason("");
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/SmsClientFactoryImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/SmsClientFactoryImpl.java
deleted file mode 100644
index ab4bb20..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/SmsClientFactoryImpl.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.impl;
-
-import com.iailab.module.system.framework.sms.core.client.SmsClient;
-import com.iailab.module.system.framework.sms.core.client.SmsClientFactory;
-import com.iailab.module.system.framework.sms.core.enums.SmsChannelEnum;
-import com.iailab.module.system.framework.sms.core.property.SmsChannelProperties;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.Assert;
-import org.springframework.validation.annotation.Validated;
-
-import java.util.Arrays;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * 短信客户端工厂接口
- *
- * @author zzf
- */
-@Validated
-@Slf4j
-public class SmsClientFactoryImpl implements SmsClientFactory {
-
-    /**
-     * 短信客户端 Map
-     * key:渠道编号,使用 {@link SmsChannelProperties#getId()}
-     */
-    private final ConcurrentMap<Long, AbstractSmsClient> channelIdClients = new ConcurrentHashMap<>();
-
-    /**
-     * 短信客户端 Map
-     * key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()}
-     *
-     * 注意,一些场景下,需要获得某个渠道类型的客户端,所以需要使用它。
-     * 例如说,解析短信接收结果,是相对通用的,不需要使用某个渠道编号的 {@link #channelIdClients}
-     */
-    private final ConcurrentMap<String, AbstractSmsClient> channelCodeClients = new ConcurrentHashMap<>();
-
-    public SmsClientFactoryImpl() {
-        // 初始化 channelCodeClients 集合
-        Arrays.stream(SmsChannelEnum.values()).forEach(channel -> {
-            // 创建一个空的 SmsChannelProperties 对象
-            SmsChannelProperties properties = new SmsChannelProperties().setCode(channel.getCode())
-                    .setApiKey("default default").setApiSecret("default");
-            // 创建 Sms 客户端
-            AbstractSmsClient smsClient = createSmsClient(properties);
-            channelCodeClients.put(channel.getCode(), smsClient);
-        });
-    }
-
-    @Override
-    public SmsClient getSmsClient(Long channelId) {
-        return channelIdClients.get(channelId);
-    }
-
-    @Override
-    public SmsClient getSmsClient(String channelCode) {
-        return channelCodeClients.get(channelCode);
-    }
-
-    @Override
-    public void createOrUpdateSmsClient(SmsChannelProperties properties) {
-        AbstractSmsClient client = channelIdClients.get(properties.getId());
-        if (client == null) {
-            client = this.createSmsClient(properties);
-            client.init();
-            channelIdClients.put(client.getId(), client);
-        } else {
-            client.refresh(properties);
-        }
-    }
-
-    private AbstractSmsClient createSmsClient(SmsChannelProperties properties) {
-        SmsChannelEnum channelEnum = SmsChannelEnum.getByCode(properties.getCode());
-        Assert.notNull(channelEnum, String.format("渠道类型(%s) 为空", channelEnum));
-        // 创建客户端
-        switch (channelEnum) {
-            case ALIYUN: return new AliyunSmsClient(properties);
-            case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(properties);
-            case TENCENT: return new TencentSmsClient(properties);
-        }
-        // 创建失败,错误日志 + 抛出异常
-        log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", properties);
-        throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", properties));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/TencentSmsClient.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/TencentSmsClient.java
deleted file mode 100644
index 4dea4f7..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/client/impl/TencentSmsClient.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package com.iailab.module.system.framework.sms.core.client.impl;
-
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.StrUtil;
-import com.iailab.framework.common.core.KeyValue;
-import com.iailab.framework.common.util.collection.ArrayUtils;
-import com.iailab.framework.common.util.json.JsonUtils;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsSendRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
-import com.iailab.module.system.framework.sms.core.client.impl.AbstractSmsClient;
-import com.iailab.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
-import com.iailab.module.system.framework.sms.core.property.SmsChannelProperties;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.annotations.VisibleForTesting;
-import com.tencentcloudapi.common.Credential;
-import com.tencentcloudapi.sms.v20210111.SmsClient;
-import com.tencentcloudapi.sms.v20210111.models.*;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-
-import static com.iailab.framework.common.util.collection.CollectionUtils.convertList;
-import static com.iailab.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-import static com.iailab.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;
-
-/**
- * 腾讯云短信功能实现
- *
- * 参见 <a href="https://cloud.tencent.com/document/product/382/52077">文档</a>
- *
- * @author shiwp
- */
-public class TencentSmsClient extends AbstractSmsClient {
-
-    /**
-     * 调用成功 code
-     */
-    public static final String API_CODE_SUCCESS = "Ok";
-
-    /**
-     * REGION,使用南京
-     */
-    private static final String ENDPOINT = "ap-nanjing";
-
-    /**
-     * 是否国际/港澳台短信:
-     *
-     * 0:表示国内短信。
-     * 1:表示国际/港澳台短信。
-     */
-    private static final long INTERNATIONAL_CHINA = 0L;
-
-    private SmsClient client;
-
-    public TencentSmsClient(SmsChannelProperties properties) {
-        super(properties);
-        Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空");
-        validateSdkAppId(properties);
-    }
-
-    @Override
-    protected void doInit() {
-        // 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId,secretKey
-        Credential credential = new Credential(getApiKey(), properties.getApiSecret());
-        client = new SmsClient(credential, ENDPOINT);
-    }
-
-    /**
-     * 参数校验腾讯云的 SDK AppId
-     *
-     * 原因是:腾讯云发放短信的时候,需要额外的参数 sdkAppId
-     *
-     * 解决方案:考虑到不破坏原有的 apiKey + apiSecret 的结构,所以将 secretId 拼接到 apiKey 字段中,格式为 "secretId sdkAppId"。
-     *
-     * @param properties 配置
-     */
-    private static void validateSdkAppId(SmsChannelProperties properties) {
-        String combineKey = properties.getApiKey();
-        Assert.notEmpty(combineKey, "apiKey 不能为空");
-        String[] keys = combineKey.trim().split(" ");
-        Assert.isTrue(keys.length == 2, "腾讯云短信 apiKey 配置格式错误,请配置 为[secretId sdkAppId]");
-    }
-
-    private String getSdkAppId() {
-        return StrUtil.subAfter(properties.getApiKey(), " ", true);
-    }
-
-    private String getApiKey() {
-        return StrUtil.subBefore(properties.getApiKey(), " ", true);
-    }
-
-    @Override
-    public SmsSendRespDTO sendSms(Long sendLogId, String mobile,
-                                  String apiTemplateId, List<KeyValue<String, Object>> templateParams) throws Throwable {
-        // 构建请求
-        SendSmsRequest request = new SendSmsRequest();
-        request.setSmsSdkAppId(getSdkAppId());
-        request.setPhoneNumberSet(new String[]{mobile});
-        request.setSignName(properties.getSignature());
-        request.setTemplateId(apiTemplateId);
-        request.setTemplateParamSet(ArrayUtils.toArray(templateParams, e -> String.valueOf(e.getValue())));
-        request.setSessionContext(JsonUtils.toJsonString(new SessionContext().setLogId(sendLogId)));
-        // 执行请求
-        SendSmsResponse response = client.SendSms(request);
-        SendStatus status = response.getSendStatusSet()[0];
-        return new SmsSendRespDTO().setSuccess(Objects.equals(status.getCode(), API_CODE_SUCCESS)).setSerialNo(status.getSerialNo())
-                .setApiRequestId(response.getRequestId()).setApiCode(status.getCode()).setApiMsg(status.getMessage());
-    }
-
-    @Override
-    public List<SmsReceiveRespDTO> parseSmsReceiveStatus(String text) {
-        List<SmsReceiveStatus> callback = JsonUtils.parseArray(text, SmsReceiveStatus.class);
-        return convertList(callback, status -> new SmsReceiveRespDTO()
-                .setSuccess(SmsReceiveStatus.SUCCESS_CODE.equalsIgnoreCase(status.getStatus()))
-                .setErrorCode(status.getErrCode()).setErrorMsg(status.getDescription())
-                .setMobile(status.getMobile()).setReceiveTime(status.getReceiveTime())
-                .setSerialNo(status.getSerialNo()).setLogId(status.getSessionContext().getLogId()));
-    }
-
-    @Override
-    public SmsTemplateRespDTO getSmsTemplate(String apiTemplateId) throws Throwable {
-        // 构建请求
-        DescribeSmsTemplateListRequest request = new DescribeSmsTemplateListRequest();
-        request.setTemplateIdSet(new Long[]{Long.parseLong(apiTemplateId)});
-        request.setInternational(INTERNATIONAL_CHINA);
-        // 执行请求
-        DescribeSmsTemplateListResponse response = client.DescribeSmsTemplateList(request);
-        DescribeTemplateListStatus status = response.getDescribeTemplateStatusSet()[0];
-        if (status == null || status.getStatusCode() == null) {
-            return null;
-        }
-        return new SmsTemplateRespDTO().setId(status.getTemplateId().toString()).setContent(status.getTemplateContent())
-                .setAuditStatus(convertSmsTemplateAuditStatus(status.getStatusCode().intValue())).setAuditReason(status.getReviewReply());
-    }
-
-    @VisibleForTesting
-    Integer convertSmsTemplateAuditStatus(int templateStatus) {
-        switch (templateStatus) {
-            case 1: return SmsTemplateAuditStatusEnum.CHECKING.getStatus();
-            case 0: return SmsTemplateAuditStatusEnum.SUCCESS.getStatus();
-            case -1: return SmsTemplateAuditStatusEnum.FAIL.getStatus();
-            default: throw new IllegalArgumentException(String.format("未知审核状态(%d)", templateStatus));
-        }
-    }
-
-    @Data
-    private static class SmsReceiveStatus {
-
-        /**
-         * 短信接受成功 code
-         */
-        public static final String SUCCESS_CODE = "SUCCESS";
-
-        /**
-         * 用户实际接收到短信的时间
-         */
-        @JsonProperty("user_receive_time")
-        @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
-        private LocalDateTime receiveTime;
-
-        /**
-         * 国家(或地区)码
-         */
-        @JsonProperty("nationcode")
-        private String nationCode;
-
-        /**
-         * 手机号码
-         */
-        private String mobile;
-
-        /**
-         * 实际是否收到短信接收状态,SUCCESS(成功)、FAIL(失败)
-         */
-        @JsonProperty("report_status")
-        private String status;
-
-        /**
-         * 用户接收短信状态码错误信息
-         */
-        @JsonProperty("errmsg")
-        private String errCode;
-
-        /**
-         * 用户接收短信状态描述
-         */
-        @JsonProperty("description")
-        private String description;
-
-        /**
-         * 本次发送标识 ID(与发送接口返回的SerialNo对应)
-         */
-        @JsonProperty("sid")
-        private String serialNo;
-
-        /**
-         * 用户的 session 内容(与发送接口的请求参数 SessionContext 一致)
-         */
-        @JsonProperty("ext")
-        private SessionContext sessionContext;
-
-    }
-
-    @VisibleForTesting
-    @Data
-    static class SessionContext {
-
-        /**
-         * 发送短信记录id
-         */
-        private Long logId;
-
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/enums/SmsChannelEnum.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/enums/SmsChannelEnum.java
deleted file mode 100644
index 878d3c1..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/enums/SmsChannelEnum.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.iailab.module.system.framework.sms.core.enums;
-
-import cn.hutool.core.util.ArrayUtil;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 短信渠道枚举
- *
- * @author zzf
- * @since 2021/1/25 10:56
- */
-@Getter
-@AllArgsConstructor
-public enum SmsChannelEnum {
-
-    DEBUG_DING_TALK("DEBUG_DING_TALK", "调试(钉钉)"),
-    ALIYUN("ALIYUN", "阿里云"),
-    TENCENT("TENCENT", "腾讯云"),
-//    HUA_WEI("HUA_WEI", "华为云"),
-    ;
-
-    /**
-     * 编码
-     */
-    private final String code;
-    /**
-     * 名字
-     */
-    private final String name;
-
-    public static SmsChannelEnum getByCode(String code) {
-        return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values());
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java
deleted file mode 100644
index c550ce1..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.iailab.module.system.framework.sms.core.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 短信模板的审核状态枚举
- *
- * @author iailab
- */
-@AllArgsConstructor
-@Getter
-public enum SmsTemplateAuditStatusEnum {
-
-    CHECKING(1),
-    SUCCESS(2),
-    FAIL(3);
-
-    private final Integer status;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/property/SmsChannelProperties.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/property/SmsChannelProperties.java
deleted file mode 100644
index 410a78e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/framework/sms/core/property/SmsChannelProperties.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.iailab.module.system.framework.sms.core.property;
-
-import com.iailab.module.system.framework.sms.core.enums.SmsChannelEnum;
-import lombok.Data;
-import org.springframework.validation.annotation.Validated;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-/**
- * 短信渠道配置类
- *
- * @author zzf
- * @since 2021/1/25 17:01
- */
-@Data
-@Validated
-public class SmsChannelProperties {
-
-    /**
-     * 渠道编号
-     */
-    @NotNull(message = "短信渠道 ID 不能为空")
-    private Long id;
-    /**
-     * 短信签名
-     */
-    @NotEmpty(message = "短信签名不能为空")
-    private String signature;
-    /**
-     * 渠道编码
-     *
-     * 枚举 {@link SmsChannelEnum}
-     */
-    @NotEmpty(message = "渠道编码不能为空")
-    private String code;
-    /**
-     * 短信 API 的账号
-     */
-    @NotEmpty(message = "短信 API 的账号不能为空")
-    private String apiKey;
-    /**
-     * 短信 API 的密钥
-     */
-    @NotEmpty(message = "短信 API 的密钥不能为空")
-    private String apiSecret;
-    /**
-     * 短信发送回调 URL
-     */
-    private String callbackUrl;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/job/config/ServerInfoConfiguration.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/job/config/ServerInfoConfiguration.java
new file mode 100644
index 0000000..8e8d12d
--- /dev/null
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/job/config/ServerInfoConfiguration.java
@@ -0,0 +1,30 @@
+//package com.iailab.module.system.job.config;
+//
+//import org.springframework.context.annotation.Configuration;
+//
+//import javax.annotation.PostConstruct;
+//import java.net.InetAddress;
+//import java.net.UnknownHostException;
+//
+///**
+// * 服务器资源监控配置文件
+// */
+//@Configuration
+//public class ServerInfoConfiguration {
+//
+//    public static String hostName;
+//
+//    public static String hostIp;
+//
+//    @PostConstruct
+//    public void initServerInfo() throws UnknownHostException {
+//        System.out.println("初始化获取服务器信息initServerInfo...");
+//        // 获取本地主机对象
+//        InetAddress localHost = InetAddress.getLocalHost();
+//        // 获取主机名
+//        hostName = localHost.getHostName();
+//        // 获取IP地址
+//        hostIp = localHost.getHostAddress();
+//    }
+//
+//}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/mq/consumer/sms/SmsSendConsumer.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/mq/consumer/sms/SmsSendConsumer.java
deleted file mode 100644
index 0987c87..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/mq/consumer/sms/SmsSendConsumer.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.iailab.module.system.mq.consumer.sms;
-
-import com.iailab.module.system.mq.message.sms.SmsSendMessage;
-import com.iailab.module.system.service.sms.SmsSendService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-
-/**
- * 针对 {@link SmsSendMessage} 的消费者
- *
- * @author zzf
- */
-@Component
-@Slf4j
-public class SmsSendConsumer {
-
-    @Resource
-    private SmsSendService smsSendService;
-
-    @EventListener
-    @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
-    public void onMessage(SmsSendMessage message) {
-        log.info("[onMessage][消息内容({})]", message);
-        smsSendService.doSendSms(message);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthService.java
index 6699da4..dbf21eb 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthService.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthService.java
@@ -48,29 +48,6 @@
     void logout(String token, Integer logType);
 
     /**
-     * 短信验证码发送
-     *
-     * @param reqVO 发送请求
-     */
-    void sendSmsCode(AuthSmsSendReqVO reqVO);
-
-    /**
-     * 短信登录
-     *
-     * @param reqVO 登录信息
-     * @return 登录结果
-     */
-    AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO) ;
-
-    /**
-     * 社交快捷登录,使用 code 授权码
-     *
-     * @param reqVO 登录信息
-     * @return 登录结果
-     */
-    AuthLoginRespVO socialLogin(@Valid AuthSocialLoginReqVO reqVO);
-
-    /**
      * 刷新访问令牌
      *
      * @param refreshToken 刷新令牌
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthServiceImpl.java
index 1fa800b..115ad3e 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthServiceImpl.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/auth/AdminAuthServiceImpl.java
@@ -7,9 +7,6 @@
 import com.iailab.framework.common.util.servlet.ServletUtils;
 import com.iailab.framework.common.util.validation.ValidationUtils;
 import com.iailab.module.system.api.logger.dto.LoginLogCreateReqDTO;
-import com.iailab.module.system.api.sms.SmsCodeApi;
-import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
-import com.iailab.module.system.api.social.dto.SocialUserRespDTO;
 import com.iailab.module.system.controller.admin.auth.vo.*;
 import com.iailab.module.system.convert.auth.AuthConvert;
 import com.iailab.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
@@ -21,7 +18,6 @@
 import com.iailab.module.system.service.logger.LoginLogService;
 import com.iailab.module.system.service.member.MemberService;
 import com.iailab.module.system.service.oauth2.OAuth2TokenService;
-import com.iailab.module.system.service.social.SocialUserService;
 import com.iailab.module.system.service.user.AdminUserService;
 import com.google.common.annotations.VisibleForTesting;
 import com.xingyuv.captcha.model.common.ResponseModel;
@@ -36,7 +32,6 @@
 import java.util.Objects;
 
 import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.iailab.framework.common.util.servlet.ServletUtils.getClientIP;
 import static com.iailab.module.system.enums.ErrorCodeConstants.*;
 
 /**
@@ -55,15 +50,11 @@
     @Resource
     private OAuth2TokenService oauth2TokenService;
     @Resource
-    private SocialUserService socialUserService;
-    @Resource
     private MemberService memberService;
     @Resource
     private Validator validator;
     @Resource
     private CaptchaService captchaService;
-    @Resource
-    private SmsCodeApi smsCodeApi;
 
     /**
      * 验证码的开关,默认为 true
@@ -106,38 +97,8 @@
         // 使用账号密码,进行登录
         AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword());
 
-        // 如果 socialType 非空,说明需要绑定社交用户
-        if (reqVO.getSocialType() != null) {
-            socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
-                    reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState()));
-        }
         // 创建 Token 令牌,记录登录日志
         return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
-    }
-
-    @Override
-    public void sendSmsCode(AuthSmsSendReqVO reqVO) {
-        // 登录场景,验证是否存在
-        if (userService.getUserByMobile(reqVO.getMobile()) == null) {
-            throw exception(AUTH_MOBILE_NOT_EXISTS);
-        }
-        // 发送验证码
-        smsCodeApi.sendSmsCode(AuthConvert.INSTANCE.convert(reqVO).setCreateIp(getClientIP()));
-    }
-
-    @Override
-    public AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO) {
-        // 校验验证码
-        smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.ADMIN_MEMBER_LOGIN.getScene(), getClientIP())).getCheckedData();
-
-        // 获得用户信息
-        AdminUserDO user = userService.getUserByMobile(reqVO.getMobile());
-        if (user == null) {
-            throw exception(USER_NOT_EXISTS);
-        }
-
-        // 创建 Token 令牌,记录登录日志
-        return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE);
     }
 
     private void createLoginLog(Long userId, String username,
@@ -157,25 +118,6 @@
         if (userId != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
             userService.updateUserLogin(userId, ServletUtils.getClientIP());
         }
-    }
-
-    @Override
-    public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) {
-        // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
-        SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(UserTypeEnum.ADMIN.getValue(), reqVO.getType(),
-                reqVO.getCode(), reqVO.getState());
-        if (socialUser == null || socialUser.getUserId() == null) {
-            throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
-        }
-
-        // 获得用户
-        AdminUserDO user = userService.getUser(socialUser.getUserId());
-        if (user == null) {
-            throw exception(USER_NOT_EXISTS);
-        }
-
-        // 创建 Token 令牌,记录登录日志
-        return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
     }
 
     @VisibleForTesting
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsChannelService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsChannelService.java
deleted file mode 100644
index 047e0ac..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsChannelService.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.module.system.framework.sms.core.client.SmsClient;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelSaveReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsChannelDO;
-
-import javax.validation.Valid;
-import java.util.List;
-
-/**
- * 短信渠道 Service 接口
- *
- * @author zzf
- * @since 2021/1/25 9:24
- */
-public interface SmsChannelService {
-
-    /**
-     * 创建短信渠道
-     *
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Long createSmsChannel(@Valid SmsChannelSaveReqVO createReqVO);
-
-    /**
-     * 更新短信渠道
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateSmsChannel(@Valid SmsChannelSaveReqVO updateReqVO);
-
-    /**
-     * 删除短信渠道
-     *
-     * @param id 编号
-     */
-    void deleteSmsChannel(Long id);
-
-    /**
-     * 获得短信渠道
-     *
-     * @param id 编号
-     * @return 短信渠道
-     */
-    SmsChannelDO getSmsChannel(Long id);
-
-    /**
-     * 获得所有短信渠道列表
-     *
-     * @return 短信渠道列表
-     */
-    List<SmsChannelDO> getSmsChannelList();
-
-    /**
-     * 获得短信渠道分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 短信渠道分页
-     */
-    PageResult<SmsChannelDO> getSmsChannelPage(SmsChannelPageReqVO pageReqVO);
-
-    /**
-     * 获得短信客户端
-     *
-     * @param id 编号
-     * @return 短信客户端
-     */
-    SmsClient getSmsClient(Long id);
-
-    /**
-     * 获得短信客户端
-     *
-     * @param code 编码
-     * @return 短信客户端
-     */
-    SmsClient getSmsClient(String code);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsChannelServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsChannelServiceImpl.java
deleted file mode 100644
index 1e9db0a..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsChannelServiceImpl.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import cn.hutool.core.util.StrUtil;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.framework.sms.core.client.SmsClient;
-import com.iailab.module.system.framework.sms.core.client.SmsClientFactory;
-import com.iailab.module.system.framework.sms.core.property.SmsChannelProperties;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.channel.SmsChannelSaveReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsChannelDO;
-import com.iailab.module.system.dal.mysql.sms.SmsChannelMapper;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import lombok.Getter;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.Duration;
-import java.util.List;
-
-import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.iailab.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache;
-import static com.iailab.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN;
-import static com.iailab.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS;
-
-/**
- * 短信渠道 Service 实现类
- *
- * @author zzf
- */
-@Service
-@Slf4j
-public class SmsChannelServiceImpl implements SmsChannelService {
-
-    /**
-     * {@link SmsClient} 缓存,通过它异步刷新 smsClientFactory
-     */
-    @Getter
-    private final LoadingCache<Long, SmsClient> idClientCache = buildAsyncReloadingCache(Duration.ofSeconds(10L),
-            new CacheLoader<Long, SmsClient>() {
-
-                @Override
-                public SmsClient load(Long id) {
-                    // 查询,然后尝试刷新
-                    SmsChannelDO channel = smsChannelMapper.selectById(id);
-                    if (channel != null) {
-                        SmsChannelProperties properties = BeanUtils.toBean(channel, SmsChannelProperties.class);
-                        smsClientFactory.createOrUpdateSmsClient(properties);
-                    }
-                    return smsClientFactory.getSmsClient(id);
-                }
-
-            });
-
-    /**
-     * {@link SmsClient} 缓存,通过它异步刷新 smsClientFactory
-     */
-    @Getter
-    private final LoadingCache<String, SmsClient> codeClientCache = buildAsyncReloadingCache(Duration.ofSeconds(60L),
-            new CacheLoader<String, SmsClient>() {
-
-                @Override
-                public SmsClient load(String code) {
-                    // 查询,然后尝试刷新
-                    SmsChannelDO channel = smsChannelMapper.selectByCode(code);
-                    if (channel != null) {
-                        SmsChannelProperties properties = BeanUtils.toBean(channel, SmsChannelProperties.class);
-                        smsClientFactory.createOrUpdateSmsClient(properties);
-                    }
-                    return smsClientFactory.getSmsClient(code);
-                }
-
-            });
-
-    @Resource
-    private SmsClientFactory smsClientFactory;
-
-    @Resource
-    private SmsChannelMapper smsChannelMapper;
-
-    @Resource
-    private SmsTemplateService smsTemplateService;
-
-    @Override
-    public Long createSmsChannel(SmsChannelSaveReqVO createReqVO) {
-        SmsChannelDO channel = BeanUtils.toBean(createReqVO, SmsChannelDO.class);
-        smsChannelMapper.insert(channel);
-        return channel.getId();
-    }
-
-    @Override
-    public void updateSmsChannel(SmsChannelSaveReqVO updateReqVO) {
-        // 校验存在
-        SmsChannelDO channel = validateSmsChannelExists(updateReqVO.getId());
-        // 更新
-        SmsChannelDO updateObj = BeanUtils.toBean(updateReqVO, SmsChannelDO.class);
-        smsChannelMapper.updateById(updateObj);
-
-        // 清空缓存
-        clearCache(updateReqVO.getId(), channel.getCode());
-    }
-
-    @Override
-    public void deleteSmsChannel(Long id) {
-        // 校验存在
-        SmsChannelDO channel = validateSmsChannelExists(id);
-        // 校验是否有在使用该账号的模版
-        if (smsTemplateService.getSmsTemplateCountByChannelId(id) > 0) {
-            throw exception(SMS_CHANNEL_HAS_CHILDREN);
-        }
-        // 删除
-        smsChannelMapper.deleteById(id);
-
-        // 清空缓存
-        clearCache(id, channel.getCode());
-    }
-
-    /**
-     * 清空指定渠道编号的缓存
-     *
-     * @param id 渠道编号
-     * @param code 渠道编码
-     */
-    private void clearCache(Long id, String code) {
-        idClientCache.invalidate(id);
-        if (StrUtil.isNotEmpty(code)) {
-            codeClientCache.invalidate(code);
-        }
-    }
-
-    private SmsChannelDO validateSmsChannelExists(Long id) {
-        SmsChannelDO channel = smsChannelMapper.selectById(id);
-        if (channel == null) {
-            throw exception(SMS_CHANNEL_NOT_EXISTS);
-        }
-        return channel;
-    }
-
-    @Override
-    public SmsChannelDO getSmsChannel(Long id) {
-        return smsChannelMapper.selectById(id);
-    }
-
-    @Override
-    public List<SmsChannelDO> getSmsChannelList() {
-        return smsChannelMapper.selectList();
-    }
-
-    @Override
-    public PageResult<SmsChannelDO> getSmsChannelPage(SmsChannelPageReqVO pageReqVO) {
-        return smsChannelMapper.selectPage(pageReqVO);
-    }
-
-    @Override
-    public SmsClient getSmsClient(Long id) {
-        return idClientCache.getUnchecked(id);
-    }
-
-    @Override
-    public SmsClient getSmsClient(String code) {
-        return codeClientCache.getUnchecked(code);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsCodeService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsCodeService.java
deleted file mode 100644
index ce5ae1e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsCodeService.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import com.iailab.framework.common.exception.ServiceException;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
-
-import javax.validation.Valid;
-
-/**
- * 短信验证码 Service 接口
- *
- * @author iailab
- */
-public interface SmsCodeService {
-
-    /**
-     * 创建短信验证码,并进行发送
-     *
-     * @param reqDTO 发送请求
-     */
-    void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO);
-
-    /**
-     * 验证短信验证码,并进行使用
-     * 如果正确,则将验证码标记成已使用
-     * 如果错误,则抛出 {@link ServiceException} 异常
-     *
-     * @param reqDTO 使用请求
-     */
-    void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO);
-
-    /**
-     * 检查验证码是否有效
-     *
-     * @param reqDTO 校验请求
-     */
-    void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsCodeServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsCodeServiceImpl.java
deleted file mode 100644
index d7dd35e..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsCodeServiceImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.map.MapUtil;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
-import com.iailab.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
-import com.iailab.module.system.dal.dataobject.sms.SmsCodeDO;
-import com.iailab.module.system.dal.mysql.sms.SmsCodeMapper;
-import com.iailab.module.system.enums.sms.SmsSceneEnum;
-import com.iailab.module.system.framework.sms.config.SmsCodeProperties;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-
-import static cn.hutool.core.util.RandomUtil.randomInt;
-import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.iailab.framework.common.util.date.DateUtils.isToday;
-import static com.iailab.module.system.enums.ErrorCodeConstants.*;
-
-/**
- * 短信验证码 Service 实现类
- *
- * @author iailab
- */
-@Service
-@Validated
-public class SmsCodeServiceImpl implements SmsCodeService {
-
-    @Resource
-    private SmsCodeProperties smsCodeProperties;
-
-    @Resource
-    private SmsCodeMapper smsCodeMapper;
-
-    @Resource
-    private SmsSendService smsSendService;
-
-    @Override
-    public void sendSmsCode(SmsCodeSendReqDTO reqDTO) {
-        SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene());
-        Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene());
-        // 创建验证码
-        String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp());
-        // 发送验证码
-        smsSendService.sendSingleSms(reqDTO.getMobile(), null, null,
-                sceneEnum.getTemplateCode(), MapUtil.of("code", code));
-    }
-
-    private String createSmsCode(String mobile, Integer scene, String ip) {
-        // 校验是否可以发送验证码,不用筛选场景
-        SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null, null);
-        if (lastSmsCode != null) {
-            if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
-                    < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁
-                throw exception(SMS_CODE_SEND_TOO_FAST);
-            }
-            if (isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限
-                    lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。
-                throw exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
-            }
-            // TODO iailab:提升,每个 IP 每天可发送数量
-            // TODO iailab:提升,每个 IP 每小时可发送数量
-        }
-
-        // 创建验证码记录
-        String code = String.format("%0" + smsCodeProperties.getEndCode().toString().length() + "d",
-                randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1));
-        SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene)
-                .todayIndex(lastSmsCode != null && isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1)
-                .createIp(ip).used(false).build();
-        smsCodeMapper.insert(newSmsCode);
-        return code;
-    }
-
-    @Override
-    public void useSmsCode(SmsCodeUseReqDTO reqDTO) {
-        // 检测验证码是否有效
-        SmsCodeDO lastSmsCode = validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
-        // 使用验证码
-        smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId())
-                .used(true).usedTime(LocalDateTime.now()).usedIp(reqDTO.getUsedIp()).build());
-    }
-
-    @Override
-    public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
-        validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
-    }
-
-    private SmsCodeDO validateSmsCode0(String mobile, String code, Integer scene) {
-        // 校验验证码
-        SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, code, scene);
-        // 若验证码不存在,抛出异常
-        if (lastSmsCode == null) {
-            throw exception(SMS_CODE_NOT_FOUND);
-        }
-        // 超过时间
-        if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
-                >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
-            throw exception(SMS_CODE_EXPIRED);
-        }
-        // 判断验证码是否已被使用
-        if (Boolean.TRUE.equals(lastSmsCode.getUsed())) {
-            throw exception(SMS_CODE_USED);
-        }
-        return lastSmsCode;
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsLogService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsLogService.java
deleted file mode 100644
index 55f81f8..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsLogService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsLogDO;
-import com.iailab.module.system.dal.dataobject.sms.SmsTemplateDO;
-
-import java.time.LocalDateTime;
-import java.util.Map;
-
-/**
- * 短信日志 Service 接口
- *
- * @author zzf
- * @date 13:48 2021/3/2
- */
-public interface SmsLogService {
-
-    /**
-     * 创建短信日志
-     *
-     * @param mobile 手机号
-     * @param userId 用户编号
-     * @param userType 用户类型
-     * @param isSend 是否发送
-     * @param template 短信模板
-     * @param templateContent 短信内容
-     * @param templateParams 短信参数
-     * @return 发送日志编号
-     */
-    Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
-                      SmsTemplateDO template, String templateContent, Map<String, Object> templateParams);
-
-    /**
-     * 更新日志的发送结果
-     *
-     * @param id 日志编号
-     * @param success 发送是否成功
-     * @param apiSendCode 短信 API 发送结果的编码
-     * @param apiSendMsg 短信 API 发送失败的提示
-     * @param apiRequestId 短信 API 发送返回的唯一请求 ID
-     * @param apiSerialNo 短信 API 发送返回的序号
-     */
-    void updateSmsSendResult(Long id, Boolean success,
-                             String apiSendCode, String apiSendMsg,
-                             String apiRequestId, String apiSerialNo);
-
-    /**
-     * 更新日志的接收结果
-     *
-     * @param id 日志编号
-     * @param success 是否接收成功
-     * @param receiveTime 用户接收时间
-     * @param apiReceiveCode API 接收结果的编码
-     * @param apiReceiveMsg API 接收结果的说明
-     */
-    void updateSmsReceiveResult(Long id, Boolean success,
-                                LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg);
-
-    /**
-     * 获得短信日志分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 短信日志分页
-     */
-    PageResult<SmsLogDO> getSmsLogPage(SmsLogPageReqVO pageReqVO);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsLogServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsLogServiceImpl.java
deleted file mode 100644
index 268a4d0..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsLogServiceImpl.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsLogDO;
-import com.iailab.module.system.dal.dataobject.sms.SmsTemplateDO;
-import com.iailab.module.system.dal.mysql.sms.SmsLogMapper;
-import com.iailab.module.system.enums.sms.SmsReceiveStatusEnum;
-import com.iailab.module.system.enums.sms.SmsSendStatusEnum;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * 短信日志 Service 实现类
- *
- * @author zzf
- */
-@Slf4j
-@Service
-public class SmsLogServiceImpl implements SmsLogService {
-
-    @Resource
-    private SmsLogMapper smsLogMapper;
-
-    @Override
-    public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
-                             SmsTemplateDO template, String templateContent, Map<String, Object> templateParams) {
-        SmsLogDO.SmsLogDOBuilder logBuilder = SmsLogDO.builder();
-        // 根据是否要发送,设置状态
-        logBuilder.sendStatus(Objects.equals(isSend, true) ? SmsSendStatusEnum.INIT.getStatus()
-                : SmsSendStatusEnum.IGNORE.getStatus());
-        // 设置手机相关字段
-        logBuilder.mobile(mobile).userId(userId).userType(userType);
-        // 设置模板相关字段
-        logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType());
-        logBuilder.templateContent(templateContent).templateParams(templateParams)
-                .apiTemplateId(template.getApiTemplateId());
-        // 设置渠道相关字段
-        logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode());
-        // 设置接收相关字段
-        logBuilder.receiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
-
-        // 插入数据库
-        SmsLogDO logDO = logBuilder.build();
-        smsLogMapper.insert(logDO);
-        return logDO.getId();
-    }
-
-    @Override
-    public void updateSmsSendResult(Long id, Boolean success,
-                                    String apiSendCode, String apiSendMsg,
-                                    String apiRequestId, String apiSerialNo) {
-        SmsSendStatusEnum sendStatus = success ? SmsSendStatusEnum.SUCCESS : SmsSendStatusEnum.FAILURE;
-        smsLogMapper.updateById(SmsLogDO.builder().id(id)
-                .sendStatus(sendStatus.getStatus()).sendTime(LocalDateTime.now())
-                .apiSendCode(apiSendCode).apiSendMsg(apiSendMsg)
-                .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build());
-    }
-
-    @Override
-    public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime,
-                                       String apiReceiveCode, String apiReceiveMsg) {
-        SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ?
-                SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE;
-        smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus())
-                .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
-    }
-
-    @Override
-    public PageResult<SmsLogDO> getSmsLogPage(SmsLogPageReqVO pageReqVO) {
-        return smsLogMapper.selectPage(pageReqVO);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsSendService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsSendService.java
deleted file mode 100644
index db29516..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsSendService.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import com.iailab.module.system.mq.message.sms.SmsSendMessage;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 短信发送 Service 接口
- *
- * @author iailab
- */
-public interface SmsSendService {
-
-    /**
-     * 发送单条短信给管理后台的用户
-     *
-     * 在 mobile 为空时,使用 userId 加载对应管理员的手机号
-     *
-     * @param mobile 手机号
-     * @param userId 用户编号
-     * @param templateCode 短信模板编号
-     * @param templateParams 短信模板参数
-     * @return 发送日志编号
-     */
-    Long sendSingleSmsToAdmin(String mobile, Long userId,
-                              String templateCode, Map<String, Object> templateParams);
-
-    /**
-     * 发送单条短信给用户 APP 的用户
-     *
-     * 在 mobile 为空时,使用 userId 加载对应会员的手机号
-     *
-     * @param mobile 手机号
-     * @param userId 用户编号
-     * @param templateCode 短信模板编号
-     * @param templateParams 短信模板参数
-     * @return 发送日志编号
-     */
-    Long sendSingleSmsToMember(String mobile, Long userId,
-                               String templateCode, Map<String, Object> templateParams);
-
-    /**
-     * 发送单条短信给用户
-     *
-     * @param mobile 手机号
-     * @param userId 用户编号
-     * @param userType 用户类型
-     * @param templateCode 短信模板编号
-     * @param templateParams 短信模板参数
-     * @return 发送日志编号
-     */
-    Long sendSingleSms(String mobile, Long userId, Integer userType,
-                       String templateCode, Map<String, Object> templateParams);
-
-    default void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType,
-                              String templateCode, Map<String, Object> templateParams) {
-        throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!");
-    }
-
-    /**
-     * 执行真正的短信发送
-     * 注意,该方法仅仅提供给 MQ Consumer 使用
-     *
-     * @param message 短信
-     */
-    void doSendSms(SmsSendMessage message);
-
-    /**
-     * 接收短信的接收结果
-     *
-     * @param channelCode 渠道编码
-     * @param text 结果内容
-     * @throws Throwable 处理失败时,抛出异常
-     */
-    void receiveSmsStatus(String channelCode, String text) throws Throwable;
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsSendServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsSendServiceImpl.java
deleted file mode 100644
index aeb0f14..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsSendServiceImpl.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.exceptions.ExceptionUtil;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.StrUtil;
-import com.iailab.framework.common.core.KeyValue;
-import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.common.enums.UserTypeEnum;
-import com.iailab.framework.datapermission.core.annotation.DataPermission;
-import com.iailab.module.system.framework.sms.core.client.SmsClient;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsSendRespDTO;
-import com.iailab.module.system.dal.dataobject.sms.SmsChannelDO;
-import com.iailab.module.system.dal.dataobject.sms.SmsTemplateDO;
-import com.iailab.module.system.dal.dataobject.user.AdminUserDO;
-import com.iailab.module.system.mq.message.sms.SmsSendMessage;
-import com.iailab.module.system.mq.producer.sms.SmsProducer;
-import com.iailab.module.system.service.member.MemberService;
-import com.iailab.module.system.service.user.AdminUserService;
-import com.google.common.annotations.VisibleForTesting;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.iailab.module.system.enums.ErrorCodeConstants.*;
-
-/**
- * 短信发送 Service 发送的实现
- *
- * @author iailab
- */
-@Service
-@Slf4j
-public class SmsSendServiceImpl implements SmsSendService {
-
-    @Resource
-    private AdminUserService adminUserService;
-    @Resource
-    private MemberService memberService;
-    @Resource
-    private SmsChannelService smsChannelService;
-    @Resource
-    private SmsTemplateService smsTemplateService;
-    @Resource
-    private SmsLogService smsLogService;
-
-    @Resource
-    private SmsProducer smsProducer;
-
-    @Override
-    @DataPermission(enable = false) // 发送短信时,无需考虑数据权限
-    public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map<String, Object> templateParams) {
-        // 如果 mobile 为空,则加载用户编号对应的手机号
-        if (StrUtil.isEmpty(mobile)) {
-            AdminUserDO user = adminUserService.getUser(userId);
-            if (user != null) {
-                mobile = user.getMobile();
-            }
-        }
-        // 执行发送
-        return sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams);
-    }
-
-    @Override
-    public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map<String, Object> templateParams) {
-        // 如果 mobile 为空,则加载用户编号对应的手机号
-        if (StrUtil.isEmpty(mobile)) {
-            mobile = memberService.getMemberUserMobile(userId);
-        }
-        // 执行发送
-        return sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams);
-    }
-
-    @Override
-    public Long sendSingleSms(String mobile, Long userId, Integer userType,
-                              String templateCode, Map<String, Object> templateParams) {
-        // 校验短信模板是否合法
-        SmsTemplateDO template = validateSmsTemplate(templateCode);
-        // 校验短信渠道是否合法
-        SmsChannelDO smsChannel = validateSmsChannel(template.getChannelId());
-
-        // 校验手机号码是否存在
-        mobile = validateMobile(mobile);
-        // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志
-        List<KeyValue<String, Object>> newTemplateParams = buildTemplateParams(template, templateParams);
-
-        // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志
-        Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus())
-                && CommonStatusEnum.ENABLE.getStatus().equals(smsChannel.getStatus());
-        String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams);
-        Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
-
-        // 发送 MQ 消息,异步执行发送短信
-        if (isSend) {
-            smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(),
-                    template.getApiTemplateId(), newTemplateParams);
-        }
-        return sendLogId;
-    }
-
-    @VisibleForTesting
-    SmsChannelDO validateSmsChannel(Long channelId) {
-        // 获得短信模板。考虑到效率,从缓存中获取
-        SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
-        // 短信模板不存在
-        if (channelDO == null) {
-            throw exception(SMS_CHANNEL_NOT_EXISTS);
-        }
-        return channelDO;
-    }
-
-    @VisibleForTesting
-    SmsTemplateDO validateSmsTemplate(String templateCode) {
-        // 获得短信模板。考虑到效率,从缓存中获取
-        SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode);
-        // 短信模板不存在
-        if (template == null) {
-            throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS);
-        }
-        return template;
-    }
-
-    /**
-     * 将参数模板,处理成有序的 KeyValue 数组
-     * <p>
-     * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说 <a href="https://cloud.tencent.com/document/product/382/39023">腾讯云</a>
-     *
-     * @param template       短信模板
-     * @param templateParams 原始参数
-     * @return 处理后的参数
-     */
-    @VisibleForTesting
-    List<KeyValue<String, Object>> buildTemplateParams(SmsTemplateDO template, Map<String, Object> templateParams) {
-        return template.getParams().stream().map(key -> {
-            Object value = templateParams.get(key);
-            if (value == null) {
-                throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, key);
-            }
-            return new KeyValue<>(key, value);
-        }).collect(Collectors.toList());
-    }
-
-    @VisibleForTesting
-    public String validateMobile(String mobile) {
-        if (StrUtil.isEmpty(mobile)) {
-            throw exception(SMS_SEND_MOBILE_NOT_EXISTS);
-        }
-        return mobile;
-    }
-
-    @Override
-    public void doSendSms(SmsSendMessage message) {
-        // 获得渠道对应的 SmsClient 客户端
-        SmsClient smsClient = smsChannelService.getSmsClient(message.getChannelId());
-        Assert.notNull(smsClient, "短信客户端({}) 不存在", message.getChannelId());
-        // 发送短信
-        try {
-            SmsSendRespDTO sendResponse = smsClient.sendSms(message.getLogId(), message.getMobile(),
-                    message.getApiTemplateId(), message.getTemplateParams());
-            smsLogService.updateSmsSendResult(message.getLogId(), sendResponse.getSuccess(),
-                    sendResponse.getApiCode(), sendResponse.getApiMsg(),
-                    sendResponse.getApiRequestId(), sendResponse.getSerialNo());
-        } catch (Throwable ex) {
-            log.error("[doSendSms][发送短信异常,日志编号({})]", message.getLogId(), ex);
-            smsLogService.updateSmsSendResult(message.getLogId(), false,
-                    "EXCEPTION", ExceptionUtil.getRootCauseMessage(ex), null, null);
-        }
-    }
-
-    @Override
-    public void receiveSmsStatus(String channelCode, String text) throws Throwable {
-        // 获得渠道对应的 SmsClient 客户端
-        SmsClient smsClient = smsChannelService.getSmsClient(channelCode);
-        Assert.notNull(smsClient, "短信客户端({}) 不存在", channelCode);
-        // 解析内容
-        List<SmsReceiveRespDTO> receiveResults = smsClient.parseSmsReceiveStatus(text);
-        if (CollUtil.isEmpty(receiveResults)) {
-            return;
-        }
-        // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
-        receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(),
-                result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg()));
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsTemplateService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsTemplateService.java
deleted file mode 100644
index 9179dc1..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsTemplateService.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplateSaveReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsTemplateDO;
-
-import javax.validation.Valid;
-import java.util.Map;
-
-/**
- * 短信模板 Service 接口
- *
- * @author zzf
- * @since 2021/1/25 9:24
- */
-public interface SmsTemplateService {
-
-    /**
-     * 创建短信模板
-     *
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Long createSmsTemplate(@Valid SmsTemplateSaveReqVO createReqVO);
-
-    /**
-     * 更新短信模板
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateSmsTemplate(@Valid SmsTemplateSaveReqVO updateReqVO);
-
-    /**
-     * 删除短信模板
-     *
-     * @param id 编号
-     */
-    void deleteSmsTemplate(Long id);
-
-    /**
-     * 获得短信模板
-     *
-     * @param id 编号
-     * @return 短信模板
-     */
-    SmsTemplateDO getSmsTemplate(Long id);
-
-    /**
-     * 获得短信模板,从缓存中
-     *
-     * @param code 模板编码
-     * @return 短信模板
-     */
-    SmsTemplateDO getSmsTemplateByCodeFromCache(String code);
-
-    /**
-     * 获得短信模板分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 短信模板分页
-     */
-    PageResult<SmsTemplateDO> getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO);
-
-    /**
-     * 获得指定短信渠道下的短信模板数量
-     *
-     * @param channelId 短信渠道编号
-     * @return 数量
-     */
-    Long getSmsTemplateCountByChannelId(Long channelId);
-
-    /**
-     * 格式化短信内容
-     *
-     * @param content 短信模板的内容
-     * @param params 内容的参数
-     * @return 格式化后的内容
-     */
-    String formatSmsTemplateContent(String content, Map<String, Object> params);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsTemplateServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsTemplateServiceImpl.java
deleted file mode 100644
index 8297cee..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/sms/SmsTemplateServiceImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package com.iailab.module.system.service.sms;
-
-import cn.hutool.core.exceptions.ExceptionUtil;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.ReUtil;
-import cn.hutool.core.util.StrUtil;
-import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.framework.sms.core.client.SmsClient;
-import com.iailab.module.system.framework.sms.core.client.dto.SmsTemplateRespDTO;
-import com.iailab.module.system.framework.sms.core.enums.SmsTemplateAuditStatusEnum;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO;
-import com.iailab.module.system.controller.admin.sms.vo.template.SmsTemplateSaveReqVO;
-import com.iailab.module.system.dal.dataobject.sms.SmsChannelDO;
-import com.iailab.module.system.dal.dataobject.sms.SmsTemplateDO;
-import com.iailab.module.system.dal.mysql.sms.SmsTemplateMapper;
-import com.iailab.module.system.dal.redis.RedisKeyConstants;
-import com.google.common.annotations.VisibleForTesting;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.regex.Pattern;
-
-import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.iailab.module.system.enums.ErrorCodeConstants.*;
-
-/**
- * 短信模板 Service 实现类
- *
- * @author zzf
- * @since 2021/1/25 9:25
- */
-@Service
-@Slf4j
-public class SmsTemplateServiceImpl implements SmsTemplateService {
-
-    /**
-     * 正则表达式,匹配 {} 中的变量
-     */
-    private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}");
-
-    @Resource
-    private SmsTemplateMapper smsTemplateMapper;
-
-    @Resource
-    private SmsChannelService smsChannelService;
-
-    @Override
-    public Long createSmsTemplate(SmsTemplateSaveReqVO createReqVO) {
-        // 校验短信渠道
-        SmsChannelDO channelDO = validateSmsChannel(createReqVO.getChannelId());
-        // 校验短信编码是否重复
-        validateSmsTemplateCodeDuplicate(null, createReqVO.getCode());
-        // 校验短信模板
-        validateApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId());
-
-        // 插入
-        SmsTemplateDO template = BeanUtils.toBean(createReqVO, SmsTemplateDO.class);
-        template.setParams(parseTemplateContentParams(template.getContent()));
-        template.setChannelCode(channelDO.getCode());
-        smsTemplateMapper.insert(template);
-        // 返回
-        return template.getId();
-    }
-
-    @Override
-    @CacheEvict(cacheNames = RedisKeyConstants.SMS_TEMPLATE,
-            allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理
-    public void updateSmsTemplate(SmsTemplateSaveReqVO updateReqVO) {
-        // 校验存在
-        validateSmsTemplateExists(updateReqVO.getId());
-        // 校验短信渠道
-        SmsChannelDO channelDO = validateSmsChannel(updateReqVO.getChannelId());
-        // 校验短信编码是否重复
-        validateSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode());
-        // 校验短信模板
-        validateApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId());
-
-        // 更新
-        SmsTemplateDO updateObj = BeanUtils.toBean(updateReqVO, SmsTemplateDO.class);
-        updateObj.setParams(parseTemplateContentParams(updateObj.getContent()));
-        updateObj.setChannelCode(channelDO.getCode());
-        smsTemplateMapper.updateById(updateObj);
-    }
-
-    @Override
-    @CacheEvict(cacheNames = RedisKeyConstants.SMS_TEMPLATE,
-            allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理
-    public void deleteSmsTemplate(Long id) {
-        // 校验存在
-        validateSmsTemplateExists(id);
-        // 更新
-        smsTemplateMapper.deleteById(id);
-    }
-
-    private void validateSmsTemplateExists(Long id) {
-        if (smsTemplateMapper.selectById(id) == null) {
-            throw exception(SMS_TEMPLATE_NOT_EXISTS);
-        }
-    }
-
-    @Override
-    public SmsTemplateDO getSmsTemplate(Long id) {
-        return smsTemplateMapper.selectById(id);
-    }
-
-    @Override
-    @Cacheable(cacheNames = RedisKeyConstants.SMS_TEMPLATE, key = "#code",
-            unless = "#result == null")
-    public SmsTemplateDO getSmsTemplateByCodeFromCache(String code) {
-        return smsTemplateMapper.selectByCode(code);
-    }
-
-    @Override
-    public PageResult<SmsTemplateDO> getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO) {
-        return smsTemplateMapper.selectPage(pageReqVO);
-    }
-
-    @Override
-    public Long getSmsTemplateCountByChannelId(Long channelId) {
-        return smsTemplateMapper.selectCountByChannelId(channelId);
-    }
-
-    @VisibleForTesting
-    public SmsChannelDO validateSmsChannel(Long channelId) {
-        SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
-        if (channelDO == null) {
-            throw exception(SMS_CHANNEL_NOT_EXISTS);
-        }
-        if (CommonStatusEnum.isDisable(channelDO.getStatus())) {
-            throw exception(SMS_CHANNEL_DISABLE);
-        }
-        return channelDO;
-    }
-
-    @VisibleForTesting
-    public void validateSmsTemplateCodeDuplicate(Long id, String code) {
-        SmsTemplateDO template = smsTemplateMapper.selectByCode(code);
-        if (template == null) {
-            return;
-        }
-        // 如果 id 为空,说明不用比较是否为相同 id 的字典类型
-        if (id == null) {
-            throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code);
-        }
-        if (!template.getId().equals(id)) {
-            throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code);
-        }
-    }
-
-    /**
-     * 校验 API 短信平台的模板是否有效
-     *
-     * @param channelId 渠道编号
-     * @param apiTemplateId API 模板编号
-     */
-    @VisibleForTesting
-    void validateApiTemplate(Long channelId, String apiTemplateId) {
-        // 获得短信模板
-        SmsClient smsClient = smsChannelService.getSmsClient(channelId);
-        Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", channelId));
-        SmsTemplateRespDTO template;
-        try {
-            template = smsClient.getSmsTemplate(apiTemplateId);
-        } catch (Throwable ex) {
-            throw exception(SMS_TEMPLATE_API_ERROR, ExceptionUtil.getRootCauseMessage(ex));
-        }
-        // 校验短信模版
-        if (template == null) {
-            throw exception(SMS_TEMPLATE_API_NOT_FOUND);
-        }
-        if (Objects.equals(template.getAuditStatus(), SmsTemplateAuditStatusEnum.CHECKING.getStatus())) {
-            throw exception(SMS_TEMPLATE_API_AUDIT_CHECKING);
-        }
-        if (Objects.equals(template.getAuditStatus(), SmsTemplateAuditStatusEnum.FAIL.getStatus())) {
-            throw exception(SMS_TEMPLATE_API_AUDIT_FAIL, template.getAuditReason());
-        }
-        Assert.equals(template.getAuditStatus(), SmsTemplateAuditStatusEnum.SUCCESS.getStatus(),
-                String.format("短信模板(%s) 审核状态(%d) 不正确", apiTemplateId, template.getAuditStatus()));
-    }
-
-    @Override
-    public String formatSmsTemplateContent(String content, Map<String, Object> params) {
-        return StrUtil.format(content, params);
-    }
-
-    @VisibleForTesting
-    List<String> parseTemplateContentParams(String content) {
-        return ReUtil.findAllGroup1(PATTERN_PARAMS, content);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialClientService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialClientService.java
deleted file mode 100644
index 7fc5afc..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialClientService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.iailab.module.system.service.social;
-
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO;
-import com.iailab.module.system.dal.dataobject.social.SocialClientDO;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import com.xingyuv.jushauth.model.AuthUser;
-import me.chanjar.weixin.common.bean.WxJsapiSignature;
-
-import javax.validation.Valid;
-
-/**
- * 社交应用 Service 接口
- *
- * @author iailab
- */
-public interface SocialClientService {
-
-    /**
-     * 获得社交平台的授权 URL
-     *
-     * @param socialType 社交平台的类型 {@link SocialTypeEnum}
-     * @param userType 用户类型
-     * @param redirectUri 重定向 URL
-     * @return 社交平台的授权 URL
-     */
-    String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri);
-
-    /**
-     * 请求社交平台,获得授权的用户
-     *
-     * @param socialType 社交平台的类型
-     * @param userType 用户类型
-     * @param code 授权码
-     * @param state 授权 state
-     * @return 授权的用户
-     */
-    AuthUser getAuthUser(Integer socialType, Integer userType, String code, String state);
-
-    // =================== 微信公众号独有 ===================
-
-    /**
-     * 创建微信公众号的 JS SDK 初始化所需的签名
-     *
-     * @param userType 用户类型
-     * @param url 访问的 URL 地址
-     * @return 签名
-     */
-    WxJsapiSignature createWxMpJsapiSignature(Integer userType, String url);
-
-    // =================== 微信小程序独有 ===================
-
-    /**
-     * 获得微信小程序的手机信息
-     *
-     * @param userType 用户类型
-     * @param phoneCode 手机授权码
-     * @return 手机信息
-     */
-    WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode);
-
-    // =================== 客户端管理 ===================
-
-    /**
-     * 创建社交客户端
-     *
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Long createSocialClient(@Valid SocialClientSaveReqVO createReqVO);
-
-    /**
-     * 更新社交客户端
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateSocialClient(@Valid SocialClientSaveReqVO updateReqVO);
-
-    /**
-     * 删除社交客户端
-     *
-     * @param id 编号
-     */
-    void deleteSocialClient(Long id);
-
-    /**
-     * 获得社交客户端
-     *
-     * @param id 编号
-     * @return 社交客户端
-     */
-    SocialClientDO getSocialClient(Long id);
-
-    /**
-     * 获得社交客户端分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 社交客户端分页
-     */
-    PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageReqVO);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialClientServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialClientServiceImpl.java
deleted file mode 100644
index c0a400f..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialClientServiceImpl.java
+++ /dev/null
@@ -1,351 +0,0 @@
-package com.iailab.module.system.service.social;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.ObjUtil;
-import cn.hutool.core.util.ReflectUtil;
-import com.iailab.framework.common.enums.CommonStatusEnum;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.framework.common.util.cache.CacheUtils;
-import com.iailab.framework.common.util.http.HttpUtils;
-import com.iailab.framework.common.util.object.BeanUtils;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
-import com.iailab.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO;
-import com.iailab.module.system.dal.dataobject.social.SocialClientDO;
-import com.iailab.module.system.dal.mysql.social.SocialClientMapper;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties;
-import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.xingyuv.jushauth.config.AuthConfig;
-import com.xingyuv.jushauth.model.AuthCallback;
-import com.xingyuv.jushauth.model.AuthResponse;
-import com.xingyuv.jushauth.model.AuthUser;
-import com.xingyuv.jushauth.request.AuthRequest;
-import com.xingyuv.jushauth.utils.AuthStateUtils;
-import com.xingyuv.justauth.AuthRequestFactory;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import me.chanjar.weixin.common.bean.WxJsapiSignature;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
-import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.Duration;
-import java.util.Objects;
-
-import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.iailab.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache;
-import static com.iailab.framework.common.util.json.JsonUtils.toJsonString;
-import static com.iailab.module.system.enums.ErrorCodeConstants.*;
-
-/**
- * 社交应用 Service 实现类
- *
- * @author iailab
- */
-@Service
-@Slf4j
-public class SocialClientServiceImpl implements SocialClientService {
-
-    /**
-     * 小程序版本
-     *
-     * 1. release:正式版
-     * 2. trial:体验版
-     * 3. developer:开发版
-     */
-    @Value("${yudao.wxa-code.env-version:release}")
-    public String envVersion;
-
-    @Resource
-    private AuthRequestFactory authRequestFactory;
-
-    @Resource
-    private WxMpService wxMpService;
-    @Resource
-    private WxMpProperties wxMpProperties;
-    @Resource
-    private StringRedisTemplate stringRedisTemplate; // WxMpService 需要使用到,所以在 Service 注入了它
-    /**
-     * 缓存 WxMpService 对象
-     *
-     * key:使用微信公众号的 appId + secret 拼接,即 {@link SocialClientDO} 的 clientId 和 clientSecret 属性。
-     * 为什么 key 使用这种格式?因为 {@link SocialClientDO} 在管理后台可以变更,通过这个 key 存储它的单例。
-     *
-     * 为什么要做 WxMpService 缓存?因为 WxMpService 构建成本比较大,所以尽量保证它是单例。
-     */
-    private final LoadingCache<String, WxMpService> wxMpServiceCache = buildAsyncReloadingCache(
-            Duration.ofSeconds(10L),
-            new CacheLoader<String, WxMpService>() {
-
-                @Override
-                public WxMpService load(String key) {
-                    String[] keys = key.split(":");
-                    return buildWxMpService(keys[0], keys[1]);
-                }
-
-            });
-
-    @Resource
-    private WxMaService wxMaService;
-    @Resource
-    private WxMaProperties wxMaProperties;
-    /**
-     * 缓存 WxMaService 对象
-     *
-     * 说明同 {@link #wxMpServiceCache} 变量
-     */
-    private final LoadingCache<String, WxMaService> wxMaServiceCache = buildAsyncReloadingCache(
-            Duration.ofSeconds(10L),
-            new CacheLoader<String, WxMaService>() {
-
-                @Override
-                public WxMaService load(String key) {
-                    String[] keys = key.split(":");
-                    return buildWxMaService(keys[0], keys[1]);
-                }
-
-            });
-
-    @Resource
-    private SocialClientMapper socialClientMapper;
-
-    @Override
-    public String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri) {
-        // 获得对应的 AuthRequest 实现
-        AuthRequest authRequest = buildAuthRequest(socialType, userType);
-        // 生成跳转地址
-        String authorizeUri = authRequest.authorize(AuthStateUtils.createState());
-        return HttpUtils.replaceUrlQuery(authorizeUri, "redirect_uri", redirectUri);
-    }
-
-    @Override
-    public AuthUser getAuthUser(Integer socialType, Integer userType, String code, String state) {
-        // 构建请求
-        AuthRequest authRequest = buildAuthRequest(socialType, userType);
-        AuthCallback authCallback = AuthCallback.builder().code(code).state(state).build();
-        // 执行请求
-        AuthResponse<?> authResponse = authRequest.login(authCallback);
-        log.info("[getAuthUser][请求社交平台 type({}) request({}) response({})]", socialType,
-                toJsonString(authCallback), toJsonString(authResponse));
-        if (!authResponse.ok()) {
-            throw exception(SOCIAL_USER_AUTH_FAILURE, authResponse.getMsg());
-        }
-        return (AuthUser) authResponse.getData();
-    }
-
-    /**
-     * 构建 AuthRequest 对象,支持多租户配置
-     *
-     * @param socialType 社交类型
-     * @param userType 用户类型
-     * @return AuthRequest 对象
-     */
-    @VisibleForTesting
-    AuthRequest buildAuthRequest(Integer socialType, Integer userType) {
-        // 1. 先查找默认的配置项,从 application-*.yaml 中读取
-        AuthRequest request = authRequestFactory.get(SocialTypeEnum.valueOfType(socialType).getSource());
-        Assert.notNull(request, String.format("社交平台(%d) 不存在", socialType));
-        // 2. 查询 DB 的配置项,如果存在则进行覆盖
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(socialType, userType);
-        if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
-            // 2.1 构造新的 AuthConfig 对象
-            AuthConfig authConfig = (AuthConfig) ReflectUtil.getFieldValue(request, "config");
-            AuthConfig newAuthConfig = ReflectUtil.newInstance(authConfig.getClass());
-            BeanUtil.copyProperties(authConfig, newAuthConfig);
-            // 2.2 修改对应的 clientId + clientSecret 密钥
-            newAuthConfig.setClientId(client.getClientId());
-            newAuthConfig.setClientSecret(client.getClientSecret());
-            if (client.getAgentId() != null) { // 如果有 agentId 则修改 agentId
-                newAuthConfig.setAgentId(client.getAgentId());
-            }
-            // 2.3 设置会 request 里,进行后续使用
-            ReflectUtil.setFieldValue(request, "config", newAuthConfig);
-        }
-        return request;
-    }
-
-    // =================== 微信公众号独有 ===================
-
-    @Override
-    @SneakyThrows
-    public WxJsapiSignature createWxMpJsapiSignature(Integer userType, String url) {
-        WxMpService service = getWxMpService(userType);
-        return service.createJsapiSignature(url);
-    }
-
-    /**
-     * 获得 clientId + clientSecret 对应的 WxMpService 对象
-     *
-     * @param userType 用户类型
-     * @return WxMpService 对象
-     */
-    @VisibleForTesting
-    WxMpService getWxMpService(Integer userType) {
-        // 第一步,查询 DB 的配置项,获得对应的 WxMpService 对象
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(
-                SocialTypeEnum.WECHAT_MP.getType(), userType);
-        if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
-            return wxMpServiceCache.getUnchecked(client.getClientId() + ":" + client.getClientSecret());
-        }
-        // 第二步,不存在 DB 配置项,则使用 application-*.yaml 对应的 WxMpService 对象
-        return wxMpService;
-    }
-
-    /**
-     * 创建 clientId + clientSecret 对应的 WxMpService 对象
-     *
-     * @param clientId 微信公众号 appId
-     * @param clientSecret 微信公众号 secret
-     * @return WxMpService 对象
-     */
-    public WxMpService buildWxMpService(String clientId, String clientSecret) {
-        // 第一步,创建 WxMpRedisConfigImpl 对象
-        WxMpRedisConfigImpl configStorage = new WxMpRedisConfigImpl(
-                new RedisTemplateWxRedisOps(stringRedisTemplate),
-                wxMpProperties.getConfigStorage().getKeyPrefix());
-        configStorage.setAppId(clientId);
-        configStorage.setSecret(clientSecret);
-
-        // 第二步,创建 WxMpService 对象
-        WxMpService service = new WxMpServiceImpl();
-        service.setWxMpConfigStorage(configStorage);
-        return service;
-    }
-
-    // =================== 微信小程序独有 ===================
-
-    @Override
-    public WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode) {
-        WxMaService service = getWxMaService(userType);
-        try {
-            return service.getUserService().getPhoneNoInfo(phoneCode);
-        } catch (WxErrorException e) {
-            log.error("[getPhoneNoInfo][userType({}) phoneCode({}) 获得手机号失败]", userType, phoneCode, e);
-            throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR);
-        }
-    }
-
-    /**
-     * 获得 clientId + clientSecret 对应的 WxMpService 对象
-     *
-     * @param userType 用户类型
-     * @return WxMpService 对象
-     */
-    @VisibleForTesting
-    WxMaService getWxMaService(Integer userType) {
-        // 第一步,查询 DB 的配置项,获得对应的 WxMaService 对象
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(
-                SocialTypeEnum.WECHAT_MINI_APP.getType(), userType);
-        if (client != null && Objects.equals(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
-            return wxMaServiceCache.getUnchecked(client.getClientId() + ":" + client.getClientSecret());
-        }
-        // 第二步,不存在 DB 配置项,则使用 application-*.yaml 对应的 WxMaService 对象
-        return wxMaService;
-    }
-
-    /**
-     * 创建 clientId + clientSecret 对应的 WxMaService 对象
-     *
-     * @param clientId 微信小程序 appId
-     * @param clientSecret 微信小程序 secret
-     * @return WxMaService 对象
-     */
-    private WxMaService buildWxMaService(String clientId, String clientSecret) {
-        // 第一步,创建 WxMaRedisBetterConfigImpl 对象
-        WxMaRedisBetterConfigImpl configStorage = new WxMaRedisBetterConfigImpl(
-                new RedisTemplateWxRedisOps(stringRedisTemplate),
-                wxMaProperties.getConfigStorage().getKeyPrefix());
-        configStorage.setAppid(clientId);
-        configStorage.setSecret(clientSecret);
-
-        // 第二步,创建 WxMpService 对象
-        WxMaService service = new WxMaServiceImpl();
-        service.setWxMaConfig(configStorage);
-        return service;
-    }
-
-    // =================== 客户端管理 ===================
-
-    @Override
-    public Long createSocialClient(SocialClientSaveReqVO createReqVO) {
-        // 校验重复
-        validateSocialClientUnique(null, createReqVO.getUserType(), createReqVO.getSocialType());
-
-        // 插入
-        SocialClientDO client = BeanUtils.toBean(createReqVO, SocialClientDO.class);
-        socialClientMapper.insert(client);
-        return client.getId();
-    }
-
-    @Override
-    public void updateSocialClient(SocialClientSaveReqVO updateReqVO) {
-        // 校验存在
-        validateSocialClientExists(updateReqVO.getId());
-        // 校验重复
-        validateSocialClientUnique(updateReqVO.getId(), updateReqVO.getUserType(), updateReqVO.getSocialType());
-
-        // 更新
-        SocialClientDO updateObj = BeanUtils.toBean(updateReqVO, SocialClientDO.class);
-        socialClientMapper.updateById(updateObj);
-    }
-
-    @Override
-    public void deleteSocialClient(Long id) {
-        // 校验存在
-        validateSocialClientExists(id);
-        // 删除
-        socialClientMapper.deleteById(id);
-    }
-
-    private void validateSocialClientExists(Long id) {
-        if (socialClientMapper.selectById(id) == null) {
-            throw exception(SOCIAL_CLIENT_NOT_EXISTS);
-        }
-    }
-
-    /**
-     * 校验社交应用是否重复,需要保证 userType + socialType 唯一
-     *
-     * 原因是,不同端(userType)选择某个社交登录(socialType)时,需要通过 {@link #buildAuthRequest(Integer, Integer)} 构建对应的请求
-     *
-     * @param id 编号
-     * @param userType 用户类型
-     * @param socialType 社交类型
-     */
-    private void validateSocialClientUnique(Long id, Integer userType, Integer socialType) {
-        SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(
-                socialType, userType);
-        if (client == null) {
-            return;
-        }
-        if (id == null // 新增时,说明重复
-                || ObjUtil.notEqual(id, client.getId())) { // 更新时,如果 id 不一致,说明重复
-            throw exception(SOCIAL_CLIENT_UNIQUE);
-        }
-    }
-
-    @Override
-    public SocialClientDO getSocialClient(Long id) {
-        return socialClientMapper.selectById(id);
-    }
-
-    @Override
-    public PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageReqVO) {
-        return socialClientMapper.selectPage(pageReqVO);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialUserService.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialUserService.java
deleted file mode 100644
index f017f8d..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialUserService.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.iailab.module.system.service.social;
-
-import com.iailab.framework.common.exception.ServiceException;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
-import com.iailab.module.system.api.social.dto.SocialUserRespDTO;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
-import com.iailab.module.system.dal.dataobject.social.SocialUserDO;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-
-import javax.validation.Valid;
-import java.util.List;
-
-/**
- * 社交用户 Service 接口,例如说社交平台的授权登录
- *
- * @author iailab
- */
-public interface SocialUserService {
-
-    /**
-     * 获得指定用户的社交用户列表
-     *
-     * @param userId   用户编号
-     * @param userType 用户类型
-     * @return 社交用户列表
-     */
-    List<SocialUserDO> getSocialUserList(Long userId, Integer userType);
-
-    /**
-     * 绑定社交用户
-     *
-     * @param reqDTO 绑定信息
-     * @return 社交用户 openid
-     */
-    String bindSocialUser(@Valid SocialUserBindReqDTO reqDTO);
-
-    /**
-     * 取消绑定社交用户
-     *
-     * @param userId 用户编号
-     * @param userType 全局用户类型
-     * @param socialType 社交平台的类型 {@link SocialTypeEnum}
-     * @param openid 社交平台的 openid
-     */
-    void unbindSocialUser(Long userId, Integer userType, Integer socialType, String openid);
-
-    /**
-     * 获得社交用户,基于 userId
-     *
-     * @param userType 用户类型
-     * @param userId 用户编号
-     * @param socialType 社交平台的类型
-     * @return 社交用户
-     */
-    SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType);
-
-    /**
-     * 获得社交用户
-     *
-     * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
-     *
-     * @param userType 用户类型
-     * @param socialType 社交平台的类型
-     * @param code 授权码
-     * @param state state
-     * @return 社交用户
-     */
-    SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state);
-
-    // ==================== 社交用户 CRUD ====================
-
-    /**
-     * 获得社交用户
-     *
-     * @param id 编号
-     * @return 社交用户
-     */
-    SocialUserDO getSocialUser(Long id);
-
-    /**
-     * 获得社交用户分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 社交用户分页
-     */
-    PageResult<SocialUserDO> getSocialUserPage(SocialUserPageReqVO pageReqVO);
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialUserServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialUserServiceImpl.java
deleted file mode 100644
index 177b1b6..0000000
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/social/SocialUserServiceImpl.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package com.iailab.module.system.service.social;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.Assert;
-import com.iailab.framework.common.exception.ServiceException;
-import com.iailab.framework.common.pojo.PageResult;
-import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
-import com.iailab.module.system.api.social.dto.SocialUserRespDTO;
-import com.iailab.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
-import com.iailab.module.system.dal.dataobject.social.SocialUserBindDO;
-import com.iailab.module.system.dal.dataobject.social.SocialUserDO;
-import com.iailab.module.system.dal.mysql.social.SocialUserBindMapper;
-import com.iailab.module.system.dal.mysql.social.SocialUserMapper;
-import com.iailab.module.system.enums.social.SocialTypeEnum;
-import com.xingyuv.jushauth.model.AuthUser;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.validation.annotation.Validated;
-
-import javax.annotation.Resource;
-import javax.validation.constraints.NotNull;
-import java.util.Collections;
-import java.util.List;
-
-import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.iailab.framework.common.util.collection.CollectionUtils.convertSet;
-import static com.iailab.framework.common.util.json.JsonUtils.toJsonString;
-import static com.iailab.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND;
-
-/**
- * 社交用户 Service 实现类
- *
- * @author iailab
- */
-@Service
-@Validated
-@Slf4j
-public class SocialUserServiceImpl implements SocialUserService {
-
-    @Resource
-    private SocialUserBindMapper socialUserBindMapper;
-    @Resource
-    private SocialUserMapper socialUserMapper;
-
-    @Resource
-    private SocialClientService socialClientService;
-
-    @Override
-    public List<SocialUserDO> getSocialUserList(Long userId, Integer userType) {
-        // 获得绑定
-        List<SocialUserBindDO> socialUserBinds = socialUserBindMapper.selectListByUserIdAndUserType(userId, userType);
-        if (CollUtil.isEmpty(socialUserBinds)) {
-            return Collections.emptyList();
-        }
-        // 获得社交用户
-        return socialUserMapper.selectBatchIds(convertSet(socialUserBinds, SocialUserBindDO::getSocialUserId));
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public String bindSocialUser(SocialUserBindReqDTO reqDTO) {
-        // 获得社交用户
-        SocialUserDO socialUser = authSocialUser(reqDTO.getSocialType(), reqDTO.getUserType(),
-                reqDTO.getCode(), reqDTO.getState());
-        Assert.notNull(socialUser, "社交用户不能为空");
-
-        // 社交用户可能之前绑定过别的用户,需要进行解绑
-        socialUserBindMapper.deleteByUserTypeAndSocialUserId(reqDTO.getUserType(), socialUser.getId());
-
-        // 用户可能之前已经绑定过该社交类型,需要进行解绑
-        socialUserBindMapper.deleteByUserTypeAndUserIdAndSocialType(reqDTO.getUserType(), reqDTO.getUserId(),
-                socialUser.getType());
-
-        // 绑定当前登录的社交用户
-        SocialUserBindDO socialUserBind = SocialUserBindDO.builder()
-                .userId(reqDTO.getUserId()).userType(reqDTO.getUserType())
-                .socialUserId(socialUser.getId()).socialType(socialUser.getType()).build();
-        socialUserBindMapper.insert(socialUserBind);
-        return socialUser.getOpenid();
-    }
-
-    @Override
-    public void unbindSocialUser(Long userId, Integer userType, Integer socialType, String openid) {
-        // 获得 openid 对应的 SocialUserDO 社交用户
-        SocialUserDO socialUser = socialUserMapper.selectByTypeAndOpenid(socialType, openid);
-        if (socialUser == null) {
-            throw exception(SOCIAL_USER_NOT_FOUND);
-        }
-
-        // 获得对应的社交绑定关系
-        socialUserBindMapper.deleteByUserTypeAndUserIdAndSocialType(userType, userId, socialUser.getType());
-    }
-
-    @Override
-    public SocialUserRespDTO getSocialUserByUserId(Integer userType, Long userId, Integer socialType) {
-        // 获得绑定用户
-        SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserIdAndUserTypeAndSocialType(userId, userType, socialType);
-        if (socialUserBind == null) {
-            return null;
-        }
-        // 获得社交用户
-        SocialUserDO socialUser = socialUserMapper.selectById(socialUserBind.getSocialUserId());
-        Assert.notNull(socialUser, "社交用户不能为空");
-        return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(),
-                socialUserBind.getUserId());
-    }
-
-    @Override
-    public SocialUserRespDTO getSocialUserByCode(Integer userType, Integer socialType, String code, String state) {
-        // 获得社交用户
-        SocialUserDO socialUser = authSocialUser(socialType, userType, code, state);
-        Assert.notNull(socialUser, "社交用户不能为空");
-
-        // 获得绑定用户
-        SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(userType,
-                socialUser.getId());
-        return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(),
-                socialUserBind != null ? socialUserBind.getUserId() : null);
-    }
-
-    /**
-     * 授权获得对应的社交用户
-     * 如果授权失败,则会抛出 {@link ServiceException} 异常
-     *
-     * @param socialType 社交平台的类型 {@link SocialTypeEnum}
-     * @param userType 用户类型
-     * @param code     授权码
-     * @param state    state
-     * @return 授权用户
-     */
-    @NotNull
-    public SocialUserDO authSocialUser(Integer socialType, Integer userType, String code, String state) {
-        // 优先从 DB 中获取,因为 code 有且可以使用一次。
-        // 在社交登录时,当未绑定 User 时,需要绑定登录,此时需要 code 使用两次
-        SocialUserDO socialUser = socialUserMapper.selectByTypeAndCodeAnState(socialType, code, state);
-        if (socialUser != null) {
-            return socialUser;
-        }
-
-        // 请求获取
-        AuthUser authUser = socialClientService.getAuthUser(socialType, userType, code, state);
-        Assert.notNull(authUser, "三方用户不能为空");
-
-        // 保存到 DB 中
-        socialUser = socialUserMapper.selectByTypeAndOpenid(socialType, authUser.getUuid());
-        if (socialUser == null) {
-            socialUser = new SocialUserDO();
-        }
-        socialUser.setType(socialType).setCode(code).setState(state) // 需要保存 code + state 字段,保证后续可查询
-                .setOpenid(authUser.getUuid()).setToken(authUser.getToken().getAccessToken()).setRawTokenInfo((toJsonString(authUser.getToken())))
-                .setNickname(authUser.getNickname()).setAvatar(authUser.getAvatar()).setRawUserInfo(toJsonString(authUser.getRawUserInfo()));
-        if (socialUser.getId() == null) {
-            socialUserMapper.insert(socialUser);
-        } else {
-            socialUserMapper.updateById(socialUser);
-        }
-        return socialUser;
-    }
-
-    // ==================== 社交用户 CRUD ====================
-
-    @Override
-    public SocialUserDO getSocialUser(Long id) {
-        return socialUserMapper.selectById(id);
-    }
-
-    @Override
-    public PageResult<SocialUserDO> getSocialUserPage(SocialUserPageReqVO pageReqVO) {
-        return socialUserMapper.selectPage(pageReqVO);
-    }
-
-}
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/resources/application-dev.yaml b/iailab-module-system/iailab-module-system-biz/src/main/resources/application-dev.yaml
index 4188c19..3d08576 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/resources/application-dev.yaml
+++ b/iailab-module-system/iailab-module-system-biz/src/main/resources/application-dev.yaml
@@ -39,7 +39,7 @@
       primary: master
       datasource:
         master:
-          url: jdbc:mysql://172.16.8.100:3306/iailab_plat_system?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          url: jdbc:mysql://localhost:3306/iailab_plat_system?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
           username: root
           password: 123456
         slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
@@ -64,7 +64,7 @@
 spring:
   # RabbitMQ 配置项,对应 RabbitProperties 配置类
   rabbitmq:
-    host: 172.16.8.200 # RabbitMQ 服务的地址
+    host: 172.16.1.221 # RabbitMQ 服务的地址
     port: 5672 # RabbitMQ 服务的端口
     username: admin # RabbitMQ 服务的账号
     password: admin123 # RabbitMQ 服务的密码
@@ -72,6 +72,13 @@
   kafka:
     bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
 
+--- #################### 定时任务相关配置 ####################
+xxl:
+  job:
+    enabled: true # 是否开启调度中心,默认为 true 开启
+    admin:
+      addresses: http://172.16.216.135:9090/xxl-job-admin # 调度中心部署跟地址
+
 --- #################### 服务保障相关配置 ####################
 
 # Lock4j 配置项
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/resources/application.yaml b/iailab-module-system/iailab-module-system-biz/src/main/resources/application.yaml
index c2167c8..15f0ab1 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/resources/application.yaml
+++ b/iailab-module-system/iailab-module-system-biz/src/main/resources/application.yaml
@@ -12,6 +12,7 @@
       username: @nacos.username@
       password: @nacos.password@
       discovery: # 【配置中心】配置项
+#        ip: 172.16.8.200
         namespace: @profiles.active@
         group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
         metadata:
@@ -155,6 +156,16 @@
     req-check-minute-limit: 60 # check 接口一分钟内请求数限制
     req-verify-minute-limit: 60 # verify 接口一分钟内请求数限制
 
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+  job:
+    executor:
+#      ip: 172.16.8.200
+      appname: ${spring.application.name} # 执行器 AppName
+      logpath: D:/DLUT/IailabPlat/webapp/infra/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径
+    accessToken: default_token # 执行器通讯TOKEN
+
 --- #################### 平台相关配置 ####################
 
 iailab:
diff --git a/iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/IailabClient.java b/iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/IailabClient.java
index 96b3342..ce84464 100644
--- a/iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/IailabClient.java
+++ b/iailab-plat-sdk/src/main/java/com/iailab/sdk/auth/client/IailabClient.java
@@ -80,7 +80,7 @@
     private static final String RESP_DATA = "data";
 
     /**
-     * 用户名密码方式获取平台token
+     * 客户端方式获取平台token
      */
     public static synchronized TokenDTO authenticate() {
         System.out.println("登录获取平台token");
diff --git a/pom.xml b/pom.xml
index fb75d8b..b743a55 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,8 +13,8 @@
         <!--  各种 module 拓展 -->
         <module>iailab-module-system</module>
         <module>iailab-module-infra</module>
-        <module>iailab-module-bpm</module>
-        <module>iailab-module-report</module>
+<!--        <module>iailab-module-bpm</module>-->
+<!--        <module>iailab-module-report</module>-->
         <module>iailab-module-data</module>
         <module>iailab-module-model</module>
     </modules>

--
Gitblit v1.9.3