From 2b8c32366a2916dfbeac269eea94b2e6ef65f556 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期二, 20 一月 2026 14:40:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New

---
 src/views/qualityManagement/metricMaintenance/index.vue |  171 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 160 insertions(+), 11 deletions(-)

diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
index 4f62bca..44d3fae 100644
--- a/src/views/qualityManagement/metricMaintenance/index.vue
+++ b/src/views/qualityManagement/metricMaintenance/index.vue
@@ -6,6 +6,8 @@
         <div class="toolbar-left"></div>
         <div class="toolbar-right">
           <el-button type="primary" @click="openStandardDialog('add')">鏂板</el-button>
+          <el-button type="success" plain @click="handleBatchAudit(1)">鎵瑰噯</el-button>
+          <el-button type="warning" plain @click="handleBatchAudit(2)">鎾ら攢</el-button>
           <el-button type="danger" plain @click="handleBatchDelete">鍒犻櫎</el-button>
         </div>
       </div>
@@ -16,6 +18,8 @@
         :page="page"
         :isSelection="true"
         :tableLoading="tableLoading"
+        :rowClassName="rowClassNameCenter"
+        :rowClick="handleTableRowClick"
         @selection-change="handleSelectionChange"
         @pagination="handlePagination"
         :total="page.total"
@@ -92,10 +96,10 @@
       </div>
 
       <div class="right-toolbar">
-        <el-button type="primary" :disabled="!currentStandard" @click="openParamDialog('add')">
+        <el-button type="primary" :disabled="!currentStandard || isStandardReadonly" @click="openParamDialog('add')">
           鏂板
         </el-button>
-        <el-button type="danger" plain :disabled="!currentStandard" @click="handleParamBatchDelete">
+        <el-button type="danger" plain :disabled="!currentStandard || isStandardReadonly" @click="handleParamBatchDelete">
           鍒犻櫎
         </el-button>
       </div>
@@ -104,6 +108,8 @@
         v-loading="detailLoading"
         :data="detailTableData"
         border
+        :row-class-name="() => 'row-center'"
+        class="center-table"
         style="width: 100%"
         height="calc(100vh - 220px)"
         @selection-change="handleParamSelectionChange"
@@ -117,10 +123,10 @@
         <el-table-column prop="defaultValue" label="榛樿鍊�" min-width="120" />
         <el-table-column label="鎿嶄綔" width="140" fixed="right" align="center">
           <template #default="{ row }">
-            <el-button link type="primary" size="small" @click="openParamDialog('edit', row)">
+            <el-button link type="primary" size="small" :disabled="isStandardReadonly" @click="openParamDialog('edit', row)">
               缂栬緫
             </el-button>
-            <el-button link type="danger" size="small" @click="handleParamDelete(row)">
+            <el-button link type="danger" size="small" :disabled="isStandardReadonly" @click="handleParamDelete(row)">
               鍒犻櫎
             </el-button>
           </template>
@@ -155,7 +161,7 @@
 
 <script setup>
 import { Search } from '@element-plus/icons-vue'
-import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue'
+import { ref, reactive, toRefs, onMounted, getCurrentInstance, computed } from 'vue'
 import { ElMessageBox } from 'element-plus'
 import {
   qualityTestStandardListPage,
@@ -163,6 +169,7 @@
   qualityTestStandardUpdate,
   qualityTestStandardDel,
   qualityTestStandardCopyParam,
+  qualityTestStandardAudit,
   qualityTestStandardParamList,
   qualityTestStandardParamAdd,
   qualityTestStandardParamUpdate,
@@ -173,6 +180,15 @@
 import ParamFormDialog from './ParamFormDialog.vue'
 
 const { proxy } = getCurrentInstance()
+
+// 宸︿晶鏍囧噯鍒楄〃锛氭暣琛屽唴瀹瑰眳涓紙閰嶅悎鏍峰紡锛�
+const rowClassNameCenter = () => 'row-center'
+
+// 鏍囧噯鐘舵�佷负鈥滈�氳繃(1)鈥濇椂锛屽彸渚у弬鏁扮姝㈠鍒犳敼
+const isStandardReadonly = computed(() => {
+  const state = currentStandard.value?.state
+  return state === 1 || state === '1'
+})
 
 // 鎼滅储鏉′欢
 const data = reactive({
@@ -197,7 +213,7 @@
     standardNo: [{ required: true, message: '璇疯緭鍏ユ爣鍑嗙紪鍙�', trigger: 'blur' }],
     standardName: [{ required: true, message: '璇疯緭鍏ユ爣鍑嗗悕绉�', trigger: 'blur' }],
     inspectType: [{ required: true, message: '璇烽�夋嫨妫�娴嬬被鍨�', trigger: 'change' }],
-    processId: [{ required: true, message: '璇烽�夋嫨宸ュ簭', trigger: 'change' }]
+    processId: [{ required: false, message: '璇烽�夋嫨宸ュ簭', trigger: 'change' }]
   }
 })
 
