1. 添加显示问题整改的时间;
2. 新增巡查场景数、巡查点次、复查点次的统计;
3. 添加扬尘监测数据统计结果管理(待完成)
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { $fytz } from '../index'; |
| | | |
| | | /** |
| | | * 卿é
ç½®ç¸å
³APIæ¥å£ |
| | | */ |
| | | export default { |
| | | /** |
| | | * è·åç¨æ·ç±»åå¯ç¨çåºæ¯èå´ |
| | | */ |
| | | // Fixme 2025.4.2: ææ¶é»è®¤ä½¿ç¨ç®¡çåç¨æ·idï¼åç»å å
¥æé管çåï¼æ ¹æ®ç»å½ç¨æ·å¨æè·å |
| | | fetchSceneTypeRange(userId = 'pGrkC8e8eu8jGPgf') { |
| | | return $fytz |
| | | .get(`config/scene/range`, { params: { userId } }) |
| | | .then((res) => res.data); |
| | | }, |
| | | }; |
| | |
| | | <template> |
| | | <el-row class="layout"> |
| | | <el-col :span="12"> |
| | | <el-col :span="10"> |
| | | <el-form :inline="true" :model="formSearch"> |
| | | <el-form-item label="æ»ä»»å¡"> |
| | | <!-- <el-input v-model="formSearch.topTaskId" placeholder="æ»ä»»å¡" /> --> |
| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åºæ¯ç±»å"> |
| | | <el-select |
| | | v-model="formSearch.sceneTypeId" |
| | | placeholder="åºæ¯ç±»å" |
| | | style="width: 150px" |
| | | > |
| | | <el-option |
| | | v-for="s in sceneTypes" |
| | | :key="s.value" |
| | | :label="s.label" |
| | | :value="s.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <FYOptionScene |
| | | :allOption="true" |
| | | :type="2" |
| | | v-model:value="formSearch.scenetype" |
| | | ></FYOptionScene> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="onSubmit">æ¥è¯¢</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-col :span="14"> |
| | | <el-row justify="end"> |
| | | <slot name="summary"></slot> |
| | | </el-row> |
| | |
| | | |
| | | <script> |
| | | import taskApi from '@/api/fysp/taskApi'; |
| | | import { enumScene } from '@/enum/scene'; |
| | | |
| | | export default { |
| | | emits: ['onSubmit'], |
| | | data() { |
| | | return { |
| | | topTasks: [], |
| | | sceneTypes: enumScene(2, false), |
| | | formSearch: { |
| | | topTaskId: '', |
| | | sceneTypeId: '' |
| | | scenetype: '' |
| | | } |
| | | }; |
| | | }, |
| | |
| | | ); |
| | | const param = { |
| | | topTask: task ? task.data : {}, |
| | | sceneTypeId: this.formSearch.sceneTypeId |
| | | sceneTypeId: this.formSearch.scenetype.value |
| | | }; |
| | | console.log(param); |
| | | // console.log(param); |
| | | |
| | | this.$emit('onSubmit', param); |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.formSearch.sceneTypeId = this.sceneTypes[0].value; |
| | | this.getOptions(); |
| | | } |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import sceneApi from '@/api/fysp/sceneApi'; |
| | | import configApi from '@/api/fytz/configApi'; |
| | | |
| | | /** |
| | | * åºæ¯ç±»åæä¸¾ |
| | | * @param {Number} type 1:é£ç¾½ç¯å¢ç³»ç»ï¼2ï¼é£ç¾½ç管系ç»ï¼ |
| | | * @param {Boolean} allOption æ¯å¦å¨å¤´é¨æ·»å âå
¨é¨âé项 |
| | | */ |
| | | async function enumScene(type, allOption = true) { |
| | | let func; |
| | | switch (parseInt(type)) { |
| | | case 1: |
| | | func = _enumScene_1; |
| | | break; |
| | | case 2: |
| | | func = _enumScene_2; |
| | | break; |
| | | default: |
| | | func = _enumScene_1; |
| | | break; |
| | | } |
| | | |
| | | return func().then((res) => { |
| | | if (!allOption) { |
| | | return res.shift(); |
| | | } else { |
| | | return res; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | function getSceneName(value, type = 1) { |
| | | return enumScene(type).then((res) => { |
| | | return res.find((v) => { |
| | | if (v.value == value) { |
| | | return v; |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | // é£ç¾½ç¯å¢ç³»ç» |
| | | let _scene1; |
| | | function _enumScene_1() { |
| | | if (_scene1) { |
| | | return Promise.resolve(_scene1); |
| | | } else { |
| | | return configApi.fetchSceneTypeRange().then((res) => { |
| | | _scene1 = res.data.map((r) => { |
| | | return { |
| | | label: r.second, |
| | | value: r.first |
| | | }; |
| | | }); |
| | | _scene1.unshift({ |
| | | label: 'å
¨é¨', |
| | | value: null |
| | | }); |
| | | }); |
| | | } |
| | | // return [ |
| | | // { |
| | | // label: 'å
¨é¨', |
| | | // value: null |
| | | // }, |
| | | // { |
| | | // label: 'é¤é¥®', |
| | | // value: '1' |
| | | // }, |
| | | // { |
| | | // label: 'å·¥å°', |
| | | // value: '2' |
| | | // }, |
| | | // { |
| | | // label: 'ç 头', |
| | | // value: '3' |
| | | // }, |
| | | // { |
| | | // label: 'å åº', |
| | | // value: '4' |
| | | // }, |
| | | // { |
| | | // label: 'æ
æç«', |
| | | // value: '5' |
| | | // }, |
| | | // { |
| | | // label: 'å·¥ä¸ä¼ä¸', |
| | | // value: '6' |
| | | // }, |
| | | // { |
| | | // label: '汽修', |
| | | // value: '7' |
| | | // }, |
| | | // { |
| | | // label: 'å®éªå®¤', |
| | | // value: '8' |
| | | // }, |
| | | // { |
| | | // label: 'å»çæºæ', |
| | | // value: '9' |
| | | // } |
| | | // ]; |
| | | } |
| | | |
| | | // é£ç¾½çç®¡ç³»ç» |
| | | let _scene2; |
| | | function _enumScene_2() { |
| | | if (_scene2) { |
| | | return Promise.resolve(_scene2); |
| | | } else { |
| | | return sceneApi.getAllScene().then((res) => { |
| | | _scene2 = res.map((r) => { |
| | | return { |
| | | label: r.sceneType, |
| | | value: r.sceneTypeId + '' |
| | | }; |
| | | }); |
| | | _scene2.unshift({ |
| | | label: 'å
¨é¨', |
| | | value: null |
| | | }); |
| | | }); |
| | | } |
| | | // return [ |
| | | // { |
| | | // label: 'å
¨é¨', |
| | | // value: null |
| | | // }, |
| | | // { |
| | | // label: 'å·¥å°', |
| | | // value: '1' |
| | | // }, |
| | | // { |
| | | // label: 'ç 头', |
| | | // value: '2' |
| | | // }, |
| | | // { |
| | | // label: 'æ
æç«', |
| | | // value: '3' |
| | | // }, |
| | | // { |
| | | // label: 'å·¥ä¸ä¼ä¸', |
| | | // value: '4' |
| | | // }, |
| | | // { |
| | | // label: 'é¤é¥®', |
| | | // value: '5' |
| | | // }, |
| | | // { |
| | | // label: '汽修', |
| | | // value: '6' |
| | | // }, |
| | | // { |
| | | // label: 'éè·¯æ¬å°çæµç¹', |
| | | // value: '9' |
| | | // }, |
| | | // { |
| | | // label: 'éè·¯', |
| | | // value: '10' |
| | | // }, |
| | | // { |
| | | // label: 'å åº', |
| | | // value: '14' |
| | | // } |
| | | // ]; |
| | | } |
| | | |
| | | /** |
| | | * é£ç¾½çç®¡ç³»ç» åºæ¯ç±»å转 é£ç¾½ç¯å¢ç³»ç» |
| | | * @param {*} sceneTypeId |
| | | */ |
| | | async function svToTz(sceneTypeId) { |
| | | const sv = await _enumScene_2(); |
| | | const tz = await _enumScene_1(); |
| | | |
| | | const scType = sv.find((v) => { |
| | | return v.value == sceneTypeId + ''; |
| | | }); |
| | | const tzType = tz.find((v) => { |
| | | return v.label == scType.label; |
| | | }); |
| | | return tzType ? tzType : scType; |
| | | } |
| | | |
| | | export { enumScene, getSceneName, svToTz }; |
| | |
| | | { |
| | | label: 'å åº', |
| | | value: '14' |
| | | } |
| | | }, |
| | | { |
| | | label: 'ç²¾åå°åº', |
| | | value: '15' |
| | | }, |
| | | ]; |
| | | } |
| | | |
| | |
| | | <template #header> |
| | | <SearchBar @on-submit="search"> |
| | | <template #summary> |
| | | <CompSubTaskStatistic :subtasks="subtasks" /> |
| | | <CompSubTaskStatistic |
| | | :loading="sideLoading" |
| | | :subtasks="subtasks" |
| | | :monitorObjList="curMonitorObjList" |
| | | /> |
| | | </template> |
| | | </SearchBar> |
| | | </template> |
| | |
| | | ></SideList> |
| | | </template> |
| | | <template #main> |
| | | <ToolBar |
| | | :title="curSubtask.title" |
| | | :descriptions="proStatus" |
| | | :buttons="buttons" |
| | | :loading="mainLoading" |
| | | ></ToolBar> |
| | | <el-scrollbar |
| | | v-if="curProList.length > 0" |
| | | class="el-scrollbar" |
| | | v-loading="mainLoading" |
| | | > |
| | | <CompProblemCard |
| | | :key="i" |
| | | v-for="(p, i) in curProList" |
| | | :index="i + 1" |
| | | :problem="p" |
| | | :subtask="curSubtask.data" |
| | | :topTask="topTask" |
| | | @submit="updateSubtask" |
| | | @check="handleProblemCheck" |
| | | ></CompProblemCard> |
| | | <el-scrollbar > |
| | | <ToolBar |
| | | :title="curSubtask.title" |
| | | :descriptions="proStatus" |
| | | :buttons="buttons" |
| | | :loading="mainLoading" |
| | | ></ToolBar> |
| | | <el-scrollbar |
| | | v-if="curProList.length > 0" |
| | | class="scrollbar-inner" |
| | | v-loading="mainLoading" |
| | | > |
| | | <CompProblemCard |
| | | :key="i" |
| | | v-for="(p, i) in curProList" |
| | | :index="i + 1" |
| | | :problem="p" |
| | | :subtask="curSubtask.data" |
| | | :topTask="topTask" |
| | | @submit="updateSubtask" |
| | | @check="handleProblemCheck" |
| | | ></CompProblemCard> |
| | | </el-scrollbar> |
| | | <el-empty v-else description="ææ é®é¢" v-loading="mainLoading" /> |
| | | </el-scrollbar> |
| | | <el-empty v-else description="ææ é®é¢" v-loading="mainLoading" /> |
| | | </template> |
| | | </BaseContentLayout> |
| | | <CompProblemAddOrUpd |
| | |
| | | mainLoading: false, |
| | | // æ»ä»»å¡ |
| | | topTask: {}, |
| | | // æ»ä»»å¡å·¡æ¥è®¡åæ¸
å |
| | | curMonitorObjList: [], |
| | | //åä»»å¡å表 |
| | | subtasks: [], |
| | | //å½åéä¸çä»»å¡ |
| | |
| | | //é®é¢ç¶æ |
| | | proStatus() { |
| | | return ProCheckProxy.proStatusArray(this.curProList); |
| | | }, |
| | | //ä»»å¡é®é¢å®¡æ ¸æ
åµç»è®¡ä¿¡æ¯ |
| | | summary() { |
| | | const _summary = [ |
| | | { |
| | | name: '任塿»è®¡', |
| | | value: 0, |
| | | type: 'info' |
| | | }, |
| | | { |
| | | name: 'é®é¢æªå®¡æ ¸', |
| | | value: 0, |
| | | type: 'success', |
| | | icon: 'SuccessFilled' |
| | | }, |
| | | { |
| | | name: 'é®é¢é¨åå®¡æ ¸', |
| | | value: 0, |
| | | type: 'success', |
| | | icon: 'SuccessFilled' |
| | | }, |
| | | { |
| | | name: 'é®é¢å
¨é¨å®¡æ ¸', |
| | | value: 0, |
| | | type: 'success', |
| | | icon: 'SuccessFilled' |
| | | }, |
| | | { |
| | | name: 'æªæ´æ¹', |
| | | value: 0, |
| | | type: 'info', |
| | | icon: 'WarningFilled' |
| | | }, |
| | | { |
| | | name: 'æ´æ¹æªå®¡æ ¸', |
| | | value: 0, |
| | | type: 'info', |
| | | icon: 'WarningFilled' |
| | | }, |
| | | { |
| | | name: 'æ´æ¹é¨åå®¡æ ¸', |
| | | value: 0, |
| | | type: 'warning', |
| | | icon: 'WarningFilled' |
| | | }, |
| | | { |
| | | name: 'æ´æ¹å
¨é¨å®¡æ ¸', |
| | | value: 0, |
| | | type: 'warning', |
| | | icon: 'WarningFilled' |
| | | } |
| | | ]; |
| | | |
| | | this.subtasks.forEach((s) => { |
| | | _summary[0].value++; |
| | | |
| | | if (s.data.proNum == 0) { |
| | | _summary[1].value++; |
| | | } else if (s.data.proCheckedNum == 0) { |
| | | _summary[3].value++; |
| | | } else if (s.data.proCheckedNum < s.data.proNum) { |
| | | _summary[2].value++; |
| | | } else { |
| | | _summary[1].value++; |
| | | } |
| | | }); |
| | | _summary.forEach((s, i) => { |
| | | if (i > 0) { |
| | | let per = Math.round((s.value / _summary[0].value) * 1000) / 10; |
| | | if (isNaN(per)) per = 0; |
| | | s.value = `${s.value}(${per}%)`; |
| | | } |
| | | }); |
| | | |
| | | return _summary; |
| | | } |
| | | }, |
| | | methods: { |
| | |
| | | this.sideLoading = false; |
| | | this.mainLoading = false; |
| | | } |
| | | }); |
| | | taskApi.fetchMonitorObjectVersion(param.topTaskId).then((res) => { |
| | | this.curMonitorObjList = res; |
| | | }); |
| | | }, |
| | | //ç¹å»å·¦ä¾§èåä»»å¡äºä»¶ |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .el-scrollbar { |
| | | .scrollbar-outer { |
| | | height: calc(100vh - 60px * 2 - 24px); |
| | | background-color: aliceblue; |
| | | } |
| | | |
| | | .scrollbar-inner { |
| | | height: calc(100vh - 60px * 2 - 20px * 2 - var(--height-toolbar)); |
| | | } |
| | | </style> |
| | |
| | | import CompProblemAddOrUpd from './CompProblemAddOrUpd.vue'; |
| | | import taskApi from '@/api/fysp/taskApi'; |
| | | import { useCloned } from '@vueuse/core'; |
| | | import dayjs from 'dayjs'; |
| | | export default { |
| | | computed: { |
| | | // repeteRate() { |
| | |
| | | } |
| | | }, |
| | | components: { |
| | | CompProblemAddOrUpd, |
| | | CompProblemAddOrUpd |
| | | }, |
| | | mounted() {}, |
| | | data() { |
| | |
| | | updateSubtask() {}, |
| | | generateQueryParam() { |
| | | // ä»å¤©çæ¥æ |
| | | const today = new Date(); |
| | | const today = dayjs(this.subtask.stPlanTime); |
| | | // ä¸ä¸ªæå |
| | | const threeMonthsAgo = new Date(today); |
| | | threeMonthsAgo.setMonth(today.getMonth() - 3); |
| | | const threeMonthsAgo = today.subtract(3, 'month'); |
| | | // 计ç®åå¹´åçæ¥æ |
| | | const sixMonthsAgo = new Date(today); |
| | | sixMonthsAgo.setMonth(today.getMonth() - 6); |
| | | const sixMonthsAgo = today.subtract(6, 'month'); |
| | | // 计ç®ä¸å¹´åçæ¥æ |
| | | const oneYearAgo = new Date(today); |
| | | oneYearAgo.setFullYear(today.getFullYear() - 1); |
| | | const oneYearAgo = today.subtract(1, 'year'); |
| | | |
| | | return { |
| | | startTime: |
| | |
| | | /** |
| | | * è·åè¿ææ
åµ |
| | | * */ |
| | | async getRecentPros() { |
| | | getRecentPros() { |
| | | this.loading = true; |
| | | this.subtaskCount = 0; |
| | | // è·ååä»»å¡å表 |
| | | await taskApi |
| | | .getSubtaskByScene(this.generateQueryParam()) |
| | | .then((subtasks) => { |
| | | this.curProList = []; |
| | | if (subtasks) { |
| | | subtasks.forEach((subtask) => { |
| | | // è·åé®é¢å表 |
| | | this.getProBySubtask(subtask); |
| | | }); |
| | | } |
| | | }); |
| | | // é¢å¤å¤ç |
| | | this.curProList.sort((o1, o2) => o2.getDate() - o1.getDate()); |
| | | this.loading = false; |
| | | taskApi.getSubtaskByScene(this.generateQueryParam()).then((subtasks) => { |
| | | this.curProList = []; |
| | | if (subtasks) { |
| | | const promiseList = []; |
| | | subtasks.forEach((subtask) => { |
| | | // è·åé®é¢å表 |
| | | promiseList.push(this.getProBySubtask(subtask)); |
| | | }); |
| | | Promise.all(promiseList) |
| | | .then(() => { |
| | | // é¢å¤å¤ç |
| | | this.curProList.sort((o1, o2) => { |
| | | return o2._time > o1._time; |
| | | }); |
| | | }) |
| | | .finally(() => (this.loading = false)); |
| | | } |
| | | }); |
| | | }, |
| | | // æ ¹æ®åä»»å¡è·åéé¢çé®é¢å表 |
| | | async getProBySubtask(subtask) { |
| | | taskApi.getProBySubtask(subtask.stGuid).then((pros) => { |
| | | getProBySubtask(subtask) { |
| | | return taskApi.getProBySubtask(subtask.stGuid).then((pros) => { |
| | | if (pros) { |
| | | pros.forEach((pro) => { |
| | | if (pro.ptguid == this.deepCopyPro.ptguid) { |
| | |
| | | <template> |
| | | <el-card class="layout" shadow="never"> |
| | | <!-- <el-row justify="space-between"> --> |
| | | <div > |
| | | <div> |
| | | <el-steps |
| | | :active="proStatus.index" |
| | | finish-status="success" |
| | |
| | | </div> |
| | | <!-- </el-row> --> |
| | | |
| | | <el-descriptions :column="3" size="small"> |
| | | <el-descriptions :column="2" size="small" border> |
| | | <template #title> |
| | | <span class="d-index">{{ index }}</span> |
| | | <span class="d-title">{{ title }}</span> |
| | |
| | | v-for="(d, i) in descriptions" |
| | | :key="i" |
| | | :label="d.name" |
| | | >{{ d.value }}</el-descriptions-item |
| | | > |
| | | <template #label> |
| | | <el-text tag="b" size="small"> |
| | | {{ d.name }} |
| | | </el-text> |
| | | </template> |
| | | {{ d.value }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <el-scrollbar style="width: 70%;"> |
| | | <el-scrollbar> |
| | | <el-descriptions |
| | | title=" " |
| | | :column="2" |
| | |
| | | t == 0 ? 'descriptions-label-1' : 'descriptions-label-2' |
| | | " |
| | | > |
| | | <template #label> |
| | | <el-text tag="b" size="small"> |
| | | {{ pic.title }} |
| | | </el-text> |
| | | </template> |
| | | <el-space> |
| | | <el-image |
| | | v-for="(p, i) in pic.path" |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-row justify="end" class="btn-group"> |
| | | <el-button type="danger" size="small" @click="deletePro" :disabled="true" |
| | | <el-button |
| | | type="danger" |
| | | size="small" |
| | | @click="deletePro" |
| | | :disabled="true" |
| | | >å é¤</el-button |
| | | > |
| | | <!-- <el-button |
| | |
| | | }, |
| | | // é®é¢æè¿° |
| | | descriptions() { |
| | | return [ |
| | | const des = [ |
| | | { |
| | | icon: 'Location', |
| | | name: 'é®é¢ä½ç½®', |
| | | value: this.problem.location |
| | | }, |
| | | { |
| | | icon: 'Clock', |
| | | name: 'æäº¤æ¶é´', |
| | | value: this.problem.time.replace('T', ' ').split('.')[0] |
| | | } |
| | | ]; |
| | | if (this.problem.ischanged) { |
| | | des.push({ |
| | | icon: 'Clock', |
| | | name: 'æ´æ¹æ¶é´', |
| | | value: this.problem.changedtime |
| | | ? this.problem.changedtime.replace('T', ' ').split('.')[0] |
| | | : this.problem.time.replace('T', ' ').split('.')[0] |
| | | }); |
| | | } |
| | | return des; |
| | | }, |
| | | // é®é¢å¾ç |
| | | pics() { |
| | |
| | | |
| | | <!-- æ¥éª¤æ¡èªå®ä¹æ ·å¼ --> |
| | | <style scoped> |
| | | :deep(.el-steps--simple){ |
| | | :deep(.el-steps--simple) { |
| | | background: #fffbf731; |
| | | } |
| | | |
| | | :deep(.is-wait .el-step__icon){ |
| | | :deep(.is-wait .el-step__icon) { |
| | | height: 17px; |
| | | width: 17px; |
| | | margin-top: 3px; |
| | |
| | | font-size: var(--el-font-size-small); |
| | | } |
| | | |
| | | :deep(.is-success .el-step__icon){ |
| | | :deep(.is-success .el-step__icon) { |
| | | height: 17px; |
| | | width: 17px; |
| | | margin-top: 3px; |
| | |
| | | |
| | | :deep(.el-step__head.is-process) { |
| | | border-color: var(--el-color-danger); |
| | | color: var(--el-color-danger) |
| | | color: var(--el-color-danger); |
| | | } |
| | | |
| | | :deep(.el-step__head.is-wait) { |
| | | border-color: var(--el-text-color-placeholder); |
| | | color: var(--el-text-color-placeholder) |
| | | color: var(--el-text-color-placeholder); |
| | | } |
| | | |
| | | :deep(.el-step__head.is-success) { |
| | | border-color: var(--el-color-success-light-3); |
| | | color: var(--el-color-success-light-3) |
| | | color: var(--el-color-success-light-3); |
| | | } |
| | | |
| | | :deep(.el-step__title.is-process) { |
| | |
| | | <template> |
| | | <el-space> |
| | | <el-descriptions :column="3" size="small" border direction="vertical"> |
| | | <el-row justify="end" v-loading="loading"> |
| | | <el-descriptions :column="4" size="small" border direction="vertical"> |
| | | <el-descriptions-item |
| | | label="åºæ¯æ»è®¡" |
| | | label-class-name="inspection-label" |
| | | class-name="secondary-content" |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> åºæ¯æ»è®¡ </el-text> |
| | | </template> |
| | | {{ progress.total }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="å·¡æ¥åºæ¯" |
| | | label-class-name="inspection-label" |
| | | class-name="secondary-content" |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> å·¡æ¥åºæ¯ </el-text> |
| | | </template> |
| | | {{ progress.completedScenes }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="å·¡æ¥ç¹æ¬¡" |
| | | label-class-name="inspection-label" |
| | | class-name="secondary-content" |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> å·¡æ¥ç¹æ¬¡ </el-text> |
| | | </template> |
| | | {{ progress.completedTimes }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="夿¥ç¹æ¬¡" |
| | | label-class-name="inspection-label" |
| | | class-name="secondary-content" |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> 夿¥ç¹æ¬¡ </el-text> |
| | | </template> |
| | | {{ progress.reviewTimes }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <el-descriptions |
| | | class="m-l-4" |
| | | :column="3" |
| | | size="small" |
| | | border |
| | | direction="vertical" |
| | | > |
| | | <el-descriptions-item |
| | | label="é®é¢æ°" |
| | | label-class-name="problem-label" |
| | | class-name="secondary-content" |
| | | >{{ summary.proCount }}</el-descriptions-item |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> é®é¢æ° </el-text> |
| | | </template> |
| | | {{ summary.proCount }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="æ´æ¹æ°" |
| | | label-class-name="problem-label" |
| | | class-name="secondary-content" |
| | | >{{ summary.changeCount }}</el-descriptions-item |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> æ´æ¹æ° </el-text> |
| | | </template> |
| | | {{ summary.changeCount }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="æ´æ¹ç" |
| | | label-class-name="problem-label" |
| | | :class-name="summary.changePer < 1 ? 'danger-content' : 'secondary-content'" |
| | | >{{ formatPercent(summary.changePer) }}</el-descriptions-item |
| | | :class-name=" |
| | | summary.changePer < 1 ? 'danger-content' : 'secondary-content' |
| | | " |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> æ´æ¹ç </el-text> |
| | | </template> |
| | | {{ formatPercent(summary.changePer) }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | <el-descriptions :column="8" size="small" border direction="vertical"> |
| | | |
| | | <el-descriptions |
| | | class="m-l-4" |
| | | :column="8" |
| | | size="small" |
| | | border |
| | | direction="vertical" |
| | | > |
| | | <el-descriptions-item |
| | | label="å·¡æ¥ç¹æ¬¡" |
| | | label="æ é®é¢" |
| | | label-class-name="pro-check-label" |
| | | class-name="secondary-content" |
| | | >{{ summary.total }}</el-descriptions-item |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> æ é®é¢ </el-text> |
| | | </template> |
| | | {{ summary.noProblem }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="é®é¢æªå®¡æ ¸" |
| | | label-class-name="pro-check-label" |
| | | :class-name="summary.proUnCheck > 0 ? 'danger-content' : 'secondary-content'" |
| | | >{{ summary.proUnCheck }}</el-descriptions-item |
| | | :class-name=" |
| | | summary.proUnCheck > 0 ? 'danger-content' : 'secondary-content' |
| | | " |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> é®é¢æªå®¡æ ¸ </el-text> |
| | | </template> |
| | | {{ summary.proUnCheck }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="é¨åå®¡æ ¸" |
| | | label-class-name="pro-check-label" |
| | | :class-name="summary.proPartCheck > 0 ? 'danger-content' : 'secondary-content'" |
| | | >{{ summary.proPartCheck }}</el-descriptions-item |
| | | :class-name=" |
| | | summary.proPartCheck > 0 ? 'danger-content' : 'secondary-content' |
| | | " |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> é¨åå®¡æ ¸ </el-text> |
| | | </template> |
| | | {{ summary.proPartCheck }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="å
¨é¨å®¡æ ¸" |
| | | label-class-name="pro-check-label" |
| | | class-name="secondary-content" |
| | | >{{ summary.proAllCheck }}</el-descriptions-item |
| | | > |
| | | </el-descriptions> |
| | | <el-descriptions :column="8" size="small" border direction="vertical"> |
| | | <template #label> |
| | | <el-text size="small"> å
¨é¨å®¡æ ¸ </el-text> |
| | | </template> |
| | | {{ summary.proAllCheck }} |
| | | </el-descriptions-item> |
| | | <!-- </el-descriptions> |
| | | <el-descriptions |
| | | :column="4" |
| | | size="small" |
| | | border |
| | | direction="vertical" |
| | | > --> |
| | | <el-descriptions-item |
| | | label="æªæ´æ¹" |
| | | label-class-name="change-check-label" |
| | | :class-name="summary.UnChange > 0 ? 'danger-content' : 'secondary-content'" |
| | | >{{ summary.UnChange }}</el-descriptions-item |
| | | :class-name=" |
| | | summary.UnChange > 0 ? 'danger-content' : 'secondary-content' |
| | | " |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> æªæ´æ¹ </el-text> |
| | | </template> |
| | | {{ summary.UnChange }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="æ´æ¹æªå®¡æ ¸" |
| | | label-class-name="change-check-label" |
| | | :class-name="summary.changeUnCheck > 0 ? 'danger-content' : 'secondary-content'" |
| | | >{{ summary.changeUnCheck }}</el-descriptions-item |
| | | :class-name=" |
| | | summary.changeUnCheck > 0 ? 'danger-content' : 'secondary-content' |
| | | " |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> æ´æ¹æªå®¡æ ¸ </el-text> |
| | | </template> |
| | | {{ summary.changeUnCheck }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="é¨åå®¡æ ¸" |
| | | label-class-name="change-check-label" |
| | | :class-name="summary.changePartCheck > 0 ? 'danger-content' : 'secondary-content'" |
| | | >{{ summary.changePartCheck }}</el-descriptions-item |
| | | :class-name=" |
| | | summary.changePartCheck > 0 ? 'danger-content' : 'secondary-content' |
| | | " |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> é¨åå®¡æ ¸ </el-text> |
| | | </template> |
| | | {{ summary.changePartCheck }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="å
¨é¨å®¡æ ¸" |
| | | label-class-name="change-check-label" |
| | | class-name="secondary-content" |
| | | >{{ summary.changeAllCheck }}</el-descriptions-item |
| | | > |
| | | <template #label> |
| | | <el-text size="small"> å
¨é¨å®¡æ ¸ </el-text> |
| | | </template> |
| | | {{ summary.changeAllCheck }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-space> |
| | | <!-- <el-space> |
| | | <el-tag v-for="(s, i) in summary" :key="i" :type="s.type" size="small"> |
| | | <el-icon v-if="s.icon" color=""> |
| | | <component :is="s.icon"></component> |
| | | </el-icon> |
| | | {{ s.name + ': ' + s.value }} |
| | | </el-tag> |
| | | </el-space> --> |
| | | </el-row> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | props: { |
| | | subtasks: Array |
| | | loading: Boolean, |
| | | subtasks: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | monitorObjList: { |
| | | type: Array, |
| | | default: () => [] |
| | | } |
| | | }, |
| | | computed: { |
| | | //ä»»å¡é®é¢å®¡æ ¸æ
åµç»è®¡ä¿¡æ¯ |
| | | summary() { |
| | | const _summary = { |
| | | total: 0, |
| | | noProblem: 0, |
| | | proUnCheck: 0, |
| | | proPartCheck: 0, |
| | | proAllCheck: 0, |
| | |
| | | |
| | | // é®é¢å®¡æ ¸æ
åµ |
| | | if (s.data.proNum == 0) { |
| | | _summary.proAllCheck++; |
| | | _summary.noProblem++; |
| | | } else if (s.data.proCheckedNum == 0) { |
| | | _summary.proUnCheck++; |
| | | } else if (s.data.proCheckedNum < s.data.proNum) { |
| | |
| | | if (s.data.changeNum < s.data.proNum) { |
| | | _summary.UnChange++; |
| | | } |
| | | |
| | | // æ´æ¹å®¡æ ¸æ
åµ |
| | | if (s.data.proNum == 0) { |
| | | _summary.changeAllCheck++; |
| | | else if (s.data.proNum == 0) { |
| | | // _summary.changeAllCheck++; |
| | | } else if (s.data.changeNum > 0) { |
| | | if (s.data.changeCheckedNum == 0) { |
| | | _summary.changeUnCheck++; |
| | |
| | | _summary.changePer = _summary.changeCount / _summary.proCount; |
| | | } |
| | | return _summary; |
| | | }, |
| | | // å·¡æ¥ä»»å¡æ§è¡è¿åº¦ |
| | | progress() { |
| | | const _res = { |
| | | total: 0, |
| | | completedScenes: 0, |
| | | completedTimes: 0, |
| | | reviewTimes: 0 |
| | | }; |
| | | this.monitorObjList.forEach((m) => { |
| | | _res.total++; |
| | | const times = parseInt(m.extension1); |
| | | if (times) { |
| | | _res.completedScenes++; |
| | | _res.completedTimes += times; |
| | | _res.reviewTimes += times - 1; |
| | | } |
| | | }); |
| | | return _res; |
| | | } |
| | | }, |
| | | methods: { |
| | |
| | | /* font-size: 13px !important; */ |
| | | } |
| | | |
| | | :deep(.inspection-label) { |
| | | background: var(--el-color-success-light-5) !important; |
| | | /* color: white !important; */ |
| | | } |
| | | |
| | | :deep(.problem-label) { |
| | | background: var(--el-color-primary-light-7) !important; |
| | | } |
| | | :deep(.problem-content) { |
| | | /* background: var(--el-color-danger-light-9); */ |
| | | } |
| | | |
| | | :deep(.pro-check-label) { |
| | | background: var(--el-color-success-light-7) !important; |
| | | } |
| | | :deep(.pro-check-content) { |
| | | background: var(--el-color-warning-light-7) !important; |
| | | } |
| | | |
| | | :deep(.change-check-label) { |
| | | background: var(--el-color-warning-light-7) !important; |
| | | } |
| | | :deep(.change-check-content) { |
| | | background: var(--el-color-danger-light-7) !important; |
| | | } |
| | | |
| | | :deep(.danger-content) { |
| | |
| | | :auto-upload="false" |
| | | > |
| | | <template #trigger> |
| | | <el-button type="primary" :loading="tableLoading" |
| | | >ä¸ä¼ çæµæ°æ®ç»è®¡ç»æ</el-button |
| | | > |
| | | <el-button type="primary" :loading="tableLoading">导å
¥æä»¶</el-button> |
| | | </template> |
| | | <template #tip> |
| | | <div> |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="drTime" label="æ¶é´" width="100"> |
| | | <template #default="{ row }"> |
| | | <span>{{ $fm.formatYMD(row.drTime) }}</span> |
| | | <span>{{ $fm.formatYM(row.drTime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="drExceedTimes" label="è¶
æ æ¬¡æ°"> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-button |
| | | type="primary" |
| | | :loading="uploadLoading" |
| | | icon="upload" |
| | | @click="uploadFile" |
| | | >ä¸ä¼ ç»è®¡ç»æ</el-button |
| | | > |
| | | </template> |
| | | <script setup> |
| | | import { ref, reactive, watch, onMounted, getCurrentInstance } from 'vue'; |
| | |
| | | const tableLoading = ref(false); |
| | | const loadTxt = ref(''); |
| | | const tips = ref(''); |
| | | const uploadLoading = ref(false); |
| | | |
| | | const tableRowClassName = ({ row, rowIndex }) => { |
| | | if (row.loading) { |
| | |
| | | } |
| | | |
| | | // ä¸ä¼ ç»è®¡ç»æææ¡£ |
| | | function uploadFile() {} |
| | | function uploadFile() { |
| | | monitordataApi.uploadDustDataResult(data.value).then((res) => {}); |
| | | } |
| | | |
| | | onMounted(() => { |
| | | fetchDustDataResult(); |