index.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <div :class="prefixCls" class="device-manager-box">
  3. <BasicTable @register="registerTable" :rowSelection="rowSelection">
  4. <!--插槽:table标题-->
  5. <template #tableTitle>
  6. <a-button type="primary" preIcon="ant-design:plus-outlined" @click="onAdd">新增</a-button>
  7. <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
  8. <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
  9. <a-dropdown v-if="showBatchBtn">
  10. <template #overlay>
  11. <a-menu>
  12. <a-menu-item key="1" @click="onDeleteBatch">
  13. <Icon icon="ant-design:delete-outlined"></Icon>
  14. <span>删除</span>
  15. </a-menu-item>
  16. </a-menu>
  17. </template>
  18. <a-button>
  19. <span>批量操作</span>
  20. <Icon icon="mdi:chevron-down"></Icon>
  21. </a-button>
  22. </a-dropdown>
  23. </template>
  24. <!--操作栏-->
  25. <template #action="{ record }">
  26. <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
  27. </template>
  28. </BasicTable>
  29. <TemplateModal @register="registerModal" @success="reload" />
  30. <TemplateTestModal @register="registerTestModal" />
  31. </div>
  32. </template>
  33. <script lang="ts" setup name="message-template">
  34. import { unref, computed, toRaw } from 'vue';
  35. import { ActionItem, BasicTable, TableAction } from '/@/components/Table';
  36. import { useModal } from '/@/components/Modal';
  37. import { useListPage } from '/@/hooks/system/useListPage';
  38. import TemplateModal from './TemplateModal.vue';
  39. import TemplateTestModal from './TemplateTestModal.vue';
  40. import { Api, saveOrUpdate, list, deleteBatch } from './template.api';
  41. import { columns, searchFormSchema } from './template.data';
  42. import { useMessage } from '/@/hooks/web/useMessage';
  43. const { createMessage } = useMessage();
  44. // 列表页面公共参数、方法
  45. const { prefixCls, onExportXls, onImportXls, tableContext } = useListPage({
  46. designScope: 'message-template',
  47. tableProps: {
  48. title: '消息中心模板列表数据',
  49. api: list,
  50. columns: columns,
  51. formConfig: {
  52. schemas: searchFormSchema,
  53. },
  54. },
  55. exportConfig: {
  56. url: Api.exportXls,
  57. name: '消息中心模板列表',
  58. },
  59. importConfig: {
  60. url: Api.importXls,
  61. success: () => reload(),
  62. },
  63. });
  64. // 注册 ListTable
  65. const [registerTable, { reload, setLoading }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;
  66. const [registerModal, { openModal }] = useModal();
  67. const [registerTestModal, testModal] = useModal();
  68. const showBatchBtn = computed(() => selectedRowKeys.value.length > 0);
  69. function onAdd() {
  70. openModal(true, {
  71. title: '新增消息模板',
  72. isUpdate: false,
  73. record: {},
  74. });
  75. }
  76. function onEdit(record) {
  77. if (record.useStatus === '1') {
  78. createMessage.warning('此模板已被应用,禁止编辑!');
  79. return;
  80. }
  81. openModal(true, {
  82. title: '修改消息模板',
  83. isUpdate: true,
  84. record: record,
  85. });
  86. }
  87. function onDelete(record) {
  88. if (record) {
  89. //update-begin-author:taoyan date:2022-7-14 for: VUEN-1652【bug】应用状态下不允许删除
  90. if(record.useStatus == '1'){
  91. createMessage.warning('该模板已被应用禁止删除!');
  92. return;
  93. }
  94. //update-end-author:taoyan date:2022-7-14 for: VUEN-1652【bug】应用状态下不允许删除
  95. doDeleteDepart([record.id], false);
  96. }
  97. }
  98. /**
  99. * 根据 ids 批量删除
  100. * @param idListRef array
  101. * @param confirm 是否显示确认提示框
  102. */
  103. async function doDeleteDepart(idListRef, confirm = true) {
  104. const idList = unref(idListRef);
  105. if (idList.length > 0) {
  106. try {
  107. setLoading(true);
  108. await deleteBatch({ ids: idList.join(',') }, confirm);
  109. await reload();
  110. } finally {
  111. setLoading(false);
  112. }
  113. }
  114. }
  115. async function onDeleteBatch() {
  116. try {
  117. //update-begin-author:taoyan date:2022-7-14 for: VUEN-1652【bug】应用状态下不允许删除
  118. let arr = toRaw(selectedRows.value);
  119. let temp = arr.filter(item=>item.useStatus=='1')
  120. if(temp.length>0){
  121. createMessage.warning('选中的模板已被应用禁止删除!');
  122. return;
  123. }
  124. //update-end-author:taoyan date:2022-7-14 for: VUEN-1652【bug】应用状态下不允许删除
  125. await doDeleteDepart(selectedRowKeys);
  126. selectedRowKeys.value = [];
  127. } finally {
  128. }
  129. }
  130. // 发送消息测试
  131. function onSendTest(record) {
  132. testModal.openModal(true, { record });
  133. }
  134. /**
  135. * 操作栏
  136. */
  137. function getTableAction(record): ActionItem[] {
  138. return [{ label: '编辑', onClick: onEdit.bind(null, record) }];
  139. }
  140. /**
  141. * 下拉操作栏
  142. */
  143. function getDropDownAction(record): ActionItem[] {
  144. return [
  145. { label: '应用', onClick: handleUse.bind(null, record) },
  146. { label: '停用', onClick: handleNotUse.bind(null, record) },
  147. { label: '发送测试', onClick: onSendTest.bind(null, record) },
  148. {
  149. label: '删除',
  150. color: 'error',
  151. popConfirm: {
  152. title: '确认要删除吗?',
  153. confirm: onDelete.bind(null, record),
  154. },
  155. },
  156. ];
  157. }
  158. /**
  159. * 应用
  160. */
  161. async function handleUse(record) {
  162. let param = { id: record.id, useStatus: '1' };
  163. await saveOrUpdate(param, true);
  164. await reload();
  165. }
  166. /**
  167. * 停用
  168. */
  169. async function handleNotUse(record) {
  170. let param = { id: record.id, useStatus: '0' };
  171. await saveOrUpdate(param, true);
  172. await reload();
  173. }
  174. </script>
  175. <style lang="less">
  176. @import 'index';
  177. </style>