Commit a89ff72a36d5dd980fdd85b46332caeb75a2cd13

Authored by puhui999
1 parent 69822433

feat:【INFRA 基础设施】vben5-antd-general 新增 general 标准模式批量删除

yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm
... ... @@ -5,14 +5,30 @@ import { requestClient } from '#/api/request';
5 5 #set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")
6 6  
7 7 export namespace ${simpleClassName}Api {
8   -## 特殊:主子表专属逻辑
9   -#foreach ($subTable in $subTables)
10   - #set ($index = $foreach.count - 1)
11   - #set ($subSimpleClassName = $subSimpleClassNames.get($index))
12   - #set ($subColumns = $subColumnsList.get($index))##当前字段数组
13   - /** ${subTable.classComment}信息 */
14   - export interface ${subSimpleClassName} {
15   - #foreach ($column in $subColumns)
  8 + ## 特殊:主子表专属逻辑
  9 + #foreach ($subTable in $subTables)
  10 + #set ($index = $foreach.count - 1)
  11 + #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  12 + #set ($subColumns = $subColumnsList.get($index))##当前字段数组
  13 + /** ${subTable.classComment}信息 */
  14 + export interface ${subSimpleClassName} {
  15 + #foreach ($column in $subColumns)
  16 + #if ($column.createOperation || $column.updateOperation)
  17 + #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")
  18 + ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment}
  19 + #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime")
  20 + ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment}
  21 + #else
  22 + ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment}
  23 + #end
  24 + #end
  25 + #end
  26 + }
  27 +
  28 + #end
  29 + /** ${table.classComment}信息 */
  30 + export interface ${simpleClassName} {
  31 + #foreach ($column in $columns)
16 32 #if ($column.createOperation || $column.updateOperation)
17 33 #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")
18 34 ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment}
... ... @@ -23,37 +39,21 @@ export namespace ${simpleClassName}Api {
23 39 #end
24 40 #end
25 41 #end
26   - }
27   -
28   -#end
29   - /** ${table.classComment}信息 */
30   - export interface ${simpleClassName} {
31   -#foreach ($column in $columns)
32   -#if ($column.createOperation || $column.updateOperation)
33   -#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")
34   - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment}
35   -#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime")
36   - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment}
37   -#else
38   - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment}
39   -#end
40   -#end
41   -#end
42   -#if ( $table.templateType == 2 )
43   - children?: ${simpleClassName}[];
44   -#end
45   -## 特殊:主子表专属逻辑
46   -#if ( $table.templateType == 10 || $table.templateType == 12 )
47   - #foreach ($subTable in $subTables)
48   - #set ($index = $foreach.count - 1)
49   - #set ($subSimpleClassName = $subSimpleClassNames.get($index))
50   - #if ( $subTable.subJoinMany )
51   - ${subSimpleClassName.toLowerCase()}s?: ${subSimpleClassName}[]
52   - #else
53   - ${subSimpleClassName.toLowerCase()}?: ${subSimpleClassName}
  42 + #if ( $table.templateType == 2 )
  43 + children?: ${simpleClassName}[];
  44 + #end
  45 + ## 特殊:主子表专属逻辑
  46 + #if ( $table.templateType == 10 || $table.templateType == 12 )
  47 + #foreach ($subTable in $subTables)
  48 + #set ($index = $foreach.count - 1)
  49 + #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  50 + #if ( $subTable.subJoinMany )
  51 + ${subSimpleClassName.toLowerCase()}s?: ${subSimpleClassName}[]
  52 + #else
  53 + ${subSimpleClassName.toLowerCase()}?: ${subSimpleClassName}
  54 + #end
  55 + #end
54 56 #end
55   - #end
56   -#end
57 57 }
58 58 }
59 59  
... ... @@ -89,6 +89,13 @@ export function delete${simpleClassName}(id: number) {
89 89 return requestClient.delete(`${baseURL}/delete?id=${id}`);
90 90 }
91 91  
  92 +#if ( $table.templateType != 2 && $deleteBatchEnable)
  93 +/** 批量删除${table.classComment} */
  94 +export function delete${simpleClassName}ListByIds(ids: number[]) {
  95 + return requestClient.delete(`${baseURL}/delete-list?ids=${ids.join(',')}`)
  96 +}
  97 +#end
  98 +
