From f2676dec9dcb8ea400fe942a486caa9c7d2a1f75 Mon Sep 17 00:00:00 2001 From: wangrunpu <2095588299@qq.com> Date: Fri, 16 Jan 2026 10:11:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E6=B8=85=E6=89=AB?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=EF=BC=9B=E5=A2=9E=E5=8A=A0=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alert/vo/recrod/IotAlertRecordRespVO.java | 3 + .../service/alert/IotAlertRecordService.java | 1 + .../alert/IotAlertRecordServiceImpl.java | 94 ++++++++++++ .../message/IotDeviceMessageServiceImpl.java | 21 +++ .../DustClearrecordController.java | 22 +++ .../vo/DustClearrecordRespVO.java | 119 +++++++-------- .../vo/DustClearrecordSaveReqVO.java | 4 +- .../dustclearrecord/DustClearrecordDO.java | 140 +++++++++--------- .../service/auth/AdminAuthServiceImpl.java | 64 +++++--- 9 files changed, 316 insertions(+), 152 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/recrod/IotAlertRecordRespVO.java b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/recrod/IotAlertRecordRespVO.java index 97ccf6cca..82a2e0d58 100644 --- a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/recrod/IotAlertRecordRespVO.java +++ b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/alert/vo/recrod/IotAlertRecordRespVO.java @@ -40,4 +40,7 @@ public class IotAlertRecordRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime updateTime; + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordService.java b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordService.java index 68a2da97c..e0aa1b12d 100644 --- a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordService.java +++ b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordService.java @@ -62,4 +62,5 @@ public interface IotAlertRecordService { */ Long createAlertRecord(IotAlertConfigDO config, Long sceneRuleId, IotDeviceMessage deviceMessage); + Long createAlertRecord(IotAlertRecordDO alertRecordDO); } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordServiceImpl.java b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordServiceImpl.java index 34a673a4b..7007765f5 100644 --- a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/alert/IotAlertRecordServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.iot.service.alert; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; 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.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.device.IotDeviceDO; 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 jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.quartz.SchedulerException; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.Collection; import java.util.List; +import java.util.Map; /** * IoT 告警记录 Service 实现类 * * @author 芋道源码 */ +@Slf4j @Service @Validated public class IotAlertRecordServiceImpl implements IotAlertRecordService { @@ -31,6 +39,12 @@ public class IotAlertRecordServiceImpl implements IotAlertRecordService { @Resource private IotDeviceService deviceService; + @Resource(name = "iotSchedulerManager") + private IotSchedulerManager schedulerManager; + + @Resource(required = false) + private ProvincialPlatformMqttProperties mqttProperties; + @Override public IotAlertRecordDO getAlertRecord(Long id) { return alertRecordMapper.selectById(id); @@ -54,6 +68,11 @@ public class IotAlertRecordServiceImpl implements IotAlertRecordService { // 批量更新告警记录的处理状态 alertRecordMapper.updateList(ids, IotAlertRecordDO.builder() .processStatus(true).processRemark(processRemark).build()); + + // 停止所有相关告警的推送定时任务 + for (Long alertRecordId : ids) { + stopAlertPushJob(alertRecordId); + } } @Override @@ -77,4 +96,79 @@ public class IotAlertRecordServiceImpl implements IotAlertRecordService { 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 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); + } + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceMessageServiceImpl.java b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceMessageServiceImpl.java index 01d1c45ee..3c2e6b260 100644 --- a/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceMessageServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-server/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceMessageServiceImpl.java @@ -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.producer.IotDeviceMessageProducer; 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.IotDeviceMessageDO; 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.property.IotDevicePropertyService; 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.time.LocalDateTime; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -52,6 +55,8 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DEVICE_DOWNST @Slf4j public class IotDeviceMessageServiceImpl implements IotDeviceMessageService { + @Resource + private IotAlertRecordService alertRecordService; @Resource private IotDeviceService deviceService; @Resource @@ -203,6 +208,22 @@ public class IotDeviceMessageServiceImpl implements IotDeviceMessageService { return null; } + // 事件上报 TODO 以后事件触发器完善后 需要剔除这里的处理 + if (Objects.equal(message.getMethod(), IotDeviceMessageMethodEnum.EVENT_POST.getMethod())) { + HashMap params = (HashMap) 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 上报升级进度 if (Objects.equal(message.getMethod(), IotDeviceMessageMethodEnum.OTA_PROGRESS.getMethod())) { otaTaskRecordService.updateOtaRecordProgress(device, message); diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/DustClearrecordController.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/DustClearrecordController.java index e635445f5..fe085cca9 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/DustClearrecordController.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/DustClearrecordController.java @@ -1,5 +1,8 @@ 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 jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -42,6 +45,10 @@ public class DustClearrecordController { @Operation(summary = "创建粉尘清扫打卡记录") @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:create')") public CommonResult createDustClearrecord(@Valid @RequestBody DustClearrecordSaveReqVO createReqVO) { + List clearItemNameList = createReqVO.getClearItemNameList(); + if (CollUtil.isNotEmpty(clearItemNameList)) { + createReqVO.setClearItemName(String.join(",", clearItemNameList)); + } return success(dustClearrecordService.createDustClearrecord(createReqVO)); } @@ -49,6 +56,10 @@ public class DustClearrecordController { @Operation(summary = "更新粉尘清扫打卡记录") @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:update')") public CommonResult updateDustClearrecord(@Valid @RequestBody DustClearrecordSaveReqVO updateReqVO) { + List clearItemNameList = updateReqVO.getClearItemNameList(); + if (CollUtil.isNotEmpty(clearItemNameList)) { + updateReqVO.setClearItemName(String.join(",", clearItemNameList)); + } dustClearrecordService.updateDustClearrecord(updateReqVO); return success(true); } @@ -77,6 +88,10 @@ public class DustClearrecordController { @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:query')") public CommonResult getDustClearrecord(@RequestParam("id") String 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)); } @@ -85,6 +100,13 @@ public class DustClearrecordController { @PreAuthorize("@ss.hasPermission('system:dust-clearrecord:query')") public CommonResult> getDustClearrecordPage(@Valid DustClearrecordPageReqVO pageReqVO) { PageResult pageResult = dustClearrecordService.getDustClearrecordPage(pageReqVO); + List 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)); } diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordRespVO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordRespVO.java index 26b559401..f89a4d8c3 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordRespVO.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordRespVO.java @@ -1,59 +1,60 @@ -package cn.iocoder.yudao.module.system.controller.admin.dustclearrecord.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; -import cn.idev.excel.annotation.*; - -@Schema(description = "管理后台 - 粉尘清扫打卡记录 Response VO") -@Data -@ExcelIgnoreUnannotated -public class DustClearrecordRespVO { - - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "21496") - @ExcelProperty("主键") - private String id; - - @Schema(description = "数据接入标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2822") - @ExcelProperty("数据接入标识") - private String dataId; - - @Schema(description = "清扫项目", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - @ExcelProperty("清扫项目") - private String clearItemName; - - @Schema(description = "完成情况 0:未完成;1:已完成", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("完成情况 0:未完成;1:已完成") - private String taskProcess; - - @Schema(description = "打卡人", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("打卡人") - private String taskPerson; - - @Schema(description = "打卡日期", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("打卡日期") - private LocalDateTime taskTime; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - - @Schema(description = "图片", example = "15259") - @ExcelProperty("图片") - private String picOssId; - - @Schema(description = "图片", example = "https://www.iocoder.cn") - @ExcelProperty("图片") - private String picOssUrl; - - @Schema(description = "附件", example = "29669") - @ExcelProperty("附件") - private String fileOssId; - - @Schema(description = "附件", example = "https://www.iocoder.cn") - @ExcelProperty("附件") - private String fileOssUrl; - -} \ No newline at end of file +package cn.iocoder.yudao.module.system.controller.admin.dustclearrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 粉尘清扫打卡记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DustClearrecordRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "21496") + @ExcelProperty("主键") + private String id; + + @Schema(description = "数据接入标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2822") + @ExcelProperty("数据接入标识") + private String dataId; + + @Schema(description = "清扫项目", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("清扫项目") + private String clearItemName; + private List clearItemNameList; + + @Schema(description = "完成情况 0:未完成;1:已完成", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("完成情况 0:未完成;1:已完成") + private String taskProcess; + + @Schema(description = "打卡人", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("打卡人") + private String taskPerson; + + @Schema(description = "打卡日期", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("打卡日期") + private LocalDateTime taskTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "图片", example = "15259") + @ExcelProperty("图片") + private String picOssId; + + @Schema(description = "图片", example = "https://www.iocoder.cn") + @ExcelProperty("图片") + private String picOssUrl; + + @Schema(description = "附件", example = "29669") + @ExcelProperty("附件") + private String fileOssId; + + @Schema(description = "附件", example = "https://www.iocoder.cn") + @ExcelProperty("附件") + private String fileOssUrl; + +} diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordSaveReqVO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordSaveReqVO.java index a771fc2e2..82c82ca77 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dustclearrecord/vo/DustClearrecordSaveReqVO.java @@ -19,9 +19,11 @@ public class DustClearrecordSaveReqVO { private String dataId; @Schema(description = "清扫项目", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - @NotEmpty(message = "清扫项目不能为空") private String clearItemName; + @NotEmpty(message = "清扫项目不能为空") + private List clearItemNameList; + @Schema(description = "完成情况 0:未完成;1:已完成", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "完成情况 0:未完成;1:已完成不能为空") private String taskProcess; diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dustclearrecord/DustClearrecordDO.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dustclearrecord/DustClearrecordDO.java index 22c31bcb4..101e2c7d8 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dustclearrecord/DustClearrecordDO.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dustclearrecord/DustClearrecordDO.java @@ -1,69 +1,71 @@ -package cn.iocoder.yudao.module.system.dal.dataobject.dustclearrecord; - -import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; - -/** - * 粉尘清扫打卡记录 DO - * - * @author 超级管理员 - */ -@TableName("hazard_dust_clearrecord") -@KeySequence("hazard_dust_clearrecord_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class DustClearrecordDO extends BaseDO { - - /** - * 主键 - */ - @TableId(type = IdType.INPUT) - private String id; - /** - * 数据接入标识 - */ - private String dataId; - /** - * 清扫项目 - */ - private String clearItemName; - /** - * 完成情况 0:未完成;1:已完成 - */ - private String taskProcess; - /** - * 打卡人 - */ - private String taskPerson; - /** - * 打卡日期 - */ - private LocalDateTime taskTime; - /** - * 图片 - */ - private String picOssId; - /** - * 图片 - */ - private String picOssUrl; - /** - * 附件 - */ - private String fileOssId; - /** - * 附件 - */ - private String fileOssUrl; - - -} \ No newline at end of file +package cn.iocoder.yudao.module.system.dal.dataobject.dustclearrecord; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 粉尘清扫打卡记录 DO + * + * @author 超级管理员 + */ +@TableName("hazard_dust_clearrecord") +@KeySequence("hazard_dust_clearrecord_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DustClearrecordDO extends BaseDO { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /** + * 数据接入标识 + */ + private String dataId; + /** + * 清扫项目 + */ + private String clearItemName; + @TableField(exist = false) + private List clearItemNameList; + /** + * 完成情况 0:未完成;1:已完成 + */ + private String taskProcess; + /** + * 打卡人 + */ + private String taskPerson; + /** + * 打卡日期 + */ + private LocalDateTime taskTime; + /** + * 图片 + */ + private String picOssId; + /** + * 图片 + */ + private String picOssUrl; + /** + * 附件 + */ + private String fileOssId; + /** + * 附件 + */ + private String fileOssUrl; + + +} diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java index 4d841865d..59a0ebce6 100644 --- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java +++ b/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java @@ -81,22 +81,31 @@ public class AdminAuthServiceImpl implements AdminAuthService { @Override public AdminUserDO authenticate(String username, String password) { final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; - // 校验账号是否存在 - AdminUserDO user = userService.getUserByUsername(username); - if (user == null) { - createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } - if (!userService.isPasswordMatch(password, user.getPassword())) { - createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); - throw exception(AUTH_LOGIN_BAD_CREDENTIALS); - } - // 校验是否禁用 - if (CommonStatusEnum.isDisable(user.getStatus())) { - createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.USER_DISABLED); - throw exception(AUTH_LOGIN_USER_DISABLED); + // 临时忽略租户隔离,因为登录时还不知道用户属于哪个租户 + TenantContextHolder.setIgnore(true); + try { + // 校验账号是否存在 + AdminUserDO user = userService.getUserByUsername(username); + if (user == null) { + createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + if (!userService.isPasswordMatch(password, user.getPassword())) { + createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + // 校验是否禁用 + 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 @@ -113,7 +122,6 @@ public class AdminAuthServiceImpl implements AdminAuthService { socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); } - if (ObjectUtil.isNull(TenantContextHolder.getTenantId())) TenantContextHolder.setTenantId(user.getTenantId()); // 创建 Token 令牌,记录登录日志 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(); - // 获得用户信息 - AdminUserDO user = userService.getUserByUsername(reqVO.getMobile()); - if (user == null) { - throw exception(USER_NOT_EXISTS); - } + // 临时忽略租户隔离,因为登录时还不知道用户属于哪个租户 + TenantContextHolder.setIgnore(true); + try { + // 获得用户信息 + 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,