From 9e2801168d0caf2691b1189697d76dce86d78ebf Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期一, 18 五月 2026 17:16:38 +0800
Subject: [PATCH] 保养项目改成保养内容

---
 src/views/equipmentManagement/upkeep/index.vue |  211 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 189 insertions(+), 22 deletions(-)

diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index 44f4af7..d9b5a32 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -1,8 +1,8 @@
 <template>
   <div class="app-container">
     <el-tabs v-model="activeTab" @tab-change="handleTabChange">
-      <!-- 瀹氭椂浠诲姟绠$悊tab -->
-      <el-tab-pane label="瀹氭椂浠诲姟绠$悊" name="scheduled">
+      <!-- 淇濆吇浠诲姟绠$悊tab -->
+      <el-tab-pane label="淇濆吇浠诲姟绠$悊" name="scheduled">
         <div class="search_form">
           <el-form :model="scheduledFilters" :inline="true">
             <el-form-item label="浠诲姟鍚嶇О">
@@ -16,9 +16,9 @@
               />
             </el-form-item>
             <el-form-item label="浠诲姟鐘舵��">
-              <el-select v-model="scheduledFilters.status" placeholder="璇烽�夋嫨浠诲姟鐘舵��" clearable style="width: 200px">
-                <el-option label="鍚敤" value="1" />
-                <el-option label="鍋滅敤" value="0" />
+              <el-select v-model="scheduledFilters.isActive" placeholder="璇烽�夋嫨浠诲姟鐘舵��" clearable style="width: 200px">
+                <el-option label="鍚敤" :value="1" />
+                <el-option label="鍋滅敤" :value="0" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -29,7 +29,7 @@
         </div>
         <div class="table_list">
           <div class="actions">
-            <el-text class="mx-1" size="large">瀹氭椂浠诲姟绠$悊</el-text>
+            <el-text class="mx-1" size="large">淇濆吇浠诲姟绠$悊</el-text>
             <div>
               <el-button type="primary" icon="Plus" @click="addScheduledTask">
                 鏂板浠诲姟
@@ -58,8 +58,8 @@
             @pagination="changeScheduledPage"
           >
             <template #statusRef="{ row }">
-              <el-tag v-if="row.status === 1" type="success">鍚敤</el-tag>
-              <el-tag v-if="row.status === 0" type="danger">鍋滅敤</el-tag>
+              <el-tag v-if="row.isActive === 1" type="success">鍚敤</el-tag>
+              <el-tag v-if="row.isActive === 0" type="danger">鍋滅敤</el-tag>
             </template>
             <template #operation="{ row }">
               <el-button
@@ -82,7 +82,7 @@
       </el-tab-pane>
 
       <!-- 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛� -->
-      <el-tab-pane label="浠诲姟璁板綍" name="record">
+      <el-tab-pane label="淇濆吇浠诲姟璁板綍" name="record">
         <div class="search_form">
           <el-form :model="filters" :inline="true">
             <el-form-item label="璁惧鍚嶇О">
@@ -131,7 +131,7 @@
         </div>
         <div class="table_list">
           <div class="actions">
-            <el-text class="mx-1" size="large">浠诲姟璁板綍</el-text>
+            <el-text class="mx-1" size="large">淇濆吇浠诲姟璁板綍</el-text>
             <div>
               <el-button type="success" icon="Van" @click="addPlan">
                 鏂板璁″垝
@@ -162,15 +162,19 @@
         @selection-change="handleSelectionChange"
         @pagination="changePage"
       >
-        <template #maintenanceResultRef="{ row }">
-          <div>{{ row.maintenanceResult || '-' }}</div>
-        </template>
         <template #statusRef="{ row }">
           <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
           <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
           <el-tag v-if="row.status === 0" type="warning">寰呬繚鍏�</el-tag>
         </template>
         <template #operation="{ row }">
+          <el-button
+            type="primary"
+            link
+            @click="openDetail(row)"
+          >
+            璇︽儏
+          </el-button>
           <el-button
             type="primary"
             link
@@ -195,6 +199,13 @@
           >
             鍒犻櫎
           </el-button>
+          <el-button
+            type="primary"
+            link
+            @click="openFileDialog(row)"
+          >
+            闄勪欢
+          </el-button>
         </template>
       </PIMTable>
         </div>
@@ -203,6 +214,20 @@
     <PlanModal ref="planModalRef" @ok="getTableData" />
         <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
         <FormDia ref="formDiaRef" @closeDia="getScheduledTableData" />
+    <UpkeepDetailModal ref="upkeepDetailModalRef" :java-api="javaApi" />
+    <FileListDialog
+      ref="fileListDialogRef"
+      v-model="fileDialogVisible"
+      :title="currentRecordFinished ? '闄勪欢锛堝凡瀹岀粨锛屼粎鍙煡鐪嬶級' : '闄勪欢'"
+      :show-upload-button="!currentRecordFinished"
+      :show-delete-button="!currentRecordFinished"
+      :delete-method="handleAttachmentDelete"
+      :name-column-label="'闄勪欢鍚嶇О'"
+      :upload-url="maintenanceFileUploadUrl"
+      :upload-data="maintenanceFileUploadData"
+      :upload-direct-save="true"
+      @upload="refreshFileList"
+    />
   </div>
 </template>
 