92 99 /** 导出${table.classComment} */
93 100 export function export${simpleClassName}(params: any) {
94 101 return requestClient.download('${baseURL}/export-excel', params);
... ... @@ -96,58 +103,65 @@ export function export${simpleClassName}(params: any) {
96 103  
97 104 ## 特殊:主子表专属逻辑
98 105 #foreach ($subTable in $subTables)
99   -#set ($index = $foreach.count - 1)
100   -#set ($subSimpleClassName = $subSimpleClassNames.get($index))
101   -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
102   -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
103   -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
104   -#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
105   -#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index))
106   -#set ($subClassNameVar = $subClassNameVars.get($index))
  106 + #set ($index = $foreach.count - 1)
  107 + #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  108 + #set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
  109 + #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
  110 + #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  111 + #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
  112 + #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index))
  113 + #set ($subClassNameVar = $subClassNameVars.get($index))
107 114  
108 115 // ==================== 子表($subTable.classComment) ====================
109 116  
110   -## 情况一:MASTER_ERP 时,需要分查询页子表
111   -#if ( $table.templateType == 11 )
112   -/** 获得${subTable.classComment}分页 */
113   -export function get${subSimpleClassName}Page(params: PageParam) {
114   - return requestClient.get<PageResult<${simpleClassName}Api.${subSimpleClassName}>>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params });
115   -}
116   -## 情况二:非 MASTER_ERP 时,需要列表查询子表
117   -#else
118   - #if ( $subTable.subJoinMany )
119   -/** 获得${subTable.classComment}列表 */
120   -export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}: number) {
121   - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`);
122   -}
  117 + ## 情况一:MASTER_ERP 时,需要分查询页子表
  118 + #if ( $table.templateType == 11 )
  119 + /** 获得${subTable.classComment}分页 */
  120 + export function get${subSimpleClassName}Page(params: PageParam) {
  121 + return requestClient.get<PageResult<${simpleClassName}Api.${subSimpleClassName}>>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params });
  122 + }
  123 + ## 情况二:非 MASTER_ERP 时,需要列表查询子表
123 124 #else
124   -/** 获得${subTable.classComment} */
125   -export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}: number) {
126   - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`);
127   -}
  125 + #if ( $subTable.subJoinMany )
  126 + /** 获得${subTable.classComment}列表 */
  127 + export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}: number) {
  128 + return requestClient.get<${simpleClassName}Api.${subSimpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`);
  129 + }
  130 + #else
  131 + /** 获得${subTable.classComment} */
  132 + export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}: number) {
  133 + return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`);
  134 + }
  135 + #end
128 136 #end
129   -#end
130   -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作
131   -#if ( $table.templateType == 11 )
132   -/** 新增${subTable.classComment} */
133   -export function create${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) {
134   - return requestClient.post(`${baseURL}/${subSimpleClassName_strikeCase}/create`, data);
135   -}
  137 + ## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作
  138 + #if ( $table.templateType == 11 )
  139 + /** 新增${subTable.classComment} */
  140 + export function create${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) {
  141 + return requestClient.post(`${baseURL}/${subSimpleClassName_strikeCase}/create`, data);
  142 + }
136 143  
137   -/** 修改${subTable.classComment} */
138   -export function update${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) {
139   - return requestClient.put(`${baseURL}/${subSimpleClassName_strikeCase}/update`, data);
140   -}
  144 + /** 修改${subTable.classComment} */
  145 + export function update${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) {
  146 + return requestClient.put(`${baseURL}/${subSimpleClassName_strikeCase}/update`, data);
  147 + }
141 148  
142   -/** 删除${subTable.classComment} */
143   -export function delete${subSimpleClassName}(id: number) {
144   - return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete?id=${id}`);
145   -}
  149 + /** 删除${subTable.classComment} */
  150 + export function delete${subSimpleClassName}(id: number) {
  151 + return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete?id=${id}`);
  152 + }
