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> +<!-- <!– 三方云服务相关 –>--> +<!-- <dependency>--> +<!-- <groupId>com.xingyuv</groupId>--> +<!-- <artifactId>spring-boot-starter-justauth</artifactId> <!– 社交登陆(例如说,个人微信、企业微信等等) –>--> +<!-- </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> <!– 短信(阿里云) –>--> +<!-- </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.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×tamp=%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