@@ -212,13 +237,19 @@
 import { ElMessage, ElMessageBox } from 'element-plus'
 import PlanModal from './Form/PlanModal.vue'
 import MaintenanceModal from './Form/MaintenanceModal.vue'
+import UpkeepDetailModal from './Form/UpkeepDetailModal.vue'
 import FormDia from './Form/formDia.vue'
+import FileListDialog from '@/components/Dialog/FileListDialog.vue'
 import {
   getUpkeepPage,
   delUpkeep,
   deviceMaintenanceTaskList,
   deviceMaintenanceTaskDel,
 } from '@/api/equipmentManagement/upkeep'
+import {
+  listMaintenanceTaskFiles,
+  delMaintenanceTaskFile,
+} from '@/api/equipmentManagement/maintenanceTaskFile'
 import dayjs from 'dayjs'
 
 const { proxy } = getCurrentInstance()
@@ -230,8 +261,40 @@
 const planModalRef = ref()
 // 淇濆吇寮圭獥鎺у埗鍣�
 const maintainModalRef = ref()
+const upkeepDetailModalRef = ref()
 // 瀹氭椂浠诲姟寮圭獥鎺у埗鍣�
 const formDiaRef = ref()
+// 闄勪欢寮圭獥
+const fileListDialogRef = ref(null)
+const fileDialogVisible = ref(false)
+const currentMaintenanceTaskId = ref(null)
+/** 褰撳墠闄勪欢鎵�灞炶褰曟槸鍚﹀凡瀹岀粨锛坰tatus=1锛� */
+const currentRecordFinished = ref(false)
+
+const javaApi = import.meta.env.VITE_APP_BASE_API
+const maintenanceFileUploadUrl = `${javaApi}/maintenanceTaskFile/upload`
+const maintenanceFileUploadData = computed(() => ({
+  deviceMaintenanceId: currentMaintenanceTaskId.value,
+}))
+
+const normalizeMaintenanceFileUrl = (rawUrl = "") => {
+  let fileUrl = rawUrl || ""
+  if (!fileUrl) return ""
+  if (fileUrl.startsWith("http://") || fileUrl.startsWith("https://")) return fileUrl
+  if (fileUrl.indexOf("\\") > -1) {
+    const lowerPath = fileUrl.toLowerCase()
+    const uploadPathIndex = lowerPath.indexOf("uploadpath")
+    if (uploadPathIndex > -1) {
+      fileUrl = fileUrl.substring(uploadPathIndex).replace(/\\/g, "/")
+    } else {
+      fileUrl = fileUrl.replace(/\\/g, "/")
+    }
+  }
+  fileUrl = fileUrl.replace(/^\/?uploadPath/i, "/profile")
+  if (!fileUrl.startsWith("/")) fileUrl = "/" + fileUrl
+  if (!fileUrl.startsWith(javaApi)) fileUrl = javaApi + fileUrl
+  return fileUrl
+}
 
 // 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛夌浉鍏冲彉閲�
 const filters = reactive({
@@ -249,10 +312,10 @@
 })
 const multipleList = ref([])
 
-// 瀹氭椂浠诲姟绠$悊tab鐩稿叧鍙橀噺
+// 淇濆吇浠诲姟绠$悊tab鐩稿叧鍙橀噺
 const scheduledFilters = reactive({
   taskName: '',
-  status: '',
+  isActive: '',
 })
 
 const scheduledDataList = ref([])
@@ -263,7 +326,7 @@
 })
 const scheduledMultipleList = ref([])
 
