diff --git a/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/DeviceMessageProcessor.java b/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/DeviceMessageProcessor.java index 7ce02e7..396ef64 100644 --- a/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/DeviceMessageProcessor.java +++ b/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/DeviceMessageProcessor.java @@ -129,7 +129,6 @@ public class DeviceMessageProcessor { private void handLogSave(HandDataVo handVo) { TdengineDataVo bean = BeanUtils.toBean(handVo, TdengineDataVo.class); - bean.setGasType(handVo.getGasType()); bean.setTenantId(handVo.getTenantId()); bean.setTs(new Timestamp(System.currentTimeMillis())); // 直接创建Timestamp对象 tdengineBatchConfig.addToBatch(bean); @@ -456,6 +455,7 @@ public class DeviceMessageProcessor { handAlarmService.updateById(handAlarmDO); //删除离线报警 redisData.setAlarmId(null); + return redisData; } boolean isCurrentlyAlarming = redisData.getAlarmLevel() != null && redisData.getAlarmLevel() > 0; @@ -470,6 +470,7 @@ public class DeviceMessageProcessor { if (alarmRule.getAlarmLevel() == 0) { redisData.setAlarmLevel(0); + redisData.setGasStatus(HandAlarmType.NORMAL.getType()); return redisData; } @@ -514,8 +515,20 @@ public class DeviceMessageProcessor { String battery = obj.getStr("battery"); String numbersString = loc.substring(1, loc.length() - 1); // 将字符串按逗号分割成数组 - String[] split = numbersString.split(","); + if (numbersString.isEmpty()) { + log.error("数据格式错误:输入字符串为 null 或为空:{}", payload); + return detector; + } + detector.setValue(value); + detector.setSn(topic); + detector.setBattery(battery); + //添加最新时间 + detector.setTime(new Date(System.currentTimeMillis())); + //添加默认状态 + detector.setOnlineStatus(OnlineStatusType.ONLINE.getType()); + + String[] split = numbersString.split(","); if (split.length != 3) { log.error("数据格式错误:{}", payload); return detector; @@ -524,17 +537,12 @@ public class DeviceMessageProcessor { Double lon = wgs84ToGcj02.get("lon"); Double lat = wgs84ToGcj02.get("lat"); - detector.setBattery(battery); detector.setLongitude(lon); detector.setLatitude(lat); - detector.setValue(value); - detector.setSn(topic); - //添加最新时间 - detector.setTime(new Date(System.currentTimeMillis())); - //添加默认状态 - detector.setOnlineStatus(OnlineStatusType.ONLINE.getType()); String type = split[2]; - detector.setGasType(Integer.parseInt(type)); + detector.setGpsType(Integer.parseInt(type)); + + return detector; } diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmRuleController.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmRuleController.java index d9abb9e..ba1fc66 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmRuleController.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmRuleController.java @@ -91,7 +91,12 @@ public class AlarmRuleController { return success(BeanUtils.toBean(pageResult, AlarmRuleRespVO.class)); } - + @GetMapping("/listAll") + @Operation(summary = "获得全部的GAS警报规则") + public CommonResult> getListAll() { + List listAll = alarmRuleService.getListAll(); + return success(listAll); + } @GetMapping("/export-excel") @Operation(summary = "导出GAS警报规则 Excel") @PreAuthorize("@ss.hasPermission('gas:alarm-rule:export')") diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmTypeController.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmTypeController.java index b0b56a8..5b4bdce 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmTypeController.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/AlarmTypeController.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.hand.controller.admin; +import cn.iocoder.yudao.module.hand.dal.AlarmRuleDO; import cn.iocoder.yudao.module.hand.dal.AlarmTypeDO; import cn.iocoder.yudao.module.hand.service.AlarmTypeService; import cn.iocoder.yudao.module.hand.vo.AlarmTypePageReqVO; @@ -90,7 +91,12 @@ public class AlarmTypeController { PageResult pageResult = alarmTypeService.getAlarmTypePage(pageReqVO); return success(BeanUtils.toBean(pageResult, AlarmTypeRespVO.class)); } - + @GetMapping("/listAll") + @Operation(summary = "获得全部的警报类型") + public CommonResult> getListAll() { + List listAll = alarmTypeService.getListAll(); + return success(listAll); + } @GetMapping("/export-excel") @Operation(summary = "导出GAS警报类型 Excel") @PreAuthorize("@ss.hasPermission('gas:alarm-type:export')") diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/PersonnelController.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/PersonnelController.java new file mode 100644 index 0000000..6f05c49 --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/controller/admin/PersonnelController.java @@ -0,0 +1,113 @@ +package cn.iocoder.yudao.module.hand.controller.admin; + +import cn.iocoder.yudao.module.hand.dal.PersonnelDO; +import cn.iocoder.yudao.module.hand.service.PersonnelService; +import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO; +import cn.iocoder.yudao.module.hand.vo.PersonnelRespVO; +import cn.iocoder.yudao.module.hand.vo.PersonnelSaveReqVO; +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + + +@Tag(name = "管理后台 - 人员信息") +@RestController +@RequestMapping("/gas/personnel") +@Validated +public class PersonnelController { + + @Resource + private PersonnelService personnelService; + + @PostMapping("/create") + @Operation(summary = "创建人员信息") + @PreAuthorize("@ss.hasPermission('gas:personnel:create')") + public CommonResult createPersonnel(@Valid @RequestBody PersonnelSaveReqVO createReqVO) { + return success(personnelService.createPersonnel(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新人员信息") + @PreAuthorize("@ss.hasPermission('gas:personnel:update')") + public CommonResult updatePersonnel(@Valid @RequestBody PersonnelSaveReqVO updateReqVO) { + personnelService.updatePersonnel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除人员信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('gas:personnel:delete')") + public CommonResult deletePersonnel(@RequestParam("id") Long id) { + personnelService.deletePersonnel(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除人员信息") + @PreAuthorize("@ss.hasPermission('gas:personnel:delete')") + public CommonResult deletePersonnelList(@RequestParam("ids") List ids) { + personnelService.deletePersonnelListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得人员信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('gas:personnel:query')") + public CommonResult getPersonnel(@RequestParam("id") Long id) { + PersonnelDO personnel = personnelService.getPersonnel(id); + return success(BeanUtils.toBean(personnel, PersonnelRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得人员信息分页") + @PreAuthorize("@ss.hasPermission('gas:personnel:query')") + public CommonResult> getPersonnelPage(@Valid PersonnelPageReqVO pageReqVO) { + PageResult pageResult = personnelService.getPersonnelPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PersonnelRespVO.class)); + } + + @GetMapping("/getListAll") + @Operation(summary = "获得全部人员信息") + @PreAuthorize("@ss.hasPermission('gas:personnel:query')") + public CommonResult> getListAll() { + List listAll = personnelService.getListAll(); + return success(listAll); + } + @GetMapping("/export-excel") + @Operation(summary = "导出人员信息 Excel") + @PreAuthorize("@ss.hasPermission('gas:personnel:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportPersonnelExcel(@Valid PersonnelPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = personnelService.getPersonnelPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "人员信息.xls", "数据", PersonnelRespVO.class, + BeanUtils.toBean(list, PersonnelRespVO.class)); + } + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandAlarmDO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandAlarmDO.java index 1eb8b6b..215106b 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandAlarmDO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandAlarmDO.java @@ -1,12 +1,9 @@ package cn.iocoder.yudao.module.hand.dal; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -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; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandDetectorDO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandDetectorDO.java index d212468..e334a8d 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandDetectorDO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/HandDetectorDO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.hand.dal; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -26,6 +27,9 @@ public class HandDetectorDO extends BaseDO { */ @TableId private Long id; + + private Long personId; + /** * SN */ @@ -106,4 +110,14 @@ public class HandDetectorDO extends BaseDO { */ private Integer tenantId; + // 在 Setter 方法中加入 trim() 逻辑 + public void setSn(String sn) { + // 先判断是否为 null,避免 NullPointerException + if (sn != null) { + // 在赋值给字段之前,先调用 trim() + this.sn = sn.trim(); + } else { + this.sn = null; + } + } } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/PersonnelDO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/PersonnelDO.java new file mode 100644 index 0000000..a9e068f --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/dal/PersonnelDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.hand.dal; + +import lombok.*; +import java.util.*; +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("gas_personnel") +@KeySequence("gas_personnel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PersonnelDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 姓名 + */ + private String name; + /** + * 工号 + */ + private String employeeId; + /** + * 关联的系统用户ID (关联系统用户表, 可为空) + */ + private Long userId; + /** + * 联系电话 + */ + private String phone; + /** + * 电子邮箱 + */ + private String email; + /** + * 状态 (1-在职, 0-离职) + */ + private Integer status; + + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/enums/ErrorCodeConstants.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/enums/ErrorCodeConstants.java index 36fda56..536d720 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/enums/ErrorCodeConstants.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/enums/ErrorCodeConstants.java @@ -24,4 +24,6 @@ public interface ErrorCodeConstants { ErrorCode FACTORY_NOT_EXISTS = new ErrorCode(1000071, "GAS工厂不存在"); ErrorCode HAND_DETECTOR_REDIS_NOT_EXISTS = new ErrorCode(100001, "请先登录,再查看"); + + ErrorCode PERSONNEL_NOT_EXISTS = new ErrorCode(2131, "人员信息不存在"); } diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/job/OfflineAlarmJob.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/job/OfflineAlarmJob.java new file mode 100644 index 0000000..8187e4d --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/job/OfflineAlarmJob.java @@ -0,0 +1,147 @@ +package cn.iocoder.yudao.module.hand.job; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import cn.iocoder.yudao.module.hand.dal.HandAlarmDO; +import cn.iocoder.yudao.module.hand.enums.*; +import cn.iocoder.yudao.module.hand.service.HandAlarmService; +import cn.iocoder.yudao.module.hand.util.RedisKeyUtil; +import cn.iocoder.yudao.module.hand.util.RedisUtil; +import cn.iocoder.yudao.module.hand.vo.HandAlarmSaveReqVO; +import cn.iocoder.yudao.module.hand.vo.HandDataVo; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component +@Slf4j +public class OfflineAlarmJob implements JobHandler { + + /** + * 定义设备离线阈值:10分钟 + */ + private static final long OFFLINE_THRESHOLD_MINUTES = 10; + private static final long OFFLINE_THRESHOLD_MS = TimeUnit.MINUTES.toMillis(OFFLINE_THRESHOLD_MINUTES); + @Resource + private RedisUtil redisUtil; + // 1. 注入报警记录相关的Service + @Resource + private HandAlarmService handAlarmService; + + @Override + @TenantJob + public String execute(String param) throws Exception { + Long tenantId = TenantContextHolder.getTenantId(); + if (tenantId == null) { + log.warn("无法获取到租户ID,任务终止"); + return "无法获取租户ID"; + } + + String tenantDeviceKey = RedisKeyUtil.getTenantDeviceHashKey(tenantId); + Map deviceDataMap = redisUtil.hmget(tenantDeviceKey); + + if (deviceDataMap == null || deviceDataMap.isEmpty()) { + log.info("租户ID {} 下无设备数据,任务结束", tenantId); + return "无设备数据"; + } + + long currentTimeMillis = System.currentTimeMillis(); + // 用于存储需要批量插入数据库的新报警记录 + List newAlarmsToCreate = new ArrayList<>(); + + for (Map.Entry entry : deviceDataMap.entrySet()) { + try { + HandDataVo handData = BeanUtils.toBean(entry.getValue(), HandDataVo.class); + + if (handData == null || handData.getTime() == null) { + continue; // 跳过无效数据 + } + + long lastReportTimeMillis = handData.getTime().getTime(); + long timeDifference = currentTimeMillis - lastReportTimeMillis; + + // 判断条件 1:设备是否离线? (时间差超过阈值) + if (timeDifference > OFFLINE_THRESHOLD_MS) { + + // 判断条件 2:这是否是一次新的离线事件? (检查Redis中当前的状态是否还不是报警状态) + // 如果已经是报警状态,则本次不再重复处理 + if (!OnlineStatusType.OFFLINE.getType().equals(handData.getOnlineStatus())) { + + // --- 这是新发现的离线设备,执行报警逻辑 --- + log.info("【新设备离线报警】租户ID: {}, 设备SN: {} 已离线超过{}分钟", + tenantId, handData.getSn(), OFFLINE_THRESHOLD_MINUTES); + + // a. 更新设备状态 + handData.setOnlineStatus(OnlineStatusType.OFFLINE.getType()); + handData.setAlarmLevel(AlarmLevelEnum.OFFLINE.value()); + + // b. 将更新后的状态写回 Redis + redisUtil.hset(tenantDeviceKey, entry.getKey().toString(), handData); + + // c. 准备要插入数据库的报警记录 + HandAlarmDO handAlarmDO = buildAlarmRecord(tenantId, handData); + newAlarmsToCreate.add(handAlarmDO); + } + + } + + } catch (Exception e) { + log.error("处理设备数据时发生异常,设备Key: {}. 错误: {}", entry.getKey(), e.getMessage()); + } + } + + // 批量将新产生的报警记录插入数据库 + if (!newAlarmsToCreate.isEmpty()) { + log.info("租户 {} 发现 {} 条新的设备离线报警,准备批量写入数据库...", tenantId, newAlarmsToCreate.size()); + try { + handAlarmService.insertBatch(newAlarmsToCreate); + log.info("批量写入 {} 条设备离线报警记录成功", newAlarmsToCreate.size()); + } catch (Exception e) { + log.error("批量写入设备离线报警记录失败", e); + } + } + + log.info("租户 {} 的设备离线检查任务执行完毕", tenantId); + return "任务执行成功"; + } + + /** + * 辅助方法:构建报警记录对象 + */ + private HandAlarmDO buildAlarmRecord(Long tenantId, HandDataVo handData) { + HandAlarmDO alarm = new HandAlarmDO(); + alarm.setTenantId(tenantId); + alarm.setDetectorId(handData.getId()); + alarm.setPicX(handData.getLatitude()); + alarm.setPicY(handData.getLongitude()); + alarm.setName(handData.getName()); + alarm.setSn(handData.getSn()); + alarm.setAlarmType(AlarmType.OFFLINE.getType()); // 明确指定为离线报警类型 + alarm.setAlarmLevel(AlarmLevelEnum.OFFLINE.value()); + if (handData.getTime() != null) { + LocalDateTime lastReportTime = handData.getTime() + .toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + alarm.setTAlarmStart(lastReportTime); + } + + alarm.setStatus(EnableStatus.DISABLED.value()); + alarm.setGasType(handData.getUnit()); + alarm.setUnit(handData.getUnit()); + alarm.setCreator("admin"); + alarm.setCreateTime(LocalDateTime.now()); + + return alarm; + } +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/HandAlarmMapper.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/HandAlarmMapper.java index 7147208..4796a6f 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/HandAlarmMapper.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/HandAlarmMapper.java @@ -23,6 +23,7 @@ public interface HandAlarmMapper extends BaseMapperX { .likeIfPresent(HandAlarmDO::getName,reqVO.getName()) .likeIfPresent(HandAlarmDO::getSn,reqVO.getSn()) .eqIfPresent(HandAlarmDO::getAlarmLevel, reqVO.getAlarmLevel()) + .eqIfPresent(HandAlarmDO::getAlarmType, reqVO.getAlarmType()) .eqIfPresent(HandAlarmDO::getGasType, reqVO.getGasType()) .eqIfPresent(HandAlarmDO::getUnit, reqVO.getUnit()) .eqIfPresent(HandAlarmDO::getLocation, reqVO.getLocation()) diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/PersonnelMapper.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/PersonnelMapper.java new file mode 100644 index 0000000..d676ba2 --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/PersonnelMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.hand.mapper; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.hand.dal.PersonnelDO; +import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 人员信息 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface PersonnelMapper extends BaseMapperX { + + default PageResult selectPage(PersonnelPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(PersonnelDO::getName, reqVO.getName()) + .eqIfPresent(PersonnelDO::getEmployeeId, reqVO.getEmployeeId()) + .eqIfPresent(PersonnelDO::getUserId, reqVO.getUserId()) + .eqIfPresent(PersonnelDO::getPhone, reqVO.getPhone()) + .eqIfPresent(PersonnelDO::getEmail, reqVO.getEmail()) + .eqIfPresent(PersonnelDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(PersonnelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(PersonnelDO::getId)); + } + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/TdengineMapper.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/TdengineMapper.java index 90bc4cb..0f695db 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/TdengineMapper.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/mapper/TdengineMapper.java @@ -29,6 +29,7 @@ public interface TdengineMapper { IPage selectOriginalPage(IPage page,@Param("vo") HandTdenginePageVO vo); - List HistoricalSn(HandTdenginePo po); + @InterceptorIgnore(tenantLine = "true") + List HistoricalSn(@Param("po") HandTdenginePo po); } diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmRuleService.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmRuleService.java index 221af03..2875cb1 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmRuleService.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmRuleService.java @@ -63,5 +63,5 @@ public interface AlarmRuleService { Map> selectCacheListMap(Long tenantId); - + List getListAll(); } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmTypeService.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmTypeService.java index 212aee8..9328ff4 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmTypeService.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/AlarmTypeService.java @@ -61,4 +61,6 @@ public interface AlarmTypeService { */ PageResult getAlarmTypePage(AlarmTypePageReqVO pageReqVO); + List getListAll(); + } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandAlarmService.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandAlarmService.java index be2982f..bb47031 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandAlarmService.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandAlarmService.java @@ -61,4 +61,6 @@ public interface HandAlarmService { PageResult getHandAlarmPage(HandAlarmPageReqVO pageReqVO); int updateById(HandAlarmDO alarm); + + void insertBatch(List doList); } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/PersonnelService.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/PersonnelService.java new file mode 100644 index 0000000..07e23a4 --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/PersonnelService.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.hand.service; + +import java.util.*; + +import cn.iocoder.yudao.module.hand.dal.PersonnelDO; +import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO; +import cn.iocoder.yudao.module.hand.vo.PersonnelSaveReqVO; +import jakarta.validation.*; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 人员信息 Service 接口 + * + * @author 超级管理员 + */ +public interface PersonnelService { + + /** + * 创建人员信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPersonnel(@Valid PersonnelSaveReqVO createReqVO); + + /** + * 更新人员信息 + * + * @param updateReqVO 更新信息 + */ + void updatePersonnel(@Valid PersonnelSaveReqVO updateReqVO); + + /** + * 删除人员信息 + * + * @param id 编号 + */ + void deletePersonnel(Long id); + + /** + * 批量删除人员信息 + * + * @param ids 编号 + */ + void deletePersonnelListByIds(List ids); + + /** + * 获得人员信息 + * + * @param id 编号 + * @return 人员信息 + */ + PersonnelDO getPersonnel(Long id); + + /** + * 获得人员信息分页 + * + * @param pageReqVO 分页查询 + * @return 人员信息分页 + */ + PageResult getPersonnelPage(PersonnelPageReqVO pageReqVO); + + List getListAll(); +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java index 1870d13..c856614 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java @@ -46,52 +46,54 @@ public class AlarmRuleServiceImpl implements AlarmRuleService { @Resource private AlarmRuleMapper alarmRuleMapper; + + // 定义一个常量来表示缓存清除的 SpEL 表达式,避免重复和拼写错误 + private static final String EVICT_CACHE_KEY_SPEL = + "'gas_rules_map:' + T(cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder).getTenantId()"; @Override + @CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME, + // 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。 + key = EVICT_CACHE_KEY_SPEL) public Long createAlarmRule(AlarmRuleSaveReqVO createReqVO) { // 插入 AlarmRuleDO alarmRule = BeanUtils.toBean(createReqVO, AlarmRuleDO.class); alarmRuleMapper.insert(alarmRule); - LoginUser loginUser = getLoginUser(); - if (loginUser != null && loginUser.getTenantId() != null){ - evictGasAlarmRuleCache(loginUser.getTenantId()); - } // 返回 return alarmRule.getId(); } @Override + @CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME, + // 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。 + key = EVICT_CACHE_KEY_SPEL) public void updateAlarmRule(AlarmRuleSaveReqVO updateReqVO) { // 校验存在 validateAlarmRuleExists(updateReqVO.getId()); // 更新 AlarmRuleDO updateObj = BeanUtils.toBean(updateReqVO, AlarmRuleDO.class); alarmRuleMapper.updateById(updateObj); - LoginUser loginUser = getLoginUser(); - if (loginUser != null && loginUser.getTenantId() != null){ - evictGasAlarmRuleCache(loginUser.getTenantId()); - } } @Override + @CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME, + // 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。 + key = EVICT_CACHE_KEY_SPEL) public void deleteAlarmRule(Long id) { // 校验存在 validateAlarmRuleExists(id); // 删除 alarmRuleMapper.deleteById(id); LoginUser loginUser = getLoginUser(); - if (loginUser != null && loginUser.getTenantId() != null){ - evictGasAlarmRuleCache(loginUser.getTenantId()); - } + } @Override + @CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME, + // 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。 + key = EVICT_CACHE_KEY_SPEL) public void deleteAlarmRuleListByIds(List ids) { // 删除 alarmRuleMapper.deleteByIds(ids); - LoginUser loginUser = getLoginUser(); - if (loginUser != null && loginUser.getTenantId() != null){ - evictGasAlarmRuleCache(loginUser.getTenantId()); - } } @@ -128,16 +130,8 @@ public class AlarmRuleServiceImpl implements AlarmRuleService { public PageResult getAlarmRulePage(AlarmRulePageReqVO pageReqVO) { return alarmRuleMapper.selectPage(pageReqVO); } - - - /** - * 当规则发生变更时,调用此方法来清空缓存。 - */ - @CacheEvict(cacheNames = RedisKeyUtil.ALARM_RULES_CACHE_NAME, - // 【关键修改】使用 #tenantId 来引用方法参数,确保缓存key与查询数据严格对应。 - key = "'gas_rules_map:' + #tenantId") - @TenantIgnore - public void evictGasAlarmRuleCache(Long tenantId) { - log.info("成功清除气体报警规则缓存。"); + @Override + public List getListAll() { + return alarmRuleMapper.selectList(); } } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmTypeServiceImpl.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmTypeServiceImpl.java index d76ab7a..cd453ae 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmTypeServiceImpl.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmTypeServiceImpl.java @@ -84,4 +84,9 @@ public class AlarmTypeServiceImpl implements AlarmTypeService { return alarmTypeMapper.selectPage(pageReqVO); } + @Override + public List getListAll() { + return alarmTypeMapper.selectList(); + } + } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandAlarmServiceImpl.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandAlarmServiceImpl.java index 3f62ac8..0fee6f2 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandAlarmServiceImpl.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandAlarmServiceImpl.java @@ -90,4 +90,10 @@ public class HandAlarmServiceImpl implements HandAlarmService { return handAlarmMapper.updateById(alarm); } + @Override + @Transactional(rollbackFor = Exception.class) + public void insertBatch(List doList) { + handAlarmMapper.insertBatch(doList); + } + } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java index 2dc4884..3ae3a4e 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java @@ -192,7 +192,6 @@ public class HandDetectorServiceImpl implements HandDetectorService { // 校验存在 validateHandDetectorExists(id); // 删除 - handDetectorMapper.deleteById(id); String deviceSn = handDetectorMapper.selectOne(HandDetectorDO::getId, id).getSn(); // 2. 从全局映射缓存中删除 redisUtil.hdel(RedisKeyUtil.getDeviceTenantMappingKey(), deviceSn); @@ -200,6 +199,8 @@ public class HandDetectorServiceImpl implements HandDetectorService { // 3. 从租户自己的设备信息缓存中删除 String tenantDeviceKey = RedisKeyUtil.getTenantDeviceHashKey(loginUser.getTenantId()); redisUtil.hdel(tenantDeviceKey, deviceSn); + handDetectorMapper.deleteById(id); + } @Override diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/PersonnelServiceImpl.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/PersonnelServiceImpl.java new file mode 100644 index 0000000..9e8398b --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/PersonnelServiceImpl.java @@ -0,0 +1,92 @@ +package cn.iocoder.yudao.module.hand.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.module.hand.dal.PersonnelDO; +import cn.iocoder.yudao.module.hand.mapper.PersonnelMapper; +import cn.iocoder.yudao.module.hand.service.PersonnelService; +import cn.iocoder.yudao.module.hand.vo.PersonnelPageReqVO; +import cn.iocoder.yudao.module.hand.vo.PersonnelSaveReqVO; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList; +import static cn.iocoder.yudao.module.hand.enums.ErrorCodeConstants.PERSONNEL_NOT_EXISTS; + +/** + * 人员信息 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class PersonnelServiceImpl implements PersonnelService { + + @Resource + private PersonnelMapper personnelMapper; + + @Override + public Long createPersonnel(PersonnelSaveReqVO createReqVO) { + // 插入 + PersonnelDO personnel = BeanUtils.toBean(createReqVO, PersonnelDO.class); + personnelMapper.insert(personnel); + + // 返回 + return personnel.getId(); + } + + @Override + public void updatePersonnel(PersonnelSaveReqVO updateReqVO) { + // 校验存在 + validatePersonnelExists(updateReqVO.getId()); + // 更新 + PersonnelDO updateObj = BeanUtils.toBean(updateReqVO, PersonnelDO.class); + personnelMapper.updateById(updateObj); + } + + @Override + public void deletePersonnel(Long id) { + // 校验存在 + validatePersonnelExists(id); + // 删除 + personnelMapper.deleteById(id); + } + + @Override + public void deletePersonnelListByIds(List ids) { + // 删除 + personnelMapper.deleteByIds(ids); + } + + + private void validatePersonnelExists(Long id) { + if (personnelMapper.selectById(id) == null) { + throw exception(PERSONNEL_NOT_EXISTS); + } + } + + @Override + public PersonnelDO getPersonnel(Long id) { + return personnelMapper.selectById(id); + } + + @Override + public PageResult getPersonnelPage(PersonnelPageReqVO pageReqVO) { + return personnelMapper.selectPage(pageReqVO); + } + + @Override + public List getListAll() { + return personnelMapper.selectList(); + } + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/AlarmRuleSaveReqVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/AlarmRuleSaveReqVO.java index 15a8887..de272d2 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/AlarmRuleSaveReqVO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/AlarmRuleSaveReqVO.java @@ -18,7 +18,7 @@ public class AlarmRuleSaveReqVO { private Long gasTypeId; @Schema(description = "警报类型ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12917") - @NotEmpty(message = "警报类型ID不能为空") + @NotNull(message = "警报类型ID不能为空") private Long alarmTypeId; @Schema(description = "警报名称", example = "赵六") diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmPageReqVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmPageReqVO.java index 7565c95..0d23e80 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmPageReqVO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmPageReqVO.java @@ -27,6 +27,9 @@ public class HandAlarmPageReqVO extends PageParam { @Schema(description = "警报方式/级别(0:正常状态;1:一级警报;2:二级警报;3:弹窗警报)") private Integer alarmLevel; + @Schema(description = "报警类型") + private Integer alarmType; + @Schema(description = "气体类型", example = "1") private String gasType; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmRespVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmRespVO.java index c41511f..54c5385 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmRespVO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmRespVO.java @@ -27,6 +27,10 @@ public class HandAlarmRespVO { @ExcelProperty("主键ID") private Long id; + @Schema(description = "报警类型") + @ExcelProperty("报警类型") + private Integer alarmType; + @Schema(description = "警报方式/级别(0:正常状态;1:一级警报;2:二级警报;3:弹窗警报)", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("警报方式/级别(0:正常状态;1:一级警报;2:二级警报;3:弹窗警报)") private Integer alarmLevel; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmSaveReqVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmSaveReqVO.java index d5c0ba6..2890930 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmSaveReqVO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandAlarmSaveReqVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.hand.vo; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -18,7 +19,6 @@ public class HandAlarmSaveReqVO { private Long id; - @Schema(description = "探头ID", example = "1") private Long detectorId; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDataVo.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDataVo.java index 62a0240..768b65f 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDataVo.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDataVo.java @@ -70,7 +70,7 @@ public class HandDataVo { private Double maxValue; @Schema(description = "定位类型") - private Integer gasType; + private Integer gpsType; @Schema(description = "报警开始时间") private LocalDateTime tAlarmStart; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorPageReqVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorPageReqVO.java index 232c4a6..fb8ad11 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorPageReqVO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorPageReqVO.java @@ -18,6 +18,9 @@ public class HandDetectorPageReqVO extends PageParam { @Schema(description = "SN") private String sn; + @Schema(description = "持有人id", example = "1") + private Long personId; + @Schema(description = "持有人姓名", example = "赵六") private String name; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorRespVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorRespVO.java index 09f8a8e..6b647dd 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorRespVO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorRespVO.java @@ -16,6 +16,9 @@ public class HandDetectorRespVO { @ExcelProperty("主键ID") private Long id; + @Schema(description = "持有人id", example = "1") + private Long personId; + @Schema(description = "SN") @ExcelProperty("SN") private String sn; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorSaveReqVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorSaveReqVO.java index 9a26c9f..dc7839a 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorSaveReqVO.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandDetectorSaveReqVO.java @@ -13,6 +13,9 @@ public class HandDetectorSaveReqVO { @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24178") private Long id; + @Schema(description = "持有人id", example = "1") + private Long personId; + @Schema(description = "SN") private String sn; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandTdenginePo.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandTdenginePo.java index fb7ef82..e2ece7c 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandTdenginePo.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/HandTdenginePo.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.hand.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import jakarta.validation.constraints.NotEmpty; import lombok.Data; import java.sql.Timestamp; @@ -8,6 +9,7 @@ import java.sql.Timestamp; @Data public class HandTdenginePo{ + @NotEmpty(message ="sn不能为空") private String sn; private Timestamp startTime; diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelPageReqVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelPageReqVO.java new file mode 100644 index 0000000..8a4779e --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelPageReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.hand.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 人员信息分页 Request VO") +@Data +public class PersonnelPageReqVO extends PageParam { + + @Schema(description = "姓名", example = "王五") + private String name; + + @Schema(description = "工号", example = "32467") + private String employeeId; + + @Schema(description = "关联的系统用户ID (关联系统用户表, 可为空)", example = "14813") + private Long userId; + + @Schema(description = "联系电话") + private String phone; + + @Schema(description = "电子邮箱") + private String email; + + @Schema(description = "状态 (1-在职, 0-离职)", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelRespVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelRespVO.java new file mode 100644 index 0000000..287ab31 --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelRespVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.hand.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 com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 人员信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class PersonnelRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19452") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @ExcelProperty("姓名") + private String name; + + @Schema(description = "工号", example = "32467") + @ExcelProperty("工号") + private String employeeId; + + @Schema(description = "关联的系统用户ID (关联系统用户表, 可为空)", example = "14813") + @ExcelProperty("关联的系统用户ID (关联系统用户表, 可为空)") + private Long userId; + + @Schema(description = "联系电话") + @ExcelProperty("联系电话") + private String phone; + + @Schema(description = "电子邮箱") + @ExcelProperty("电子邮箱") + private String email; + + @Schema(description = "状态 (1-在职, 0-离职)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("状态 (1-在职, 0-离职)") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelSaveReqVO.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelSaveReqVO.java new file mode 100644 index 0000000..8dd9c4a --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/PersonnelSaveReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.hand.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 人员信息新增/修改 Request VO") +@Data +public class PersonnelSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19452") + private Long id; + + @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotEmpty(message = "姓名不能为空") + private String name; + + @Schema(description = "工号", example = "32467") + private String employeeId; + + @Schema(description = "关联的系统用户ID (关联系统用户表, 可为空)", example = "14813") + private Long userId; + + @Schema(description = "联系电话") + private String phone; + + @Schema(description = "电子邮箱") + private String email; + + @Schema(description = "状态 (1-在职, 0-离职)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "状态 (1-在职, 0-离职)不能为空") + private Integer status; + +} \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/TdengineDataVo.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/TdengineDataVo.java index a279ce6..852f145 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/TdengineDataVo.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/vo/TdengineDataVo.java @@ -27,8 +27,6 @@ public class TdengineDataVo { @Schema(description = "纬度") private Double latitude; - @Schema(description = "纬度") - private Integer gasType; @Schema(description = "更新时间") private Timestamp ts; diff --git a/cc-admin-master/yudao-module-hand/src/main/resources/mapper/PersonnelMapper.xml b/cc-admin-master/yudao-module-hand/src/main/resources/mapper/PersonnelMapper.xml new file mode 100644 index 0000000..b22c520 --- /dev/null +++ b/cc-admin-master/yudao-module-hand/src/main/resources/mapper/PersonnelMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml b/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml index 795b9f9..cff7e2c 100644 --- a/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml +++ b/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml @@ -25,17 +25,17 @@ INSERT INTO device_data_log_#{sn} USING device_data_log TAGS(#{sn}, #{tenantId}) - (ts, battery, `value`, longitude, latitude, `name`,gas_type) + (ts, battery, `value`, longitude, latitude, `name`) VALUES - (#{log.ts}, #{log.battery}, #{log.value}, #{log.longitude}, #{log.latitude}, #{log.name}, #{log.gasType}) + (#{log.ts}, #{log.battery}, #{log.value}, #{log.longitude}, #{log.latitude}, #{log.name}) \ No newline at end of file diff --git a/cc-admin-master/yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java b/cc-admin-master/yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java index a9ed8fb..bc98a4a 100644 --- a/cc-admin-master/yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java +++ b/cc-admin-master/yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java @@ -70,11 +70,11 @@ public class DefaultController { "[AI 大模型 yudao-module-ai - 已禁用][参考 https://doc.iocoder.cn/ai/build/ 开启]"); } - @RequestMapping(value = { "/admin-api/iot/**"}) +/* @RequestMapping(value = { "/admin-api/iot/**"}) public CommonResult iot404() { return CommonResult.error(NOT_IMPLEMENTED.getCode(), "[IoT 物联网 yudao-module-iot - 已禁用][参考 https://doc.iocoder.cn/iot/build/ 开启]"); - } + }*/ /** * 测试接口:打印 query、header、body diff --git a/cc-admin-master/yudao-server/src/main/resources/application-local.yaml b/cc-admin-master/yudao-server/src/main/resources/application-local.yaml index 1acd1af..9bfc634 100644 --- a/cc-admin-master/yudao-server/src/main/resources/application-local.yaml +++ b/cc-admin-master/yudao-server/src/main/resources/application-local.yaml @@ -114,7 +114,7 @@ spring: password: rabbit # RabbitMQ 服务的密码 # Kafka 配置项,对应 KafkaProperties 配置类 kafka: - bootstrap-servers: video.zdhlcn.com:9092 # 或者内网地址 172.21.16.6:9091,或者测试地址video.zdhlcn.com:9092 + bootstrap-servers: zdmq.zdhlcn.com:9092 # 或者内网地址 172.21.16.6:9091,或者测试地址video.zdhlcn.com:9092,zdmq.zdhlcn.com:9092 properties: security.protocol: SASL_PLAINTEXT sasl.mechanism: SCRAM-SHA-512 @@ -221,7 +221,7 @@ pf4j: pluginsDir: ../plugins mqtt: - enable: true + enable: false url: tcp://zdmq.zdhlcn.com:2883 username: mobileqt password: DVSwxQwY