From f01fb04289d221ff8f970d76c4036ba836a40e4b Mon Sep 17 00:00:00 2001 From: LokerL Date: Fri, 8 Nov 2024 09:44:11 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-druid.yml | 64 ++++++++ .../src/main/resources/application.yml | 147 ++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 RuoYi-Vue-Oracle/src/main/resources/application-druid.yml create mode 100644 RuoYi-Vue-Oracle/src/main/resources/application.yml diff --git a/RuoYi-Vue-Oracle/src/main/resources/application-druid.yml b/RuoYi-Vue-Oracle/src/main/resources/application-druid.yml new file mode 100644 index 0000000..c54df10 --- /dev/null +++ b/RuoYi-Vue-Oracle/src/main/resources/application-druid.yml @@ -0,0 +1,64 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: oracle.jdbc.driver.OracleDriver + druid: + # 主库数据源 + master: + # url: jdbc:oracle:thin:@127.0.0.1:1521/orcl + # username: root + # password: password + url: jdbc:oracle:thin:@10.169.28.44:1521/orcl + username: spg_voc + password: SPG$spgvoc_24! + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: false + wall: + config: + multi-statement-allow: true \ No newline at end of file diff --git a/RuoYi-Vue-Oracle/src/main/resources/application.yml b/RuoYi-Vue-Oracle/src/main/resources/application.yml new file mode 100644 index 0000000..eae9cba --- /dev/null +++ b/RuoYi-Vue-Oracle/src/main/resources/application.yml @@ -0,0 +1,147 @@ +# 项目相关配置 +ruoyi: + # 名称 + name: RuoYi + # 版本 + version: 3.8.8 + # 版权年份 + copyrightYear: 2024 + # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) + profile: D:/ruoyi/uploadPath + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math +# 本地文件上传 +file: + domain: + # path: /home/file/upload + path: D:/ruoyi/uploadPath + prefix: /statics +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.ruoyi: debug + org.springframework: warn + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: druid + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + # host: 192.168.31.105 + host: 127.0.0.1 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: 123456 + # password: admin123! + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 30 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.ruoyi.project.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mybatis/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + helperDialect: oracle + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + +# 代码生成 +gen: + # 作者 + author: ruoyi + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.ruoyi.project.system + # 自动去除表前缀,默认是true + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ \ No newline at end of file From 1cbfa43044117a852f87d05eb09cf0be451b8ce2 Mon Sep 17 00:00:00 2001 From: LokerL Date: Fri, 8 Nov 2024 10:25:51 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1-=E6=9C=88=E5=BA=A6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE-=E6=B8=AF=E5=8C=BA=E5=AF=B9=E6=AF=94?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/OilStatisticsController.java | 19 +- .../oil/controller/SysSendInfoController.java | 2 +- .../oil/mapper/ThDeviceReportMapper.java | 3 + .../service/IOilThDeviceReportService.java | 2 + .../impl/OilThDeviceReportService.java | 5 + .../mybatis/oil/ThDeviceReportMapper.xml | 23 ++ ruoyi-ui/src/api/statistics/monthData.js | 8 + .../dataStatistics/monthData/data-compare.vue | 246 ++++++++++++++++++ .../views/dataStatistics/monthData/index.vue | 6 + 9 files changed, 312 insertions(+), 2 deletions(-) create mode 100644 ruoyi-ui/src/views/dataStatistics/monthData/data-compare.vue diff --git a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/OilStatisticsController.java b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/OilStatisticsController.java index 11d3801..a14868a 100644 --- a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/OilStatisticsController.java +++ b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/OilStatisticsController.java @@ -155,10 +155,27 @@ public class OilStatisticsController extends BaseController { resultMap.put("preMonthDs", preMonthDs); resultMap.put("lastYearDs", lastYearDs); return success(resultMap); - } + } + + @GetMapping("/monthData/dataDetailGangQuCompare") + public AjaxResult dataDetailGangQuCompare(Long deptId, String month) { + // 本月ds均值 + List> currentMonthDs = oilThDeviceReportService.monthReportDataOverviewGangQuCompare(deptId, month); + // 上月ds均值 + List> preMonthDs = oilThDeviceReportService.monthReportDataOverviewGangQuCompare(deptId, getPreviousMonth(month)); + // 去年同月ds均值 + List> lastYearDs = oilThDeviceReportService.monthReportDataOverviewGangQuCompare(deptId, getLastYearMonth(month)); + + Map resultMap = new HashMap<>(); + resultMap.put("currentMonthDs", currentMonthDs); + resultMap.put("preMonthDs", preMonthDs); + resultMap.put("lastYearDs", lastYearDs); + return success(resultMap); + } /** * 获取去年同月 + * * @param month 2024-09 * @return 2023-09 */ diff --git a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/SysSendInfoController.java b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/SysSendInfoController.java index bcea5f5..0c132af 100644 --- a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/SysSendInfoController.java +++ b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/controller/SysSendInfoController.java @@ -53,7 +53,7 @@ public class SysSendInfoController extends BaseController { */ @Log(title = "发送消息", businessType = BusinessType.UPDATE) @GetMapping ("/sendMessage") - public AjaxResult sendMessage(SendMessageDTO sendMessageDTO) { + public AjaxResult sendMessage(SendMessageDTO sendMessageDTO) throws Exception { return success(iSysNoticeService.sendMessage(sendMessageDTO)); } diff --git a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/mapper/ThDeviceReportMapper.java b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/mapper/ThDeviceReportMapper.java index f03879d..f2ddf4c 100644 --- a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/mapper/ThDeviceReportMapper.java +++ b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/mapper/ThDeviceReportMapper.java @@ -65,6 +65,9 @@ public interface ThDeviceReportMapper { @MapKey("month") List> monthReportDataOverviewDeviceDs(@Param("deptId") Long deptId, @Param("month") String month); + @MapKey("month") + List> monthReportDataOverviewGangQuCompare(@Param("deptId") Long deptId, @Param("month") String month); + /** * 每日数据 * @param day 日期 2024-08-30 diff --git a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/IOilThDeviceReportService.java b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/IOilThDeviceReportService.java index 48d6047..a9f36ef 100644 --- a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/IOilThDeviceReportService.java +++ b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/IOilThDeviceReportService.java @@ -8,6 +8,8 @@ public interface IOilThDeviceReportService { List> monthReportDataOverviewDeviceDs(Long deptId, String month); + List> monthReportDataOverviewGangQuCompare(Long deptId, String month); + List> dailyReportDataOverview(String day); List> selectAlarmCountByDeptIdAndDateRange(Long deptId, String beginDate, String endDate); diff --git a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/impl/OilThDeviceReportService.java b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/impl/OilThDeviceReportService.java index 81ad6b3..30c6f29 100644 --- a/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/impl/OilThDeviceReportService.java +++ b/RuoYi-Vue-Oracle/src/main/java/com/ruoyi/project/oil/service/impl/OilThDeviceReportService.java @@ -26,6 +26,11 @@ public class OilThDeviceReportService implements IOilThDeviceReportService { return camelCaseMapListKey(thDeviceReportMapper.monthReportDataOverviewDeviceDs(deptId, month)); } + @Override + public List> monthReportDataOverviewGangQuCompare(Long deptId, String month) { + return camelCaseMapListKey(thDeviceReportMapper.monthReportDataOverviewGangQuCompare(deptId, month)); + } + @Override public List> dailyReportDataOverview(String day) { return camelCaseMapListKey(thDeviceReportMapper.dailyReportDataOverview(day)); diff --git a/RuoYi-Vue-Oracle/src/main/resources/mybatis/oil/ThDeviceReportMapper.xml b/RuoYi-Vue-Oracle/src/main/resources/mybatis/oil/ThDeviceReportMapper.xml index 64b28df..b2cdcab 100644 --- a/RuoYi-Vue-Oracle/src/main/resources/mybatis/oil/ThDeviceReportMapper.xml +++ b/RuoYi-Vue-Oracle/src/main/resources/mybatis/oil/ThDeviceReportMapper.xml @@ -145,6 +145,29 @@ ORDER BY pp.dept_name, p.dept_name + + + select m.sn, - m.dept_id, m.year, round(AVG(TO_NUMBER(m.avg_value)), 8) AS avg_value, p.dept_name, - p.ancestors, - pp.dept_name as "gangqu" + p.dept_name as "p", + pp.dept_name as "pp", + ppp.dept_name as "ppp" from th_device_report_month1 m left join sys_dept p on m.dept_id = p.dept_id left join sys_dept pp on p.parent_id = pp.dept_id + left join sys_dept ppp on pp.parent_id = ppp.dept_id WHERE m.dept_id IN ( SELECT dept_id FROM sys_dept START WITH dept_id = #{deptId} @@ -65,8 +66,8 @@ AND m.year = #{year} - GROUP BY m.sn, m.dept_id, m.year, p.dept_name, p.ancestors, pp.dept_name - ORDER BY m.dept_id, m.year ASC + GROUP BY m.sn, m.year, p.dept_name, pp.dept_name, ppp.dept_name + ORDER BY ppp.dept_name, pp.dept_name, p.dept_name - - + + + + + + + + + - + -
+
@@ -102,6 +134,9 @@ export default { tableHeight() { return window.innerHeight - 300; }, + pppList() { + return Array.from(new Set(this.tableData.map((item) => item.ppp))); + }, }, mounted() { // 获取当前年份 2024 @@ -109,6 +144,68 @@ export default { this.queryDebounce = debounce(this.query, 100); }, methods: { + tableRowClassName({ row, rowIndex }) { + const classNames = ["default-row", "success-row", "error-row", "warning-row", "info-row"]; + const index = this.pppList.findIndex((item) => item === row.ppp); + if (index === -1) return "info-row"; + return index > classNames.length - 1 ? classNames[index % classNames.length] : classNames[index]; + }, + getChildCount(row, key, childKey) { + const childSet = new Set(); + for (let i = 0; i < this.tableData.length; i++) { + if (row[key] === this.tableData[i][key]) { + childSet.add(this.tableData[i][childKey]); + } + } + return childSet.size; + }, + calculateChildAvg(row, key) { + const childList = []; + for (let i = 0; i < this.tableData.length; i++) { + if (row[key] === this.tableData[i][key]) { + childList.push(this.tableData[i].avgValue); + } + } + // 计算平均值, 保留两位小数 + return (childList.reduce((a, b) => a + b, 0) / childList.length).toFixed( + 2 + ); + }, + objectSpanMethod({ row, column, rowIndex, columnIndex }) { + const calculateRowSpan = (key) => { + const value = row[key]; + let rowSpan = 1; + if (rowIndex === 0) { + while ( + this.tableData[rowIndex + rowSpan] && + this.tableData[rowIndex + rowSpan][key] === value + ) { + rowSpan++; + } + return { rowspan: rowSpan, colspan: 1 }; + } else { + if (this.tableData[rowIndex - 1][key] === value) { + return { rowspan: 0, colspan: 0 }; + } else { + while ( + this.tableData[rowIndex + rowSpan] && + this.tableData[rowIndex + rowSpan][key] === value + ) { + rowSpan++; + } + return { rowspan: rowSpan, colspan: 1 }; + } + } + }; + + if (columnIndex === 0) { + return calculateRowSpan("ppp"); + } else if (columnIndex === 1) { + return calculateRowSpan("pp"); + } else if (columnIndex === 2) { + return calculateRowSpan("p"); + } + }, handleYearChange() { this.queryDebounce(); }, @@ -130,16 +227,16 @@ export default { } this.loading = true; - getDeviceReportYearList({ + getDeviceReportYearListAll({ deptId: this.dept.deptId, year: this.year, - pageNum: this.pageNum, - pageSize: this.pageSize, + // pageNum: this.pageNum, + // pageSize: this.pageSize, }) .then((res) => { if (res.code === 200) { - this.tableData = res.rows; - this.total = res.total; + this.tableData = res.data; + // this.total = res.total; } }) .finally(() => { @@ -161,10 +258,11 @@ export default { dataToExcel({ data: [ [fileName], - ["归属港区", "归属企业", "设备编码", "年份", "平均值"], + ["归属港口", "归属港区", "归属企业", "设备编码", "年份", "平均值"], ...data.map((row) => [ - row.gangqu, - row.deptName, + row.ppp, + row.pp, + row.p, row.sn, row.year, row.avgValue,