From c09b09a73a7905f980f5ebb8f25df0500d7c8ccb Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期三, 24 九月 2025 16:15:26 +0800
Subject: [PATCH] 器官编辑的比对国家表自动排序功能和新写了个附件预览的组件

---
 src/components/CustomImageViewer/index.vue                         |  214 ++++++++++++++++++++++++++
 src/views/project/donationdetails/index.vue                        |  136 +++++++++++++++-
 src/views/project/fund/applyDetail/index.vue                       |   51 ++++-
 src/views/project/travelexpenseapply/travelexpensedetail/index.vue |   37 +++-
 4 files changed, 399 insertions(+), 39 deletions(-)

diff --git a/src/components/CustomImageViewer/index.vue b/src/components/CustomImageViewer/index.vue
new file mode 100644
index 0000000..0457395
--- /dev/null
+++ b/src/components/CustomImageViewer/index.vue
@@ -0,0 +1,214 @@
+<template>
+  <div v-if="visible" class="custom-image-viewer">
+    <!-- 閬僵灞� -->
+    <div class="el-image-viewer__mask" @click.self="handleMaskClick"></div>
+
+    <!-- 鍥剧墖棰勮涓讳綋 -->
+    <div class="el-image-viewer__btn el-image-viewer__close" @click="close">
+      <i class="el-icon-close"></i>
+    </div>
+
+    <!-- 涓婁竴寮犳寜閽� -->
+    <div
+      class="el-image-viewer__btn el-image-viewer__prev"
+      :class="{ 'is-disabled': isFirst }"
+      @click="goPrev"
+    >
+      <i class="el-icon-arrow-left"></i>
+    </div>
+
+    <!-- 涓嬩竴寮犳寜閽� -->
+    <div
+      class="el-image-viewer__btn el-image-viewer__next"
+      :class="{ 'is-disabled': isLast }"
+      @click="goNext"
+    >
+      <i class="el-icon-arrow-right"></i>
+    </div>
+
+    <!-- 鍥剧墖灞曠ず -->
+    <div class="el-image-viewer__canvas">
+      <img
+        v-if="currentUrl"
+        :src="currentUrl"
+        :key="currentIndex"
+        @error="handleError"
+        class="el-image-viewer__img"
+      />
+    </div>
+
+    <!-- 鑷畾涔夋彁绀轰俊鎭� -->
+    <div v-if="showTip" class="custom-viewer-tip">
+      {{ tipMessage }}
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'CustomImageViewer',
+  props: {
+    urlList: {
+      type: Array,
+      default: () => []
+    },
+    initialIndex: {
+      type: Number,
+      default: 0
+    },
+    visible: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      currentIndex: this.initialIndex,
+      showTip: false,
+      tipMessage: ''
+    };
+  },
+  computed: {
+    currentUrl() {
+      return this.urlList[this.currentIndex];
+    },
+    isFirst() {
+      return this.currentIndex === 0;
+    },
+    isLast() {
+      return this.currentIndex === this.urlList.length - 1;
+    }
+  },
+  watch: {
+    initialIndex(newVal) {
+      this.currentIndex = newVal;
+    },
+    visible(newVal) {
+      if (!newVal) {
+        this.showTip = false;
+        this.tipMessage = '';
+      }
+    }
+  },
+  methods: {
+    close() {
+      this.$emit('update:visible', false);
+      this.$emit('close');
+    },
+    handleMaskClick() {
+      this.close();
+    },
+    goPrev() {
+      if (this.isFirst) {
+        this.showTipMessage('杩欏凡缁忔槸绗竴寮犱簡');
+        return;
+      }
+      this.currentIndex--;
+      this.hideTip();
+    },
+    goNext() {
+      if (this.isLast) {
+        this.showTipMessage('杩欏凡缁忔槸鏈�鍚庝竴寮犱簡');
+        return;
+      }
+      this.currentIndex++;
+      this.hideTip();
+    },
+    showTipMessage(message) {
+      this.tipMessage = message;
+      this.showTip = true;
+      // 2绉掑悗鑷姩闅愯棌鎻愮ず
+      setTimeout(() => {
+        this.hideTip();
+      }, 2000);
+    },
+    hideTip() {
+      this.showTip = false;
+      this.tipMessage = '';
+    },
+    handleError() {
+      console.error(`鍥剧墖鍔犺浇澶辫触: ${this.currentUrl}`);
+    }
+  }
+};
+</script>
+
+<style scoped>
+.custom-image-viewer {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 2000; /* 纭繚 z-index 瓒冲楂� */
+}
+
+.el-image-viewer__mask {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.5);
+}
+
+.el-image-viewer__btn {
+  position: absolute;
+  z-index: 1;
+  color: #fff;
+  background-color: rgba(0, 0, 0, 0.3);
+  border-radius: 50%;
+  width: 40px;
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+  user-select: none;
+}
+
+.el-image-viewer__btn.is-disabled {
+  cursor: not-allowed;
+  opacity: 0.5;
+}
+
+.el-image-viewer__close {
+  top: 20px;
+  right: 20px;
+}
+
+.el-image-viewer__prev {
+  left: 20px;
+  top: 50%;
+  transform: translateY(-50%);
+}
+
+.el-image-viewer__next {
+  right: 20px;
+  top: 50%;
+  transform: translateY(-50%);
+}
+
+.el-image-viewer__canvas {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+}
+
+.el-image-viewer__img {
+  max-width: 90%;
+  max-height: 90%;
+  object-fit: contain;
+}
+
+.custom-viewer-tip {
+  position: absolute;
+  bottom: 50px;
+  left: 50%;
+  transform: translateX(-50%);
+  background-color: rgba(0, 0, 0, 0.7);
+  color: #fff;
+  padding: 10px 20px;
+  border-radius: 4px;
+  z-index: 2001;
+}
+</style>
diff --git a/src/views/project/donationdetails/index.vue b/src/views/project/donationdetails/index.vue
index 4038f30..2d69c3d 100644
--- a/src/views/project/donationdetails/index.vue
+++ b/src/views/project/donationdetails/index.vue
@@ -1016,7 +1016,7 @@
           label-width="100px"
           label-position="right"
         >
