From 2431480f5859ef40dfdf0eb19e1ba6ddebbd9ef2 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 29 十二月 2025 20:06:22 +0800
Subject: [PATCH] 项目页面优化

---
 src/views/business/course/components/MedicalAssessmentStage.vue |  533 ++++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 361 insertions(+), 172 deletions(-)

diff --git a/src/views/business/course/components/MedicalAssessmentStage.vue b/src/views/business/course/components/MedicalAssessmentStage.vue
index ece6b8f..e96310a 100644
--- a/src/views/business/course/components/MedicalAssessmentStage.vue
+++ b/src/views/business/course/components/MedicalAssessmentStage.vue
@@ -1,208 +1,397 @@
 <template>
-  <base-stage :stage-data="stageData" :case-info="caseInfo">
-    <template #header>
-      <el-alert
-        :title="alertTitle"
-        :type="alertType"
-        :description="alertDescription"
-        show-icon
-        :closable="false"
-      />
-    </template>
+  <div class="assessment-detail">
 
-    <el-row :gutter="20" style="margin-top: 20px;">
-      <el-col :span="8">
-        <el-card>
-          <div slot="header" class="card-header">
-            <span>璇勪及姒傚喌</span>
-          </div>
-          <div class="assessment-stats">
-            <div class="stat-item">
-              <span class="stat-label">璇勪及鐘舵��:</span>
-              <el-tag :type="getStatusTag(stageData.status)">
-                {{ getStatusText(stageData.status) }}
-              </el-tag>
-            </div>
-            <div class="stat-item">
-              <span class="stat-label">璇勪及鍖荤敓:</span>
-              <span>{{ stageData.operator || '寰呭垎閰�' }}</span>
-            </div>
-            <div class="stat-item">
-              <span class="stat-label">寮�濮嬫椂闂�:</span>
-              <span>{{ formatTime(stageData.updateTime) }}</span>
-            </div>
-            <div class="stat-item">
-              <span class="stat-label">瀹屾垚鏃堕棿:</span>
-              <span>{{ formatTime(stageData.completeTime) || '-' }}</span>
-            </div>
-          </div>
-        </el-card>
-      </el-col>
 
-      <el-col :span="16">
-        <el-card>
-          <div slot="header" class="card-header">
-            <span>璇勪及椤圭洰杩涘害</span>
-          </div>
-          <div class="progress-list">
-            <div v-for="item in assessmentItems" :key="item.name" class="progress-item">
-              <div class="progress-info">
-                <span class="item-name">{{ item.name }}</span>
-                <span class="item-status">
-                  <el-tag :type="item.status === 'completed' ? 'success' : 'warning'" size="small">
-                    {{ item.status === 'completed' ? '宸插畬鎴�' : '寰呰瘎浼�' }}
-                  </el-tag>
-                </span>
-              </div>
-              <el-progress
-                :percentage="item.status === 'completed' ? 100 : 0"
-                :show-text="false"
-                :status="item.status === 'completed' ? 'success' : 'exception'"
-              />
-            </div>
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
-
-    <el-card style="margin-top: 20px;">
-      <div slot="header" class="card-header">
-        <span>璇勪及璇︽儏璁板綍</span>
-        <el-button type="primary" size="small" @click="handleViewReport">
-          鏌ョ湅璇勪及鎶ュ憡
-        </el-button>
+    <el-card class="organ-assessment-card">
+      <div slot="header" class="clearfix">
+        <span>鍣ㄥ畼璇勪及琛�</span>
+        <!-- <el-button
+          v-if="isCoordinator && allOrgansAssessed"
+          style="float: right; margin-left: 10px"
+          type="primary"
+          size="mini"
+          @click="handleCompleteAssessment"
+        >
+          纭瀹屾垚璇勪及
+        </el-button> -->
+        <!-- <span v-if="!isCoordinator" class="jstitle">
+          褰撳墠瑙掕壊锛歿{ currentDepartment }}璇勪及浜哄憳
+        </span> -->
       </div>
