index.vue.vm 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. <template>
  2. <cacp-search-layout>
  3. <template #search>
  4. <cacp-search-panel-layout
  5. :model="state.queryData"
  6. ref="queryFormRef"
  7. label-position="left"
  8. label-width="auto"
  9. :gutter="30"
  10. :colSpan="6"
  11. >
  12. #foreach($column in $columns)
  13. #if($column.query)
  14. #set($parentheseIndex=$column.columnComment.indexOf("("))
  15. #if($parentheseIndex != -1)
  16. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  17. #else
  18. #set($comment=$column.columnComment)
  19. #end
  20. #set($dictType=$column.dictType)
  21. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  22. #if($column.htmlType == "input")
  23. <el-form-item label="${comment}" prop="${column.javaField}">
  24. <el-input v-model="state.queryData.${column.javaField}" placeholder="请输入${comment}" clearable />
  25. </el-form-item>
  26. #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
  27. <el-form-item label="${comment}" prop="${column.javaField}">
  28. <el-select v-model="state.queryData.${column.javaField}" placeholder="请选择${comment}" clearable>
  29. ## <el-option
  30. ## v-for="dict in dict.type.${dictType}"
  31. ## :key="dict.value"
  32. ## :label="dict.label"
  33. ## :value="dict.value"
  34. ## />
  35. </el-select>
  36. </el-form-item>
  37. #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
  38. <el-form-item label="${comment}" prop="${column.javaField}">
  39. <el-date-picker
  40. clearable
  41. v-model="state.queryData.${column.javaField}"
  42. type="date"
  43. value-format="YYYY-MM-DD"
  44. placeholder="请选择${comment}"
  45. />
  46. </el-form-item>
  47. #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  48. <el-form-item label="${comment}">
  49. <el-date-picker
  50. type="daterange"
  51. value-format="YYYY-MM-DD"
  52. v-model="state.queryData.begin${AttrName}"
  53. placeholder="开始时间"
  54. />
  55. </el-form-item>
  56. <el-form-item label="到">
  57. <el-date-picker
  58. type="daterange"
  59. value-format="YYYY-MM-DD"
  60. v-model="state.queryData.end${AttrName}"
  61. placeholder="结束时间"
  62. />
  63. </el-form-item>
  64. #end
  65. #end
  66. #end
  67. <template #buttonGroup>
  68. <el-button type="primary" @click="onSearch">查询</el-button>
  69. <el-button type="info" @click="onReset">重置</el-button>
  70. </template>
  71. </cacp-search-panel-layout>
  72. </template>
  73. <cacp-complex-table
  74. :actions="actions"
  75. :data="tableData"
  76. :pagination="tablePagination"
  77. :actionsWidth="120"
  78. @selection-change="handleSelectionChange"
  79. @on-page-change="onPageChange"
  80. @on-size-change="onSizeChange"
  81. :loading="loading"
  82. >
  83. <el-table-column type="selection" width="36" fixed="left" />
  84. #foreach($column in $columns)
  85. #set($javaField=$column.javaField)
  86. #set($parentheseIndex=$column.columnComment.indexOf("("))
  87. #if($parentheseIndex != -1)
  88. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  89. #else
  90. #set($comment=$column.columnComment)
  91. #end
  92. #if($column.pk)
  93. <el-table-column property="${javaField}" label="${comment}" width="100" :show-overflow-tooltip="true" />
  94. #elseif($column.list && $column.htmlType == "datetime")
  95. <el-table-column property="${javaField}" label="${comment}" width="120" sortable>
  96. <template #default="scope">
  97. {{ scope.row.${javaField} ? dayjs(scope.row.${javaField}).format('YYYY-MM-DD') : '' }}
  98. </template>
  99. </el-table-column>
  100. #elseif($column.list && $column.htmlType == "datetime" && $column.javaField.toLowerCase().contains('time'))
  101. <el-table-column property="${javaField}" label="${comment}" width="160" sortable>
  102. <template #default="scope">
  103. {{ scope.row.${javaField} ? dayjs(scope.row.${javaField}).format('YYYY-MM-DD HH:mm') : '' }}
  104. </template>
  105. </el-table-column>
  106. #elseif($column.list && "" != $column.dictType)
  107. <el-table-column property="${javaField}" label="${comment}" width="120">
  108. <template #default="scope">
  109. ## <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}" />
  110. {{ scope.row.${javaField} }}
  111. </template>
  112. </el-table-column>
  113. #elseif($column.list && "" != $javaField)
  114. <el-table-column property="${javaField}" label="${comment}" width="120" :show-overflow-tooltip="true" />
  115. #end
  116. #end
  117. </cacp-complex-table>
  118. </cacp-search-layout>
  119. <!--新增、编辑弹框-->
  120. <cacp-dialog
  121. v-model="state.dialogVisible"
  122. :resizable="false"
  123. :title="state.title"
  124. width="60%"
  125. @closed="onDialogClosed"
  126. >
  127. <el-form
  128. :model="state.formData"
  129. ref="dialogFormRef"
  130. :rules="infoRules"
  131. label-width="auto"
  132. label-position="left"
  133. :disabled="!state.isEdit"
  134. >
  135. <el-row :gutter="20">
  136. #set($colCount = 0)
  137. #foreach($column in $columns)
  138. #if($column.insert && !$column.pk)
  139. #set($field=$column.javaField)
  140. #set($parentheseIndex=$column.columnComment.indexOf("("))
  141. #if($parentheseIndex != -1)
  142. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  143. #else
  144. #set($comment=$column.columnComment)
  145. #end
  146. #set($dictType=$column.dictType)
  147. #set($colCount = $colCount + 1)
  148. #if($colCount % 2 == 1)
  149. <el-col :span="12">
  150. #else
  151. <el-col :span="12">
  152. #end
  153. #if($column.htmlType == "input")
  154. <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
  155. <el-input v-model="state.formData.${field}" placeholder="请输入${comment}" />
  156. </el-form-item>
  157. #elseif($column.htmlType == "textarea")
  158. <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
  159. <el-input v-model="state.formData.${field}" type="textarea" placeholder="请输入${comment}" />
  160. </el-form-item>
  161. #elseif($column.htmlType == "select" && "" != $dictType)
  162. <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
  163. <el-select v-model="state.formData.${field}" placeholder="请选择${comment}" clearable>
  164. ## <el-option
  165. ## v-for="dict in dict.type.${dictType}"
  166. ## :key="dict.value"
  167. ## :label="dict.label"
  168. ## :value="dict.value"
  169. ## />
  170. </el-select>
  171. </el-form-item>
  172. #elseif($column.htmlType == "datetime")
  173. <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
  174. <el-date-picker
  175. v-model="state.formData.${field}"
  176. type="date"
  177. value-format="YYYY-MM-DD"
  178. placeholder="请选择${comment}"
  179. style="width: 100%"
  180. />
  181. </el-form-item>
  182. #elseif($column.htmlType == "radio" && "" != $dictType)
  183. <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
  184. <el-radio-group v-model="state.formData.${field}">
  185. ## <el-radio
  186. ## v-for="dict in dict.type.${dictType}"
  187. ## :key="dict.value"
  188. ## :label="dict.value"
  189. ## >{{ dict.label }}</el-radio>
  190. </el-radio-group>
  191. </el-form-item>
  192. #elseif($column.htmlType == "checkbox" && "" != $dictType)
  193. <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
  194. <el-checkbox-group v-model="state.formData.${field}">
  195. ## <el-checkbox
  196. ## v-for="dict in dict.type.${dictType}"
  197. ## :key="dict.value"
  198. ## :label="dict.value"
  199. ## >{{ dict.label }}</el-checkbox>
  200. </el-checkbox-group>
  201. </el-form-item>
  202. #else
  203. <el-form-item label="${comment}" prop="${field}"#if($column.required) required#end>
  204. <el-input v-model="state.formData.${field}" placeholder="请输入${comment}" />
  205. </el-form-item>
  206. #end
  207. </el-col>
  208. #if($colCount % 2 == 0 && $foreach.hasNext)
  209. </el-row><el-row :gutter="20">
  210. #end
  211. #end
  212. #end
  213. </el-row>
  214. #if($table.sub)
  215. <el-divider content-position="center">${subTable.functionName}信息</el-divider>
  216. <el-row :gutter="10" class="mb8">
  217. <el-col :span="1.5">
  218. <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd${subClassName}">添加</el-button>
  219. </el-col>
  220. <el-col :span="1.5">
  221. <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDelete${subClassName}">删除</el-button>
  222. </el-col>
  223. </el-row>
  224. <el-table highlight-selection-row :data="state.${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
  225. <el-table-column type="selection" width="50" align="center" />
  226. <el-table-column label="序号" align="center" prop="index" width="50"/>
  227. #foreach($column in $subTable.columns)
  228. #set($javaField=$column.javaField)
  229. #set($parentheseIndex=$column.columnComment.indexOf("("))
  230. #if($parentheseIndex != -1)
  231. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  232. #else
  233. #set($comment=$column.columnComment)
  234. #end
  235. #if($column.pk || $javaField == ${subTableFkclassName})
  236. #elseif($column.list && $column.htmlType == "input")
  237. <el-table-column label="$comment" prop="${javaField}" width="150">
  238. <template #default="scope">
  239. <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
  240. </template>
  241. </el-table-column>
  242. #elseif($column.list && $column.htmlType == "datetime")
  243. <el-table-column label="$comment" prop="${javaField}" width="240">
  244. <template #default="scope">
  245. <el-date-picker clearable v-model="scope.row.$javaField" type="date" value-format="YYYY-MM-DD" placeholder="请选择$comment" style="width: 100%" />
  246. </template>
  247. </el-table-column>
  248. #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
  249. <el-table-column label="$comment" prop="${javaField}" width="150">
  250. <template #default="scope">
  251. <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
  252. ## <el-option
  253. ## v-for="dict in dict.type.$column.dictType"
  254. ## :key="dict.value"
  255. ## :label="dict.label"
  256. ## :value="dict.value"
  257. ## ></el-option>
  258. </el-select>
  259. </template>
  260. </el-table-column>
  261. #end
  262. #end
  263. </el-table>
  264. #end
  265. </el-form>
  266. <template #footer v-if="state.isEdit">
  267. <el-button @click="onDialogClosed">取消</el-button>
  268. <el-button type="primary" @click="onSubmit">确定</el-button>
  269. </template>
  270. </cacp-dialog>
  271. <!--查看弹框-->
  272. <cacp-dialog
  273. v-model="state.viewDialogVisible"
  274. :resizable="false"
  275. :title="state.viewTitle"
  276. width="50%"
  277. >
  278. <el-form
  279. :model="state.viewForm"
  280. label-width="auto"
  281. label-position="left"
  282. :disabled="true"
  283. >
  284. <el-row :gutter="20">
  285. #set($colCount = 0)
  286. #foreach($column in $columns)
  287. #if($column.insert && !$column.pk)
  288. #set($field=$column.javaField)
  289. #set($parentheseIndex=$column.columnComment.indexOf("("))
  290. #if($parentheseIndex != -1)
  291. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  292. #else
  293. #set($comment=$column.columnComment)
  294. #end
  295. #set($colCount = $colCount + 1)
  296. #if($colCount % 2 == 1)
  297. <el-col :span="12">
  298. #else
  299. <el-col :span="12">
  300. #end
  301. <el-form-item label="${comment}:" prop="${field}">
  302. <span>{{ state.viewForm.${field} || '-' }}</span>
  303. </el-form-item>
  304. </el-col>
  305. #if($colCount % 2 == 0 && $foreach.hasNext)
  306. </el-row><el-row :gutter="20">
  307. #end
  308. #end
  309. #end
  310. </el-row>
  311. </el-form>
  312. </cacp-dialog>
  313. </template>
  314. <script lang="ts" setup>
  315. import { onMounted, reactive, ref } from 'vue'
  316. import type { FormInstance } from 'element-plus'
  317. import { ElMessage, ElMessageBox, type FormRules } from 'element-plus'
  318. import config from '@/config'
  319. import {
  320. SuccessResultCode,
  321. useComplexTable,
  322. type Result,
  323. type SearchPanelLayoutInstance,
  324. type TableAction,
  325. useLoading
  326. } from '@cacp/ui'
  327. import type { ${ClassName}, ${ClassName}Query } from '@/types/${moduleName}/${businessName}'
  328. import { insert, getList, getDetail, remove, update } from '@/apis/${moduleName}/${businessName}'
  329. import { permissionStatus } from '@/utils/globalPermission'
  330. // 表单引用
  331. const queryFormRef = ref<SearchPanelLayoutInstance>()
  332. const dialogFormRef = ref<FormInstance>()
  333. // 加载状态
  334. const { loading, setLoading } = useLoading()
  335. // 表格 Hook
  336. const tableHooks = useComplexTable<${ClassName}>(config)
  337. const { tableData, tablePagination, setPagination, setPageIndex, setPageSizes } = tableHooks
  338. // 响应式数据
  339. interface State {
  340. queryData: ${ClassName}Query
  341. formData: ${ClassName}
  342. viewForm: ${ClassName}
  343. viewTitle: string
  344. viewDialogVisible: boolean
  345. title: string
  346. isEdit: boolean
  347. dialogVisible: boolean
  348. #if($table.sub)
  349. ${subclassName}List: any[]
  350. checked${subClassName}: number[]
  351. #end
  352. }
  353. const state = reactive<State>({
  354. queryData: {
  355. #foreach($column in $columns)
  356. #if($column.query)
  357. $column.javaField: #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")''#else''#end,
  358. #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  359. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  360. begin${AttrName}: '',
  361. end${AttrName}: '',
  362. #end
  363. #end
  364. #end
  365. pageIndex: tablePagination.currentPage,
  366. pageSize: tablePagination.pageSize
  367. },
  368. formData: {
  369. #foreach($column in $columns)
  370. $column.javaField: #if($column.htmlType == "checkbox")[]#elseif($column.javaType == 'Long' || $column.javaType == 'Integer')null#else''#end,
  371. #end
  372. #if($table.sub)
  373. ${subclassName}List: []
  374. #end
  375. } as ${ClassName},
  376. viewForm: {} as ${ClassName},
  377. viewTitle: '',
  378. viewDialogVisible: false,
  379. title: '',
  380. isEdit: false,
  381. dialogVisible: false,
  382. #if($table.sub)
  383. ${subclassName}List: [],
  384. checked${subClassName}: []
  385. #end
  386. })
  387. // 表单验证规则
  388. const infoRules = reactive<FormRules<${ClassName}>>({
  389. #foreach($column in $columns)
  390. #if($column.required)
  391. #set($parentheseIndex=$column.columnComment.indexOf("("))
  392. #if($parentheseIndex != -1)
  393. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  394. #else
  395. #set($comment=$column.columnComment)
  396. #end
  397. ${column.javaField}: [
  398. { required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")'change'#else'blur'#end }
  399. ],
  400. #end
  401. #end
  402. })
  403. // 表格操作按钮配置
  404. const actions = <Array<TableAction>>[
  405. {
  406. key: 'create',
  407. text: '新增',
  408. onclick: onCreate,
  409. limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_ADD_BT'),
  410. position: 'left',
  411. type: 'primary',
  412. },
  413. {
  414. key: 'view',
  415. text: '查看',
  416. onclick: onView,
  417. limit: permissionStatus('one', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_VIEW_BT'),
  418. type: 'primary'
  419. },
  420. {
  421. key: 'edit',
  422. text: '修改',
  423. onclick: onEdit,
  424. limit: permissionStatus('one', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_EDIT_BT'),
  425. type: 'primary'
  426. },
  427. {
  428. key: 'delete',
  429. text: '删除',
  430. onclick: onDelete,
  431. confirm: true,
  432. limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_DELETE_BT'),
  433. type: 'primary'
  434. },
  435. #if($table.genTable.importTable)
  436. {
  437. key: 'import',
  438. type: 'primary',
  439. text: '导入',
  440. onclick: onImport,
  441. limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_IMPORT_BT'),
  442. position: 'right',
  443. plain: true
  444. },
  445. {
  446. key: 'export',
  447. type: 'primary',
  448. text: '导出',
  449. onclick: onExport,
  450. limit: permissionStatus('none', '${moduleName.toUpperCase()}_${businessName.toUpperCase()}_EXPORT_BT'),
  451. position: 'right',
  452. plain: true
  453. },
  454. #end
  455. {
  456. key: 'refresh',
  457. type: 'primary',
  458. text: '刷新',
  459. onclick: onRefresh,
  460. limit: 'none',
  461. position: 'left',
  462. plain: true
  463. }
  464. ]
  465. // 选中项的 ID 数组
  466. const ids = ref<string[]>([])
  467. // 多选框选中数据
  468. function handleSelectionChange(selection: ${ClassName}[]) {
  469. ids.value = selection
  470. .map(item => item.${pkColumn.javaField})
  471. .filter((id): id is string => id != null && id !== undefined)
  472. }
  473. // 搜索方法
  474. const onSearch = () => {
  475. setPageIndex(1)
  476. onLoadData()
  477. }
  478. // 重置方法
  479. const onReset = () => {
  480. queryFormRef.value?.resetFields()
  481. #foreach($column in $columns)
  482. #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
  483. #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  484. state.queryData.begin${AttrName} = ''
  485. state.queryData.end${AttrName} = ''
  486. #end
  487. #end
  488. onPageChange(1)
  489. }
  490. // 每页显示条数变化
  491. const onSizeChange = (size: number) => {
  492. setPageSizes(size)
  493. onLoadData()
  494. }
  495. // 翻页查询
  496. const onPageChange = (currentPage: number) => {
  497. setPageIndex(currentPage)
  498. onLoadData()
  499. }
  500. // 弹框关闭方法
  501. function onDialogClosed() {
  502. state.dialogVisible = false
  503. resetForm()
  504. }
  505. // 重置表单
  506. function resetForm() {
  507. state.formData = {
  508. #foreach($column in $columns)
  509. $column.javaField: #if($column.htmlType == "checkbox")[]#elseif($column.javaType == 'Long' || $column.javaType == 'Integer')null#else''#end,
  510. #end
  511. #if($table.sub)
  512. ${subclassName}List: []
  513. #end
  514. } as ${ClassName}
  515. #if($table.sub)
  516. state.${subclassName}List = []
  517. #end
  518. dialogFormRef.value?.resetFields()
  519. }
  520. // 刷新方法
  521. function onRefresh() {
  522. onReset()
  523. }
  524. // 新增
  525. function onCreate() {
  526. resetForm()
  527. state.dialogVisible = true
  528. state.isEdit = true
  529. state.title = '新增${functionName}'
  530. }
  531. // 查看
  532. function onView(row: ${ClassName}) {
  533. state.viewForm = { ...row }
  534. state.viewDialogVisible = true
  535. state.viewTitle = '查看${functionName}详情'
  536. }
  537. // 编辑
  538. async function onEdit(row: ${ClassName}) {
  539. const res = await getDetail(row.${pkColumn.javaField})
  540. if (res.code === SuccessResultCode) {
  541. state.formData = res.data
  542. #foreach($column in $columns)
  543. #if($column.htmlType == "checkbox")
  544. if (state.formData.${column.javaField}) {
  545. state.formData.${column.javaField} = state.formData.${column.javaField}.split(',')
  546. } else {
  547. state.formData.${column.javaField} = []
  548. }
  549. #end
  550. #end
  551. #if($table.sub)
  552. state.${subclassName}List = res.data.${subclassName}List || []
  553. #end
  554. state.dialogVisible = true
  555. state.isEdit = true
  556. state.title = '修改${functionName}'
  557. } else {
  558. ElMessage.error(res.message || '数据获取异常')
  559. }
  560. }
  561. // 删除
  562. async function onDelete(row: ${ClassName}) {
  563. const deleteIds = row.${pkColumn.javaField} || ids.value
  564. if (!deleteIds || deleteIds.length === 0) {
  565. ElMessage.warning('请选择要删除的数据')
  566. return
  567. }
  568. try {
  569. await ElMessageBox.confirm('确定要删除选中的${functionName}吗?', '提示', {
  570. confirmButtonText: '确定',
  571. cancelButtonText: '取消',
  572. type: 'warning'
  573. })
  574. const res = await remove(deleteIds)
  575. if (res.code === SuccessResultCode) {
  576. ElMessage.success('删除成功')
  577. onPageChange(1)
  578. } else {
  579. ElMessage.error(res.message || '删除失败')
  580. }
  581. } catch{
  582. // 用户取消删除
  583. }
  584. }
  585. #if($table.genTable.importTable)
  586. // 导入
  587. function onImport() {
  588. // TODO: 实现导入功能
  589. ElMessage.info('导入功能待实现')
  590. }
  591. // 导出
  592. function onExport() {
  593. // TODO: 实现导出功能
  594. ElMessage.info('导出功能待实现')
  595. }
  596. #end
  597. // 新增/修改提交
  598. async function onSubmit() {
  599. if (!dialogFormRef.value) return
  600. const isValid = await dialogFormRef.value.validate()
  601. if (!isValid) return
  602. try {
  603. #foreach($column in $columns)
  604. #if($column.htmlType == "checkbox")
  605. if (Array.isArray(state.formData.${column.javaField})) {
  606. state.formData.${column.javaField} = state.formData.${column.javaField}.join(',')
  607. }
  608. #end
  609. #end
  610. #if($table.sub)
  611. state.formData.${subclassName}List = state.${subclassName}List
  612. #end
  613. let res: Result<any>
  614. if (state.formData.${pkColumn.javaField}) {
  615. res = await update(state.formData)
  616. } else {
  617. res = await insert(state.formData)
  618. }
  619. if (res.code === SuccessResultCode) {
  620. ElMessage.success(state.formData.${pkColumn.javaField} ? '修改成功' : '新增成功')
  621. state.dialogVisible = false
  622. onPageChange(1)
  623. } else {
  624. ElMessage.error(res.message || '操作失败')
  625. }
  626. } catch (error) {
  627. console.error('提交失败:', error)
  628. ElMessage.error('操作失败')
  629. }
  630. }
  631. // 数据查询
  632. async function onLoadData() {
  633. setLoading(true)
  634. try {
  635. const query = {
  636. ...state.queryData,
  637. pageIndex: tablePagination.currentPage,
  638. pageSize: tablePagination.pageSize
  639. }
  640. const res = await getList(query)
  641. if (res.code === SuccessResultCode) {
  642. setPagination(res.data)
  643. } else {
  644. ElMessage.error(res.message || '查询失败')
  645. }
  646. } catch (error) {
  647. console.error('查询失败:', error)
  648. ElMessage.error('查询失败')
  649. } finally {
  650. setLoading(false)
  651. }
  652. }
  653. #if($table.sub)
  654. // 子表相关方法
  655. function row${subClassName}Index({ row, rowIndex }: any) {
  656. row.index = rowIndex + 1
  657. }
  658. function handleAdd${subClassName}() {
  659. const obj: any = {}
  660. #foreach($column in $subTable.columns)
  661. #if(!$column.pk && $column.javaField != ${subTableFkclassName})
  662. obj.${column.javaField} = ''
  663. #end
  664. #end
  665. state.${subclassName}List.push(obj)
  666. }
  667. function handleDelete${subClassName}() {
  668. if (state.checked${subClassName}.length === 0) {
  669. ElMessage.warning('请先选择要删除的数据')
  670. return
  671. }
  672. state.${subclassName}List = state.${subclassName}List.filter(item =>
  673. !state.checked${subClassName}.includes(item.index)
  674. )
  675. state.checked${subClassName} = []
  676. }
  677. function handle${subClassName}SelectionChange(selection: any[]) {
  678. state.checked${subClassName} = selection.map(item => item.index)
  679. }
  680. #end
  681. // 组件挂载时加载数据
  682. onMounted(() => {
  683. onLoadData()
  684. })
  685. </script>
  686. <style scoped>
  687. /* 自定义样式 */
  688. </style>