From 9f880b5f6d08ad418ba11f4280505c7a41ec3807 Mon Sep 17 00:00:00 2001
From: 张诺 <2864490065@qq.com>
Date: 星期四, 24 七月 2025 10:38:22 +0800
Subject: [PATCH] 完善 设备领用 用户归还完毕不显示归还按钮

---
 src/views/equipment/management/index.vue |  202 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 137 insertions(+), 65 deletions(-)

diff --git a/src/views/equipment/management/index.vue b/src/views/equipment/management/index.vue
index 656e162..26930d9 100644
--- a/src/views/equipment/management/index.vue
+++ b/src/views/equipment/management/index.vue
@@ -49,18 +49,33 @@
           type="danger"
           v-show="activeTab === 'management'"
           @click="handleDelete"
-          >鍒犻櫎</el-button
+          :disabled="selectedCount === 0"
+          >鍒犻櫎 {{ selectedCount > 0 ? `(${selectedCount})` : '' }}</el-button
         >
       </el-row>
        <!-- 琛ㄦ牸缁勪欢 -->
-      <div>
+      <div class="table-container">
+        <!-- 鍔犺浇鐘舵�� -->
+        <el-skeleton v-if="loading" animated>
+          <template #template>
+            <el-skeleton-item variant="h1" style="width: 40%" />
+            <div style="padding: 14px;">
+              <el-skeleton-item variant="text" />
+              <el-skeleton-item variant="text" />
+              <el-skeleton-item variant="text" />
+            </div>
+          </template>
+        </el-skeleton>
+        
+        <!-- 鏁版嵁琛ㄦ牸 -->
         <data-table
+          v-else
           :showOverflowTooltip="false"
           :border="true"
           :columns="columns"
           :loading="loading"
           style="width: 100%; height: calc(100vh - 29em)"
-          :show-selection="true"
+          :show-selection="activeTab === 'management'"
           :table-data="tableData"
           @edit="handleEdit"
           @viewRow="handleView"
@@ -70,12 +85,27 @@
           :operationsWidth="getOperationsWidth()"
           :customButtons="getCustomButtons()"
         >
+          <!-- 绌虹姸鎬佹彃妲� -->
+          <template #empty>
+            <el-empty 
+              :description="`鏆傛棤${currentTabConfig?.label || ''}鏁版嵁`"
+              :image-size="120"
+            >
+              <template #description>
+                <p>鏆傛棤{{ currentTabConfig?.label || '' }}鏁版嵁</p>
+                <p v-if="queryParams.searchAll" class="text-secondary">
+                  灏濊瘯璋冩暣鎼滅储鏉′欢鎴� 
+                  <el-button type="primary" link @click="resetQuery">娓呯┖鎼滅储</el-button>
+                </p>
+              </template>
+            </el-empty>
+          </template>
         </data-table>
       </div>
       <pagination
         v-if="total > 0"
         :layout="'total, prev, pager, next, jumper'"
-        :limit="pageSizes"
+        :limit="pageSize"
         :page="pageNum"
         :total="total"
         @pagination="handPagination"
@@ -119,7 +149,7 @@
 </template>
 
 <script setup>
-import { computed, onMounted, reactive, ref, nextTick } from "vue";
+import { computed, onMounted, reactive, ref, nextTick, toRefs } from "vue";
 import { ElMessage } from "element-plus";
 import { Delete, Plus } from "@element-plus/icons-vue";
 
@@ -138,6 +168,33 @@
 } from "@/api/equipment/management/index.js";
 import { getUsageRecordList, getUsageDetailList } from "@/api/equipment/requisition/index.js";
 
+// 璁惧鐘舵�佹灇涓�
+const EQUIPMENT_STATUS = {
+  USING: 1,           // 浣跨敤涓�
+  PARTIAL_RETURN: 2,  // 閮ㄥ垎褰掕繕
+  RETURNED: 3         // 宸插綊杩�
+};
+
+// 鑾峰彇鐘舵�佹枃鏈�
+const getStatusText = (status) => {
+  switch(status) {
+    case EQUIPMENT_STATUS.USING: return "浣跨敤涓�";
+    case EQUIPMENT_STATUS.PARTIAL_RETURN: return "閮ㄥ垎褰掕繕";
+    case EQUIPMENT_STATUS.RETURNED: return "宸插綊杩�";
+    default: return "鏈煡鐘舵��";
+  }
+};
+
+// 鑾峰彇鐘舵�侀鑹�
+const getStatusColor = (status) => {
+  switch(status) {
+    case EQUIPMENT_STATUS.USING: return '#409eff';        // 钃濊壊
+    case EQUIPMENT_STATUS.PARTIAL_RETURN: return '#e6a23c'; // 姗欒壊
+    case EQUIPMENT_STATUS.RETURNED: return '#67c23a';     // 缁胯壊
+    default: return '#909399';                             // 鐏拌壊
+  }
+};
+
 // 鍝嶅簲寮忕姸鎬佺鐞� - 浣跨敤瑙f瀯鍜岄粯璁ゅ��
 const initFormState = () => ({ consumables: false });
 