-      <el-descriptions :column="2" border>
-        <el-descriptions-item label="鐢熺悊鎸囨爣璇勪及">
-          {{ assessmentDetails.physiological || '寰呰瘎浼�' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="鍣ㄥ畼鍔熻兘璇勪及">
-          {{ assessmentDetails.organFunction || '寰呰瘎浼�' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="鎰熸煋鎬х柧鐥呯瓫鏌�">
-          {{ assessmentDetails.infectionScreening || '寰呯瓫鏌�' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="鎭舵�ц偪鐦ょ瓫鏌�">
-          {{ assessmentDetails.cancerScreening || '寰呯瓫鏌�' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="璇勪及缁撹">
-          <el-tag :type="assessmentDetails.conclusion ? 'success' : 'warning'">
-            {{ assessmentDetails.conclusion || '璇勪及涓�' }}
-          </el-tag>
-        </el-descriptions-item>
-        <el-descriptions-item label="璇勪及鍖荤敓鎰忚">
-          {{ assessmentDetails.doctorOpinion || '寰呭~鍐�' }}
-        </el-descriptions-item>
-      </el-descriptions>
+
+      <el-table
+        :data="organAssessmentList"
+        v-loading="assessmentLoading"
+        style="width: 100%"
+        :row-class-name="getRowClassName"
+      >
+        <el-table-column
+          label="鍣ㄥ畼绫诲瀷"
+          align="center"
+          prop="organType"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <dict-tag
+              :options="organTypeOptions"
+              :value="scope.row.organType"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="璇勪及绉戝"
+          align="center"
+          prop="department"
+          width="120"
+        />
+        <el-table-column
+          label="璇勪及浜哄憳"
+          align="center"
+          prop="assessor"
+          width="100"
+        />
+        <el-table-column label="璇勪及鐘舵��" align="center" width="100">
+          <template slot-scope="scope">
+            <el-tag
+              :type="scope.row.assessmentStatus === '1' ? 'success' : 'warning'"
+              size="small"
+            >
+              {{ scope.row.assessmentStatus === "1" ? "宸茶瘎浼�" : "寰呰瘎浼�" }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍔熻兘鐘舵��" align="center" width="100">
+          <template slot-scope="scope">
+            <el-tag
+              :type="getFunctionStatusType(scope.row.functionStatus)"
+              size="small"
+            >
+              {{ getFunctionStatusText(scope.row.functionStatus) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="璇勪及鎰忚"
+          align="center"
+          prop="assessmentOpinion"
+          min-width="150"
+          show-overflow-tooltip
+        />
+        <el-table-column label="璇勪及鏃堕棿" align="center" width="120">
+          <template slot-scope="scope">
+            <span>{{ scope.row.assessmentTime || "-" }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="150"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              v-if="canAssessOrgan(scope.row)"
+              size="mini"
+              type="text"
+              @click="handleOrganAssess(scope.row)"
+              >{{
+                scope.row.assessmentStatus === "1" ? "鏌ョ湅/淇敼" : "璇勪及"
+              }}</el-button
+            >
+            <el-button v-else size="mini" type="text" disabled
+              >鏃犳潈闄�</el-button
+            >
+            <el-button
+              v-if="isCoordinator"
+              size="mini"
+              type="text"
+              @click="handleViewOrganDetail(scope.row)"
+              >璇︽儏</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 鍣ㄥ畼璇勪及璇︽儏 -->
+      <el-collapse
+        v-model="activeOrgans"
+        accordion
+        class="organ-detail-collapse"
+      >
+        <el-collapse-item
+          v-for="organ in organAssessmentList"
+          :key="organ.organType"
+          :name="organ.organType"
+          :title="getOrganTitle(organ)"
+        >
+          <organ-assessment-form
+            :organ-data="organ"
+            :readonly="!canAssessOrgan(organ)"
+            @save="handleSaveOrganAssessment"
+          />
+        </el-collapse-item>
+      </el-collapse>
     </el-card>
-  </base-stage>
+
+    <!-- 闄勪欢棰勮寮圭獥 -->
+    <attachment-preview
+      :visible="attachmentVisible"
+      :attachment-list="attachmentList"
+      @close="attachmentVisible = false"
+    />
+  </div>
 </template>
 
 <script>
-import BaseStage from './BaseStage.vue';
+// import { getAssessment, updateOrganAssessment, completeAssessment } from "@/api/case/assessment";
+import {
+  getAssessment,
+  updateOrganAssessment,
+  completeAssessment
+} from "./api/mockAssessmentApi";
+
+import OrganAssessmentForm from "./components/OrganAssessmentForm.vue";
+import AttachmentPreview from "./components/AttachmentPreview.vue";
 
 export default {
-  name: 'MedicalAssessmentStage',
-  components: { BaseStage },
-  props: {
-    stageData: {
-      type: Object,
-      default: () => ({})
-    },
-    caseInfo: {
-      type: Object,
-      default: () => ({})
-    }
-  },
-  computed: {
-    alertTitle() {
-      const status = this.stageData.status;
-      return status === 'completed' ? '鍖诲璇勪及瀹屾垚' :
-             status === 'in_progress' ? '鍖诲璇勪及杩涜涓�' : '寰呭紑濮嬪尰瀛﹁瘎浼�';
-    },
-    alertType() {
-      const status = this.stageData.status;
-      return status === 'completed' ? 'success' :
-             status === 'in_progress' ? 'warning' : 'info';
-    },
-    alertDescription() {
-      const status = this.stageData.status;
-      return status === 'completed' ? '鎵�鏈夊尰瀛﹁瘎浼伴」鐩凡瀹屾垚锛屼緵鑰呯鍚堟崘鐚潯浠�' :
-             status === 'in_progress' ? '鍖诲璇勪及姝e湪杩涜涓紝璇峰叧娉ㄨ瘎浼拌繘搴�' : '绛夊緟寮�濮嬪尰瀛﹁瘎浼版祦绋�';
-    }
-  },
+  name: "AssessmentDetail",
+  components: { OrganAssessmentForm, AttachmentPreview },
   data() {
     return {
-      assessmentItems: [
-        { name: '鐢熺悊鎸囨爣璇勪及', status: 'completed' },
-        { name: '鍣ㄥ畼鍔熻兘璇勪及', status: 'completed' },
-        { name: '鎰熸煋鎬х柧鐥呯瓫鏌�', status: 'completed' },
-        { name: '鎭舵�ц偪鐦ょ瓫鏌�', status: 'completed' },
-        { name: '閬椾紶鎬х柧鐥呯瓫鏌�', status: 'completed' },
-        { name: '蹇冪悊鐘舵�佽瘎浼�', status: 'completed' }
+      // 璇勪及ID
+      assessmentId: undefined,
+      // 璇勪及鏁版嵁
+      assessmentData: {},
+      // 鍣ㄥ畼璇勪及鍒楄〃
+      organAssessmentList: [],
+      // 闄勪欢鍒楄〃
+      attachmentList: [],
+      // 鍔犺浇鐘舵��
+      assessmentLoading: false,
+      // 褰撳墠鐢ㄦ埛淇℃伅
+      currentUser: {
+        id: "001",
+        name: "寮犲尰鐢�",
+        department: "蹇冭剰澶栫",
+        role: "department" // coordinator: 鍗忚皟鍛�, department: 绉戝浜哄憳
+      },
+      // 灞曞紑鐨勫櫒瀹�
+      activeOrgans: [],
+      // 闄勪欢棰勮鍙鎬�
+      attachmentVisible: false,
+      // 瀛楀吀閫夐」
+      genderOptions: [
+        { value: "0", label: "鐢�" },
+        { value: "1", label: "濂�" }
       ],
-      assessmentDetails: {
-        physiological: '鍚勯」鐢熺悊鎸囨爣姝e父锛岀鍚堟崘鐚姹�',
-        organFunction: '涓昏鍣ㄥ畼鍔熻兘鑹ソ锛屾棤绂佸繉鐥�',
-        infectionScreening: '浼犳煋鐥呯瓫鏌ュ潎涓洪槾鎬�',
-        cancerScreening: '鏃犳伓鎬ц偪鐦よ抗璞�',
-        conclusion: '閫傚悎鍣ㄥ畼鎹愮尞',
-        doctorOpinion: '渚涜�呰韩浣撶姸鍐佃壇濂斤紝绗﹀悎鎹愮尞鍖诲鏍囧噯'
-      }
+      bloodTypeOptions: [
+        { value: "A", label: "A鍨�" },
+        { value: "B", label: "B鍨�" },
+        { value: "O", label: "O鍨�" },
+        { value: "AB", label: "AB鍨�" }
+      ],
+      assessmentTypeOptions: [
+        { value: "1", label: "鍒濇璇勪及" },
+        { value: "2", label: "鏈�缁堣瘎浼�" }
+      ],
+      organTypeOptions: [
+        { value: "heart", label: "蹇冭剰" },
+        { value: "liver", label: "鑲濊剰" },
+        { value: "kidney", label: "鑲捐剰" },
+        { value: "lung", label: "鑲鸿剰" },
+        { value: "pancreas", label: "鑳拌吅" },
+        { value: "intestine", label: "鑲犻亾" },
+        { value: "cornea", label: "瑙掕啘" },
+        { value: "skin", label: "鐨偆" }
+      ]
     };
   },
-  methods: {
-    getStatusText(status) {
-      const map = {
-        'completed': '宸插畬鎴�',
-        'in_progress': '杩涜涓�',
-        'pending': '鏈紑濮�'
-      };
-      return map[status] || '鏈煡';
+  computed: {
+    // 鏄惁鏄崗璋冨憳
+    isCoordinator() {
+      return this.currentUser.role === "coordinator";
     },
-    handleViewReport() {
-      this.$message.info('鏌ョ湅鍖诲璇勪及鎶ュ憡鍔熻兘');
+    // 褰撳墠绉戝
+    currentDepartment() {
+      return this.currentUser.department;
+    },
+    // 鎵�鏈夊櫒瀹樻槸鍚﹂兘宸茶瘎浼�
+    allOrgansAssessed() {
+      return this.organAssessmentList.every(
+        organ => organ.assessmentStatus === "1"
+      );
+    }
+  },
+  created() {
+    this.assessmentId = this.$route.query.id;
+    this.getAssessmentDetail();
+  },
+  methods: {
+    // 鑾峰彇璇勪及璇︽儏 - 浣跨敤Mock鏁版嵁
+    getAssessmentDetail() {
+      this.assessmentLoading = true;
+      getAssessment(this.assessmentId)
+        .then(response => {
+          if (response.code === 200) {
+            this.assessmentData = response.data.caseInfo;
+            this.organAssessmentList = response.data.organAssessments || [];
+            this.attachmentList = response.data.attachments || [];
+          } else {
+            this.$message.error("鑾峰彇璇勪及璇︽儏澶辫触");
+          }
+          this.assessmentLoading = false;
+        })
+        .catch(error => {
+          console.error("鑾峰彇璇勪及璇︽儏澶辫触:", error);
+          this.assessmentLoading = false;
+          this.$message.error("鑾峰彇璇勪及璇︽儏澶辫触");
+        });
+    },
+    // 鐘舵�佽繃婊ゅ櫒
+    statusFilter(status) {
+      const statusMap = {
+        "0": "warning",
+        "1": "primary",
+        "2": "success",
+        "3": "danger"
+      };
+      return statusMap[status] || "info";
+    },
+    statusTextFilter(status) {
+      const statusMap = {
+        "0": "寰呰瘎浼�",
+        "1": "璇勪及涓�",
+        "2": "宸插畬鎴�",
+        "3": "宸插叧闂�"
+      };
+      return statusMap[status] || "鏈煡";
+    },
+    // 鑾峰彇鍔熻兘鐘舵�佺被鍨�
+    getFunctionStatusType(status) {
+      const typeMap = {
+        "1": "success", // 姝e父
+        "2": "warning", // 杞诲害寮傚父
+        "3": "danger", // 閲嶅害寮傚父
+        "4": "info" // 鏃犳硶璇勪及
+      };
+      return typeMap[status] || "info";
+    },
+    // 鑾峰彇鍔熻兘鐘舵�佹枃鏈�
+    getFunctionStatusText(status) {
+      const textMap = {
+        "1": "姝e父",
+        "2": "杞诲害寮傚父",
+        "3": "閲嶅害寮傚父",
+        "4": "鏃犳硶璇勪及"
+      };
+      return textMap[status] || "鏈煡";
+    },
+    // 妫�鏌ユ槸鍚︽湁鏉冮檺璇勪及璇ュ櫒瀹�
+    canAssessOrgan(organ) {
+      if (this.isCoordinator) return true;
+      return organ.department === this.currentDepartment;
+    },
+    // 鑾峰彇琛岀被鍚�
+    getRowClassName({ row }) {
+      return this.canAssessOrgan(row) ? "assessable-row" : "non-assessable-row";
+    },
+    // 鑾峰彇鍣ㄥ畼鏍囬
+    getOrganTitle(organ) {
+      const organName =
+        this.organTypeOptions.find(opt => opt.value === organ.organType)
+          ?.label || organ.organType;
+      return `${organName}璇勪及璇︽儏锛�${organ.department}锛塦;
+    },
+    // 鍣ㄥ畼璇勪及
+    handleOrganAssess(organ) {
+      this.activeOrgans = [organ.organType];
+    },
+    // 鏌ョ湅鍣ㄥ畼璇︽儏
+    handleViewOrganDetail(organ) {
+      this.activeOrgans = [organ.organType];
+    },
+    // 淇濆瓨鍣ㄥ畼璇勪及 - 浣跨敤Mock API
+    handleSaveOrganAssessment(organData) {
+      updateOrganAssessment(organData)
+        .then(response => {
+          if (response.code === 200) {
+            this.$message.success("璇勪及淇濆瓨鎴愬姛");
+            // 鍒锋柊鏁版嵁
+            this.getAssessmentDetail();
+          }
+        })
+        .catch(error => {
+          console.error("淇濆瓨璇勪及澶辫触:", error);
+          this.$message.error("淇濆瓨澶辫触");
+        });
+    },
+    // 鏌ョ湅闄勪欢棰勮
+    handleAttachmentPreview() {
+      this.attachmentVisible = true;
+    },
+    // 瀹屾垚璇勪及 - 浣跨敤Mock API
+    handleCompleteAssessment() {
+      this.$confirm("纭瀹屾垚鎵�鏈夊櫒瀹樿瘎浼板悧锛熷畬鎴愬悗灏嗘棤娉曚慨鏀�", "纭鎿嶄綔", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(() => {
+        completeAssessment(this.assessmentId)
+          .then(response => {
+            if (response.code === 200) {
+              this.$message.success("璇勪及瀹屾垚纭鎴愬姛");
+              this.getAssessmentDetail();
+            }
+          })
+          .catch(error => {
+            console.error("瀹屾垚璇勪及澶辫触:", error);
+            this.$message.error("鎿嶄綔澶辫触");
+          });
+      });
     }
   }
 };
 </script>
 
 <style scoped>
-.assessment-stats {
-  padding: 10px 0;
+.assessment-detail {
+  padding: 20px;
 }
 
-.stat-item {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 15px;
-  padding: 8px 0;
-  border-bottom: 1px solid #f0f0f0;
+.basic-info-card {
+  margin-bottom: 20px;
 }
 
-.stat-label {
-  color: #606266;
-  font-weight: 500;
+.organ-assessment-card {
+  margin-bottom: 20px;
 }
 
-.progress-list {
-  padding: 10px 0;
+.organ-detail-collapse {
+  margin-top: 20px;
 }
 
-.progress-item {
-  margin-bottom: 15px;
+::v-deep .assessable-row {
+  background-color: #f0f9ff;
 }
 
-.progress-info {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 8px;
+::v-deep .non-assessable-row {
+  background-color: #fafafa;
 }
 
-.item-name {
-  color: #606266;
-  font-size: 14px;
+::v-deep .el-descriptions__label {
+  width: 120px;
+  background-color: #f5f7fa;
+  font-weight: bold;
+}
+
+.fixed-width .el-button {
+  margin: 0 2px;
+}
+.jstitle {
+  float: right;
+  font-size: 18px !important;
+  font-weight: 600;
+  color: #2645f7;
+  font-size: 12px;
 }
 </style>

--
Gitblit v1.9.3