@@ -262,18 +278,21 @@
     dataType: 'slot',
     slot: 'standardNoCell',
     minWidth: 160,
+    align: 'center',
     headerSlot: 'standardNoHeader'
   },
   {
     label: '鏍囧噯鍚嶇О',
     prop: 'standardName',
     minWidth: 180,
+    align: 'center',
     headerSlot: 'standardNameHeader'
   },
   {
     label: '绫诲埆',
     prop: 'inspectType',
     headerSlot: 'inspectTypeHeader',
+    align: 'center',
     dataType: 'tag',
     formatData: (val) => {
       const map = {
@@ -286,12 +305,21 @@
   },
   {
     label: '宸ュ簭',
-    prop: 'processId'
+    prop: 'processId',
+    align: 'center',
+    dataType: 'tag',
+    formatData: (val) => {
+      const target = processOptions.value.find(
+        (item) => String(item.value) === String(val)
+      )
+      return target?.label || val
+    }
   },
   {
     label: '鐘舵��',
     prop: 'state',
     headerSlot: 'stateHeader',
+    align: 'center',
     dataType: 'tag',
     formatData: (val) => {
       const map = {
@@ -310,7 +338,8 @@
   {
     label: '澶囨敞',
     prop: 'remark',
-    minWidth: 160
+    minWidth: 160,
+    align: 'center'
   },
   {
     dataType: 'action',
@@ -399,7 +428,39 @@
   selectedRows.value = selection
 }
 
-// 宸︿晶琛岀偣鍑伙紝鍔犺浇鍙充晶鍙傛暟
+// 鎵归噺瀹℃牳锛氱姸鎬� 1=鎵瑰噯锛�2=鎾ら攢
+const handleBatchAudit = async (state) => {
+  if (!selectedRows.value.length) {
+    proxy.$message.warning('璇烽�夋嫨鏁版嵁')
+    return
+  }
+  const text = state === 1 ? '鎵瑰噯' : '鎾ら攢'
+  const payload = selectedRows.value
+    .filter(i => i?.id)
+    .map((item) => ({ id: item.id, state }))
+
+  if (!payload.length) {
+    proxy.$message.warning('璇烽�夋嫨鏈夋晥鏁版嵁')
+    return
+  }
+
+  try {
+    await ElMessageBox.confirm(`纭${text}閫変腑鐨勬爣鍑嗭紵`, '鎻愮ず', { type: 'warning' })
+  } catch {
+    return
+  }
+  await qualityTestStandardAudit(payload)
+  proxy.$message.success(`${text}鎴愬姛`)
+  getStandardList()
+}
+
+// 琛ㄦ牸琛岀偣鍑伙紝鍔犺浇鍙充晶鍙傛暟
+const handleTableRowClick = (row) => {
+  currentStandard.value = row
+  loadDetail(row.id)
+}
+
+// 宸︿晶琛岀偣鍑伙紝鍔犺浇鍙充晶鍙傛暟锛堜繚鐣欑敤浜庢爣鍑嗙紪鍙峰垪鐨勭偣鍑伙級
 const handleStandardRowClick = (row) => {
   currentStandard.value = row
   loadDetail(row.id)
@@ -425,6 +486,10 @@
 
 const openParamDialog = (type, row) => {
   if (!currentStandard.value?.id) return
+  if (isStandardReadonly.value) {
+    proxy.$message.warning('璇ユ爣鍑嗗凡閫氳繃锛屽弬鏁颁笉鍙紪杈�')
+    return
+  }
   paramOperationType.value = type
   if (type === 'add') {
     Object.assign(paramForm, {
@@ -449,6 +514,10 @@
 const submitParamForm = async () => {
   const testStandardId = currentStandard.value?.id
   if (!testStandardId) return
+  if (isStandardReadonly.value) {
+    proxy.$message.warning('璇ユ爣鍑嗗凡閫氳繃锛屽弬鏁颁笉鍙紪杈�')
+    return
+  }
   const payload = { ...paramForm, testStandardId }
   if (paramOperationType.value === 'edit') {
     await qualityTestStandardParamUpdate(payload)
@@ -463,6 +532,10 @@
 
 const handleParamDelete = async (row) => {
   if (!row?.id) return
+  if (isStandardReadonly.value) {
+    proxy.$message.warning('璇ユ爣鍑嗗凡閫氳繃锛屽弬鏁颁笉鍙紪杈�')
+    return
+  }
   try {
     await ElMessageBox.confirm('纭鍒犻櫎璇ュ弬鏁帮紵', '鎻愮ず', { type: 'warning' })
   } catch {
@@ -474,6 +547,10 @@
 }
 
 const handleParamBatchDelete = async () => {
+  if (isStandardReadonly.value) {
+    proxy.$message.warning('璇ユ爣鍑嗗凡閫氳繃锛屽弬鏁颁笉鍙紪杈�')
+    return
+  }
   if (!paramSelectedRows.value.length) {
     proxy.$message.warning('璇烽�夋嫨鏁版嵁')
     return
@@ -503,14 +580,23 @@
       processId: ''
     })
   } else if (type === 'edit' && row) {
-    Object.assign(standardForm.value, row)
+    Object.assign(standardForm.value, {
+      ...row,
+      // 纭繚 inspectType 鍜� state 杞崲涓哄瓧绗︿覆锛屼互鍖归厤 el-select 鐨� value 绫诲瀷
+      inspectType: row.inspectType !== null && row.inspectType !== undefined ? String(row.inspectType) : '',
+      state: row.state !== null && row.state !== undefined ? String(row.state) : '0',
+      // 纭繚 processId 杞崲涓哄瓧绗︿覆鎴栨暟瀛楋紙鏍规嵁瀹為檯闇�瑕侊級
+      processId: row.processId !== null && row.processId !== undefined ? row.processId : ''
+    })
   } else if (type === 'copy' && row) {
     const { id, ...rest } = row
     Object.assign(standardForm.value, {
       ...rest,
       id: undefined,
       standardNo: '',
-      state: '0'
+      state: '0',
+      // 纭繚 inspectType 杞崲涓哄瓧绗︿覆
+      inspectType: rest.inspectType !== null && rest.inspectType !== undefined ? String(rest.inspectType) : ''
     })
   }
   standardDialogVisible.value = true
@@ -609,14 +695,41 @@
 .metric-maintenance {
   display: flex;
   gap: 16px;
+  min-width: 0; /* 鍏佽 flex 瀛愬厓绱犳敹缂� */
 }
 
 .left-panel,
 .right-panel {
   flex: 1;
+  min-width: 0; /* 鍏佽 flex 瀛愬厓绱犳敹缂� */
   background: #ffffff;
   padding: 16px;
   box-sizing: border-box;
+  overflow: hidden; /* 闃叉鍐呭婧㈠嚭 */
+}
+
+/* 浣庡垎杈ㄧ巼閫傞厤 */
+@media (max-width: 1400px) {
+  .metric-maintenance {
+    flex-direction: column;
+  }
+  
+  .left-panel,
+  .right-panel {
+    width: 100%;
+    min-width: 0;
+  }
+}
+
+@media (max-width: 768px) {
+  .metric-maintenance {
+    gap: 12px;
+  }
+  
+  .left-panel,
+  .right-panel {
+    padding: 12px;
+  }
 }
 
 .toolbar {
@@ -624,6 +737,8 @@
   justify-content: space-between;
   align-items: center;
   margin-bottom: 12px;
+  flex-wrap: wrap;
+  gap: 8px;
 }
 
 .toolbar-left {
@@ -635,6 +750,9 @@
 
 .toolbar-right {
   flex-shrink: 0;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
 }
 
 .search-label {
@@ -682,4 +800,35 @@
 .clickable-link:hover {
   text-decoration: underline;
 }
+
+:deep(.row-center td) {
+  text-align: center !important;
+}
+
+/* el-table 琛ㄥご/鍐呭缁熶竴灞呬腑锛坮ow-class-name 涓嶄綔鐢ㄤ簬琛ㄥご锛� */
+:deep(.center-table .el-table__header-wrapper th .cell) {
+  text-align: center !important;
+}
+:deep(.center-table .el-table__body-wrapper td .cell) {
+  text-align: center !important;
+}
+
+/* PIMTable 琛ㄥご灞呬腑 */
+:deep(.lims-table .pim-table-header-cell) {
+  text-align: center;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+:deep(.lims-table .pim-table-header-title) {
+  text-align: center;
+  width: 100%;
+}
+
+:deep(.lims-table .pim-table-header-extra) {
+  width: 100%;
+  margin-top: 4px;
+}
 </style>
\ No newline at end of file

--
Gitblit v1.9.3