fix: 完善清扫记录;增加告警推送

master
wangrunpu 3 weeks ago
parent b39d89ba88
commit f2676dec9d

@ -40,4 +40,7 @@ public class IotAlertRecordRespVO {
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime updateTime;
} }

@ -62,4 +62,5 @@ public interface IotAlertRecordService {
*/ */
Long createAlertRecord(IotAlertConfigDO config, Long sceneRuleId, IotDeviceMessage deviceMessage); Long createAlertRecord(IotAlertConfigDO config, Long sceneRuleId, IotDeviceMessage deviceMessage);
Long createAlertRecord(IotAlertRecordDO alertRecordDO);
} }

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.iot.service.alert; package cn.iocoder.yudao.module.iot.service.alert;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod.IotAlertRecordPageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.alert.vo.recrod.IotAlertRecordPageReqVO;
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
@ -8,19 +9,26 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertConfigDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertRecordDO; import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.mysql.alert.IotAlertRecordMapper; import cn.iocoder.yudao.module.iot.dal.mysql.alert.IotAlertRecordMapper;
import cn.iocoder.yudao.module.iot.framework.job.core.IotSchedulerManager;
import cn.iocoder.yudao.module.iot.framework.mqtt.config.ProvincialPlatformMqttProperties;
import cn.iocoder.yudao.module.iot.job.alert.IotAlertRecordPushJob;
import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* IoT Service * IoT Service
* *
* @author * @author
*/ */
@Slf4j
@Service @Service
@Validated @Validated
public class IotAlertRecordServiceImpl implements IotAlertRecordService { public class IotAlertRecordServiceImpl implements IotAlertRecordService {
@ -31,6 +39,12 @@ public class IotAlertRecordServiceImpl implements IotAlertRecordService {
@Resource @Resource
private IotDeviceService deviceService; private IotDeviceService deviceService;
@Resource(name = "iotSchedulerManager")
private IotSchedulerManager schedulerManager;
@Resource(required = false)
private ProvincialPlatformMqttProperties mqttProperties;
@Override @Override
public IotAlertRecordDO getAlertRecord(Long id) { public IotAlertRecordDO getAlertRecord(Long id) {
return alertRecordMapper.selectById(id); return alertRecordMapper.selectById(id);
@ -54,6 +68,11 @@ public class IotAlertRecordServiceImpl implements IotAlertRecordService {
// 批量更新告警记录的处理状态 // 批量更新告警记录的处理状态
alertRecordMapper.updateList(ids, IotAlertRecordDO.builder() alertRecordMapper.updateList(ids, IotAlertRecordDO.builder()
.processStatus(true).processRemark(processRemark).build()); .processStatus(true).processRemark(processRemark).build());
// 停止所有相关告警的推送定时任务
for (Long alertRecordId : ids) {
stopAlertPushJob(alertRecordId);
}
} }
@Override @Override
@ -77,4 +96,79 @@ public class IotAlertRecordServiceImpl implements IotAlertRecordService {
return record.getId(); return record.getId();
} }
@Override
public Long createAlertRecord(IotAlertRecordDO alertRecordDO) {
alertRecordMapper.insert(alertRecordDO);
// 启动定时任务推送告警记录到省平台
startAlertPushJob(alertRecordDO.getId());
return alertRecordDO.getId();
}
/**
*
*
* @param alertRecordId
*/
private void startAlertPushJob(Long alertRecordId) {
// 检查是否启用省平台MQTT推送
if (mqttProperties == null || !Boolean.TRUE.equals(mqttProperties.getEnabled())) {
log.debug("[startAlertPushJob][省平台MQTT推送未启用跳过启动定时任务告警ID: {}]", alertRecordId);
return;
}
try {
// 构建任务名称和数据
String jobName = buildAlertPushJobName(alertRecordId);
Map<String, Object> jobDataMap = MapUtil.of(IotAlertRecordPushJob.JOB_DATA_KEY_ALERT_RECORD_ID, alertRecordId);
// 构建CRON表达式每N秒执行一次从配置中读取
Integer pushIntervalSeconds = mqttProperties.getPushIntervalSeconds();
String cronExpression = String.format("0/%d * * * * ?", pushIntervalSeconds);
// 注册定时任务
schedulerManager.addOrUpdateJob(
IotAlertRecordPushJob.class,
jobName,
cronExpression,
jobDataMap
);
log.info("[startAlertPushJob][启动告警推送定时任务成功告警ID: {}, 推送间隔: {}秒]",
alertRecordId, pushIntervalSeconds);
} catch (SchedulerException e) {
log.error("[startAlertPushJob][启动告警推送定时任务失败告警ID: {}]", alertRecordId, e);
}
}
/**
*
*
* @param alertRecordId
*/
private void stopAlertPushJob(Long alertRecordId) {
// 检查是否启用省平台MQTT推送
if (mqttProperties == null || !Boolean.TRUE.equals(mqttProperties.getEnabled())) {
return;
}
try {
String jobName = buildAlertPushJobName(alertRecordId);
schedulerManager.deleteJob(jobName);
log.info("[stopAlertPushJob][停止告警推送定时任务成功告警ID: {}]", alertRecordId);
} catch (SchedulerException e) {
log.error("[stopAlertPushJob][停止告警推送定时任务失败告警ID: {}]", alertRecordId, e);
}
}
/**
*
*
* @param alertRecordId
* @return
*/
private String buildAlertPushJobName(Long alertRecordId) {
return String.format("%s_%d", IotAlertRecordPushJob.class.getSimpleName(), alertRecordId);
}
} }

@ -17,9 +17,11 @@ import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum;
import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
import cn.iocoder.yudao.module.iot.core.mq.producer.IotDeviceMessageProducer; import cn.iocoder.yudao.module.iot.core.mq.producer.IotDeviceMessageProducer;
import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils; import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils;
import cn.iocoder.yudao.module.iot.dal.dataobject.alert.IotAlertRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
import cn.iocoder.yudao.module.iot.dal.tdengine.IotDeviceMessageMapper; import cn.iocoder.yudao.module.iot.dal.tdengine.IotDeviceMessageMapper;
import cn.iocoder.yudao.module.iot.service.alert.IotAlertRecordService;
import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
import cn.iocoder.yudao.module.iot.service.device.property.IotDevicePropertyService; import cn.iocoder.yudao.module.iot.service.device.property.IotDevicePropertyService;
import cn.iocoder.yudao.module.iot.service.ota.IotOtaTaskRecordService; import cn.iocoder.yudao.module.iot.service.ota.IotOtaTaskRecordService;
@ -35,6 +37,7 @@ import org.springframework.validation.annotation.Validated;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -52,6 +55,8 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DEVICE_DOWNST
@Slf4j @Slf4j
public class IotDeviceMessageServiceImpl implements IotDeviceMessageService { public class IotDeviceMessageServiceImpl implements IotDeviceMessageService {
@Resource
private IotAlertRecordService alertRecordService;
@Resource @Resource
private IotDeviceService deviceService; private IotDeviceService deviceService;
@Resource @Resource
@ -203,6 +208,22 @@ public class IotDeviceMessageServiceImpl implements IotDeviceMessageService {
return null; return null;
} }
// 事件上报 TODO 以后事件触发器完善后 需要剔除这里的处理
if (Objects.equal(message.getMethod(), IotDeviceMessageMethodEnum.EVENT_POST.getMethod())) {
HashMap<String, Object> params = (HashMap<String, Object>) message.getParams();
IotAlertRecordDO alertRecordDO = new IotAlertRecordDO();
alertRecordDO.setConfigId(0L);
alertRecordDO.setConfigName("温度高报");
alertRecordDO.setConfigLevel(3);
alertRecordDO.setSceneRuleId(0L);
alertRecordDO.setDeviceId(device.getId());
alertRecordDO.setProductId(device.getProductId());
alertRecordDO.setDeviceMessage(message);
alertRecordService.createAlertRecord(alertRecordDO);
return null;
}
// OTA 上报升级进度 // OTA 上报升级进度
if (Objects.equal(message.getMethod(), IotDeviceMessageMethodEnum.OTA_PROGRESS.getMethod())) { if (Objects.equal(message.getMethod(), IotDeviceMessageMethodEnum.OTA_PROGRESS.getMethod())) {
otaTaskRecordService.updateOtaRecordProgress(device, message); otaTaskRecordService.updateOtaRecordProgress(device, message);

@ -1,5 +1,8 @@
package cn.iocoder.yudao.module.system.controller.admin.dustclearrecord; package cn.iocoder.yudao.module.system.controller.admin.dustclearrecord;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -42,6 +45,10 @@ public class DustClearrecordController {
@Operation(summary = "创建粉尘清扫打卡记录") @Operation(summary = "创建粉尘清扫打卡记录")
@PreAuthorize("@ss.hasPermission('system:dust-clearrecord:create')") @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:create')")
public CommonResult<String> createDustClearrecord(@Valid @RequestBody DustClearrecordSaveReqVO createReqVO) { public CommonResult<String> createDustClearrecord(@Valid @RequestBody DustClearrecordSaveReqVO createReqVO) {
List<String> clearItemNameList = createReqVO.getClearItemNameList();
if (CollUtil.isNotEmpty(clearItemNameList)) {
createReqVO.setClearItemName(String.join(",", clearItemNameList));
}
return success(dustClearrecordService.createDustClearrecord(createReqVO)); return success(dustClearrecordService.createDustClearrecord(createReqVO));
} }
@ -49,6 +56,10 @@ public class DustClearrecordController {
@Operation(summary = "更新粉尘清扫打卡记录") @Operation(summary = "更新粉尘清扫打卡记录")
@PreAuthorize("@ss.hasPermission('system:dust-clearrecord:update')") @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:update')")
public CommonResult<Boolean> updateDustClearrecord(@Valid @RequestBody DustClearrecordSaveReqVO updateReqVO) { public CommonResult<Boolean> updateDustClearrecord(@Valid @RequestBody DustClearrecordSaveReqVO updateReqVO) {
List<String> clearItemNameList = updateReqVO.getClearItemNameList();
if (CollUtil.isNotEmpty(clearItemNameList)) {
updateReqVO.setClearItemName(String.join(",", clearItemNameList));
}
dustClearrecordService.updateDustClearrecord(updateReqVO); dustClearrecordService.updateDustClearrecord(updateReqVO);
return success(true); return success(true);
} }
@ -77,6 +88,10 @@ public class DustClearrecordController {
@PreAuthorize("@ss.hasPermission('system:dust-clearrecord:query')") @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:query')")
public CommonResult<DustClearrecordRespVO> getDustClearrecord(@RequestParam("id") String id) { public CommonResult<DustClearrecordRespVO> getDustClearrecord(@RequestParam("id") String id) {
DustClearrecordDO dustClearrecord = dustClearrecordService.getDustClearrecord(id); DustClearrecordDO dustClearrecord = dustClearrecordService.getDustClearrecord(id);
String clearItemName = dustClearrecord.getClearItemName();
if (StringUtils.isNotEmpty(clearItemName)) {
dustClearrecord.setClearItemNameList(Arrays.asList(clearItemName.split(",")));
}
return success(BeanUtils.toBean(dustClearrecord, DustClearrecordRespVO.class)); return success(BeanUtils.toBean(dustClearrecord, DustClearrecordRespVO.class));
} }
@ -85,6 +100,13 @@ public class DustClearrecordController {
@PreAuthorize("@ss.hasPermission('system:dust-clearrecord:query')") @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:query')")
public CommonResult<PageResult<DustClearrecordRespVO>> getDustClearrecordPage(@Valid DustClearrecordPageReqVO pageReqVO) { public CommonResult<PageResult<DustClearrecordRespVO>> getDustClearrecordPage(@Valid DustClearrecordPageReqVO pageReqVO) {
PageResult<DustClearrecordDO> pageResult = dustClearrecordService.getDustClearrecordPage(pageReqVO); PageResult<DustClearrecordDO> pageResult = dustClearrecordService.getDustClearrecordPage(pageReqVO);
List<DustClearrecordDO> list = pageResult.getList();
list.forEach(item -> {
String clearItemName = item.getClearItemName();
if (StringUtils.isNotEmpty(clearItemName)) {
item.setClearItemNameList(Arrays.asList(clearItemName.split(",")));
}
});
return success(BeanUtils.toBean(pageResult, DustClearrecordRespVO.class)); return success(BeanUtils.toBean(pageResult, DustClearrecordRespVO.class));
} }

@ -1,59 +1,60 @@
package cn.iocoder.yudao.module.system.controller.admin.dustclearrecord.vo; package cn.iocoder.yudao.module.system.controller.admin.dustclearrecord.vo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import cn.idev.excel.annotation.*; import cn.idev.excel.annotation.*;
@Schema(description = "管理后台 - 粉尘清扫打卡记录 Response VO") @Schema(description = "管理后台 - 粉尘清扫打卡记录 Response VO")
@Data @Data
@ExcelIgnoreUnannotated @ExcelIgnoreUnannotated
public class DustClearrecordRespVO { public class DustClearrecordRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "21496") @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "21496")
@ExcelProperty("主键") @ExcelProperty("主键")
private String id; private String id;
@Schema(description = "数据接入标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2822") @Schema(description = "数据接入标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2822")
@ExcelProperty("数据接入标识") @ExcelProperty("数据接入标识")
private String dataId; private String dataId;
@Schema(description = "清扫项目", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") @Schema(description = "清扫项目", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("清扫项目") @ExcelProperty("清扫项目")
private String clearItemName; private String clearItemName;
private List<String> clearItemNameList;
@Schema(description = "完成情况 0:未完成;1:已完成", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("完成情况 0:未完成;1:已完成") @Schema(description = "完成情况 0:未完成;1:已完成", requiredMode = Schema.RequiredMode.REQUIRED)
private String taskProcess; @ExcelProperty("完成情况 0:未完成;1:已完成")
private String taskProcess;
@Schema(description = "打卡人", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("打卡人") @Schema(description = "打卡人", requiredMode = Schema.RequiredMode.REQUIRED)
private String taskPerson; @ExcelProperty("打卡人")
private String taskPerson;
@Schema(description = "打卡日期", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("打卡日期") @Schema(description = "打卡日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime taskTime; @ExcelProperty("打卡日期")
private LocalDateTime taskTime;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间") @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime; @ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "图片", example = "15259")
@ExcelProperty("图片") @Schema(description = "图片", example = "15259")
private String picOssId; @ExcelProperty("图片")
private String picOssId;
@Schema(description = "图片", example = "https://www.iocoder.cn")
@ExcelProperty("图片") @Schema(description = "图片", example = "https://www.iocoder.cn")
private String picOssUrl; @ExcelProperty("图片")
private String picOssUrl;
@Schema(description = "附件", example = "29669")
@ExcelProperty("附件") @Schema(description = "附件", example = "29669")
private String fileOssId; @ExcelProperty("附件")
private String fileOssId;
@Schema(description = "附件", example = "https://www.iocoder.cn")
@ExcelProperty("附件") @Schema(description = "附件", example = "https://www.iocoder.cn")
private String fileOssUrl; @ExcelProperty("附件")
private String fileOssUrl;
}
}

@ -19,9 +19,11 @@ public class DustClearrecordSaveReqVO {
private String dataId; private String dataId;
@Schema(description = "清扫项目", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") @Schema(description = "清扫项目", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@NotEmpty(message = "清扫项目不能为空")
private String clearItemName; private String clearItemName;
@NotEmpty(message = "清扫项目不能为空")
private List<String> clearItemNameList;
@Schema(description = "完成情况 0:未完成;1:已完成", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "完成情况 0:未完成;1:已完成", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "完成情况 0:未完成;1:已完成不能为空") @NotEmpty(message = "完成情况 0:未完成;1:已完成不能为空")
private String taskProcess; private String taskProcess;

@ -1,69 +1,71 @@
package cn.iocoder.yudao.module.system.dal.dataobject.dustclearrecord; package cn.iocoder.yudao.module.system.dal.dataobject.dustclearrecord;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/** /**
* DO * DO
* *
* @author * @author
*/ */
@TableName("hazard_dust_clearrecord") @TableName("hazard_dust_clearrecord")
@KeySequence("hazard_dust_clearrecord_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @KeySequence("hazard_dust_clearrecord_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class DustClearrecordDO extends BaseDO { public class DustClearrecordDO extends BaseDO {
/** /**
* *
*/ */
@TableId(type = IdType.INPUT) @TableId(type = IdType.ASSIGN_ID)
private String id; private String id;
/** /**
* *
*/ */
private String dataId; private String dataId;
/** /**
* *
*/ */
private String clearItemName; private String clearItemName;
/** @TableField(exist = false)
* 0:;1: private List<String> clearItemNameList;
*/ /**
private String taskProcess; * 0:;1:
/** */
* private String taskProcess;
*/ /**
private String taskPerson; *
/** */
* private String taskPerson;
*/ /**
private LocalDateTime taskTime; *
/** */
* private LocalDateTime taskTime;
*/ /**
private String picOssId; *
/** */
* private String picOssId;
*/ /**
private String picOssUrl; *
/** */
* private String picOssUrl;
*/ /**
private String fileOssId; *
/** */
* private String fileOssId;
*/ /**
private String fileOssUrl; *
*/
private String fileOssUrl;
}
}

@ -81,22 +81,31 @@ public class AdminAuthServiceImpl implements AdminAuthService {
@Override @Override
public AdminUserDO authenticate(String username, String password) { public AdminUserDO authenticate(String username, String password) {
final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME;
// 校验账号是否存在 // 临时忽略租户隔离,因为登录时还不知道用户属于哪个租户
AdminUserDO user = userService.getUserByUsername(username); TenantContextHolder.setIgnore(true);
if (user == null) { try {
createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); // 校验账号是否存在
throw exception(AUTH_LOGIN_BAD_CREDENTIALS); AdminUserDO user = userService.getUserByUsername(username);
} if (user == null) {
if (!userService.isPasswordMatch(password, user.getPassword())) { createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); throw exception(AUTH_LOGIN_BAD_CREDENTIALS);
throw exception(AUTH_LOGIN_BAD_CREDENTIALS); }
} if (!userService.isPasswordMatch(password, user.getPassword())) {
// 校验是否禁用 createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
if (CommonStatusEnum.isDisable(user.getStatus())) { throw exception(AUTH_LOGIN_BAD_CREDENTIALS);
createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.USER_DISABLED); }
throw exception(AUTH_LOGIN_USER_DISABLED); // 校验是否禁用
if (CommonStatusEnum.isDisable(user.getStatus())) {
createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.USER_DISABLED);
throw exception(AUTH_LOGIN_USER_DISABLED);
}
// 设置用户所属租户到上下文
TenantContextHolder.setTenantId(user.getTenantId());
return user;
} finally {
// 恢复租户隔离
TenantContextHolder.setIgnore(false);
} }
return user;
} }
@Override @Override
@ -113,7 +122,6 @@ public class AdminAuthServiceImpl implements AdminAuthService {
socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState()));
} }
if (ObjectUtil.isNull(TenantContextHolder.getTenantId())) TenantContextHolder.setTenantId(user.getTenantId());
// 创建 Token 令牌,记录登录日志 // 创建 Token 令牌,记录登录日志
return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
} }
@ -141,14 +149,24 @@ public class AdminAuthServiceImpl implements AdminAuthService {
// 校验验证码 // 校验验证码
smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.ADMIN_MEMBER_LOGIN.getScene(), getClientIP())).checkError(); smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.ADMIN_MEMBER_LOGIN.getScene(), getClientIP())).checkError();
// 获得用户信息 // 临时忽略租户隔离,因为登录时还不知道用户属于哪个租户
AdminUserDO user = userService.getUserByUsername(reqVO.getMobile()); TenantContextHolder.setIgnore(true);
if (user == null) { try {
throw exception(USER_NOT_EXISTS); // 获得用户信息
} AdminUserDO user = userService.getUserByUsername(reqVO.getMobile());
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
// 创建 Token 令牌,记录登录日志 // 设置用户所属租户到上下文
return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE); TenantContextHolder.setTenantId(user.getTenantId());
// 创建 Token 令牌,记录登录日志
return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE);
} finally {
// 恢复租户隔离
TenantContextHolder.setIgnore(false);
}
} }
private void createLoginLog(Long userId, String username, private void createLoginLog(Long userId, String username,

Loading…
Cancel
Save