广丰卷烟厂数采质量分析系统
baoshiwei
昨天 d143af7023cfd4a0ced6f0ecf04ae3b3a06fd1dc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<script setup lang="tsx">
import { ref, watch } from 'vue';
import { fetchGetGenDataNames, fetchGetGenDbList, fetchImportGenTable } from '@/service/api/tool';
import { useAppStore } from '@/store/modules/app';
import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table';
import { $t } from '@/locales';
import GenTableDbSearch from './gen-table-db-search.vue';
 
defineOptions({
  name: 'GenTableImportDrawer'
});
 
const visible = defineModel<boolean>('visible', {
  default: false
});
 
interface Emits {
  (e: 'submitted'): void;
}
 
const emit = defineEmits<Emits>();
 
const appStore = useAppStore();
 
const searchParams = ref<Api.Tool.GenTableDbSearchParams>({
  pageNum: 1,
  pageSize: 10,
  dataName: null,
  tableName: null,
  tableComment: null
});
 
const { columns, data, getData, getDataByPage, loading, mobilePagination, scrollX } = useNaivePaginatedTable({
  api: () => fetchGetGenDbList(searchParams.value),
  transform: response => defaultTransform(response),
  onPaginationParamsChange: params => {
    searchParams.value.pageNum = params.page;
    searchParams.value.pageSize = params.pageSize;
  },
  columns: () => [
    {
      type: 'selection',
      align: 'center',
      width: 52
    },
    {
      key: 'index',
      title: $t('common.index'),
      align: 'center',
      width: 64
    },
    {
      key: 'tableName',
      title: '表名称',
      align: 'center',
      minWidth: 120
    },
    {
      key: 'tableComment',
      title: '表描述',
      align: 'center',
      minWidth: 120
    }
  ]
});
 
const { checkedRowKeys } = useTableOperate(data, 'tableName', getData);
 
function closeDrawer() {
  visible.value = false;
}
 
async function handleSubmit() {
  if (checkedRowKeys.value.length > 0) {
    // request
    const { error } = await fetchImportGenTable(checkedRowKeys.value as string[], searchParams.value.dataName!);
    if (error) return;
    window.$message?.success('导入成功');
    emit('submitted');
  }
  closeDrawer();
}
 
const dataNameOptions = ref<CommonType.Option[]>([]);
 
async function handleResetSearchParams() {
  searchParams.value.dataName = dataNameOptions.value.length ? dataNameOptions.value[0].value : null;
  searchParams.value.tableName = null;
  searchParams.value.tableComment = null;
  data.value = [];
  checkedRowKeys.value = [];
  await getDataByPage();
}
 
async function getDataNames() {
  const { error, data: dataNames } = await fetchGetGenDataNames();
  if (error) return;
  dataNameOptions.value = dataNames.map(item => ({ label: item, value: item }));
}
 
watch(visible, async () => {
  if (visible.value) {
    await getDataNames();
    await handleResetSearchParams();
  }
});
</script>
 
<template>
  <NDrawer v-model:show="visible" display-directive="show" :width="800" class="max-w-90%">
    <NDrawerContent title="导入表" :native-scrollbar="false" closable>
      <div class="h-full flex-col">
        <GenTableDbSearch
          v-model:model="searchParams"
          :options="dataNameOptions"
          @reset="handleResetSearchParams"
          @search="getDataByPage"
        />
        <TableRowCheckAlert v-model:checked-row-keys="checkedRowKeys" class="mb-16px" />
        <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.tableName"
          :pagination="mobilePagination"
          class="flex-1"
        />
      </div>
      <template #footer>
        <NSpace :size="16">
          <NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
          <NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton>
        </NSpace>
      </template>
    </NDrawerContent>
  </NDrawer>
</template>
 
<style scoped>
:deep(.n-drawer-body-content-wrapper) {
  height: 100%;
}
</style>