From dade6a8b4772abc113383246d05ab59162630e7c Mon Sep 17 00:00:00 2001
From: zhangwei <1504152376@qq.com>
Date: 星期三, 27 八月 2025 17:21:21 +0800
Subject: [PATCH] '上传变更公告获取详情与删除'

---
 src/views/system/dept/detail.vue |  237 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 198 insertions(+), 39 deletions(-)

diff --git a/src/views/system/dept/detail.vue b/src/views/system/dept/detail.vue
index ec82377..ddb1e97 100644
--- a/src/views/system/dept/detail.vue
+++ b/src/views/system/dept/detail.vue
@@ -1,14 +1,21 @@
 <script setup lang="tsx">
-import { ref, reactive, onMounted, computed, PropType } from "vue";
+import { ref, reactive, onMounted, computed, PropType, h } from "vue";
 import { useRenderIcon } from "@/components/ReIcon/src/hooks";
 import { useDept } from "./utils/hook";
 import { useDetail } from "./utils/detail";
 import { getTenderOrderDetail } from "@/api/item/index";
 const isLoading = ref(false);
 import { addDialog } from "@/components/ReDialog";
+import pdfPreview from "@/views/system/component/pdfPreview.vue";
+import { deviceDetection } from "@pureadmin/utils";
 interface Emits {
   (e: "backListPage"): void;
 }