-               <el-row>
+          <el-row>
             <el-col :span="6">
               <el-form-item label="鎹愯禒鑰呮皯鏃�" prop="nation">
                 <el-select v-model="affirmform.nation" placeholder="璇烽�夋嫨姘戞棌">
@@ -1403,12 +1403,12 @@
                       />
                     </template>
                   </el-table-column>
-                  <el-table-column
+                  <!-- <el-table-column
                     label="鍣ㄥ畼缂栧彿"
                     align="center"
                     width="90"
                     prop="organno"
-                  />
+                  /> -->
                   <el-table-column
                     label="鍒嗛厤绯荤粺缂栧彿"
                     align="center"
@@ -1457,7 +1457,7 @@
                   <el-table-column
                     label="绉绘鍖婚櫌"
                     align="center"
-                    width="230"
+                    width="280"
                     prop="transplanthospitalno"
                   >
                     <template slot-scope="scope">
@@ -1690,7 +1690,7 @@
             <el-col :span="6">
               <el-form-item
                 align="left"
-                label="绛惧瓧鏃堕棿"
+                label="绛惧瓧鏃ユ湡"
                 label-width="120px"
                 prop="coordinatorSignTime"
               >
@@ -1698,7 +1698,7 @@
                   clearable
                   v-model="witnessform.coordinatorSignTime"
                   type="datetime"
-                  value-format="yyyy-MM-dd HH:mm:ss"
+                  value-format="yyyy-MM-dd"
                   placeholder="閫夋嫨鎵嬫湳缁撴潫鏃堕棿"
                 >
                 </el-date-picker>
@@ -1864,7 +1864,12 @@
           <el-row>
             <el-col>
               <el-form-item>
-                <el-table v-loading="loading" border :data="procureddata">
+                <el-table
+                  v-loading="loading"
+                  border
+                  :key="tableKey"
+                  :data="procureddata"
+                >
                   <el-table-column
                     label="鍣ㄥ畼鍚嶇О"
                     align="center"
@@ -1879,12 +1884,12 @@
                       />
                     </template>
                   </el-table-column>
-                  <el-table-column
+                  <!-- <el-table-column
                     label="鍣ㄥ畼缂栧彿"
                     align="center"
                     width="90"
                     prop="organno"
-                  />
+                  /> -->
                   <!-- <el-table-column
                     label="绯荤粺缂栧彿"
                     align="center"
@@ -1920,7 +1925,7 @@
                   <el-table-column
                     label="鑾峰彇鍖婚櫌"
                     align="center"
-                    width="230"
+                    width="280"
                     prop="gainhospitalno"
                   >
                     <template slot-scope="scope">
@@ -2139,12 +2144,12 @@
                       />
                     </template>
                   </el-table-column>
-                  <el-table-column
+                  <!-- <el-table-column
                     label="鍣ㄥ畼缂栧彿"
                     align="center"
                     width="90"
                     prop="organno"
-                  />
+                  /> -->
                   <el-table-column
                     label="绯荤粺缂栧彿"
                     align="center"
