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/application-druid.yml b/RuoYi-Vue-Oracle/src/main/resources/application-druid.yml index 3f8f831..c54df10 100644 --- a/RuoYi-Vue-Oracle/src/main/resources/application-druid.yml +++ b/RuoYi-Vue-Oracle/src/main/resources/application-druid.yml @@ -1,67 +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! - url: jdbc:oracle:thin:@218.58.79.146:17521/orcl - username: system - password: oracle - # 从库数据源 - 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 + 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 index fe05cdd..eae9cba 100644 --- a/RuoYi-Vue-Oracle/src/main/resources/application.yml +++ b/RuoYi-Vue-Oracle/src/main/resources/application.yml @@ -15,7 +15,7 @@ ruoyi: # 本地文件上传 file: domain: -# path: /home/file/upload + # path: /home/file/upload path: D:/ruoyi/uploadPath prefix: /statics # 开发环境配置 @@ -73,15 +73,15 @@ spring: # redis 配置 redis: # 地址 - host: 192.168.31.105 - # host: 127.0.0.1 + # host: 192.168.31.105 + host: 127.0.0.1 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 -# password: 123456 - password: admin123! + password: 123456 + # password: admin123! # 连接超时时间 timeout: 10s lettuce: @@ -103,7 +103,7 @@ token: secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 30 - + # MyBatis配置 mybatis: # 搜索指定包别名 @@ -114,7 +114,7 @@ mybatis: configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 -pagehelper: +pagehelper: helperDialect: oracle supportMethodsArguments: true params: count=countSql @@ -134,7 +134,7 @@ xss: excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* - + # 代码生成 gen: # 作者 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 +
+ + + + + + + + + +
+ 导出 +
+
+
+ + + + + + + + + + + + + + + + + +
+ + + + + diff --git a/ruoyi-ui/src/views/dataStatistics/monthData/index.vue b/ruoyi-ui/src/views/dataStatistics/monthData/index.vue index 5a623b5..e830d67 100644 --- a/ruoyi-ui/src/views/dataStatistics/monthData/index.vue +++ b/ruoyi-ui/src/views/dataStatistics/monthData/index.vue @@ -18,12 +18,14 @@ import CreateReport from "./create-report.vue"; import DataOverview from "./data-overview.vue"; import DataDetail from "./data-detail.vue"; +import DataCompare from "./data-compare.vue"; export default { name: "MonthData", components: { CreateReport, DataOverview, DataDetail, + DataCompare, }, data() { return { @@ -41,6 +43,10 @@ export default { label: "数据详情", cpn: "DataDetail", }, + { + label: "港区对比", + cpn: "DataCompare", + }, ], }; }, diff --git a/ruoyi-ui/src/views/dataStatistics/yearData/index.vue b/ruoyi-ui/src/views/dataStatistics/yearData/index.vue index 3d69624..585fcfe 100644 --- a/ruoyi-ui/src/views/dataStatistics/yearData/index.vue +++ b/ruoyi-ui/src/views/dataStatistics/yearData/index.vue @@ -31,13 +31,45 @@ :data="tableData" style="width: 100%" border - :max-height="tableHeight" + :span-method="objectSpanMethod" + :row-class-name="tableRowClassName" v-loading="loading" > - - + + + + + + + + + - + -
+
@@ -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,