-// 瀹氭椂浠诲姟绠$悊琛ㄦ牸鍒楅厤缃�
+// 淇濆吇浠诲姟绠$悊琛ㄦ牸鍒楅厤缃�
 const scheduledColumns = ref([
 	{ prop: "taskName", label: "璁惧鍚嶇О"},
 	{
@@ -304,7 +367,28 @@
 		}
 	},
 	{ prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
+	{ prop: "maintenancePerson", label: "淇濆吇浜�", minWidth: 100 },
+	{
+		prop: "maintenanceLocation",
+		label: "淇濆吇閮ㄤ綅",
+		minWidth: 150,
+		showOverflowTooltip: true,
+	},
+	{
+		prop: "maintenanceItems",
+		label: "淇濆吇鍐呭",
+		minWidth: 180,
+		showOverflowTooltip: true,
+	},
 	{ prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 },
+	{
+		label: "浠诲姟鐘舵��",
+		prop: "isActive",
+		minWidth: 100,
+		dataType: "slot",
+		slot: "statusRef",
+		align: "center",
+	},
 	{
 		fixed: "right",
 		label: "鎿嶄綔",
@@ -326,6 +410,25 @@
 		label: "瑙勬牸鍨嬪彿",
 		align: "center",
 		prop: "deviceModel",
+	},
+	{
+		label: "淇濆吇閮ㄤ綅",
+		align: "center",
+		prop: "maintenanceLocation",
+		minWidth: 150,
+		showOverflowTooltip: true,
+	},
+	{
+		label: "淇濆吇鍐呭",
+		align: "center",
+		prop: "maintenanceItems",
+		minWidth: 150,
+		showOverflowTooltip: true,
+	},
+	{
+		label: "淇濆吇浜�",
+		align: "center",
+		prop: "maintenancePerson",
 	},
 	{
 		label: "璁″垝淇濆吇鏃ユ湡",
@@ -361,8 +464,8 @@
 		label: "淇濆吇缁撴灉",
 		align: "center",
 		prop: "maintenanceResult",
-		dataType: "slot",
-		slot: "maintenanceResultRef",
+		minWidth: 200,
+		showOverflowTooltip: true,
 	},
 	{
 		label: "鐘舵��",
@@ -377,7 +480,7 @@
 		dataType: "slot",
 		slot: "operation",
 		align: "center",
-		width: "200px",
+    width: "400px",
 	},
 ])
 
@@ -390,14 +493,14 @@
   }
 }
 
-// 瀹氭椂浠诲姟绠$悊鐩稿叧鏂规硶
+// 淇濆吇浠诲姟绠$悊鐩稿叧鏂规硶
 const getScheduledTableData = async () => {
   try {
     const params = {
       current: scheduledPagination.currentPage,
       size: scheduledPagination.pageSize,
       taskName: scheduledFilters.taskName || undefined,
-      status: scheduledFilters.status || undefined,
+      isActive: scheduledFilters.isActive !== '' ? scheduledFilters.isActive : undefined,
     }
     const { code, data } = await deviceMaintenanceTaskList(params)
     if (code === 200) {
@@ -411,7 +514,7 @@
 
 const resetScheduledFilters = () => {
   scheduledFilters.taskName = ''
-  scheduledFilters.status = ''
+  scheduledFilters.isActive = ''
   getScheduledTableData()
 }
 
@@ -563,6 +666,70 @@
   getTableData()
 }
 
+// 闄勪欢鐩稿叧鏂规硶
+// 鏌ヨ闄勪欢鍒楄〃
+const fetchMaintenanceTaskFiles = async (deviceMaintenanceId) => {
+  try {
+    const params = {
+      current: 1,
+      size: 100,
+      deviceMaintenanceId,
+    }
+    const res = await listMaintenanceTaskFiles(params)
+    const records = res?.data?.records || []
+    const mapped = records.map(item => ({
+      id: item.id,
+      name: item.fileName || item.name,
+      url: normalizeMaintenanceFileUrl(item.fileUrl || item.url),
+      raw: item,
+    }))
+    fileListDialogRef.value?.setList(mapped)
+  } catch (error) {
+    ElMessage.error('鑾峰彇闄勪欢鍒楄〃澶辫触')
+  }
+}
+
+const openDetail = (row) => {
+  upkeepDetailModalRef.value?.open(row)
+}
+
+// 鎵撳紑闄勪欢寮圭獥
+const openFileDialog = async (row) => {
+  currentMaintenanceTaskId.value = row.id
+  currentRecordFinished.value = row.status === 1
+  fileDialogVisible.value = true
+  await fetchMaintenanceTaskFiles(row.id)
+}
+
+// 鍒锋柊闄勪欢鍒楄〃
+const refreshFileList = async () => {
+  if (!currentMaintenanceTaskId.value) return
+  await fetchMaintenanceTaskFiles(currentMaintenanceTaskId.value)
+}
+
+// 鍒犻櫎闄勪欢锛堝凡瀹岀粨涓嶅彲鍒狅級
+const handleAttachmentDelete = async (row) => {
+  if (currentRecordFinished.value) {
+    ElMessage.warning('璇ヤ繚鍏诲凡瀹岀粨锛屼笉鍙垹闄ら檮浠�')
+    return false
+  }
+  if (!row?.id) return false
+  try {
+    await ElMessageBox.confirm('纭鍒犻櫎璇ラ檮浠讹紵', '鎻愮ず', { type: 'warning' })
+  } catch {
+    return false
+  }
+  try {
+    await delMaintenanceTaskFile(row.id)
+    ElMessage.success('鍒犻櫎鎴愬姛')
+    await refreshFileList()
+    return true
+  } catch (error) {
+    ElMessage.error('鍒犻櫎澶辫触')
+    return false
+  }
+}
+
 onMounted(() => {
   // 鏍规嵁榛樿婵�娲荤殑 Tab 璋冪敤瀵瑰簲鐨勬煡璇㈡帴鍙�
   if (activeTab.value === 'scheduled') {

--
Gitblit v1.9.3