From e97b55310155a2dd691bd698a10295a4d867f60c Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期五, 17 四月 2026 15:55:51 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
ruoyi-plus-soybean/src/views/qm/judge/index.vue | 526 ++++++++++++++++++++++++++++++---------------------------
1 files changed, 278 insertions(+), 248 deletions(-)
diff --git a/ruoyi-plus-soybean/src/views/qm/judge/index.vue b/ruoyi-plus-soybean/src/views/qm/judge/index.vue
index 80ff821..13fe5c0 100644
--- a/ruoyi-plus-soybean/src/views/qm/judge/index.vue
+++ b/ruoyi-plus-soybean/src/views/qm/judge/index.vue
@@ -10,15 +10,18 @@
import ButtonIcon from '@/components/custom/button-icon.vue';
import JudgeOperateDrawer from './modules/judge-operate-drawer.vue';
import JudgeSearch from './modules/judge-search.vue';
+import JudgeDetailsSubTable from '../judge-details/modules/judge-details-sub-table.vue';
+import StdSubTable from "@/views/qm/std/modules/std-sub-table.vue";
defineOptions({
name: 'JudgeList'
});
-
const appStore = useAppStore();
const { download } = useDownload();
const { hasAuth } = useAuth();
+
+const selectedJudgeId = ref<CommonType.IdType | null>(null);
const searchParams = ref<Api.Qm.JudgeSearchParams>({
pageNum: 1,
@@ -27,231 +30,231 @@
matName: null,
judgeName: null,
category: 0, // 榛樿閫夋嫨鎴愬搧
- status: -1, // 榛樿閫夋嫨鍏ㄩ儴
+ 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);
+ api: () => {
+ const params = { ...searchParams.value };
+ if (params.status === -1) {
+ delete params.status;
}
+ return fetchGetJudgeList(params);
},
- {
- 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>
- )
+ transform: response => defaultTransform(response),
+ onPaginationParamsChange: params => {
+ searchParams.value.pageNum = params.page;
+ searchParams.value.pageSize = params.pageSize;
},
- {
- 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;
+ 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 '鎴愬搧';
}
- return <NDivider vertical />;
- };
+ 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;
- }
+ 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 (
- <ButtonIcon
- text
- type="primary"
- icon="material-symbols:drive-file-rename-outline-outline"
- tooltipContent={$t('common.edit')}
- onClick={() => edit(row.id)}
- />
+ <div class="flex-center gap-8px">
+ {editBtn()}
+ {divider()}
+ {deleteBtn()}
+ </div>
);
- };
-
- 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);
@@ -277,47 +280,74 @@
function handleExport() {
download('/qm/judge/export', searchParams.value, `鍒ゅ畾渚濇嵁_${new Date().getTime()}.xlsx`);
}
+
+function handleRowClick(row: any) {
+ return {
+ onClick: (e: MouseEvent) => {
+ const target = e.target as HTMLElement | null;
+ if (target?.closest('.n-checkbox') || target?.closest('.n-button') || target?.closest('a')) return;
+ selectedJudgeId.value = row.id;
+ },
+ style: 'cursor: pointer;'
+ };
+}
</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"
+ <div class="judge-content-area relative flex-col-stretch gap-16px sm:flex-1-hidden">
+ <NCard
+ title="鍒ゅ畾渚濇嵁鍒楄〃"
+ :bordered="false"
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>
+ class="flex-col-stretch card-wrapper sm:flex-1-hidden"
+ :content-style="{ flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }"
+ >
+ <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"
+ :row-props="handleRowClick"
+ class="flex-1-hidden"
+ />
+ <JudgeOperateDrawer
+ v-model:visible="drawerVisible"
+ :operate-type="operateType"
+ :row-data="editingData"
+ @submitted="getDataByPage"
+ />
+ </NCard>
+ <JudgeDetailsSubTable :judge-id="selectedJudgeId" class="sm:flex-1-hidden" />
+ </div>
</div>
</template>
-<style scoped></style>
+<style scoped>
+:deep(.n-data-table-th),
+:deep(.n-data-table-td) {
+ padding: 4px 6px;
+ overflow: hidden;
+}
+</style>
--
Gitblit v1.9.3