146 153  
147   -/** 获得${subTable.classComment} */
148   -export function get${subSimpleClassName}(id: number) {
149   - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`);
150   -}
151   -#end
  154 + #if ($deleteBatchEnable)
  155 + /** 批量删除${subTable.classComment} */
  156 + export function delete${subSimpleClassName}ListByIds(ids: number[]) {
  157 + return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`)
  158 + }
  159 + #end
  160 +
  161 + /** 获得${subTable.classComment} */
  162 + export function get${subSimpleClassName}(id: number) {
  163 + return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`);
  164 + }
  165 + #end
152 166 #end
153 167  
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm
... ... @@ -8,7 +8,7 @@ import { Button, message,Tabs,Pagination,Form,RangePicker,DatePicker,Select,Inpu
8 8 import { DictTag } from '#/components/dict-tag';
9 9 import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils';
10 10 import ${simpleClassName}Form from './modules/form.vue';
11   -import { Download, Plus, RefreshCw, Search } from '@vben/icons';
  11 +import { Download, Plus, RefreshCw, Search, Trash2 } from '@vben/icons';
12 12 import { ContentWrap } from '#/components/content-wrap';
13 13 import { VxeColumn, VxeTable } from '#/adapter/vxe-table';
14 14 import { TableToolbar } from '#/components/table-toolbar';
... ... @@ -29,7 +29,8 @@ import { $t } from &#39;#/locales&#39;;
29 29 import { handleTree,isEmpty } from '@vben/utils'
30 30 import { get${simpleClassName}List, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}';
31 31 #else## 标准表接口
32   -import { get${simpleClassName}Page, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}';
  32 +import { isEmpty } from '@vben/utils';
  33 +import { get${simpleClassName}Page, delete${simpleClassName},#if ($deleteBatchEnable) delete${simpleClassName}ListByIds,#end export${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}';
33 34 #end
34 35 import { downloadFileFromBlobPart } from '@vben/utils';
35 36  
... ... @@ -152,11 +153,38 @@ async function onDelete(row: ${simpleClassName}Api.${simpleClassName}) {
152 153 key: 'action_process_msg',
153 154 });
154 155 await getList();
155   - } catch {
  156 + } finally {
  157 + hideLoading();
  158 + }
  159 +}
  160 +
  161 +#if ($table.templateType != 2 && $deleteBatchEnable)
  162 +/** 批量删除${table.classComment} */
  163 +async function onDeleteBatch() {
  164 + const hideLoading = message.loading({
  165 + content: $t('ui.actionMessage.deleting'),
  166 + duration: 0,
  167 + key: 'action_process_msg',
  168 + });
  169 + try {
  170 + await delete${simpleClassName}ListByIds(deleteIds.value);
  171 + message.success( $t('ui.actionMessage.deleteSuccess') );
  172 + await getList();
  173 + } finally {
156 174 hideLoading();
157 175 }
158 176 }
159 177  
  178 +const deleteIds = ref<number[]>([]) // 待删除${table.classComment} ID
  179 +function setDeleteIds({
  180 + records,
  181 +}: {
  182 + records: ${simpleClassName}Api.${simpleClassName}[];
  183 +}) {
  184 + deleteIds.value = records.map((item) => item.id);
  185 +}
  186 +#end
  187 +
160 188 /** 导出表格 */
161 189 async function onExport() {
162 190 try {
... ... @@ -302,6 +330,19 @@ onMounted(() =&gt; {
302 330 >
303 331 {{ $t('ui.actionTitle.export') }}
304 332 </Button>
  333 + #if ($table.templateType != 2 && $deleteBatchEnable)
  334 + <Button
  335 + :icon="h(Trash2)"
  336 + type="primary"
  337 + danger
  338 + class="ml-2"
  339 + :disabled="isEmpty(deleteIds)"
  340 + @click="onDeleteBatch"
  341 + v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:delete']"
  342 + >
  343 + 批量删除
  344 + </Button>
  345 + #end
305 346 </TableToolbar>
306 347 </template>
307 348 <vxe-table
... ... @@ -326,7 +367,14 @@ onMounted(() =&gt; {
326 367 #end
327 368 show-overflow
328 369 :loading="loading"
  370 +#if ($table.templateType != 2 && $deleteBatchEnable)
  371 + @checkboxAll="setDeleteIds"
  372 + @checkboxChange="setDeleteIds"
  373 +#end
329 374 >
  375 +#if ($table.templateType != 2 && $deleteBatchEnable)
  376 + <vxe-column type="checkbox" width="40"></vxe-column>
  377 +#end
330 378 ## 特殊:主子表专属逻辑
331 379 #if ( $table.templateType == 12 && $subTables && $subTables.size() > 0 )
332 380 <!-- 子表的列表 -->
... ... @@ -421,7 +469,6 @@ onMounted(() =&gt; {
421 469 </div>
422 470 #end
423 471 </ContentWrap>
424   -
425 472 #if ($table.templateType == 11) ## erp情况
426 473 <ContentWrap>
427 474 <!-- 子表的表单 -->
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm
... ... @@ -10,7 +10,7 @@
10 10 import type { VxeTableInstance } from '#/adapter/vxe-table';
11 11  
12 12 import { DictTag } from '#/components/dict-tag';
13   - import { DICT_TYPE, getDictOptions } from '#/utils';
  13 + import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils';
14 14 import { VxeColumn, VxeTable } from '#/adapter/vxe-table';
15 15 import { reactive,ref, h, nextTick,watch,onMounted } from 'vue';
16 16 import { cloneDeep, formatDateTime } from '@vben/utils';
... ... @@ -22,15 +22,15 @@
22 22 import { Tinymce as RichTextarea } from '#/components/tinymce';
23 23 import { ImageUpload, FileUpload } from "#/components/upload";
24 24 import { message,Button, Tabs,Pagination, Form, Input, Textarea, Select, RadioGroup, Radio, CheckboxGroup, Checkbox,RangePicker, DatePicker, TreeSelect } from 'ant-design-vue';
25   - import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils';
26   - import { Plus } from '@vben/icons';
  25 + import { Plus, Trash2 } from '@vben/icons';
27 26 import { $t } from '#/locales';
28 27 import { TableToolbar } from '#/components/table-toolbar';
29 28 import { useTableToolbar } from '#/hooks';
30 29 #end
31 30  
32 31 #if ($table.templateType == 11) ## erp
33   - import { delete${subSimpleClassName}, get${subSimpleClassName}Page } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}';
  32 + import { delete${subSimpleClassName},#if ($deleteBatchEnable) delete${subSimpleClassName}ListByIds,#end get${subSimpleClassName}Page } from '#/api/${table.moduleName}/${table.businessName}';
  33 + import { isEmpty } from '@vben/utils';
34 34 #else
35 35 #if ($subTable.subJoinMany) ## 一对多
36 36 import { get${subSimpleClassName}ListBy${SubJoinColumnName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}';
... ... @@ -76,11 +76,38 @@ async function onDelete(row: ${simpleClassName}Api.${subSimpleClassName}) {
76 76 content: $t('ui.actionMessage.deleteSuccess', [row.id]),
77 77 key: 'action_process_msg',
78 78 });
79   - getList();
80   - } catch {
  79 + await getList();
  80 + } finally {
81 81 hideLoading();
82 82 }
83 83 }
  84 +
  85 +#if ($deleteBatchEnable)
  86 +/** 批量删除${subTable.classComment} */
  87 +async function onDeleteBatch() {
  88 + const hideLoading = message.loading({
  89 + content: $t('ui.actionMessage.deleting'),
  90 + duration: 0,
  91 + key: 'action_process_msg',
  92 + });
  93 + try {
  94 + await delete${subSimpleClassName}ListByIds(deleteIds.value);
  95 + message.success( $t('ui.actionMessage.deleteSuccess') );
  96 + await getList();
  97 + } finally {
  98 + hideLoading();
  99 + }
  100 +}
  101 +
  102 +const deleteIds = ref<number[]>([]) // 待删除${subTable.classComment} ID
  103 +function setDeleteIds({
  104 + records,
  105 +}: {
  106 + records: ${simpleClassName}Api.${subSimpleClassName}[];
  107 +}) {
  108 + deleteIds.value = records.map((item) => item.id);
  109 +}
  110 +#end
84 111 #end
85 112  
86 113 const loading = ref(true) // 列表的加载中
... ... @@ -277,6 +304,19 @@ onMounted(() =&gt; {
277 304 >
278 305 {{ $t('ui.actionTitle.create', ['${table.classComment}']) }}
279 306 </Button>
  307 + #if ($deleteBatchEnable)
  308 + <Button
  309 + :icon="h(Trash2)"
  310 + type="primary"
  311 + danger
  312 + class="ml-2"
  313 + :disabled="isEmpty(deleteIds)"
  314 + @click="onDeleteBatch"
  315 + v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:delete']"
  316 + >
  317 + 批量删除
  318 + </Button>
  319 + #end
280 320 </TableToolbar>
281 321 </template>
282 322 <vxe-table
... ... @@ -284,7 +324,14 @@ onMounted(() =&gt; {
284 324 :data="list"
285 325 show-overflow
286 326 :loading="loading"
  327 + #if ($deleteBatchEnable)
  328 + @checkboxAll="setDeleteIds"
  329 + @checkboxChange="setDeleteIds"
  330 + #end
287 331 >
  332 + #if ($deleteBatchEnable)
  333 + <vxe-column type="checkbox" width="40"></vxe-column>
  334 + #end
288 335 #foreach($column in $subColumns)
289 336 #if ($column.listOperationResult)
290 337 #set ($dictType=$column.dictType)
... ...