From 3471290659516cf21db3211a9053daff5f283e03 Mon Sep 17 00:00:00 2001
From: zhuguifei <312353457@qq.com>
Date: 星期五, 20 三月 2026 15:50:18 +0800
Subject: [PATCH] feat: 基础数据仪器管理、判定依据、判定依据明细

---
 ruoyi-plus-soybean/src/views/qm/judge/index.vue |  323 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 323 insertions(+), 0 deletions(-)

diff --git a/ruoyi-plus-soybean/src/views/qm/judge/index.vue b/ruoyi-plus-soybean/src/views/qm/judge/index.vue
new file mode 100644
index 0000000..80ff821
--- /dev/null
+++ b/ruoyi-plus-soybean/src/views/qm/judge/index.vue
@@ -0,0 +1,323 @@
+<script setup lang="tsx">
+import { ref } from 'vue';
+import { NDivider, NTooltip } from 'naive-ui';
+import { fetchBatchDeleteJudge, fetchGetJudgeList } from '@/service/api/qm/judge';
+import { useAppStore } from '@/store/modules/app';
+import { useAuth } from '@/hooks/business/auth';
+import { useDownload } from '@/hooks/business/download';
+import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table';
+import { $t } from '@/locales';
+import ButtonIcon from '@/components/custom/button-icon.vue';
+import JudgeOperateDrawer from './modules/judge-operate-drawer.vue';
+import JudgeSearch from './modules/judge-search.vue';
+
+defineOptions({
+  name: 'JudgeList'
+});
+
+
+const appStore = useAppStore();
+const { download } = useDownload();
+const { hasAuth } = useAuth();
+
+const searchParams = ref<Api.Qm.JudgeSearchParams>({
+  pageNum: 1,
+  pageSize: 10,
+  matCode: null,
+  matName: null,
+  judgeName: null,
+  category: 0, // 榛樿閫夋嫨鎴愬搧
+  status: -1, // 榛樿閫夋嫨鍏ㄩ儴
+  params: {}
+});
+
+const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } =
+  useNaivePaginatedTable({
+  api: () => {
+    const params = { ...searchParams.value };
+    if (params.status === -1) {
+      delete params.status;
+    }
+    return fetchGetJudgeList(params);
+  },
+  transform: response => defaultTransform(response),
+  onPaginationParamsChange: params => {
+    searchParams.value.pageNum = params.page;
+    searchParams.value.pageSize = params.pageSize;
+  },
+  columns: () => [
+    {
+      type: 'selection',
+      align: 'center',
+      width: 48
+    },
+    {
+      key: 'index',
+      title: $t('common.index'),
+      align: 'center',
+      width: 64,
+      render: (_, index) => index + 1
+    },
+    {
+      key: 'judgeName',
+      title: '鍒ゅ畾鍚嶇О',
+      align: 'center',
+      width: 200,
+      render: row => (
+        <NTooltip trigger="hover">
+          {{
+            trigger: () => (
+              <div
+                style={{
+                  whiteSpace: 'nowrap',
+                  overflow: 'hidden',
+                  textOverflow: 'ellipsis'
+                }}
+              >
+                {row.judgeName}
+              </div>
+            ),
+            default: () => row.judgeName
+          }}
+        </NTooltip>
+      )
+    },
+    {
+      key: 'category',
+      title: '鐗╂枡绫诲瀷',
+      align: 'center',
+      width: 100,
+      render: row => {
+        if (row.category === 0) {
+          return '鎴愬搧';
+        }
+        if (row.category === 1) {
+          return '杈呮枡';
+        }
+        return String(row.category);
+      }
+    },
+    {
+      key: 'typeName',
+      title: '杈呮枡绫诲瀷',
+      align: 'center',
+      width: 100,
+      render: row => (
+        <NTooltip trigger="hover">
+          {{
+            trigger: () => (
+              <div
+                style={{
+                  whiteSpace: 'nowrap',
+                  overflow: 'hidden',
+                  textOverflow: 'ellipsis'
+                }}
+              >
+                {row.typeName}
+              </div>
+            ),
+            default: () => row.typeName
+          }}
+        </NTooltip>
+      )
+    },
+    {
+      key: 'matName',
+      title: '鐗╂枡鐗屽彿',
+      align: 'center',
+      width: 180,
+      render: row => (
+        <NTooltip trigger="hover">
+          {{
+            trigger: () => (
+              <div
+                style={{
+                  whiteSpace: 'nowrap',
+                  overflow: 'hidden',
+                  textOverflow: 'ellipsis'
+                }}
+              >
+                {row.matName}
+              </div>
+            ),
+            default: () => row.matName
+          }}
+        </NTooltip>
+      )
+    },
+    {
+      key: 'matCode',
+      title: '鐗╂枡鐗屽彿浠g爜',
+      align: 'center',
+      width: 150
+    },
+    {
+      key: 'version',
+      title: '鐗堟湰鍙�',
+      align: 'center',
+      width: 100
+    },
+    {
+      key: 'status',
+      title: '鐘舵��',
+      align: 'center',
+      width: 100,
+      render: row => {
+        if (row.status === 1) {
+          return '鍚敤';
+        }
+        if (row.status === 0) {
+          return '褰掓。';
+        }
+        return String(row.status);
+      }
+    },
+    {
+      key: 'stdName',
+      title: '鍒ゅ畾瑙勭▼',
+      align: 'center',
+      width: 200
+    },
+    {
+      key: 'cdate',
+      title: '鍒涘缓鏃堕棿',
+      align: 'center',
+      width: 180
+    },
+    {
+      key: 'oper',
+      title: '鎿嶄綔浜�',
+      align: 'center',
+      width: 100
+    },
+    {
+      key: 'des',
+      title: '澶囨敞',
+      align: 'center',
+      width: 200
+    },
+    {
+      key: 'operate',
+      title: $t('common.operate'),
+      align: 'center',
+      fixed: 'right',
+      width: 130,
+      render: row => {
+        const divider = () => {
+          if (!hasAuth('qm:judge:edit') || !hasAuth('qm:judge:remove')) {
+            return null;
+          }
+          return <NDivider vertical />;
+        };
+
+        const editBtn = () => {
+          if (!hasAuth('qm:judge:edit')) {
+            return null;
+          }
+          return (
+            <ButtonIcon
+              text
+              type="primary"
+              icon="material-symbols:drive-file-rename-outline-outline"
+              tooltipContent={$t('common.edit')}
+              onClick={() => edit(row.id)}
+            />
+          );
+        };
+
+        const deleteBtn = () => {
+          if (!hasAuth('qm:judge:remove')) {
+            return null;
+          }
+          return (
+            <ButtonIcon
+              text
+              type="error"
+              icon="material-symbols:delete-outline"
+              tooltipContent={$t('common.delete')}
+              popconfirmContent={$t('common.confirmDelete')}
+              onPositiveClick={() => handleDelete(row.id)}
+            />
+          );
+        };
+
+        return (
+          <div class="flex-center gap-8px">
+            {editBtn()}
+            {divider()}
+            {deleteBtn()}
+          </div>
+        );
+      }
+    }
+  ]
+});
+
+const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } =
+  useTableOperate(data, 'id', getData);
+
+async function handleBatchDelete() {
+  // request
+  const { error } = await fetchBatchDeleteJudge(checkedRowKeys.value);
+  if (error) return;
+  onBatchDeleted();
+}
+
+async function handleDelete(id: CommonType.IdType) {
+  // request
+  const { error } = await fetchBatchDeleteJudge([id]);
+  if (error) return;
+  onDeleted();
+}
+
+function edit(id: CommonType.IdType) {
+  handleEdit(id);
+}
+
+function handleExport() {
+  download('/qm/judge/export', searchParams.value, `鍒ゅ畾渚濇嵁_${new Date().getTime()}.xlsx`);
+}
+</script>
+
+<template>
+  <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
+    <JudgeSearch v-model:model="searchParams" @search="getDataByPage" />
+    <NCard title="鍒ゅ畾渚濇嵁鍒楄〃" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
+      <template #header-extra>
+        <TableHeaderOperation
+          v-model:columns="columnChecks"
+          :disabled-delete="checkedRowKeys.length === 0"
+          :loading="loading"
+          :show-add="hasAuth('qm:judge:add')"
+          :show-delete="hasAuth('qm:judge:remove')"
+          :show-export="hasAuth('qm:judge:export')"
+          @add="handleAdd"
+          @delete="handleBatchDelete"
+          @export="handleExport"
+          @refresh="getData"
+        />
+      </template>
+      <NDataTable
+        v-model:checked-row-keys="checkedRowKeys"
+        :columns="columns"
+        :data="data"
+        size="small"
+        :flex-height="!appStore.isMobile"
+        :scroll-x="scrollX"
+        :loading="loading"
+        remote
+        :row-key="row => row.id"
+        :pagination="mobilePagination"
+        class="sm:h-full"
+      />
+      <JudgeOperateDrawer
+        v-model:visible="drawerVisible"
+        :operate-type="operateType"
+        :row-data="editingData"
+        @submitted="getDataByPage"
+      />
+    </NCard>
+  </div>
+</template>
+
+<style scoped></style>

--
Gitblit v1.9.3