From 0796eebe3520fafb0ac5d36ee584af81506d7e9c Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期六, 20 九月 2025 14:05:52 +0800
Subject: [PATCH] 2025.9.20 数据产品(待完成)

---
 src/views/fysp/data-product/ProdSceneReport.vue |  223 ++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 185 insertions(+), 38 deletions(-)

diff --git a/src/views/fysp/data-product/ProdSceneReport.vue b/src/views/fysp/data-product/ProdSceneReport.vue
index 0e94a8d..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,9 +32,9 @@
             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 />
@@ -41,29 +44,53 @@
             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"
@@ -71,26 +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({});
@@ -125,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],
@@ -151,16 +184,19 @@
   });
   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 = 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;
@@ -185,36 +221,38 @@
 
 // 璁惧鍥剧墖閫夋嫨瀵硅瘽妗�
 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;
   }
 }
 
@@ -271,14 +309,123 @@
   }
 }
 /************************* 鐜板満宸℃煡鎯呭喌锛堥棶棰樹笌鏁存敼锛� **********************************/
+
+const problemDesc = ref('');
 //褰撳墠浠诲姟鐨勯棶棰樺垪琛�
 const curProList = ref([]);
+const month = ref('');
+const selectedProList = ref([]);
 
 function fetchProblems(s) {
   curProList.value = [];
-  taskApi.getProBySubtask(s.data.stGuid).then((res) => {
+  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