@@ -2161,7 +2166,7 @@
                   <el-table-column
                     label="绉绘鍖婚櫌"
                     align="center"
-                    width="220"
+                    width="280"
                     prop="hospitalno"
                   >
                     <template slot-scope="scope">
@@ -2695,6 +2700,20 @@
         contacttime: "",
         reporttime: ""
       },
+      organOrder: [
+        "鑲濊剰",
+        "宸﹁偩",
+        "鍙宠偩",
+        "蹇冭剰",
+        "宸﹁偤",
+        "鍙宠偤",
+        "鑳拌吅",
+        "灏忚偁",
+        "宸︾溂瑙掕啘",
+        "鍙崇溂瑙掕啘"
+      ], // 鎸囧畾鐨勫櫒瀹橀『搴�
+      isSorting: false, // 鏍囧織浣嶏紝琛ㄧず鏄惁姝e湪鎺掑簭
+      tableKey: 0,
       istb: false,
       activeName: "",
       tableDatafile: [
@@ -2892,7 +2911,7 @@
         education: [
           { required: true, message: "瀹跺睘鑱旂郴鐢佃瘽涓嶄负绌�", trigger: "blur" }
         ],
-         occupation: [
+        occupation: [
           { required: true, message: "瀹跺睘鑱旂郴鐢佃瘽涓嶄负绌�", trigger: "blur" }
         ],
         signfamilyrelations: [
@@ -2975,6 +2994,28 @@
     listReportname("fzr").then(res => {
       this.leaderlist = res.data;
     });
+    // this.customOrganSort();
+  },
+  watch: {
+    // 鐩戝惉 procureddata 鐨勫彉鍖栵紝鏁版嵁鏇存柊鍚庨噸鏂版帓搴�
+    procureddata: {
+      handler(newVal) {
+        if (this.isSorting) {
+          return;
+        }
+        this.customOrganSort();
+      },
+      deep: true // 娣卞害鐩戝惉锛屽洜涓烘暟缁勫唴瀹瑰彲鑳藉彉鍖�
+    },
+    allocateddata: {
+      handler(newVal) {
+        if (this.isSorting) {
+          return;
+        }
+        this.allocateddataSort();
+      },
+      deep: true // 娣卞害鐩戝惉锛屽洜涓烘暟缁勫唴瀹瑰彲鑳藉彉鍖�
+    }
   },
 
   methods: {
@@ -3567,6 +3608,73 @@
         });
       }
     },
