| | |
| | | <template> |
| | | <BaseContentLayout> |
| | | <template #header> |
| | | <SearchBar @on-submit="search"> </SearchBar> |
| | | </template> |
| | | <template #aside> |
| | | <SideList |
| | | :items="subtasks" |
| | | :loading="sideLoading" |
| | | @item-click="chooseSubtask" |
| | | ></SideList> |
| | | </template> |
| | | <template #main> |
| | | <el-scrollbar class="el-scrollbar" v-loading="mainLoading"> |
| | | <CompSceneConstructionInfo |
| | | v-if="curSubtask.data && curSubtask.data.sceneType == '工地'" |
| | | title="A、基本信息" |
| | | :scene="formScene" |
| | | :form-info="formSubScene" |
| | | :scene-type="1" |
| | | /> |
| | | <CompSceneWharfInfo |
| | | v-else-if="curSubtask.data && curSubtask.data.sceneType == '码头'" |
| | | title="A、基本信息" |
| | | :scene="formScene" |
| | | :form-info="formSubScene" |
| | | :scene-type="2" |
| | | /> |
| | | <CompSceneMixingPlantInfo |
| | | v-else-if="curSubtask.data && curSubtask.data.sceneType == '搅拌站'" |
| | | title="A、基本信息" |
| | | :scene="formScene" |
| | | :form-info="formSubScene" |
| | | :scene-type="3" |
| | | /> |
| | | <div v-else><el-text tag="h1">A、基本信息</el-text></div> |
| | | <div><el-text type="">附图片:</el-text></div> |
| | | <CompImgInfo |
| | | v-model:title="imgTitle" |
| | | :img-src="sceneImg.url" |
| | | @change="anyPhotoDialog = true" |
| | | ></CompImgInfo> |
| | | <el-divider /> |
| | | <el-text tag="h1">B、主要污染防治设施</el-text> |
| | | <el-space wrap> |
| | | <CompImgInfo |
| | | v-for="(item, i) in deviceList" |
| | | :key="i" |
| | | down-title |
| | | v-model:title="item._deviceTypeName" |
| | | :img-src="item._showStatusPic" |
| | | @change="showDevicePhotoDialog(item, i)" |
| | | ></CompImgInfo> |
| | | </el-space> |
| | | <el-divider /> |
| | | <el-text tag="h1">C、现场污染问题与整改情况</el-text> |
| | | <el-space wrap> |
| | | <CompProblemTable |
| | | v-for="(item, i) in curProList" |
| | | :key="i" |
| | | :problem="item" |
| | | @change="(value) => handleProPicSelect(value, i)" |
| | | ></CompProblemTable> |
| | | </el-space> |
| | | <el-divider /> |
| | | <el-text tag="h1">D、扬尘污染防治建议</el-text> |
| | | <div class="p-b-8"> |
| | | 针对该工地本期巡查发现的问题,评估为扬尘污染防治 |
| | | <el-radio-group v-model="radioStandard" size="default"> |
| | | <el-radio value="规范" border>规范</el-radio> |
| | | <el-radio value="基本规范" border>基本规范</el-radio> |
| | | <el-radio value="不规范" border>不规范</el-radio> |
| | | <el-radio value="严重不规范" border>严重不规范</el-radio> |
| | | </el-radio-group> |
| | | 工地,建议该工地严格按照《扬尘防治方案》、《扬尘防治承诺书》、《文明施工管理规范》、《精细化管理指标》等相关文件落实整改。 |
| | | </div> |
| | | <el-row justify="center" style="height: 200px"> |
| | | <el-button |
| | | icon="Download" |
| | | type="primary" |
| | | :loading="docLoading" |
| | | :disabled="!sceneImg.url" |
| | | @click="genWord()" |
| | | > |
| | | 生成报告 |
| | | </el-button> |
| | | </el-row> |
| | | </el-scrollbar> |
| | | </template> |
| | | </BaseContentLayout> |
| | | <ArbitraryPhoto |
| | | v-if="anyPhotoDialog" |
| | | v-model:dialog-visible="anyPhotoDialog" |
| | | :max-select="1" |
| | | :readonly="false" |
| | | :subtask="curSubtask.data" |
| | | @selectByAnyPhonoEvent="handleSelectAnyPhoto" |
| | | :defaultFile="[sceneImg]" |
| | | > |
| | | </ArbitraryPhoto> |
| | | <el-dialog |
| | | title="设备图片" |
| | | width="66%" |
| | | v-model="deiveceImgDialog" |
| | | destroy-on-close |
| | | > |
| | | <CompDevicePhono |
| | | @selectPhonoEvent="handleSelectDevicePhoto" |
| | | :imgPathsDataSource="showDeviceImgList" |
| | | > |
| | | </CompDevicePhono> |
| | | </el-dialog> |
| | | </template> |
| | | <script setup> |
| | | import { ref, computed } from 'vue'; |
| | | |
| | | import { $fysp } from '@/api/index'; |
| | | import taskApi from '@/api/fysp/taskApi'; |
| | | import sceneApi from '@/api/fysp/sceneApi'; |
| | | import deviceApi from '@/api/fysp/deviceApi'; |
| | | import evaluateApi from '@/api/fysp/evaluateApi'; |
| | | import { formatDeviceList } from '@/model/fysp/device'; |
| | | import { enumDevice, toLabel } from '@/enum/device/device'; |
| | | import { exportDocx } from '@/utils/doc'; |
| | | import right_triangle from '@/assets/image/right_triangle.png'; |
| | | |
| | | import CompSceneConstructionInfo from '@/views/fysp/scene/CompSceneConstructionInfo.vue'; |
| | | import CompSceneWharfInfo from '@/views/fysp/scene/CompSceneWharfInfo.vue'; |
| | | import CompSceneMixingPlantInfo from '@/views/fysp/scene/CompSceneMixingPlantInfo.vue'; |
| | | import ArbitraryPhoto from '@/views/fysp/check/components/ArbitraryPhoto.vue'; |
| | | import CompDevicePhono from '@/views/fysp/check/components/CompDevicePhono.vue'; |
| | | import CompImgInfo from '@/views/fysp/data-product/components/CompImgInfo.vue'; |
| | | import CompProblemTable from './components/CompProblemTable.vue'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | /************************* 左侧巡查任务选单 **********************************/ |
| | | const curSubtask = ref({}); |
| | | const subtasks = ref([]); |
| | | const sideLoading = ref(false); |
| | | const mainLoading = ref(false); |
| | | //获取任务问题的审核情况 |
| | | function getSubtaskType(s) { |
| | | let type = 0; |
| | | if (s.proNum == 0) { |
| | | type = 2; |
| | | } else if (s.proCheckedNum == 0) { |
| | | type = 0; |
| | | } else if (s.proCheckedNum < s.proNum) { |
| | | type = 1; |
| | | } else { |
| | | type = 2; |
| | | } |
| | | return type; |
| | | } |
| | | //查询子任务统计信息 |
| | | function search(formSearch) { |
| | | // this.topTask = formSearch.topTask; |
| | | sideLoading.value = true; |
| | | mainLoading.value = true; |
| | | // this.curProList = []; |
| | | curSubtask.value = {}; |
| | | const param = { |
| | | topTaskId: formSearch.topTask.tguid, |
| | | sceneTypeId: formSearch.sceneTypeId |
| | | }; |
| | | taskApi.getSubtaskSummary(param).then((res) => { |
| | | const list = []; |
| | | res.forEach((s) => { |
| | | const t = getSubtaskType(s); |
| | | list.push({ |
| | | type: t, |
| | | title: s.stName, |
| | | categoly: s.stPlanTime.split('T')[0], |
| | | data: s |
| | | }); |
| | | }); |
| | | subtasks.value = list; |
| | | if (list.length == 0) { |
| | | sideLoading.value = false; |
| | | mainLoading.value = false; |
| | | } |
| | | }); |
| | | } |
| | | //点击左侧菜单任务事件 |
| | | function chooseSubtask(s) { |
| | | sideLoading.value = false; |
| | | mainLoading.value = true; |
| | | curSubtask.value = s; |
| | | |
| | | fetchSceneInfo(s.data.sceneId).finally(() => { |
| | | mainLoading.value = false; |
| | | }); |
| | | fetchDeviceList(s); |
| | | fetchProblems(s); |
| | | fetchEvaluation(s); |
| | | } |
| | | |
| | | /************************* 场景基本信息 **********************************/ |
| | | const imgTitle = ref('施工铭牌'); |
| | | const formScene = ref({}); |
| | | const formSubScene = ref({}); |
| | | function fetchSceneInfo(sceneId) { |
| | | formSubScene.value = {}; |
| | | sceneImg.value = {}; |
| | | return sceneApi.getSceneDetail(sceneId).then((res) => { |
| | | //场景 |
| | | if (res.data.scense) formScene.value = res.data.scense; |
| | | formSubScene.value = res.data.subScene ? res.data.subScene : {}; |
| | | // if (res.data.sceneDevice) { |
| | | // formSceneDevice = res.data.sceneDevice; |
| | | // } else { |
| | | // formSceneDevice = { |
| | | // sGuid: formScene.guid, |
| | | // }; |
| | | // } |
| | | }); |
| | | } |
| | | |
| | | // 任意拍图片选择对话框 |
| | | const anyPhotoDialog = ref(false); |
| | | const sceneImg = ref({}); |
| | | function handleSelectAnyPhoto(data) { |
| | | anyPhotoDialog.value = false; |
| | | if (data.length > 0) { |
| | | sceneImg.value = data[0]; |
| | | } |
| | | } |
| | | /************************* 场景设备信息 **********************************/ |
| | | |
| | | // 设备图片选择对话框 |
| | | const deiveceImgDialog = ref(false); |
| | | const showDeviceIndex = ref(0); |
| | | const showDeviceImgList = ref([]); |
| | | // 设备图片列表 |
| | | const deviceList = ref([]); |
| | | |
| | | function showDevicePhotoDialog(device, index) { |
| | | showDeviceIndex.value = index; |
| | | deiveceImgDialog.value = true; |
| | | showDeviceImgList.value = []; |
| | | let imgList = []; |
| | | device._status |
| | | .map((s) => s._picUrls) |
| | | .forEach((pics) => { |
| | | imgList = imgList.concat( |
| | | pics.map((p) => { |
| | | return { |
| | | topTypeId: device.topTypeId, |
| | | _picUrl: p |
| | | }; |
| | | }) |
| | | ); |
| | | }); |
| | | // console.log(imgList); |
| | | |
| | | showDeviceImgList.value = imgList; |
| | | } |
| | | |
| | | function handleSelectDevicePhoto(data) { |
| | | deiveceImgDialog.value = false; |
| | | if (data.length > 0) { |
| | | deviceList.value[showDeviceIndex.value]._showStatusPic = data[0]._picUrl; |
| | | } |
| | | } |
| | | |
| | | const deviceTopTypes = [ |
| | | { id: 0, label: '监控设备' }, |
| | | { id: 1, label: '治理设备' } |
| | | // { id: 2, label: '生产设备' } |
| | | ]; |
| | | |
| | | function fetchDeviceList(s) { |
| | | deviceList.value = []; |
| | | for (const deviceTopTypeElement of deviceTopTypes) { |
| | | const topTypeId = deviceTopTypeElement.id; |
| | | deviceApi |
| | | .fetchDevices(s.data.sceneId, topTypeId) |
| | | .then((res) => { |
| | | return formatDeviceList(res.data); |
| | | }) |
| | | .then((result) => { |
| | | result.forEach((r) => { |
| | | const param = { |
| | | deviceId: r.id, |
| | | sceneId: r.sceneGuid, |
| | | deviceTypeId: topTypeId |
| | | }; |
| | | deviceApi |
| | | .fetchDeviceStatus(param) |
| | | .then((res) => { |
| | | res.data.forEach((e) => { |
| | | if (e.dlPicUrl && e.dlPicUrl.trim() != '') { |
| | | e._picUrls = e.dlPicUrl |
| | | .split(';') |
| | | .map((v) => $fysp.imgUrl + v); |
| | | } else { |
| | | e._picUrls = []; |
| | | } |
| | | }); |
| | | return res; |
| | | }) |
| | | .then((res) => { |
| | | if (res.data.length > 0 && res.data[0]._picUrls.length > 0) { |
| | | r._showStatusPic = res.data[0]._picUrls[0]; |
| | | } |
| | | r._status = res.data; |
| | | r.topTypeId = topTypeId; |
| | | r._deviceTypeName = toLabel(r.sceneTypeId, topTypeId, [ |
| | | r.typeId, |
| | | r.subtypeId |
| | | ]).join('-'); |
| | | deviceList.value.push(r); |
| | | }); |
| | | }); |
| | | }); |
| | | } |
| | | } |
| | | /************************* 现场巡查情况(问题与整改) **********************************/ |
| | | |
| | | const problemDesc = ref(''); |
| | | //当前任务的问题列表 |
| | | const curProList = ref([]); |
| | | const month = ref(''); |
| | | const selectedProList = ref([]); |
| | | |
| | | function fetchProblems(s) { |
| | | curProList.value = []; |
| | | taskApi.getProBySubtask(s.data.stGuid).then((res) => { |
| | | curProList.value = res; |
| | | |
| | | // 生成巡查描述文本 |
| | | month.value = dayjs(s.data.stPlanTime).month() + 1; |
| | | const proCount = curProList.value.length; |
| | | problemDesc.value = `${month.value}月巡查共计发现${proCount}个问题`; |
| | | if (proCount > 0) { |
| | | problemDesc.value += ':'; |
| | | curProList.value.forEach((p, i) => { |
| | | problemDesc.value += `${i + 1}、${p.problemname};`; |
| | | }); |
| | | problemDesc.value += '如下图所示:'; |
| | | } else { |
| | | problemDesc.value += '。'; |
| | | } |
| | | |
| | | // 生成选中的问题和整改图片描述 |
| | | selectedProList.value = curProList.value.map((v) => { |
| | | return {}; |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | function handleProPicSelect(value, index) { |
| | | selectedProList.value[index] = value; |
| | | } |
| | | /************************* 扬尘防治建议 **********************************/ |
| | | const radioStandard = ref('规范'); |
| | | function fetchEvaluation(s) { |
| | | evaluateApi.fetchItemEvaluation(s.data.stGuid).then((res) => { |
| | | radioStandard.value = res.data.grade; |
| | | }); |
| | | } |
| | | |
| | | /************************* 生成报告 **********************************/ |
| | | |
| | | const docLoading = ref(false); |
| | | // 生成word报告 |
| | | function genWord() { |
| | | const _deviceList = []; |
| | | for (let i = 0; i < deviceList.value.length; i += 2) { |
| | | const d1 = deviceList.value[i]; |
| | | const d2 = |
| | | i + 1 < deviceList.value.length ? deviceList.value[i + 1] : undefined; |
| | | _deviceList.push({ |
| | | _showStatusPic_1: d1._showStatusPic, |
| | | _deviceTypeName_1: d1._deviceTypeName, |
| | | // hasPic2: d2 ? true : false, |
| | | _showStatusPic_2: d2 ? d2._showStatusPic : right_triangle, |
| | | _deviceTypeName_2: d2 ? d2._deviceTypeName : '' |
| | | }); |
| | | } |
| | | const param = { |
| | | index: formScene.value.index, |
| | | sceneName: formScene.value.name, |
| | | projectType: formSubScene.value.csProjectType, |
| | | stage: formSubScene.value.siExtension1, |
| | | startTime: formSubScene.value.csStartTime, |
| | | endTime: formSubScene.value.csEndTime, |
| | | leftTime: formSubScene.value.csLeftTime, |
| | | location: formScene.value.location, |
| | | floorSpace: formSubScene.value.csFloorSpace, |
| | | constructionArea: formSubScene.value.csConstructionArea, |
| | | constructionAreaPerMonth: formSubScene.value.csConstructionAreaPerMonth, |
| | | contacts: formScene.value.contacts, |
| | | contactst: formScene.value.contactst, |
| | | securityOfficer: formSubScene.value.csSecurityOfficer, |
| | | securityOfficerTel: formSubScene.value.csSecurityOfficerTel, |
| | | constructionUnit: formSubScene.value.csConstructionUnit, |
| | | employerUnit: formSubScene.value.csEmployerUnit, |
| | | sceneType: formScene.value.type, |
| | | imgTitle: imgTitle.value, |
| | | imgTitle_url: sceneImg.value.url, |
| | | deviceList: _deviceList, |
| | | problemDesc: problemDesc.value, |
| | | problemList: selectedProList.value.map((v) => { |
| | | return { |
| | | month: month.value, |
| | | ...v |
| | | }; |
| | | }), |
| | | standard_1: radioStandard.value == '规范', |
| | | standard_2: radioStandard.value == '基本规范', |
| | | standard_3: radioStandard.value == '不规范', |
| | | standard_4: radioStandard.value == '严重规范' |
| | | }; |
| | | for (const key in param) { |
| | | if (param[key] == undefined) { |
| | | param[key] = ''; |
| | | } |
| | | } |
| | | const date = dayjs(curSubtask.value.data.stPlanTime).format('MM月DD日'); |
| | | console.log(param); |
| | | |
| | | docLoading.value = true; |
| | | exportDocx( |
| | | '/单体模版.docx', |
| | | param, |
| | | `${param.sceneName}单体(${date}).docx`, |
| | | { |
| | | horizontalHeight: 368, |
| | | verticalWidth: 266 |
| | | } |
| | | ).finally(() => (docLoading.value = false)); |
| | | } |
| | | </script> |