+import MaterialIconThemePdf from "~icons/material-icon-theme/pdf";
+import MaterialIconThemeImage from "~icons/material-icon-theme/image";
+import MaterialIconThemeWord from "~icons/material-icon-theme/word";
+import MaterialIconThemeTable from "~icons/material-icon-theme/table";
+import MaterialIconThemeZip from "~icons/material-icon-theme/zip";
 const emit = defineEmits<Emits>();
 const props = defineProps({
   nowID: null
@@ -17,41 +24,83 @@
 import IconParkSolidBack from "~icons/icon-park-solid/back";
 
 const { openDialog } = useDept(ref({}));
-const { openUploadDialog, state } = useDetail();
+const { openUploadDialog, state, changeDialog } = useDetail();
 defineOptions({
   name: "itemdetail"
 });
+const convertFujianToObjects = (fujianStr, fujianNameStr) => {
+  // 鍒嗗壊瀛楃涓蹭负鏁扮粍骞惰繃婊ょ┖鍊�
+  const srcArray = fujianStr.split(",").filter(Boolean);
+  const nameArray = fujianNameStr.split(",").filter(Boolean);
+
+  // 鎻愬彇鏂囦欢鍚庣紑浣滀负valu
+  const getFileExtension = fileName => {
+    const lastDotIndex = fileName.lastIndexOf(".");
+    // 濡傛灉娌℃湁鍚庣紑鎴栨枃浠跺悕浠ョ偣缁撳熬锛岃繑鍥炵┖瀛楃涓�
+    if (lastDotIndex === -1 || lastDotIndex === fileName.length - 1) {
+      return "";
+    }
+    return fileName.slice(lastDotIndex + 1).toLowerCase();
+  };
+
+  // 鏄犲皠涓虹洰鏍囧璞℃暟缁�
+  return srcArray.map((src, index) => {
+    // 纭繚鍚嶇О鏁扮粍鏈夊搴旂储寮曠殑鍏冪礌
+    const name = nameArray[index]?.trim() || `鏈煡鏂囦欢${index + 1}`;
+
+    return {
+      name: name,
+      filePath: src.trim(),
+      fileType: getFileExtension(name)
+    };
+  });
+};
 onMounted(async () => {
   let res = await getTenderOrderDetail({ id: props.nowID });
   state.nowInfo = res.result;
+  if (state.nowInfo.fujian) {
+    state.nowInfo.fujianList = convertFujianToObjects(
+      state.nowInfo.fujian,
+      state.nowInfo.fujianName
+    );
+  }
 });
 const backListPage = () => {
   emit("backListPage");
 };
 const previewPdf = pdfUrl => {
-  addDialog({
-    width: "80%",
-    title: "纭淇℃伅",
-    contentRenderer: () => (
-      <iframe
-        type="application/pdf"
-        src={pdfUrl}
-        width="800"
-        height="600"
-      ></iframe>
-    ), // jsx 璇硶 锛堟敞鎰忓湪.vue鏂囦欢鍚敤jsx璇硶锛岄渶瑕佸湪script寮�鍚痩ang="tsx"锛�
-    closeCallBack: ({ options, args }) => {
-      // options.props 鏄搷搴斿紡鐨�
-      // const { formInline } = options.props as FormProps;
-      // const text = `濮撳悕锛�${formInline.user} 鍩庡競锛�${formInline.region}`;
-      if (args?.command === "cancel") {
-        // 鎮ㄧ偣鍑讳簡鍙栨秷鎸夐挳
-        // active.value -= 1;
-      } else if (args?.command === "sure") {
-      } else {
-      }
-    }
-  });
+  console.log(pdfUrl, "pdfUrl");
+
+  switch (pdfUrl.fileType) {
+    case "png":
+      showImg(pdfUrl.filePath);
+      break;
+    case "jepg":
+      showImg(pdfUrl.filePath);
+      break;
+    case "pdf":
+      addDialog({
+        title: `棰勮pdf`,
+        props: {},
+        width: "60%",
+        draggable: true,
+        fullscreen: deviceDetection(),
+        fullscreenIcon: true,
+        sureBtnLoading: true,
+        closeOnClickModal: false,
+        contentRenderer: () => h(pdfPreview, { fileInfo: pdfUrl })
+        // jsx 璇硶 锛堟敞鎰忓湪.vue鏂囦欢鍚敤jsx璇硶锛岄渶瑕佸湪script寮�鍚痩ang="tsx"锛�
+      });
+      break;
+    default:
+      window.location.href = pdfUrl.filePath;
+      break;
+  }
+};
+const showPreview = ref(false);
+const showImg = (name: string | number) => {
+  showPreview.value = true;
+  state.srcList = [name];
 };
 </script>
 
@@ -80,7 +129,12 @@
         </div>
       </template>
       <div>
-        <el-descriptions class="margin-top" :column="3" border>
+        <el-descriptions
+          class="margin-top"
+          :column="3"
+          border
+          label-width="120"
+        >
           <el-descriptions-item label="椤圭洰缂栧彿">
             {{ state.nowInfo.projectCode }}
           </el-descriptions-item>
@@ -93,9 +147,9 @@
           <el-descriptions-item label="鑱斿悎浣撴姇鏍�">
             {{ state.nowInfo.lianhetitoubiao }}
           </el-descriptions-item>
-          <!-- <el-descriptions-item label="Remarks">
+          <el-descriptions-item label="寮�鏍囨柟寮�">
+            {{ state.nowInfo.kaibiaofangshi }}
           </el-descriptions-item>
-          <el-descriptions-item label="Address" /> -->
         </el-descriptions>
       </div>
     </el-card>
@@ -114,11 +168,18 @@
               <div>
                 <el-form label-width="auto" style="max-width: 1000px">
                   <el-form-item label="椤圭洰淇℃伅锛�">
-                    鎶曟爣鎶ュ悕寮�濮嬫椂闂达細
-                    {{ state.nowInfo.toubiaoStartDate ?? "鏆傛棤" }}
-                    鎶曟爣鎶ュ悕鎴鏃堕棿锛�
-                    {{ state.nowInfo.toubiaoEndDate }}
-                    寮�鏍囨椂闂达細{{ state.nowInfo.kaibiaoDate }}
+                    <span class="mr-4">
+                      鎶曟爣鎶ュ悕寮�濮嬫椂闂达細{{
+                        state.nowInfo.toubiaoStartDate ?? "鏆傛棤"
+                      }}
+                    </span>
+                    <span class="mr-4">
+                      鎶曟爣鎶ュ悕鎴鏃堕棿锛�
+                      {{ state.nowInfo.toubiaoEndDate ?? "鏆傛棤" }}
+                    </span>
+                    <span class="mr-4">
+                      寮�鏍囨椂闂达細{{ state.nowInfo.kaibiaoDate ?? "鏆傛棤" }}
+                    </span>
                   </el-form-item>
                   <el-form-item label="涓婁紶鍏憡锛�">
                     <el-button
@@ -126,7 +187,7 @@
                       type="primary"
                       plain
                       size="small"
-                      @click="openUploadDialog('涓婁紶')"
+                      @click="openUploadDialog('涓婁紶', state.nowInfo)"
                     >
                       涓婁紶鍏憡
                     </el-button>
@@ -139,22 +200,114 @@
                     >
                       涓婁紶鍙樻洿鍏憡
                     </el-button>
+                    <el-button
+                      type="primary"
+                      plain
+                      size="small"
+                      @click="changeDialog('涓婁紶鍙樻洿', state.nowInfo)"
+                    >
+                      淇敼鏍囬
+                    </el-button>
                   </el-form-item>
                   <el-form-item v-if="state.nowInfo.zhaobiaowenjian" label=" ">
                     <div class="border-1 w-[100%] rounded-md p-3">
                       <p>{{ state.nowInfo.projectName }}</p>
-                      <p>涓婁紶鏃堕棿锛�2025-8-12 13:41:00</p>
-                      <el-button
+                      <p>涓婁紶鏃堕棿锛歿{ state.nowInfo.fabuDate }}</p>
+                      <p
+                        class="flex items-center cursor-pointer"
+                        @click="
+                          previewPdf({
+                            name: state.nowInfo.zhaobiaowenjian,
+                            filePath: state.nowInfo.zhaobiaowenjianName,
+                            fileType: 'pdf'
+                          })
+                        "
+                      >
+                        鎷涙爣鏂囦欢锛�<MaterialIconThemePdf
+                          style="font-size: 1.5em"
+                        />{{ state.nowInfo.zhaobiaowenjianName }}
+                      </p>
+                      <p
+                        v-if="state.nowInfo?.changeOrder"
+                        class="flex items-center cursor-pointer"
+                        @click="
+                          previewPdf({
+                            name: state.nowInfo.changeOrder.biangengwenjianName,
+                            filePath: state.nowInfo.changeOrder.biangengwenjian,
+                            fileType: 'pdf'
+                          })
+                        "
+                      >
+                        鍙樻洿鍏憡锛�
+                        <MaterialIconThemePdf style="font-size: 1.5em" />
+                        {{ state.nowInfo.changeOrder.biangengwenjianName }}
+                      </p>
+                      <div v-if="state.nowInfo.fujian" class="flex">
+                        闄勪欢锛�
+                        <div>
+                          <p
+                            v-for="item in state.nowInfo.fujianList"
+                            :key="item.src"
+                            class="flex items-center cursor-pointer"
+                            @click="previewPdf(item)"
+                          >
+                            <MaterialIconThemeImage
+                              v-if="
+                                item.fileType == 'png' ||
+                                item.fileType == 'jepg'
+                              "
+                              style="font-size: 1.5em"
+                            />
+                            <MaterialIconThemePdf
+                              v-else-if="item.fileType == 'pdf'"
+                              style="font-size: 1.5em"
+                            />
+                            <MaterialIconThemeTable
+                              v-else-if="item.fileType == 'xlsx'"
+                              style="font-size: 1.5em"
+                            />
+                            <MaterialIconThemeWord
+                              v-else-if="
+                                item.fileType == 'doc' ||
+                                item.fileType == 'docx'
+                              "
+                              style="font-size: 1.5em"
+                            />
+                            <MaterialIconThemeZip
+                              v-else
+                              style="font-size: 1.5em"
+                            />
+                            {{ item.name }}
+                          </p>
+                        </div>
+                      </div>
+                      <!-- <el-button
                         type="primary"
                         plain
                         size="small"
                         @click="previewPdf(state.nowInfo.zhaobiaowenjian)"
                       >
                         鐐瑰嚮棰勮
-                      </el-button>
-                      <el-button type="primary" plain size="small">
+                      </el-button> -->
+                      <!-- <el-button
+                        v-if="state.nowInfo?.changeOrder"
+                        type="primary"
+                        plain
+                        size="small"
+                        @click="
+                          previewPdf(state.nowInfo.changeOrder.biangengwenjian)
+                        "
+                      >
+                        鐐瑰嚮棰勮鍙樻洿鍏憡
+                      </el-button> -->
+                      <!-- <el-button
+                        type="primary"
+                        plain
+                        size="small"
+                        @click="changeDialog('涓婁紶鍙樻洿', state.nowInfo)"
+                      >
                         淇敼鏍囬
-                      </el-button>
+                      </el-button> -->
                     </div>
                   </el-form-item>
                   <!-- <el-form-item label="纾嬪晢鏂囦欢锛�">
@@ -223,6 +376,12 @@
         </el-tabs>
       </el-card>
     </div>
+    <el-image-viewer
+      v-if="showPreview"
+      :url-list="state.srcList"
+      show-progress
+      @close="showPreview = false"
+    />
   </div>
 </template>
 

--
Gitblit v1.9.1