+
+    customOrganSort() {
+      console.log("璋冪敤");
+
+      // 1. 鍔犻攣锛岄樆姝㈢洃鍚櫒鎵ц
+      this.isSorting = true;
+      // 鑷畾涔夋帓搴忓嚱鏁�
+      this.procureddata.sort((a, b) => {
+        const indexA = this.organOrder.indexOf(a.organname);
+        const indexB = this.organOrder.indexOf(b.organname);
+
+        // 濡傛灉涓や釜閮藉湪鍒楄〃涓紝鎸夊垪琛ㄤ腑鐨勯『搴忔帓搴�
+        if (indexA !== -1 && indexB !== -1) {
+          return indexA - indexB;
+        }
+        // 濡傛灉 a 鍦ㄥ垪琛ㄤ腑锛宐 涓嶅湪锛宎 鎺掑墠闈�
+        if (indexA !== -1) {
+          return -1;
+        }
+        // 濡傛灉 b 鍦ㄥ垪琛ㄤ腑锛宎 涓嶅湪锛宐 鎺掑墠闈�
+        if (indexB !== -1) {
+          return 1;
+        }
+        // 涓や釜閮戒笉鍦ㄥ垪琛ㄤ腑锛屼繚鎸佸師椤哄簭锛堟垨鎸夊叾浠栬鍒欙紝姣斿鎸夊瓧姣嶆帓搴忥紝杩欓噷鎸夊師濮嬮『搴忥級
+        return 0;
+      });
+      console.log(this.procureddata, "椤哄簭");
+      this.tableKey += 1; // 鏀瑰彉 key 杩娇琛ㄦ牸閲嶆柊娓叉煋
+      // 浣犲彲浠ヤ娇鐢� this.$forceUpdate() 鎴栬�呴噸鏂拌祴鍊兼暟缁勬潵瑙﹀彂鏇存柊
+      this.procureddata = [...this.procureddata];
+      this.$nextTick(() => {
+        this.isSorting = false;
+      });
+    },
+     allocateddataSort() {
+      console.log("璋冪敤");
+
+      // 1. 鍔犻攣锛岄樆姝㈢洃鍚櫒鎵ц
+      this.isSorting = true;
+      // 鑷畾涔夋帓搴忓嚱鏁�
+      this.allocateddata.sort((a, b) => {
+        const indexA = this.organOrder.indexOf(a.organname);
+        const indexB = this.organOrder.indexOf(b.organname);
+
+        // 濡傛灉涓や釜閮藉湪鍒楄〃涓紝鎸夊垪琛ㄤ腑鐨勯『搴忔帓搴�
+        if (indexA !== -1 && indexB !== -1) {
+          return indexA - indexB;
+        }
+        // 濡傛灉 a 鍦ㄥ垪琛ㄤ腑锛宐 涓嶅湪锛宎 鎺掑墠闈�
+        if (indexA !== -1) {
+          return -1;
+        }
+        // 濡傛灉 b 鍦ㄥ垪琛ㄤ腑锛宎 涓嶅湪锛宐 鎺掑墠闈�
+        if (indexB !== -1) {
+          return 1;
+        }
+        // 涓や釜閮戒笉鍦ㄥ垪琛ㄤ腑锛屼繚鎸佸師椤哄簭锛堟垨鎸夊叾浠栬鍒欙紝姣斿鎸夊瓧姣嶆帓搴忥紝杩欓噷鎸夊師濮嬮『搴忥級
+        return 0;
+      });
+      console.log(this.allocateddata, "椤哄簭");
+      this.tableKey += 1; // 鏀瑰彉 key 杩娇琛ㄦ牸閲嶆柊娓叉煋
+      // 浣犲彲浠ヤ娇鐢� this.$forceUpdate() 鎴栬�呴噸鏂拌祴鍊兼暟缁勬潵瑙﹀彂鏇存柊
+      this.allocateddata = [...this.allocateddata];
+      this.$nextTick(() => {
+        this.isSorting = false;
+      });
+    },
     // 鍒囨崲tab
     on_click(e) {
       // if (e != "" || e != null) {
diff --git a/src/views/project/fund/applyDetail/index.vue b/src/views/project/fund/applyDetail/index.vue
index 34ba88e..f5a64fc 100644
--- a/src/views/project/fund/applyDetail/index.vue
+++ b/src/views/project/fund/applyDetail/index.vue
@@ -817,8 +817,13 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row v-if="selectionType == 'account' && accountfrom == '2'&&
-              accountselectform.usertype == 'org'">
+        <el-row
+          v-if="
+            selectionType == 'account' &&
+              accountfrom == '2' &&
+              accountselectform.usertype == 'org'
+          "
+        >
           <el-col :span="24">
             <el-form-item label="绋庡彿" prop="unitTaxNo">
               <el-input
@@ -1125,16 +1130,22 @@
             >
               <!-- <img :src="pdfimg" /> -->
               <el-image
+                ref="imagePreview"
                 style="width: 95%; height: 90%"
-                @error="handleImageError"
-                @load="handleImageLoad"
                 :src="pdfimg"
-                :preview-src-list="pdfimgsrcList"
+                @click="handleImageClick(initialIndex)"
               >
-                <!-- <div slot="error" class="image-slot">
-              <i class="el-icon-picture-outline"></i>
-            </div> -->
-              </el-image>
+              <!-- <div slot="error" class="image-slot">
+                <i class="el-icon-picture-outline"></i>
+              </div> -->
+            </el-image>
+            <custom-image-viewer
+              :url-list="pdfimgsrcList"
+              :initial-index="currentIndex"
+              :visible="viewerVisible"
+              @update:visible="viewerVisible = $event"
+              @close="handleViewerClose"
+            />
             </div>
             <div v-else class="pdfimgmins">{{ hintitle }}</div>
           </div>
@@ -1375,12 +1386,15 @@
 import Li_area_select from "@/components/Address";
 import OrgSelecter from "@/views/project/components/orgselect";
 import { getToken } from "@/utils/auth";
+import CustomImageViewer from "@/components/CustomImageViewer"; // 鏍规嵁浣犵殑璺緞璋冩暣
+
 
 export default {
   //import寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
   components: {
     Li_area_select,
-    OrgSelecter
+    OrgSelecter,
+    CustomImageViewer,
   },
   name: "fundApply",
 
@@ -1527,9 +1541,7 @@
         username: [
           { required: true, message: "璇疯緭鍏ヨ处鎴峰悕绉�", trigger: "blur" }
         ],
-         unitTaxNo: [
-          { required: true, message: "璇疯緭鍏ョ◣鍙�", trigger: "blur" }
-        ],
+        unitTaxNo: [{ required: true, message: "璇疯緭鍏ョ◣鍙�", trigger: "blur" }],
         idcardno: [
           { required: true, message: "璇疯緭鍏ヨ韩浠借处鍙�", trigger: "blur" }
         ],
@@ -1673,6 +1685,9 @@
       pdftitle: "",
       pdfimg: "",
       pdfimgsrcList: [],
+      currentIndex: 0, // 鍒濆绱㈠紩
+      initialIndex: 0, // 鍒濆绱㈠紩
+      viewerVisible: false, // 鎺у埗棰勮缁勪欢鏄剧ず
       pdfVisible: false,
       previewpdf: false,
       hintitle: "璇蜂笂浼犳枃浠跺悗鏌ョ湅",
@@ -2337,7 +2352,8 @@
         if (
           this.userprofile.userName == "admin" ||
           this.userprofile.userName == "053" ||
-          this.userprofile.userName == "047"|| store.getters.rolesor[0].roleSort=='13'
+          this.userprofile.userName == "047" ||
+          store.getters.rolesor[0].roleSort == "13"
         ) {
           this.ismanager = true;
         } else {
@@ -3181,6 +3197,13 @@
       // 鍥剧墖鍔犺浇鎴愬姛鏃舵墽琛岀殑鎿嶄綔
       console.log("Image loaded successfully");
     },
+    handleImageClick(index) {
+      this.currentIndex = index;
+      this.viewerVisible = true;
+    },
+    handleViewerClose() {
+      this.viewerVisible = false;
+    },
     handleUploadError() {},
     remove(file, fileList) {
       const rbDetails = [...this.rbDetails];
diff --git a/src/views/project/travelexpenseapply/travelexpensedetail/index.vue b/src/views/project/travelexpenseapply/travelexpensedetail/index.vue
index 75a7a06..f24c82e 100644
--- a/src/views/project/travelexpenseapply/travelexpensedetail/index.vue
+++ b/src/views/project/travelexpenseapply/travelexpensedetail/index.vue
@@ -1111,17 +1111,21 @@
                 :src="pdfimg"
                 :preview-src-list="pdfimgsrcList" -->
               >
-                <el-image
-                  ref="imagePreview"
-                  style="width: 95%; height: 90%"
-                  :src="pdfimg"
-                  :preview-src-list="pdfimgsrcList"
-                  :initial-index="initialIndex"
-                  @error="handleImageError"
-                  @load="handleImageLoad"
-                >
-                </el-image>
-                <!-- <div slot="error" class="image-slot">
+              <el-image
+                ref="imagePreview"
+                style="width: 95%; height: 90%"
+                :src="pdfimg"
+                @click="handleImageClick(initialIndex)"
+              >
+              </el-image>
+              <custom-image-viewer
+                :url-list="pdfimgsrcList"
+                :initial-index="currentIndex"
+                :visible="viewerVisible"
+                @update:visible="viewerVisible = $event"
+                @close="handleViewerClose"
+              />
+              <!-- <div slot="error" class="image-slot">
               <i class="el-icon-picture-outline"></i>
             </div> -->
               <!-- </el-image> -->
@@ -1281,6 +1285,7 @@
 import { getInfoBytheUserNo } from "@/api/project/externalperson";
 import { regionDataPlus, CodeToText } from "element-china-area-data";
 import Li_area_select from "@/components/Address";
+import CustomImageViewer from "@/components/CustomImageViewer"; // 鏍规嵁浣犵殑璺緞璋冩暣
 import { getUser, getUserProfile } from "@/api/system/user";
 import { treeselect } from "@/api/system/dept";
 import { getSubsidy } from "@/api/project/travelcity";
@@ -1291,6 +1296,7 @@
   components: {
     Treeselect,
     Li_area_select,
+    CustomImageViewer,
     pdf
   },
   name: "Funddetail",
@@ -1453,7 +1459,9 @@
       invoicefileListto: [],
       invoicepdfimg: "",
       invoicepdfimgsrcList: [],
+      currentIndex: 0, // 鍒濆绱㈠紩
       initialIndex: 0, // 鍒濆绱㈠紩
+      viewerVisible: false, // 鎺у埗棰勮缁勪欢鏄剧ず
       //浜哄憳绫诲埆
       persontype: null,
       //鍒拌揪鍦�
@@ -1603,6 +1611,13 @@
       }
       return 0;
     },
+    handleImageClick(index) {
+      this.currentIndex = index;
+      this.viewerVisible = true;
+    },
+    handleViewerClose() {
+      this.viewerVisible = false;
+    },
     handleImageError() {
       console.error("鍥剧墖鍔犺浇澶辫触");
     },

--
Gitblit v1.9.3