From fab51ed95159ffb71d58030a0d9f303c36733add Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 24 十月 2024 08:45:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'supervisionVue/hc-dataAnalysis-1023'
---
src/api/fysp/analysisApi.js | 7
src/views/fysp/data-product/ProdDailyReport.vue | 607 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 613 insertions(+), 1 deletions(-)
diff --git a/src/api/fysp/analysisApi.js b/src/api/fysp/analysisApi.js
new file mode 100644
index 0000000..35a3078
--- /dev/null
+++ b/src/api/fysp/analysisApi.js
@@ -0,0 +1,7 @@
+import { $fysp } from '../index';
+
+export default {
+ checkProblem(data) {
+ return $fysp.post(`search/dailyreport`, data).then((res) => res.data);
+ },
+}
\ No newline at end of file
diff --git a/src/views/fysp/data-product/ProdDailyReport.vue b/src/views/fysp/data-product/ProdDailyReport.vue
index 78b8c00..209e2ff 100644
--- a/src/views/fysp/data-product/ProdDailyReport.vue
+++ b/src/views/fysp/data-product/ProdDailyReport.vue
@@ -1,9 +1,614 @@
<template>
- <div>DailyReport</div>
+ <!-- 涓诲唴瀹� -->
+ <div class="m-task container">
+ <!--澶撮儴淇℃伅-->
+ <div class="h-top col-md-12">
+ <div class="options">
+ <!-- <input type="date" class="c-time c-check" /> -->
+ <!-- 鏃堕棿 -->
+ <el-form-item label="鏃堕棿" :prop="prop" style="margin-left: 10px">
+ <el-date-picker
+ v-model="formSearch.time"
+ type="date"
+ placeholder="閫夋嫨鏃堕棿"
+ start-placeholder="閫夋嫨寮�濮嬫椂闂�"
+ end-placeholder="閫夋嫨缁撴潫鏃堕棿"
+ style="width: 180px"
+ />
+ </el-form-item>
+ <el-form-item label="鍖哄煙" :prop="prop" style="margin-left: 10px">
+ <el-select
+ placeholder="Select"
+ v-model="formSearch.districtCode"
+ class="c-area c-check"
+ style="width: 100px"
+ >
+ <el-option label="閲戝北鍖�" value="310116"></el-option>
+ <el-option label="闈欏畨鍖�" value="310106"></el-option>
+ <el-option label="寰愭眹鍖�" value="310104"></el-option>
+ <el-option label="闀垮畞鍖�" value="310105"></el-option>
+ </el-select>
+ </el-form-item>
+
+ <el-button
+ style="margin-left: 10px"
+ class="check-msg"
+ @click="search"
+ type="primary"
+ >鏌ヨ</el-button
+ >
+ <el-button type="primary" class="" @click="exportToExcel()">
+ 鐢熸垚鎶ュ憡
+ </el-button>
+ </div>
+ <div class="m-top">
+ <span class="title-input"> {{ reportName }} </span>
+ <!-- <input
+ type="text"
+ class="title-input"
+ value="绉嬪啲姹℃煋瀛f湡闂村緪姹囧尯鎵皹姹℃煋杈呭姪鐩戠宸ヤ綔鏃ユ姤"
+ /> -->
+ </div>
+ </div>
+
+ <div class="m-msg col-md-12">
+ <span
+ name="desc"
+ class="desc-textarea"
+ rows="5"
+ value=""
+ cols=""
+ disabled
+ ></span>
+ <div class="report-table row">
+ <table id="table_subtask" class="" border="1"></table>
+ </div>
+ </div>
+
+ <div class="dark-screen">
+ <i class="fa fa-spinner fa-spin fa-3x" style="color: white"></i>
+ </div>
+ </div>
</template>
<script>
+import taskApi from '@/api/fysp/taskApi';
+import dayjs from 'dayjs';
+import * as XLSX from 'xlsx';
+import FileSaver from 'file-saver';
+import analysisApi from '@/api/fysp/analysisApi.js';
export default {
name: 'DailyReport',
+ computed: {
+ reportName() {
+ var city = '';
+ switch (this.formSearch.districtCode) {
+ case '310116':
+ city = '閲戝北鍖�';
+ break;
+ case '310106':
+ city = '闈欏畨鍖�';
+ break;
+ case '310104':
+ city = '寰愭眹鍖�';
+ break;
+ case '310105':
+ city = '闀垮畞鍖�';
+ break;
+ }
+
+ let title = `${city}鎵皹姹℃煋杈呭姪鐩戠宸ヤ綔鏃ユ姤`;
+ return title;
+ }
+ },
+ data() {
+ return {
+ CompTable: {
+ title: [],
+ content: [],
+ tableStyleClass: 'comp-table',
+ rowStyleClss: 'oddrowcolor',
+
+ init: function (title, content) {
+ this.title = title;
+ this.content = content;
+ },
+
+ /**
+ * 灞曠ず琛ㄦ牸
+ * @param {*} elementId table鐨刬d
+ */
+ show: function (elementId) {
+ const table = document.getElementById(elementId);
+ if (table) {
+ table.innerHTML = '';
+ table.classList.add(this.tableStyleClass);
+ this.createHead(elementId);
+ this.createContents(elementId);
+ }
+ },
+
+ /**
+ * 鐢熸垚琛ㄥご
+ * @param {*} elementId
+ */
+ createHead: function (elementId) {
+ const element = document.getElementById(elementId);
+ if (element) {
+ const row = document.createElement('tr');
+ for (let index = 0; index < this.title.length; index++) {
+ const th = document.createElement('th');
+ th.setAttribute('align', 'center');
+ th.textContent =
+ this.title[index] === undefined ? '' : this.title[index];
+ row.appendChild(th);
+ }
+ element.appendChild(row);
+ }
+ },
+
+ /**
+ * 鐢熸垚琛ㄥ唴瀹�
+ * @param {*} elementId
+ */
+ createContents: function (elementId) {
+ const element = document.getElementById(elementId);
+ if (element) {
+ for (let index = 0; index < this.content.length; index++) {
+ if (index % 2 === 0) {
+ this.rowStyleClss = 'evenrowcolor';
+ } else {
+ this.rowStyleClss = 'oddrowcolor';
+ }
+ const rowArray = this.content[index];
+ this.createRow(rowArray, elementId);
+ }
+ }
+ },
+
+ /**
+ * 鐢熸垚涓�琛岋紙鍖呮嫭鍚堝苟鍗曞厓鏍硷級
+ * @param {*} rowArray
+ */
+ createRow: function (rowArray, elementId) {
+ const maxRows = this.getMaxRow(rowArray);
+ const leftArray = [];
+
+ const tr = document.createElement('tr');
+ for (let i = 0; i < rowArray.length; i++) {
+ let cell = rowArray[i];
+ if (Array.isArray(cell)) {
+ const rowspan = maxRows / cell.length;
+ const td = document.createElement('td');
+ td.setAttribute('rowspan', rowspan);
+ td.classList.add(this.rowStyleClss);
+ td.textContent = cell[0] === undefined ? '' : cell[0];
+ tr.appendChild(td);
+ leftArray.push(cell.slice(1)); // Save the rest of the cell contents
+ } else {
+ const td = document.createElement('td');
+ td.setAttribute('rowspan', maxRows);
+ td.classList.add(this.rowStyleClss);
+ td.textContent = cell === undefined ? '' : cell;
+ tr.appendChild(td);
+ }
+ }
+ document.getElementById(elementId).appendChild(tr);
+
+ for (let i = 1; i < maxRows; i++) {
+ const tr = document.createElement('tr');
+ leftArray.forEach((cell, y) => {
+ if (i < cell.length) {
+ const td = document.createElement('td');
+ td.setAttribute('rowspan', maxRows / (cell.length - i));
+ td.classList.add(this.rowStyleClss);
+ td.textContent = cell[i] === undefined ? '' : cell[i];
+ tr.appendChild(td);
+ }
+ });
+ document.getElementById(elementId).appendChild(tr);
+ }
+ },
+
+ /**
+ * 鑾峰彇杩欎竴琛屼腑闇�瑕佸悎骞剁殑琛屾暟
+ * @param {*} rowArray
+ */
+ getMaxRow: function (rowArray) {
+ let maxRows = 1;
+ rowArray.forEach((element) => {
+ if (Array.isArray(element) && element.length > maxRows) {
+ maxRows = element.length;
+ }
+ });
+ return maxRows;
+ }
+ },
+
+ canClickDay: [],
+ excelConfig: {
+ title: '',
+ data: [],
+ fields: []
+ },
+ table: {
+ headers: [],
+ data: []
+ },
+ formSearch: {
+ time: [],
+ districtCode: '310116'
+ }
+ };
+ },
+ watch: {
+ formSearch: {
+ handler(nV, oV) {
+ // this.getCanClickDay();
+ },
+ deep: true,
+ // immediate: true
+ }
+ },
+ mounted() {
+ this.formSearch.time = new Date();
+ },
+ methods: {
+ disabledDate(time) {
+ this.getCanClickDay()
+ let disabled =
+ this.canClickDay.filter((item) => {
+ let date = dayjs(time)
+ let itemDay = new Date(item)
+ console.log("curr preview time canClickDay", itemDay.getFullYear(), itemDay.getMonth(), itemDay.getDate());
+ console.log("curr preview time date", date.year(), date.month(), date.date());
+ return date.year() == itemDay.getFullYear() && date.month() == itemDay.getMonth() && date.date() == itemDay.getDate()
+ })
+ .length == 0;
+ return !disabled;
+ },
+ getSelectedCityname() {
+ let city = '';
+
+ switch (this.formSearch.districtCode) {
+ case '310116':
+ city = '閲戝北鍖�';
+ break;
+ case '310106':
+ city = '闈欏畨鍖�';
+ break;
+ case '310104':
+ city = '寰愭眹鍖�';
+ break;
+ case '310105':
+ city = '闀垮畞鍖�';
+ break;
+ }
+ return city;
+ },
+ getCanClickDay() {
+ taskApi.getTopTask().then((res) => {
+ this.canClickDay = [];
+ let city = this.getSelectedCityname();
+ res
+ .filter((r) => {
+ return (
+ r.districtname == city &&
+ dayjs(this.formSearch.time).year() == dayjs(r.starttime).year() &&
+ dayjs(this.formSearch.time).month() == dayjs(r.starttime).month()
+ );
+ })
+ .map((topTask) => {
+ taskApi.fetchDayTasks(topTask.tguid).then((res) => {
+ res.forEach((r) => {
+ let formSearchDate = dayjs(this.formSearch.time)
+ let date = new Date()
+ dayjs(date).year(formSearchDate.year()).month(formSearchDate.month()).date(Number(r.date.slice(8, 10)))
+ this.canClickDay.push(date);
+ });
+ console.log("this.canClickDay", this.canClickDay);
+
+ });
+ });
+ });
+ },
+ exportToExcel() {
+ // 鍒涘缓宸ヤ綔绨�
+ const wb = XLSX.utils.book_new();
+
+ var wsData = [];
+ for (let index = 0; index < this.table.data.length; index++) {
+ const dataItem = this.table.data[index];
+ var row = {};
+ wsData.push(row);
+ for (let index = 0; index < dataItem.length; index++) {
+ row[this.table.headers[index]] = dataItem[index];
+ }
+ }
+ console.log('data', wsData);
+
+ // 鍒涘缓宸ヤ綔琛�
+ const ws = XLSX.utils.json_to_sheet(wsData);
+
+ // 灏嗗伐浣滆〃娣诲姞鍒板伐浣滅翱
+ XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
+
+ // 鐢熸垚Excel鏂囦欢
+ const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'binary' });
+
+ // 瀛楃涓茶浆ArrayBuffer
+ function s2ab(s) {
+ const buf = new ArrayBuffer(s.length);
+ const view = new Uint8Array(buf);
+ for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
+ return buf;
+ }
+
+ // 淇濆瓨鏂囦欢
+ FileSaver.saveAs(
+ new Blob([s2ab(wbout)], { type: 'application/octet-stream' }),
+ `${this.reportName}.xlsx`
+ );
+ },
+ downloadFile() {
+ // 鏂囦欢鏍囬
+ let title = this.reportName;
+ // 琛ㄥご鎻忚堪
+ let desc = document.querySelector('.desc-textarea').textContent;
+ // 鏃堕棿
+ let time = document
+ .querySelector('.desc-textarea')
+ .textContent.split('锛�')[0];
+
+ // 鑾峰彇鏁版嵁
+ let thData = Array.from(document.getElementsByTagName('th')).map(
+ (th) => th.innerText
+ );
+ let tdData = Array.from(document.getElementsByTagName('td')).map(
+ (td) => td.innerText
+ );
+ let totalList = [];
+ let subList = [];
+ let index = 2;
+
+ let inputStatus = true;
+ for (let j = 0; j < thData.length; j++) {
+ subList.push(thData[j]);
+ }
+ totalList.push(subList);
+ subList = [];
+
+ for (let i = 0; i < tdData.length; i++) {
+ if (tdData[i] !== String(index)) {
+ if (tdData[i] !== '') {
+ subList.push(tdData[i]);
+ } else {
+ if (inputStatus) {
+ let inputList = document.querySelectorAll(`.input-${subList[0]}`);
+ for (let j = 0; j < inputList.length; j++) {
+ subList.push(inputList[j].value);
+ }
+ inputStatus = false;
+ } else {
+ inputStatus = true;
+ }
+ }
+ } else {
+ totalList.push(subList);
+ subList = [String(index)];
+ index += 1;
+ }
+ }
+ totalList.push(subList);
+
+ // index: 0 head
+ // other: data
+ // title
+
+ let fileData = {
+ title: title,
+ time: time,
+ desc: desc,
+ data: totalList
+ };
+
+ // if (fileData.title && fileData.time && fileData.desc && fileData.data.length) {
+ // fetch("http://47.100.191.150:9002/dustmonitor/report", {
+ // method: "POST",
+ // headers: {
+ // "Content-Type": "application/json"
+ // },
+ // body: JSON.stringify(fileData)
+ // })
+ // .then(response => response.json())
+ // .then(res => {
+ // if (res.status === 200) {
+ // let name = res.name.split("./")[1];
+ // setTimeout(() => {
+ // let a = document.createElement("a");
+ // a.href = appConfig.downloadUrl + name;
+ // a.download = name; // 璁剧疆涓嬭浇鏂囦欢鍚�
+ // document.body.appendChild(a);
+ // a.click();
+ // document.body.removeChild(a);
+ // }, 1000);
+ // }
+ // })
+ // .catch(error => console.error("Error:", error));
+ // }
+ },
+ search() {
+ let sTime = dayjs(this.formSearch.time).hour(0).minute(0).second(0);
+ let eTime = dayjs(this.formSearch.time).hour(23).minute(59).second(59);
+ eTime = eTime.toISOString();
+ sTime = sTime.toISOString();
+
+ let config = {
+ startTime: sTime,
+ endTime: eTime,
+ districtCode: this.formSearch.districtCode
+ };
+ analysisApi.checkProblem(config).then((res) => {
+ this.table.headers = res.tableTitle[0];
+ this.table.data = res.tableContent;
+
+ this.CompTable.init(res.tableTitle[0], res.tableContent);
+ this.CompTable.show('table_subtask');
+
+ const countMap = new Map(); //鍚勫満鏅暟閲�
+ let proCount = 0; //鎬昏闂鏁伴噺
+ let changeCount = 0; //鎬昏鏁存敼鏁伴噺
+
+ res.tableContent.forEach((cList) => {
+ const sceneType = cList[2];
+ if (!(sceneType in countMap)) {
+ countMap[sceneType] = 0;
+ }
+ countMap[sceneType] += 1;
+ proCount += Number(cList[10]);
+ changeCount += Number(cList[13]);
+ });
+
+ let countStr = '';
+ for (const key in countMap) {
+ const e = countMap[key];
+ if (countStr != '') {
+ countStr += '銆�';
+ }
+ countStr += `${key}${e}涓猔;
+ }
+
+ var descMsg = `鍏卞贰鏌�${res.tableContent.length}涓壃灏樺満鏅紙${countStr}锛夛紝鍏卞彂鐜伴棶棰�${proCount}椤癸紝鐫d績鏁存敼浜�${changeCount}椤癸紱鍓嶆湡浣欑暀闂鍧囧凡閿�椤广�俙;
+ console.log('descMsg', descMsg);
+
+ // 鑾峰彇鎵�鏈夌被鍚嶄负 'desc-textarea' 鐨勫厓绱�
+ const textareas = document.querySelectorAll('.desc-textarea');
+
+ // 閬嶅巻杩欎簺鍏冪礌骞惰缃叾 HTML 鍐呭
+ textareas.forEach(function (textarea) {
+ textarea.innerHTML = descMsg;
+ });
+ // $('.desc-textarea').html('');
+ // $('.desc-textarea').html(descMsg);
+ });
+ }
+ }
};
</script>
+<style>
+.options {
+ display: flex;
+}
+.c-time {
+ width: 12rem;
+ height: 3rem;
+ border-radius: 3px;
+
+ font-size: 1rem;
+}
+.download-div {
+}
+.download-btn {
+ background-color: #5599cc;
+ width: 10rem;
+ height: 2.6rem;
+ color: #ffffff;
+ border-radius: 3px;
+ margin-right: 2rem;
+}
+.h-top .m-top {
+ /* width: 100%; */
+ padding-right: 8rem;
+ /* padding: 0 7% 0 0%; */
+ /* min-height: 8rem; */
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: center;
+}
+.title-input {
+ margin-top: -20px;
+ border-radius: 6px;
+ color: #000;
+ width: 80%;
+ font-size: 1.5rem;
+ line-height: 5rem;
+ text-align: center;
+ border: none;
+}
+.report-desc {
+ width: 80%;
+ margin-top: 5rem;
+}
+.desc-textarea {
+ width: 100%;
+ text-indent: 6rem;
+ font-size: 1rem;
+ margin-left: 5px;
+}
+.report-table {
+ width: 100%;
+ margin-top: 2rem;
+ table-layout: fixed;
+}
+.r-table {
+ width: 100%;
+ font-size: 2rem;
+}
+.r-table tr {
+ height: auto;
+}
+.r-table th {
+ height: 100%;
+ text-align: center;
+}
+.r-table td {
+ border-width: 1px;
+ min-width: 6rem;
+}
+.render-html {
+ cursor: pointer;
+}
+.h-top .m-top .task-div {
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+ height: 2.6rem;
+ margin-bottom: 1rem;
+}
+
+/******************************琛ㄦ牸鏍峰紡*******************************/
+table.comp-table {
+ font-family: verdana, arial, sans-serif;
+ font-size: 11px;
+ color: #333333;
+ border-width: 1px;
+ border-color: #666666;
+ border-collapse: collapse;
+ margin: 4px;
+ width: 87vw;
+}
+table.comp-table th {
+ border-width: 1px;
+ padding: 8px;
+ border-style: solid;
+ border-color: #666666;
+ background-color: #dedede;
+ text-align: center; /** 璁剧疆姘村钩鏂瑰悜灞呬腑 */
+ vertical-align: middle; /** 璁剧疆鍨傜洿鏂瑰悜灞呬腑 */
+}
+table.comp-table td {
+ border-width: 1px;
+ padding: 8px;
+ border-style: solid;
+ border-color: #666666;
+ /* background-color: #ffffff; */
+}
+.oddrowcolor {
+ background-color: #d9f2f5;
+}
+.evenrowcolor {
+ background-color: #eff6f8;
+}
+/**********************************************************************/
+</style>
--
Gitblit v1.9.3