| | |
| | | <template> |
| | | <el-row align="top"> |
| | | <el-upload |
| | | ref="upload" |
| | | class="upload-file" |
| | | :limit="1" |
| | | accept=".xls,.xlsx" |
| | | :on-change="handleChange" |
| | | :on-exceed="handleExceed" |
| | | :auto-upload="false" |
| | | <el-row align="top" justify="space-between"> |
| | | <el-row align="top"> |
| | | <el-upload |
| | | ref="upload" |
| | | class="upload-file" |
| | | :limit="1" |
| | | accept=".xls,.xlsx" |
| | | :on-change="handleChange" |
| | | :on-exceed="handleExceed" |
| | | :auto-upload="false" |
| | | > |
| | | <template #trigger> |
| | | <el-button type="success" :loading="tableLoading">导å
¥æä»¶</el-button> |
| | | </template> |
| | | <template #tip> |
| | | <div> |
| | | <el-text type="danger">{{ tips }}</el-text> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | <div v-if="tableLoading"> |
| | | <el-icon class="is-loading"><Loading /></el-icon> |
| | | <el-text>{{ loadTxt }}</el-text> |
| | | </div> |
| | | </el-row> |
| | | <el-button type="default" icon="download" @click="downloadTemplate" |
| | | >ä¸è½½å¯¼å
¥æ¨¡æ¿</el-button |
| | | > |
| | | <template #trigger> |
| | | <el-button type="primary" :loading="tableLoading">导å
¥æä»¶</el-button> |
| | | </template> |
| | | <template #tip> |
| | | <div> |
| | | <el-text type="danger">{{ tips }}</el-text> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | <div v-if="tableLoading"> |
| | | <el-icon class="is-loading"><Loading /></el-icon> |
| | | <el-text>{{ loadTxt }}</el-text> |
| | | </div> |
| | | </el-row> |
| | | <el-table |
| | | ref="tableRef" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isUploadNewFile" |
| | | :show-overflow-tooltip="true" |
| | | prop="sceneIndex" |
| | | label="å¯ä¸ç¼å·" |
| | | width="70" |
| | | > |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | | size="small" |
| | | v-model="row.sceneIndex" |
| | | @change="(e) => handleSceneNameChange(e, row)" |
| | | /> |
| | | <span v-else>{{ row.sceneIndex }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | :show-overflow-tooltip="true" |
| | | prop="drSceneName" |
| | | label="åç§°" |
| | | width="300" |
| | | label="åºæ¯åç§°" |
| | | > |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | | size="small" |
| | | v-model="row.drSceneName" |
| | | @change="(e) => handleSceneNameChange(e, row)" |
| | | /> |
| | | <span v-else>{{ row.drSceneName }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isUploadNewFile" |
| | | :show-overflow-tooltip="true" |
| | | prop="drDeviceCode" |
| | | label="设å¤åç§°" |
| | | > |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | | size="small" |
| | | v-model="row.deviceName" |
| | | /> |
| | | <span v-else>{{ row.deviceName }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drDeviceCode" label="设å¤å·" width="130"> |
| | |
| | | <span v-else>{{ row.drDeviceCode }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drTime" label="æ¶é´" width="100"> |
| | | <el-table-column prop="drTime" label="æ¶é´" width="70"> |
| | | <template #default="{ row }"> |
| | | <span>{{ $fm.formatYM(row.drTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drExceedTimes" label="è¶
æ æ¬¡æ°"> |
| | | <el-table-column prop="drExceedTimes" label="è¶
æ æ¬¡æ°" width="50"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | |
| | | <span v-else>{{ row.drExceedTimes }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drAvg" label="å¹³åå¼"> |
| | | <el-table-column prop="drAvg" label="å¹³åå¼" width="65"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | |
| | | <span v-else>{{ row.drAvg }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drMax" label="æå¤§å¼"> |
| | | <el-table-column prop="drMax" label="æå¤§å¼" width="65"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | |
| | | <span v-else>{{ row.drMax }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drMin" label="æå°å¼"> |
| | | <el-table-column prop="drMin" label="æå°å¼" width="65"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | |
| | | <span v-else>{{ row.drMin }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drOverAvgPer" label="è¶
åºåå¼ç¾åæ¯"> |
| | | <el-table-column prop="drOverAvgPer" label="è¶
åºåå¼ç¾åæ¯" width="70"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | |
| | | <span v-else>{{ row.drOverAvgPer }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drDataNum" label="æ°æ®é"> |
| | | <el-table-column prop="drDataNum" label="æ°æ®é" width="65"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | |
| | | <span v-else>{{ row.drDataNum }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drEffectiveRate" label="ææç"> |
| | | <el-table-column prop="drEffectiveRate" label="ææç" width="65"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-if="isUploadNewFile && !row.isFound" |
| | |
| | | <div v-if="!row.isFound" class="p-h-16"> |
| | | <div v-if="row.notSure"> |
| | | <el-text type="warning" size="small" |
| | | >æªæ¾å°è¯¥åºæ¯ï¼ä½æ¾å°äºæç¸ä¼¼åç§°çåºæ¯ï¼è¯·ç¡®å®æ¯åªä¸ªåºæ¯</el-text |
| | | >æ ¹æ®å¯ä¸ç¼å·åè¡æ¿åºåæ¾å°äºç¸å
³åºæ¯ï¼ä½ä¸å·²æåºæ¯åç§°ä¸å¹é
ï¼è¯·ç¡®å®æ¯åªä¸ªåºæ¯</el-text |
| | | > |
| | | <div class="m-t-8"> |
| | | <el-button |
| | |
| | | text |
| | | bg |
| | | size="small" |
| | | class="m-b-2" |
| | | @click="handleRadioChange(v, row)" |
| | | > |
| | | {{ v.name }} |
| | |
| | | </div> |
| | | <div v-else> |
| | | <el-text type="danger" size="small" |
| | | >æªæ¾å°è¯¥åºæ¯ï¼ä¹æ²¡æä»»ä½ç¸ä¼¼åç§°çåºæ¯ï¼è¯·ä¿®æ¹åºæ¯åç§°æå»é¤è¯¥åºæ¯</el-text |
| | | >æ ¹æ®å¯ä¸ç¼å·åè¡æ¿åºåæªæ¾å°ç¸å
³åºæ¯ï¼è¯·ä¿®æ¹å¯ä¸ç¼å·</el-text |
| | | > |
| | | </div> |
| | | </div> |
| | | <div v-else class="p-h-16"> |
| | | <el-text type="success" size="small"> å·²æ£ç¡®å¹é
å°è¯¥åºæ¯ </el-text> |
| | | <el-text v-if="row.remark" type="success" size="small"> |
| | | {{ 'ï¼' + row.remark }} |
| | | </el-text> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-button |
| | | class="m-t-8" |
| | | type="primary" |
| | | :loading="uploadLoading" |
| | | :disabled="!isUploadNewFile" |
| | | icon="upload" |
| | | @click="uploadFile" |
| | | >ä¸ä¼ ç»è®¡ç»æ</el-button |
| | |
| | | </template> |
| | | <script setup> |
| | | import { ref, reactive, watch, onMounted, getCurrentInstance } from 'vue'; |
| | | import { useMessageBoxTip, useMessageBox } from '@/composables/messageBox'; |
| | | import { genFileId } from 'element-plus'; |
| | | import monitordataApi from '@/api/fysp/monitordataApi'; |
| | | import sceneApi from '@/api/fysp/sceneApi'; |
| | | import * as XLSX from 'xlsx'; |
| | | import { exportDocx } from '@/utils/doc'; |
| | | |
| | | const cns = getCurrentInstance(); |
| | | const $fm = cns.appContext.config.globalProperties.$fm; |
| | |
| | | upload.value.handleStart(file); |
| | | } |
| | | |
| | | /** |
| | | * å¤çä¸ä¼ æä»¶è§£æ |
| | | * @param uploadFile |
| | | * @param uploadFiles |
| | | */ |
| | | function handleChange(uploadFile, uploadFiles) { |
| | | expandRowKeys.value = []; |
| | | tableLoading.value = true; |
| | |
| | | } |
| | | const worksheet = workbook.Sheets[workbook.SheetNames[0]]; |
| | | const tableData = XLSX.utils.sheet_to_json(worksheet); |
| | | data.value = tableData.map((v, i) => { |
| | | return reactive({ |
| | | const _data = tableData.map((v, i) => { |
| | | return { |
| | | id: i, |
| | | drSceneName: v['åç§°'], |
| | | sceneIndex: v['å¯ä¸ç¼å·'], |
| | | drSceneName: v['åºæ¯åç§°'], |
| | | deviceName: v['设å¤åç§°'], |
| | | drDeviceCode: v['设å¤å·'], |
| | | drTime: $fm.formatDateFromExcel(v['æ¶é´'], '-'), |
| | | drExceedTimes: v['è¶
æ æ¬¡æ°'], |
| | |
| | | drOverAvgPer: v['è¶
åºåå¼ç¾åæ¯'], |
| | | drDataNum: v['æ°æ®é'], |
| | | drEffectiveRate: v['ææç'] |
| | | }); |
| | | }; |
| | | }); |
| | | data.value = combineSameScene(_data); |
| | | // console.log(tableData); |
| | | setTimeout(() => { |
| | | tableLoading.value = false; |
| | |
| | | fileReader.readAsArrayBuffer(uploadFile.raw); |
| | | } |
| | | |
| | | /** |
| | | * åå¹¶ç¸ååºæ¯çå¤å°çæµè®¾å¤ï¼é»è®¤ååºå弿é«çä¸å°è®¾å¤ |
| | | */ |
| | | function combineSameScene(dataList) { |
| | | // æ ¹æ®åºæ¯å¯ä¸ç¼å·è¿è¡ç¸å设å¤å½ç±» |
| | | const tempMap = new Map(); |
| | | dataList.forEach((d) => { |
| | | if (!tempMap.has(d.sceneIndex)) { |
| | | tempMap.set(d.sceneIndex, []); |
| | | } |
| | | tempMap.get(d.sceneIndex).push(d); |
| | | }); |
| | | const res = []; |
| | | // ç¸ååºæ¯ä¸ï¼ååºå弿é«çä¸å°è®¾å¤ä½ä¸ºç»æ |
| | | for (const [k, v] of tempMap) { |
| | | v.sort((a, b) => b.drAvg - a.drAvg); |
| | | if (v.length > 1) { |
| | | v[0].remark = `æ¬åºæ¯å
±æ${v.length}å°è®¾å¤ï¼å·²èªå¨éæ©åºå弿é«çä¸å°ä¸ºç»è®¡ç»æ`; |
| | | } |
| | | res.push(reactive(v[0])); |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | // æ¥è¯¢ä»æä»¶ä¸ä¼ çæ¯ä¸ªåºæ¯æ¯å¦è½å¨ç³»ç»ä¸æ¾å°å¯¹åºçåºæ¯ä¿¡æ¯ |
| | | function searchScene(d) { |
| | | d.loading = true; |
| | | if (!d.drSceneName) { |
| | | // æ ¹æ®åºæ¯çå¯ä¸ç¼å·ãè¡æ¿åºåååºæ¯ç±»åè¿è¡æ¥æ¾ |
| | | if (!d.sceneIndex) { |
| | | d.isFound = false; |
| | | d.loading = false; |
| | | return Promise; |
| | | } else { |
| | | sceneApi |
| | | .findScene({ name: d.drSceneName }) |
| | | .findScene({ |
| | | // name: d.drSceneName, |
| | | typeid: props.areaInfo.scensetypeid, |
| | | provincecode: props.areaInfo.provincecode, |
| | | citycode: props.areaInfo.citycode, |
| | | districtcode: props.areaInfo.districtcode, |
| | | towncode: props.areaInfo.towncode, |
| | | index: d.sceneIndex, |
| | | // çéæ¥è¯¢å¨çº¿çåºæ¯ |
| | | extension1: '1' |
| | | }) |
| | | .then((res) => { |
| | | setTimeout(() => { |
| | | if (res.length > 0) { |
| | | const findRes = res.find((v) => v.name == d.drSceneName); |
| | | if (findRes) { |
| | | d.drSceneId = res[0].guid; |
| | | d.isFound = true; |
| | | // 1. æ ¹æ®åºæ¯å¯ä¸ç¼å·è¿è¡æ¥è¯¢æ¶ï¼ä¸è¬æ
åµä¸åºè¯¥åªæä¸ä¸ªå¯ä¸ç»æ |
| | | // 2-1. å½ä¸ä¼ æä»¶ä¸åºæ¯åç§°ä¸ºç©ºç½æ¶ï¼èªå¨å¹é
æ¥è¯¢æå¾åºæ¯ |
| | | // 2-2. å½ä¸ä¼ æä»¶ä¸åºæ¯åç§°ä¸ä¸ºç©ºç½æ¶ï¼æ¯å¯¹ä¸¤è
çåºæ¯åç§°ï¼è¥ä¸ååè¿è¡è¦åæç¤º |
| | | if (res.length == 1) { |
| | | const findRes = res[0]; |
| | | if (!d.drSceneName || d.drSceneName == '') { |
| | | d.drSceneId = findRes.guid; |
| | | d.drSceneName = findRes.name; |
| | | d.isFound = true; |
| | | d.notSure = false; |
| | | if (d.remark) expandRowKeys.value.push(d.id); |
| | | } else { |
| | | if (d.drSceneName == findRes.name) { |
| | | d.drSceneId = findRes.guid; |
| | | d.isFound = true; |
| | | d.notSure = false; |
| | | } else { |
| | | d.isFound = false; |
| | | d.notSure = true; |
| | | expandRowKeys.value.push(d.id); |
| | | } |
| | | } |
| | | } else { |
| | | d.isFound = false; |
| | | d.notSure = true; |
| | | expandRowKeys.value.push(d.id); |
| | | } |
| | | d.sourceScene = res; |
| | | |
| | | // const findRes = res.find((v) => v.name == d.drSceneName); |
| | | // if (findRes) { |
| | | // d.drSceneId = findRes.guid; |
| | | // d.isFound = true; |
| | | // } else { |
| | | // d.isFound = false; |
| | | // d.notSure = true; |
| | | // expandRowKeys.value.push(d.id); |
| | | // } |
| | | // d.sourceScene = res; |
| | | } else { |
| | | d.isFound = false; |
| | | d.notSure = false; |
| | | expandRowKeys.value.push(d.id); |
| | | } |
| | | d.loading = false; |
| | |
| | | |
| | | function handleRadioChange(value, row) { |
| | | const scene = value; |
| | | row.sceneIndex = scene.index; |
| | | row.drSceneId = scene.guid; |
| | | row.drSceneName = scene.name; |
| | | searchScene(row); |
| | |
| | | |
| | | // ä¸ä¼ ç»è®¡ç»æææ¡£ |
| | | function uploadFile() { |
| | | monitordataApi.uploadDustDataResult(data.value).then((res) => {}); |
| | | useMessageBoxTip({ |
| | | confirmMsg: `æ¯å¦ç¡®è®¤ä¸ä¼ ï¼`, |
| | | confirmTitle: 'ä¸ä¼ ', |
| | | onConfirm: () => { |
| | | uploadLoading.value = true; |
| | | return monitordataApi |
| | | .uploadDustDataResult(data.value) |
| | | .finally(() => (uploadLoading.value = false)); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * ä¸è½½æ¨¡æ¿æä»¶ |
| | | */ |
| | | function downloadTemplate() { |
| | | const fName = 'æ¬å°çæµæ°æ®æåº¦ç»è®¡æ¨¡æ¿.xlsx'; |
| | | const path = `/${fName}`; |
| | | const link = document.createElement('a'); |
| | | link.href = path; |
| | | link.download = fName; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | } |
| | | |
| | | onMounted(() => { |