index.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <template>
  2. <CollapseContainer
  3. class="sys-container"
  4. title="个人管理"
  5. :canExpan="false"
  6. helpMessage="个人管理"
  7. >
  8. <BasicTable
  9. ref="tableRef"
  10. @register="registerTable"
  11. rowKey="id"
  12. @selectionChange="selectionChange"
  13. @rowClick="rowClick"
  14. @rowDbClick="handleEdit"
  15. showTableSetting
  16. :canResize="true"
  17. :pagination="{
  18. pageSize: 10,
  19. defaultPageSize: 10,
  20. showSizeChanger: false,
  21. }"
  22. >
  23. <template #toolbar>
  24. <a-button type="primary" @click="addRole"> 添加 </a-button>
  25. <a-button color="error" :disabled="disable_btn" @click="deleteBatches"> 删除 </a-button>
  26. <a-button @click="openModal"> 导出 </a-button>
  27. </template>
  28. <template #form-custom> custom-slot </template>
  29. <template #action="{ record }">
  30. <TableAction :actions="createActions(record)" stopButtonPropagation />
  31. </template>
  32. </BasicTable>
  33. <ExpExcelModel @register="register" @success="defaultHeader" />
  34. <Popup @register="addRegister" :popupData="popupData" @saveData="saveData" />
  35. </CollapseContainer>
  36. </template>
  37. <script lang="ts">
  38. import { defineComponent, reactive, ref, toRefs, unref, createVNode } from 'vue';
  39. import { CollapseContainer } from '/@/components/Container/index';
  40. import Popup from './popup.vue';
  41. import { useMessage } from '/@/hooks/web/useMessage';
  42. import { useModal } from '/@/components/Modal';
  43. import { jsonToSheetXlsx, ExpExcelModel, ExportModalResult } from '/@/components/Excel';
  44. import { Modal } from 'ant-design-vue';
  45. import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
  46. import { getFormConfig, columns } from './data';
  47. import moment from 'moment';
  48. import {
  49. getDuesList,
  50. addDues,
  51. deleteBatchesDues,
  52. getDues,
  53. editDues,
  54. deleteDues,
  55. copyDues,
  56. } from '/@/api/sys/money';
  57. import {
  58. BasicTable,
  59. useTable,
  60. TableAction,
  61. ActionItem,
  62. EditRecordRow,
  63. TableActionType,
  64. } from '/@/components/Table';
  65. interface PopupData {
  66. title: string;
  67. }
  68. interface Btn {
  69. disable_btn: boolean;
  70. }
  71. export default defineComponent({
  72. name: 'Dues',
  73. components: { CollapseContainer, BasicTable, TableAction, Popup, ExpExcelModel },
  74. setup() {
  75. const { createMessage } = useMessage();
  76. const { success /*, error*/ } = createMessage;
  77. const tableRef = ref<Nullable<TableActionType>>(null);
  78. const popupData = reactive<PopupData>({
  79. title: '添加',
  80. });
  81. const btn = reactive<Btn>({
  82. disable_btn: true,
  83. });
  84. const [registerTable] = useTable({
  85. rowSelection: { type: 'checkbox' },
  86. columns: columns,
  87. // clickToRowSelect: false, // 点击行不勾选
  88. api: getDuesList,
  89. useSearchForm: true,
  90. tableSetting: {
  91. redo: false,
  92. size: false,
  93. },
  94. beforeFetch: beforeFetch,
  95. afterFetch: afterFetch,
  96. formConfig: getFormConfig(),
  97. actionColumn: {
  98. width: 260,
  99. title: '操作',
  100. dataIndex: 'action',
  101. slots: { customRender: 'action' },
  102. fixed: undefined,
  103. },
  104. showIndexColumn: false,
  105. bordered: true,
  106. });
  107. const [register, { openModal }] = useModal();
  108. const [addRegister, { openModal: openPopup }] = useModal();
  109. function getTableAction() {
  110. // 获取组件
  111. const tableAction = unref(tableRef);
  112. if (!tableAction) {
  113. throw new Error('tableAction is null');
  114. }
  115. return tableAction;
  116. }
  117. // 请求之前处理
  118. function beforeFetch(params) {
  119. for (let k in params) {
  120. if (
  121. k !== 'page' &&
  122. k !== 'pageSize' &&
  123. k !== 'field' &&
  124. k !== 'order' &&
  125. k !== 'createdate'
  126. ) {
  127. if (params[k] === '') {
  128. delete params[k];
  129. } else {
  130. if (!params.filter) {
  131. params.filter = {};
  132. }
  133. if (params.createdate) {
  134. params.createdate = moment(params.createdate).format('YYYY-MM-DD');
  135. } else {
  136. delete params.createdate;
  137. }
  138. params.filter[k] = params[k];
  139. delete params[k];
  140. }
  141. }
  142. }
  143. params.filter = JSON.stringify(params.filter);
  144. params.offset = params.page;
  145. params.limit = params.pageSize;
  146. delete params.page;
  147. delete params.pageSize;
  148. }
  149. function afterFetch(result) {
  150. console.log(`result`, result);
  151. // tableData.result = result;
  152. }
  153. function addRole() {
  154. popupData.title = '添加';
  155. openPopup(true, {});
  156. }
  157. async function handleEdit(record: EditRecordRow) {
  158. popupData.title = '编辑';
  159. getDues({ id: record.id }).then((res) => {
  160. const data = res.row;
  161. console.log(`data`, data);
  162. openPopup(true, data);
  163. });
  164. }
  165. async function handleDelete(record: Recordable) {
  166. console.log(record);
  167. await deleteDues({ id: record.id }).then((res) => {
  168. console.log(res);
  169. getTableAction().reload();
  170. success('删除成功!');
  171. });
  172. }
  173. async function handleCopy(record: Recordable) {
  174. console.log(record);
  175. await copyDues({ id: record.id }).then((res) => {
  176. console.log(res);
  177. getTableAction().reload();
  178. success('复制成功!');
  179. });
  180. }
  181. function selectionChange() {
  182. const keys = getTableAction().getSelectRowKeys();
  183. if (keys.length) {
  184. btn.disable_btn = false;
  185. } else {
  186. btn.disable_btn = true;
  187. }
  188. }
  189. function rowClick() {
  190. const keys = getTableAction().getSelectRowKeys();
  191. if (keys.length) {
  192. btn.disable_btn = false;
  193. } else {
  194. btn.disable_btn = true;
  195. }
  196. }
  197. async function deleteBatches() {
  198. const keys = await getTableAction().getSelectRowKeys();
  199. const count = keys.length;
  200. const ids = keys.toString();
  201. if (!ids) {
  202. return;
  203. }
  204. Modal.confirm({
  205. title: '删除提示',
  206. icon: createVNode(ExclamationCircleOutlined),
  207. content: '确定删除选中的' + count + '项?',
  208. okText: '确定',
  209. okType: 'danger',
  210. cancelText: '取消',
  211. maskClosable: true,
  212. async onOk() {
  213. await deleteBatchesDues({ ids }).then((res) => {
  214. console.log(res);
  215. getTableAction().reload();
  216. success('删除成功!');
  217. getTableAction().setSelectedRowKeys([]);
  218. });
  219. },
  220. onCancel() {
  221. console.log('Cancel');
  222. },
  223. });
  224. }
  225. async function saveData(params: any) {
  226. const data = params.data;
  227. const closeModel = params.closeModal;
  228. console.log(`data`, data);
  229. if (!data.id) {
  230. await addDues(data).then((res) => {
  231. console.log(res);
  232. getTableAction().reload();
  233. closeModel();
  234. success('创建成功!');
  235. });
  236. console.log('----------add---');
  237. } else {
  238. await editDues(data).then((res) => {
  239. console.log(res);
  240. getTableAction().reload();
  241. closeModel();
  242. success('修改成功!');
  243. });
  244. console.log('----------edit---');
  245. }
  246. }
  247. // 导出
  248. function defaultHeader({ filename, bookType }: ExportModalResult) {
  249. // 默认Object.keys(data[0])作为header
  250. jsonToSheetXlsx({
  251. data: getTableAction().getDataSource(),
  252. filename,
  253. write2excelOpts: {
  254. bookType,
  255. },
  256. });
  257. }
  258. function createActions(record: EditRecordRow): ActionItem[] {
  259. return [
  260. {
  261. label: '编辑',
  262. icon: 'ant-design:edit-outlined',
  263. color: 'warning',
  264. onClick: handleEdit.bind(null, record),
  265. },
  266. {
  267. label: '复制',
  268. icon: 'ant-design:copy-outlined',
  269. color: 'normal',
  270. popConfirm: {
  271. title: '是否确认复制',
  272. confirm: handleCopy.bind(null, record),
  273. },
  274. },
  275. {
  276. label: '删除',
  277. color: 'error',
  278. icon: 'ic:outline-delete-outline',
  279. popConfirm: {
  280. title: '是否确认删除',
  281. confirm: handleDelete.bind(null, record),
  282. },
  283. },
  284. ];
  285. }
  286. return {
  287. popupData,
  288. tableRef,
  289. registerTable,
  290. addRole,
  291. handleEdit,
  292. deleteBatches,
  293. createActions,
  294. getTableAction,
  295. rowClick,
  296. selectionChange,
  297. addRegister,
  298. saveData,
  299. defaultHeader,
  300. openModal,
  301. register,
  302. ...toRefs(btn),
  303. };
  304. },
  305. });
  306. </script>
  307. <style>
  308. .ant-calendar-picker {
  309. width: 100%;
  310. }
  311. /* @media (max-width: 639px) {
  312. .sys-container .vben-basic-table-header__toolbar > * {
  313. padding: 6px !important;
  314. margin-right: 3px;
  315. font-size: 12px !important;
  316. }
  317. .sys-container .vben-basic-table .ant-table-wrapper {
  318. padding: 3px;
  319. }
  320. } */
  321. </style>