diff --git a/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java b/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java index 4a92df33..e981043a 100644 --- a/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java +++ b/RuoYi-Vue-Plus/ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java @@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; /** * 启动程序 @@ -14,6 +15,7 @@ import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true) +@EnableScheduling public class DromaraApplication { public static void main(String[] args) { diff --git a/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml b/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml index 07402375..f381b23c 100644 --- a/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml +++ b/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application-dev.yml @@ -52,32 +52,32 @@ spring: url: jdbc:mysql://192.168.110.199:3306/energy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: energy password: fikwNsk8BidXSKe4 -# # 从库数据源 -# slave: -# lazy: true -# type: ${spring.datasource.type} -# driverClassName: com.mysql.cj.jdbc.Driver -# url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -# username: -# password: -# oracle: -# type: ${spring.datasource.type} -# driverClassName: oracle.jdbc.OracleDriver -# url: jdbc:oracle:thin:@//localhost:1521/XE -# username: ROOT -# password: root -# postgres: -# type: ${spring.datasource.type} -# driverClassName: org.postgresql.Driver -# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true -# username: root -# password: root -# sqlserver: -# type: ${spring.datasource.type} -# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver -# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true -# username: SA -# password: root + # # 从库数据源 + # slave: + # lazy: true + # type: ${spring.datasource.type} + # driverClassName: com.mysql.cj.jdbc.Driver + # url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + # username: + # password: + # oracle: + # type: ${spring.datasource.type} + # driverClassName: oracle.jdbc.OracleDriver + # url: jdbc:oracle:thin:@//localhost:1521/XE + # username: ROOT + # password: root + # postgres: + # type: ${spring.datasource.type} + # driverClassName: org.postgresql.Driver + # url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true + # username: root + # password: root + # sqlserver: + # type: ${spring.datasource.type} + # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver + # url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true + # username: SA + # password: root hikari: # 最大连接池数量 maxPoolSize: 20 @@ -206,7 +206,7 @@ justauth: client-id: 449c4*********937************759 client-secret: ac7***********1e0************28d redirect-uri: ${justauth.address}/social-callback?source=topiam - scopes: [openid, email, phone, profile] + scopes: [ openid, email, phone, profile ] qq: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e @@ -263,6 +263,7 @@ justauth: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab +# 和风天气 https://dev.qweather.com/ weather: key-id: T65EAABUXC project-id: 2JTHPUQ5YY diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncDeleteProjectCache.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncDeleteProjectCache.java new file mode 100644 index 00000000..59d6b446 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncDeleteProjectCache.java @@ -0,0 +1,43 @@ +package org.dromara.job.cycle; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.dromara.project.constant.BusProjectConstant; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.HashSet; +import java.util.Set; + +@Slf4j +@Component +public class IncSyncDeleteProjectCache { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + // 每天凌晨 12 点执行 + @Scheduled(cron = "0 0 0 * * ?") + public void run() { + log.info("执行定时任务:清理项目缓存"); + // 构建扫描选项 + ScanOptions scanOptions = ScanOptions.scanOptions() + .match(BusProjectConstant.PROJECT_CACHE_REDIS_KEY_PREFIX + "*") + .count(1000) // 每次 scan 的数量 + .build(); + Set keysToDelete = new HashSet<>(); + Cursor cursor = stringRedisTemplate.getConnectionFactory() + .getConnection() + .scan(scanOptions); + while (cursor.hasNext()) { + keysToDelete.add(new String(cursor.next())); + } + // 批量删除 + if (!keysToDelete.isEmpty()) { + stringRedisTemplate.delete(keysToDelete); + } + } +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java index 91bbbf42..0d4faf0e 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/manager/weathermanager/WeatherManager.java @@ -3,6 +3,7 @@ package org.dromara.manager.weathermanager; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.exception.ServiceException; import org.springframework.stereotype.Component; @@ -21,6 +22,7 @@ import java.util.Base64; * @author lcj * @date 2025/5/12 17:33 */ +@Slf4j @Component public class WeatherManager { @@ -48,6 +50,7 @@ public class WeatherManager { .execute()) { int status = result.getStatus(); if (status != HttpStatus.SUCCESS) { + log.error("获取天气失败,状态码:{},body:{}", status, result.body()); throw new ServiceException("获取天气失败,状态码:" + status, HttpStatus.ERROR); } body = result.body(); diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/constant/BusProjectConstant.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/constant/BusProjectConstant.java index c153241c..877e2063 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/constant/BusProjectConstant.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/constant/BusProjectConstant.java @@ -11,4 +11,14 @@ public interface BusProjectConstant { */ String PROJECT_WEATHER_LIST_VO_REDIS_KEY_PREFIX = "project:weather:list"; + /** + * 项目安全生产天数缓存的 Redis Key 前缀 + */ + String PROJECT_SAFETY_DAYS_REDIS_KEY_PREFIX = "project:safetyDays"; + + /** + * 项目缓存的 Redis Key 前缀 + */ + String PROJECT_CACHE_REDIS_KEY_PREFIX = "project"; + } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java index 3d9e75d8..21bf22c2 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectController.java @@ -21,6 +21,7 @@ import org.dromara.project.domain.req.project.BusProjectCreateReq; import org.dromara.project.domain.req.project.BusProjectQueryReq; import org.dromara.project.domain.req.project.BusProjectUpdateReq; import org.dromara.project.domain.vo.project.BusProjectContractorListVo; +import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.service.IBusProjectService; @@ -131,4 +132,13 @@ public class BusProjectController extends BaseController { return R.ok(projectService.getWeather(id)); } + /** + * 查询项目安全天数 + */ + @GetMapping("/safetyDay/{id}") + public R getSafetyDay(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(projectService.getSafetyDay(id)); + } + } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectSafetyDayVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectSafetyDayVo.java new file mode 100644 index 00000000..8bb2cfb2 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectSafetyDayVo.java @@ -0,0 +1,23 @@ +package org.dromara.project.domain.vo.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lcj + * @date 2025/5/14 9:34 + */ +@Data +public class BusProjectSafetyDayVo implements Serializable { + + @Serial + private static final long serialVersionUID = -1479490255029878315L; + + /** + * 安全生产天数 + */ + private Integer safetyDay; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java index 9f4457b0..081f04f1 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java @@ -3,7 +3,6 @@ package org.dromara.project.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.validation.constraints.NotNull; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.project.domain.BusProject; @@ -11,6 +10,7 @@ import org.dromara.project.domain.req.project.BusProjectCreateReq; import org.dromara.project.domain.req.project.BusProjectQueryReq; import org.dromara.project.domain.req.project.BusProjectUpdateReq; import org.dromara.project.domain.vo.project.BusProjectContractorListVo; +import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.project.domain.vo.project.BusProjectWeatherVo; @@ -130,4 +130,12 @@ public interface IBusProjectService extends IService { */ List getWeather(Long id); + /** + * 获取项目安全天数 + * + * @param id 项目id + * @return 安全天数 + */ + BusProjectSafetyDayVo getSafetyDay(Long id); + } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java index 76ab85db..419b2469 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java @@ -20,6 +20,7 @@ import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.vo.IdAndNameVO; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -36,6 +37,7 @@ import org.dromara.project.domain.req.project.BusProjectCreateReq; import org.dromara.project.domain.req.project.BusProjectQueryReq; import org.dromara.project.domain.req.project.BusProjectUpdateReq; import org.dromara.project.domain.vo.project.BusProjectContractorListVo; +import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo; import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.project.domain.vo.project.BusProjectWeatherVo; import org.dromara.project.mapper.BusProjectMapper; @@ -85,8 +87,8 @@ public class BusProjectServiceImpl extends ServiceImpl WEATHER_CACHE = Caffeine.newBuilder().initialCapacity(1024) .maximumSize(10000L) - // 缓存 30 分钟移除 - .expireAfterWrite(30L, TimeUnit.MINUTES) + // 缓存 60 分钟移除 + .expireAfterWrite(60L, TimeUnit.MINUTES) .build(); /** @@ -532,12 +534,45 @@ public class BusProjectServiceImpl extends ServiceImpl valueOps = stringRedisTemplate.opsForValue(); + String cachedValue = valueOps.get(cacheKey); + if (cachedValue != null) { + // 如果命中Redis,返回结果 + return JSONUtil.toBean(cachedValue, BusProjectSafetyDayVo.class); + } + BusProject project = this.getById(id); + if (project == null) { + throw new ServiceException("项目信息不存在", HttpStatus.NOT_FOUND); + } + int days = DateUtils.differentDaysByMillisecond(project.getCreateTime(), new Date()); + BusProjectSafetyDayVo safetyDayVo = new BusProjectSafetyDayVo(); + safetyDayVo.setSafetyDay(days); + // 更新缓存 + String cacheValue = JSONUtil.toJsonStr(safetyDayVo); + // 更新 Redis 缓存 + int cacheExpireTime = 12; + valueOps.set(cacheKey, cacheValue, cacheExpireTime, TimeUnit.HOURS); + // 返回结果 + return safetyDayVo; + } + /** * 根据天气图标获取天气类别 * diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseSafetyInspectionServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseSafetyInspectionServiceImpl.java index 4c73e927..55af7ad8 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseSafetyInspectionServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/safety/service/impl/HseSafetyInspectionServiceImpl.java @@ -150,6 +150,9 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl teamMeetings = teamMeetingService.lambdaQuery() .eq(HseTeamMeeting::getProjectId, projectId) .list(); + if (CollUtil.isEmpty(teamMeetings)){ + return gisVo; + } // 获取最新的班组列表 List topList = teamMeetings.stream() .sorted(Comparator.comparing(HseTeamMeeting::getCreateTime).reversed())