SubaccountModal.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="register"
  5. title="子账号"
  6. @ok="saveTable"
  7. width="600px"
  8. @visible-change="handleVisibleChange"
  9. >
  10. <div class="pt-3px pr-3px">
  11. <BasicForm @register="registerForm" :model="modelRef">
  12. <template #userName="{ model, field }">
  13. {{ model[field] }}
  14. </template>
  15. <template #name="{ model, field }">
  16. {{ model[field] }}
  17. </template>
  18. <template #addeduser>
  19. {{ myData.pagination.total || 0 }}
  20. <a-button @click="openTargetModal()" type="primary" preIcon="ic:outline-person-add">
  21. 新增子账号
  22. </a-button>
  23. </template>
  24. </BasicForm>
  25. <div class="table_list">
  26. <BasicTable
  27. title="子账户列表"
  28. ref="tableRef"
  29. rowKey="id"
  30. :columns="columns"
  31. :showIndexColumn="false"
  32. :dataSource="myData.TableData"
  33. :bordered="true"
  34. :pagination="false"
  35. :beforeEditSubmit="beforeEditSubmit"
  36. >
  37. <template #action="{ record }">
  38. <TableAction
  39. :actions="[
  40. // {
  41. // label: '编辑',
  42. // icon: 'mdi:account-edit-outline',
  43. // onClick: handleDelete.bind(null, record, 'edit'),
  44. // },
  45. {
  46. label: '解绑',
  47. icon: 'mdi:account-multiple-remove-outline',
  48. onClick: handleDelete.bind(null, record, 'unbond'),
  49. },
  50. ]"
  51. />
  52. </template>
  53. </BasicTable>
  54. <AddModal @register="register4" @addtable="addTabledata" />
  55. </div>
  56. </div>
  57. <EditModal @register="registerEdit" />
  58. </BasicModal>
  59. </template>
  60. <script lang="ts">
  61. import {
  62. defineComponent,
  63. ref,
  64. reactive,
  65. nextTick,
  66. onMounted,
  67. unref,
  68. ComponentOptions,
  69. shallowRef,
  70. computed,
  71. inject,
  72. } from 'vue';
  73. import { BasicModal, useModalInner, useModal } from '/@/components/Modal';
  74. import { BasicTable, BasicColumn, TableAction, TableActionType } from '/@/components/Table';
  75. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  76. import { selectUserList, saveSubUsers } from '/@/api/corporation/modal';
  77. import { useMessage } from '/@/hooks/web/useMessage';
  78. import EditModal from './EditModal.vue';
  79. import { tableState } from './types/hooks';
  80. import AddModal from './AddModal.vue';
  81. import { useI18n } from '/@/hooks/web/useI18n';
  82. export default defineComponent({
  83. components: { BasicModal, BasicForm, BasicTable, AddModal, TableAction, EditModal },
  84. props: {
  85. userData: { type: Object },
  86. },
  87. emits: ['addtable', 'register'],
  88. setup(props) {
  89. const { t } = useI18n();
  90. const { createConfirm, createMessage } = useMessage();
  91. const currentModal = shallowRef<Nullable<ComponentOptions>>(null);
  92. const tableRef = ref<Nullable<TableActionType>>(null);
  93. const [register4, { openModal: addopenModal }] = useModal();
  94. const modelRef = ref({});
  95. const reload = inject('tablereload');
  96. // const editList = ref({
  97. // list:[]
  98. // })
  99. const myData = reactive<tableState>({
  100. TableData: [],
  101. subNum: null,
  102. id: null,
  103. pagination: {
  104. total: 0,
  105. pageSize: 9999,
  106. current: 1,
  107. },
  108. });
  109. const getPagination = computed(() => {
  110. const { total, pageSize, current } = myData.pagination;
  111. return {
  112. total: total,
  113. pageSize,
  114. //size: 'small',
  115. current: unref(current),
  116. onChange(page) {
  117. myData.pagination.current = page;
  118. getApiList();
  119. },
  120. };
  121. });
  122. const columns: BasicColumn[] = [
  123. {
  124. title: t('common.fullName'),
  125. dataIndex: 'nickName',
  126. edit: true,
  127. editRule: true,
  128. width: 200,
  129. },
  130. {
  131. title: t('sys.login.email'),
  132. edit: true,
  133. editRule: true,
  134. width: 200,
  135. dataIndex: 'userName',
  136. },
  137. {
  138. title: t('common.operating'),
  139. dataIndex: '',
  140. slots: { customRender: 'action' },
  141. width: 100,
  142. },
  143. ];
  144. const schemas: FormSchema[] = [
  145. {
  146. field: 'managerPhone',
  147. component: 'Input',
  148. label: t('routes.corporation.rechargeId'),
  149. slot: 'userName',
  150. labelWidth: 200,
  151. },
  152. {
  153. field: 'companyName',
  154. label: t('routes.corporation.enterpriseId'),
  155. slot: 'name',
  156. component: 'Input',
  157. labelWidth: 200,
  158. },
  159. {
  160. field: 'subNum',
  161. component: 'InputNumber',
  162. label: t('routes.devices.subNum'),
  163. labelWidth: 200,
  164. componentProps: () => {
  165. return {
  166. // xxxx props schema, tableAction, formModel checkDevice
  167. min: 0,
  168. onChange: numOnChange,
  169. };
  170. },
  171. },
  172. {
  173. field: 'addeduser',
  174. label: t('routes.devices.addeduser'),
  175. labelWidth: 200,
  176. slot: 'addeduser',
  177. component: 'Input',
  178. },
  179. ];
  180. const [
  181. registerForm,
  182. {
  183. setFieldsValue,
  184. resetFields,
  185. // setProps,
  186. },
  187. ] = useForm({
  188. labelWidth: 120,
  189. schemas,
  190. showActionButtonGroup: false,
  191. actionColOptions: {
  192. span: 24,
  193. },
  194. });
  195. const [registerEdit, { openModal: EditModal }] = useModal();
  196. const [register, { closeModal }] = useModalInner((data) => {
  197. data && onDataReceive(data);
  198. });
  199. function onDataReceive(data) {
  200. console.log('Data Received', data.record);
  201. // 方式1;
  202. let { id, subNum } = data.record;
  203. resetFields();
  204. setFieldsValue({
  205. ...data.record,
  206. });
  207. myData.id = id;
  208. myData.subNum = subNum;
  209. getApiList();
  210. }
  211. function numOnChange(event) {
  212. myData.subNum = event;
  213. console.log('numOnChange', event);
  214. }
  215. async function handleDelete(item, type) {
  216. console.log('handleDelete', item, type);
  217. if (type == 'edit') {
  218. //编辑
  219. const { memoName, phone } = item;
  220. EditModal(true, {
  221. memoName,
  222. phone,
  223. });
  224. } else {
  225. //解除
  226. createConfirm({
  227. iconType: 'warning',
  228. title: '提示',
  229. content: t('routes.devices.unbindWarning'),
  230. onOk: async () => {
  231. tableRef.value.deleteTableDataRecord(item.id);
  232. },
  233. });
  234. }
  235. }
  236. function pageChange(page, d, a) {
  237. console.log('pageChange', page, d, a);
  238. myData.pagination.current = page;
  239. getApiList();
  240. }
  241. async function getApiList() {
  242. const { current, pageSize } = myData.pagination;
  243. let res = await selectUserList({
  244. id: myData.id,
  245. page: current || 1,
  246. limit: pageSize || 10,
  247. });
  248. myData.TableData = res.list || [];
  249. myData.pagination.total = res.totalCount || 0;
  250. console.log('selectUserList', res, myData);
  251. }
  252. async function beforeEditSubmit({ _, index, key, value }) {
  253. myData.TableData[index][key] = value;
  254. return true;
  255. }
  256. function handleVisibleChange(v) {
  257. v && props.userData && nextTick(() => onDataReceive(props.userData));
  258. }
  259. function openTargetModal() {
  260. console.log('openTargetModal');
  261. addopenModal(true, {
  262. addList: (val) => {
  263. console.log('addList', val, myData.subNum > myData.pagination.total);
  264. if (myData.subNum > myData.pagination.total) {
  265. myData.TableData.push(val);
  266. console.log('addList', val, myData.TableData);
  267. } else {
  268. createMessage.error(t('routes.devices.excess'));
  269. }
  270. },
  271. });
  272. }
  273. async function saveTable() {
  274. let tableData = tableRef.value.getDataSource() || [];
  275. let res = await saveSubUsers({
  276. id: myData.id,
  277. subNum: myData.subNum,
  278. subUsers: tableData,
  279. });
  280. console.log('saveTable', res);
  281. createMessage.success(t('common.o'));
  282. reload();
  283. closeModal();
  284. }
  285. function addTabledata(val) {
  286. console.log('addTabledata', val);
  287. }
  288. onMounted(async () => {
  289. myData.id && getApiList();
  290. });
  291. return {
  292. tableRef,
  293. register,
  294. handleDelete,
  295. registerEdit,
  296. numOnChange,
  297. getApiList,
  298. pageChange,
  299. myData,
  300. getPagination,
  301. schemas,
  302. columns,
  303. registerForm,
  304. modelRef,
  305. handleVisibleChange,
  306. beforeEditSubmit,
  307. register4,
  308. openTargetModal,
  309. currentModal,
  310. addopenModal,
  311. saveTable,
  312. closeModal,
  313. addTabledata,
  314. reload,
  315. t,
  316. };
  317. },
  318. });
  319. </script>