@@ -150,25 +207,10 @@
   activeTab: "management",
   selectedRows: [],
   tableData: [],
-  // 寮圭獥鐘舵��
-  dialogs: {
-    management: false,
-    equipmentRequisition: false,
-    usageRecord: false,
-    detailTable: false,
-  },
-  // 璇︽儏琛ㄦ牸鐘舵��
-  detailTable: {
-    data: [],
-    columns: [],
-    title: "",
-  },
   // 鍒嗛〉鐘舵��
-  pagination: {
-    pageNum: 1,
-    pageSize: 10,
-    total: 0,
-  },
+  pageNum: 1,
+  pageSize: 10,
+  total: 0,
   // 鏌ヨ鍙傛暟
   queryParams: {
     searchAll: "",
@@ -185,11 +227,20 @@
   activeTab,
   selectedRows,
   tableData,
-  dialogs,
-  detailTable,
-  pagination,
+  pageNum,
+  pageSize,
+  total,
   queryParams,
 } = toRefs(state);
+
+// 娣诲姞缂哄け鐨勫搷搴斿紡鍙橀噺
+const manaDialog = ref(false);
+const equipmentRequisitionDialog = ref(false);
+const usageRecordDialog = ref(false);
+const dialogTableVisible = ref(false);
+const dialogTableTitle = ref('');
+const dialogTableData = ref([]);
+const dialogTableColumns = ref([]);
 
 // 鏍囩椤甸厤缃� - 渚夸簬鍚庣画鎵╁睍
 const tabsConfig = {
@@ -229,37 +280,14 @@
         prop: "equipmentStatus",
         label: "浣跨敤鐘舵��",
         minWidth: 100,
-        formatter: (row) => (row.equipmentStatus == 1 ? "浣跨敤涓�" : "宸插綊杩�"),
+        formatter: (row) => getStatusText(row.equipmentStatus),
+        cellStyle: (row) => ({ color: getStatusColor(row.equipmentStatus) }),
       },
-      
       { prop: "usageStartTime", label: "浣跨敤寮�濮嬫椂闂�", minWidth: 100 },
       { prop: "usageEndTime", label: "浣跨敤缁撴潫鏃堕棿", minWidth: 100 },
       { prop: "remarks", label: "澶囨敞", minWidth: 100 },
     ],
   },
-  // usageRecord:{
-  //   label: "棰嗙敤璁板綍",
-  //   searchPlaceholder: "璁惧缂栧彿/璁惧鍚嶇О/瑙勬牸鍨嬪彿",
-  //   showSearch: true,
-  //   api: getManagementList,
-  //   deleteApi: delEquipment,
-  //   columns: [
-  //     { prop: "equipmentId", label: "璁惧缂栧彿", minWidth: 100 },
-  //     { prop: "equipmentName", label: "璁惧鍚嶇О", minWidth: 100 },
-  //     { prop: "quantity", label: "鏁伴噺", minWidth: 100 },
-  //     { prop: "specification", label: "瑙勬牸鍨嬪彿", minWidth: 100 },
-  //     {
-  //       prop: "usageStatus",
-  //       label: "浣跨敤鐘舵��",
-  //       minWidth: 100,
-  //       formatter: (row) => row.usageStatus == 1 ? "鍚敤" : "绂佺敤"
-  //     },
-  //     { prop: "purchaseDate", label: "閲囪喘鏃ユ湡", minWidth: 100 },
-  //     { prop: "purchasePrice", label: "閲囪喘浠锋牸", minWidth: 100 },
-  //   ]
-  // },
-
-  // 鍚庣画鍙互鍦ㄨ繖閲屾坊鍔犳柊鐨勬爣绛鹃〉閰嶇疆
 };
 
 // 鏍囩椤垫暟鎹�
@@ -311,8 +339,8 @@
       type: 'success',
       size: 'small',
       link: true,
-      show: (row) => row.equipmentStatus == 1 || row.equipmentStatus == 2, // 鍙湁浣跨敤涓殑璁惧鎵嶆樉绀哄綊杩樻寜閽�
-      disabled: (row) => false,
+      show: (row) => row.equipmentStatus === EQUIPMENT_STATUS.USING || row.equipmentStatus === EQUIPMENT_STATUS.PARTIAL_RETURN,
+      disabled: (row) => row.equipmentStatus === EQUIPMENT_STATUS.RETURNED,
     });
   }
   
