From c40f4c1267dae4fcf27dbbd75ea83014fba87783 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期二, 15 七月 2025 15:28:21 +0800 Subject: [PATCH] 新增联合执法清单 --- src/views/fysp/data-product/ProdSceneReport.vue | 238 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 199 insertions(+), 39 deletions(-) diff --git a/src/views/fysp/data-product/ProdSceneReport.vue b/src/views/fysp/data-product/ProdSceneReport.vue index a6abc18..d9d626d 100644 --- a/src/views/fysp/data-product/ProdSceneReport.vue +++ b/src/views/fysp/data-product/ProdSceneReport.vue @@ -5,6 +5,7 @@ </template> <template #aside> <SideList + legend :items="subtasks" :loading="sideLoading" @item-click="chooseSubtask" @@ -12,13 +13,15 @@ </template> <template #main> <el-scrollbar class="el-scrollbar" v-loading="mainLoading"> + <div></div> <CompSceneConstructionInfo - title="A銆佸伐鍦板熀鏈俊鎭�" + title="A銆佸熀鏈俊鎭�" + :scene="formScene" :form-info="formSubScene" /> <div><el-text type="">闄勫浘鐗囷細</el-text></div> <CompImgInfo - title="鏂藉伐閾墝" + v-model:title="imgTitle" :img-src="sceneImg.url" @change="anyPhotoDialog = true" ></CompImgInfo> @@ -29,32 +32,65 @@ v-for="(item, i) in deviceList" :key="i" down-title - :title="item._deviceTypeName" + v-model:title="item._deviceTypeName" :img-src="item._showStatusPic" - @change="showDevicePhotoDialog(item)" + @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> - <el-dialog - v-model="anyPhotoDialog" - width="66%" - title="浠绘剰鍥剧墖" - destroy-on-close - > - <ArbitraryPhoto - :max-select="1" - :readonly="false" - :subtask="curSubtask.data" - @selectByAnyPhonoEvent="handleSelectAnyPhoto" - :defaultFile="[sceneImg]" - > - </ArbitraryPhoto> - </el-dialog> - <el-dialog + <ArbitraryPhoto + v-if="anyPhotoDialog" + v-model:dialog-visible="anyPhotoDialog" + :max-select="1" + :readonly="false" + :subtask="curSubtask.data" + @submit="handleSelectAnyPhoto" + :defaultFile="[sceneImg]" + ></ArbitraryPhoto> + <FYImageSelectDialog + v-model:dialog-visible="deiveceImgDialog" + title="璁惧鍥剧墖" + :max-select="1" + :typeList="showDeviceTypeList" + :typeImgMap="showDeviceImgMap" + @submit="handleSelectDevicePhoto" + ></FYImageSelectDialog> + <!-- <el-dialog title="璁惧鍥剧墖" width="66%" v-model="deiveceImgDialog" @@ -62,25 +98,31 @@ > <CompDevicePhono @selectPhonoEvent="handleSelectDevicePhoto" - :imgPathsDataSource="showDeviceImgList" + :imgPathsDataSource="showDeviceImgMap" > </CompDevicePhono> - </el-dialog> + </el-dialog> --> </template> <script setup> import { ref, computed } from 'vue'; import { $fysp } from '@/api/index'; +import problemApi from '@/api/fysp/problemApi'; 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 ProCheckProxy from '@/views/fysp/check/ProCheckProxy'; import CompSceneConstructionInfo from '@/views/fysp/scene/CompSceneConstructionInfo.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({}); @@ -115,8 +157,9 @@ taskApi.getSubtaskSummary(param).then((res) => { const list = []; res.forEach((s) => { - const t = getSubtaskType(s); + const t = ProCheckProxy.getSubtaskType(s); list.push({ + status: s.subtask.status, type: t, title: s.stName, categoly: s.stPlanTime.split('T')[0], @@ -140,15 +183,20 @@ mainLoading.value = false; }); fetchDeviceList(s); - fetchProblems(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 = res.data.scense; + 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; @@ -166,43 +214,45 @@ function handleSelectAnyPhoto(data) { anyPhotoDialog.value = false; if (data.length > 0) { - sceneImg.value = { url: data[0].url }; + sceneImg.value = data[0]; } } /************************* 鍦烘櫙璁惧淇℃伅 **********************************/ // 璁惧鍥剧墖閫夋嫨瀵硅瘽妗� const deiveceImgDialog = ref(false); -const showDeviceImg = ref({}); -const showDeviceImgList = ref([]); +const showDeviceIndex = ref(0); +const showDeviceTypeList = ref([]); +const showDeviceImgMap = ref(new Map()); // 璁惧鍥剧墖鍒楄〃 const deviceList = ref([]); -function showDevicePhotoDialog(device) { +function showDevicePhotoDialog(device, index) { + showDeviceIndex.value = index; deiveceImgDialog.value = true; - showDeviceImgList.value = []; + showDeviceTypeList.value = [ + { typeId: device.topTypeId, typeName: device._deviceTypeName } + ]; + showDeviceImgMap.value.clear(); let imgList = []; device._status .map((s) => s._picUrls) .forEach((pics) => { imgList = imgList.concat( pics.map((p) => { - return { - topTypeId: device.topTypeId, - _picUrl: p - }; + return { url: p }; }) ); }); - console.log(imgList); + // console.log(imgList); - showDeviceImgList.value = imgList; + showDeviceImgMap.value.set(device.topTypeId, imgList); } function handleSelectDevicePhoto(data) { deiveceImgDialog.value = false; if (data.length > 0) { - showDeviceImg.value = { url: data[0].url }; + deviceList.value[showDeviceIndex.value]._showStatusPic = data[0].url; } } @@ -259,13 +309,123 @@ } } /************************* 鐜板満宸℃煡鎯呭喌锛堥棶棰樹笌鏁存敼锛� **********************************/ + +const problemDesc = ref(''); //褰撳墠浠诲姟鐨勯棶棰樺垪琛� const curProList = ref([]); +const month = ref(''); +const selectedProList = ref([]); function fetchProblems(s) { - taskApi.getProBySubtask(s.data.stGuid).then((res) => { + curProList.value = []; + problemApi.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 ? d1._showStatusPic : right_triangle, + _deviceTypeName_1: d1._deviceTypeName, + // hasPic2: d2 ? true : false, + _showStatusPic_2: d2 + ? d2._showStatusPic + ? d2._showStatusPic + : right_triangle + : 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鏈圖D鏃�'); + + docLoading.value = true; + exportDocx( + '/鍗曚綋妯$増-v1.0.docx', + param, + `${param.sceneName}鍗曚綋锛�${date}锛�.docx`, + { + horizontalHeight: 368, + verticalWidth: 266, + scale: 1.367 + } + ).finally(() => (docLoading.value = false)); +} </script> -- Gitblit v1.9.3