@@ -331,9 +359,20 @@
   }
 };
 const handleReturn = (row) => {
+  // 妫�鏌ヨ澶囩姸鎬�
+  if (row.equipmentStatus === EQUIPMENT_STATUS.RETURNED) {
+    ElMessage.warning('璇ヨ澶囧凡褰掕繕瀹屾垚锛屾棤闇�鍐嶆褰掕繕');
+    return;
+  }
+  
+  if (row.equipmentStatus !== EQUIPMENT_STATUS.USING && row.equipmentStatus !== EQUIPMENT_STATUS.PARTIAL_RETURN) {
+    ElMessage.warning('璇ヨ澶囧綋鍓嶇姸鎬佷笉鏀寔褰掕繕鎿嶄綔');
+    return;
+  }
+  
   form.value = { ...row };
   addOrEdit.value = "return"; // 璁剧疆涓哄綊杩樻ā寮�
-  title.value = `褰掕繕璁惧`;
+  title.value = `褰掕繕璁惧 - ${row.equipmentName || ''}`;
   copyForm.value = { ...row };
   equipmentRequisitionDialog.value = true;
   console.log("褰掕繕璁惧锛�", row);
@@ -353,13 +392,13 @@
   loading.value = true;
   tableData.value = [];
   pageNum.value = 1;
-  pageSizes.value = 10;
+  pageSize.value = 10;
   total.value = 0;
-  queryParams.searchAll = "";
+  queryParams.value.searchAll = "";
 };
 
 const resetQuery = () => {
-  queryParams.searchAll = "";
+  queryParams.value.searchAll = "";
   pageNum.value = 1;
   getList();
 };
@@ -476,7 +515,7 @@
 
 const handPagination = (val) => {
   pageNum.value = val.page;
-  pageSizes.value = val.limit;
+  pageSize.value = val.limit;
   getList();
 };
 
@@ -489,8 +528,8 @@
   deleteApi: () => currentTabConfig.value.deleteApi,
   selectedRows: selectedRows,
   getList: () => getList(),
-  tableData: tableData,
-  total: total,
+  tableData,
+  total,
   confirmText: "纭鍒犻櫎閫変腑鐨勬暟鎹悧锛�",
   successText: "鍒犻櫎鎴愬姛",
 });
@@ -508,10 +547,14 @@
 
 // 璁惧棰嗙敤寮圭獥鎻愪氦澶勭悊
 const onEquipmentRequisitionSubmit = (formData) => {
-  if (formData.equipmentStatus == 2) {
-    ElMessage.success("璁惧褰掕繕鎴愬姛");
-  } else {
+  if (formData.equipmentStatus === EQUIPMENT_STATUS.RETURNED) {
+    ElMessage.success("璁惧宸插畬鍏ㄥ綊杩�");
+  } else if (formData.equipmentStatus === EQUIPMENT_STATUS.PARTIAL_RETURN) {
+    ElMessage.success("璁惧閮ㄥ垎褰掕繕鎴愬姛");
+  } else if (formData.equipmentStatus === EQUIPMENT_STATUS.USING) {
     ElMessage.success("璁惧棰嗙敤鎴愬姛");
+  } else {
+    ElMessage.success("鎿嶄綔鎴愬姛");
   }
   equipmentRequisitionDialog.value = false;
   nextTick(() => {
@@ -526,8 +569,8 @@
     loading.value = true;
     const apiParams = {
       current: pageNum.value,
-      pageSize: pageSizes.value,
-      searchAll: queryParams.searchAll,
+      pageSize: pageSize.value,
+      searchAll: queryParams.value.searchAll,
     };
 
     const { data, code } = await currentTabConfig.value.api(apiParams);
@@ -603,4 +646,33 @@
 .main-container {
   background: red !important;
 }
+
+/* 璁惧鐘舵�佹牱寮� */
+.status-using {
+  color: #409eff;
+  font-weight: 500;
+}
+
+.status-partial-return {
+  color: #e6a23c;
+  font-weight: 500;
+}
+
+.status-returned {
+  color: #67c23a;
+  font-weight: 500;
+}
+
+.status-unknown {
+  color: #909399;
+  font-weight: 500;
+}
+
+/* 鐘舵�佹爣绛炬牱寮� */
+:deep(.el-table .cell .status-tag) {
+  font-size: 12px;
+  padding: 2px 6px;
+  border-radius: 4px;
+  white-space: nowrap;
+}
 </style>

--
Gitblit v1.9.3