From 5e198de9c6a4d10a823c4869a97d5aa0a8317563 Mon Sep 17 00:00:00 2001 From: shizhongming Date: Mon, 8 Apr 2024 17:10:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=B3=BB=E7=BB=9F=E6=A8=A1=E5=9D=97-?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E7=AE=A1=E7=90=86):=20=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=B7=BB=E5=8A=A0=E7=BB=91=E5=AE=9A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=92=8C=E8=AE=A2=E9=98=85=E5=A5=97=E9=A4=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tenantManager/SysTenantListView.api.ts | 59 ++++++ .../tenantManager/SysTenantListView.config.ts | 190 ++++++++++++++++++ .../tenantManager/SysTenantListView.vue | 31 +-- .../components/TenantSetPackageModal.vue | 21 -- .../components/TenantSubscribeList.vue | 136 +++++++++++++ .../components/TenantUserList.vue | 11 +- .../views/tenant/tenantManager/lang/zh_CN.ts | 7 + .../SysTenantPackageListView.config.ts | 1 + 8 files changed, 407 insertions(+), 49 deletions(-) delete mode 100644 src/modules/smart-system/views/tenant/tenantManager/components/TenantSetPackageModal.vue create mode 100644 src/modules/smart-system/views/tenant/tenantManager/components/TenantSubscribeList.vue diff --git a/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.api.ts b/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.api.ts index d4e5f7d74..1996c7a5a 100644 --- a/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.api.ts +++ b/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.api.ts @@ -11,6 +11,12 @@ enum Api { listNoBindUser = '/sys/tenant/manager/listNoBindUser', bindTenantUser = '/sys/tenant/manager/bindTenantUser', removeBindUser = '/sys/tenant/manager/removeBindUser', + + listSubscribe = '/sys/tenant/subscribe/listWithPackage', + setSubscribeUseYn = '/sys/tenant/subscribe/setUseYn', + getSubscribeById = '/sys/tenant/subscribe/getById', + batchSaveUpdateSubscribe = '/sys/tenant/subscribe/saveUpdateBatch', + listNoBindPackageByTenantId = '/sys/tenant/manager/listNoBindPackageByTenantId', } export const listApi = (params) => { @@ -104,3 +110,56 @@ export const removeBindUserApi = (data) => { data, }); }; + +export const listSubscribeApi = (params) => { + return defHttp.post({ + service: ApiServiceEnum.SMART_SYSTEM, + url: Api.listSubscribe, + data: { + ...params, + }, + }); +}; + +export const setSubscribeUseYnApi = (rows: any[], useYn: boolean) => { + return defHttp.post({ + service: ApiServiceEnum.SMART_SYSTEM, + url: Api.setSubscribeUseYn, + data: { + idList: rows.map((item) => item.id), + useYn, + }, + }); +}; + +export const getSubscribeByIdApi = (id: number) => { + return defHttp.post({ + service: ApiServiceEnum.SMART_SYSTEM, + url: Api.getSubscribeById, + data: id, + }); +}; + +/** + * 根据租户ID查询没有绑定的套餐 + * @param data + */ +export const listNoBindPackageByTenantIdApi = (data) => { + return defHttp.post({ + service: ApiServiceEnum.SMART_SYSTEM, + url: Api.listNoBindPackageByTenantId, + data, + }); +}; + +/** + * 根据租户ID查询没有绑定的套餐 + * @param data + */ +export const batchSaveUpdateSubscribeApi = (data: Recordable) => { + return defHttp.post({ + service: ApiServiceEnum.SMART_SYSTEM, + url: Api.batchSaveUpdateSubscribe, + data, + }); +}; diff --git a/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.config.ts b/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.config.ts index 5cb4c2edf..0692789b0 100644 --- a/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.config.ts +++ b/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.config.ts @@ -3,11 +3,17 @@ import type { FormSchema } from '@/components/Form'; import { tableUseYnClass } from '@/components/SmartTable'; import { Ref, unref } from 'vue'; +import { listNoBindPackageByTenantIdApi } from './SysTenantListView.api'; + export enum Permission { save = 'sys:tenant:manager:save', update = 'sys:tenant:manager:update', delete = 'sys:tenant:manager:delete', useYn = 'sys:tenant:manager:setUseYn', + bindUser = 'sys:tenant:manager:bindUser', + subscribeAddUpdate = 'sys:tenant:manager:subscribe:addUpdate', + subscribeDelete = 'sys:tenant:manager:subscribe:delete', + subscribeSetUseYn = 'sys:tenant:manager:subscribe:setUseYn', } export const SYSTEM_TENANT_TYPE_DICT = 'SYSTEM_TENANT_TYPE'; @@ -433,3 +439,187 @@ export const getBindUserModalListColumns = (): SmartColumn[] => { }, ]; }; + +export const getSubscribeTableColumns = (): SmartColumn[] => { + return [ + { + type: 'checkbox', + width: 60, + align: 'center', + fixed: 'left', + field: 'checkbox', + }, + { + field: 'packageId', + title: '{system.views.tenant.manager.title.subscribe.packageId}', + width: 200, + formatter({ row }) { + const tenantPackage = row.tenantPackage; + if (!tenantPackage) { + return ''; + } + return `${tenantPackage.packageCode || ''} - ${tenantPackage.packageName || ''}`; + }, + }, + { + field: 'effectTime', + sortable: true, + title: '{system.views.tenant.manager.title.subscribe.effectTime}', + width: 165, + }, + { + field: 'expireTime', + sortable: true, + title: '{system.views.tenant.manager.title.subscribe.expireTime}', + width: 165, + }, + { + field: 'remark', + title: '{common.table.remark}', + minWidth: 200, + }, + { + field: 'userNumber', + sortable: true, + title: '{system.views.tenant.manager.title.subscribe.userNumber}', + width: 120, + }, + { + ...tableUseYnClass(), + width: 120, + }, + { + field: 'createTime', + title: '{common.table.createTime}', + width: 165, + }, + { + field: 'createBy', + title: '{common.table.createUser}', + width: 120, + }, + { + field: 'updateTime', + title: '{common.table.updateTime}', + width: 165, + }, + { + field: 'updateBy', + title: '{common.table.updateUser}', + width: 120, + }, + ]; +}; + +/** + * 添加修改表单 + */ +export const getSubscribeFormSchemas = (t: Function, tenantIdRef: Ref): FormSchema[] => { + return [ + { + field: 'id', + label: t('system.views.tenant.manager.title.subscribe.id'), + component: 'Input', + show: false, + componentProps: {}, + }, + { + field: 'isAdd', + label: '', + component: 'Switch', + show: false, + }, + { + field: 'packageId', + label: t('system.views.tenant.manager.title.subscribe.packageId'), + component: 'SmartPulldownTable', + dynamicDisabled({ model }) { + const isAdd = model.isAdd; + return isAdd === false; + }, + componentProps: () => { + return { + alwaysLoad: true, + transfer: true, + showFunction: (row) => `${row.packageCode}-${row.packageName}`, + valueField: 'id', + tableProps: { + border: true, + columns: [ + { + field: 'packageCode', + sortable: true, + title: '{system.views.tenant.package.title.packageCode}', + width: 120, + }, + { + field: 'packageName', + title: '{system.views.tenant.package.title.packageName}', + width: 120, + }, + { + field: 'effectTime', + sortable: true, + title: '{system.views.tenant.package.title.effectTime}', + width: 165, + }, + { + field: 'expireTime', + sortable: true, + title: '{system.views.tenant.package.title.expireTime}', + width: 165, + }, + { + field: 'remark', + title: '{common.table.remark}', + minWidth: 120, + }, + { + ...tableUseYnClass(), + width: 120, + }, + ], + proxyConfig: { + ajax: { + async query({ ajaxParameter }) { + const tenantId = unref(tenantIdRef); + if (!tenantId) { + return []; + } + return listNoBindPackageByTenantIdApi({ + ...ajaxParameter, + id: tenantId, + }); + }, + }, + }, + }, + }; + }, + }, + { + field: 'times', + label: t('system.views.tenant.manager.title.subscribe.effectTime'), + component: 'RangePicker', + componentProps: { + showTime: true, + }, + required: true, + }, + + { + field: 'userNumber', + label: t('system.views.tenant.manager.title.subscribe.userNumber'), + component: 'InputNumber', + componentProps: {}, + required: true, + defaultValue: 1000, + }, + { + field: 'remark', + label: t('common.table.remark'), + component: 'InputTextArea', + componentProps: {}, + }, + ]; +}; diff --git a/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.vue b/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.vue index 34ea7b6a2..46a13f6de 100644 --- a/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.vue +++ b/src/modules/smart-system/views/tenant/tenantManager/SysTenantListView.vue @@ -20,11 +20,12 @@ - + + + - @@ -34,7 +35,6 @@ import { useSizeSetting } from '@/hooks/setting/UseSizeSetting'; import { SmartTable, useSmartTable } from '@/components/SmartTable'; - import { useModal } from '@/components/Modal'; import { getFormSchemas, @@ -53,20 +53,17 @@ } from './SysTenantListView.api'; import { useInjectPageDict } from '@/components/SmartPageProvider'; import { computed, onMounted, ref, unref } from 'vue'; - import { warnMessage } from '@/utils/message/SystemNotice'; import { SmartLayoutSeparate } from '@/components/SmartLayoutSeparate'; import { useDesign } from '@/hooks/web/useDesign'; - import TenantSetPackageModal from './components/TenantSetPackageModal.vue'; import TenantUserList from './components/TenantUserList.vue'; + import TenantSubscribeList from './components/TenantSubscribeList.vue'; const { prefixCls } = useDesign('system-tenant-manager'); const { t } = useI18n(); const { getTableSize } = useSizeSetting(); - const [registerSetPackageModal, { openModal }] = useModal(); - const isolationStrategyListRef = ref([]); const computedIsolationStrategyMap = computed(() => { return mapValues(keyBy(unref(isolationStrategyListRef), 'value'), 'label'); @@ -81,12 +78,12 @@ }); onMounted(() => pageDictRegister(SYSTEM_TENANT_TYPE_DICT)); - const currentTenantRef = ref(null); + const currentTenantRef = ref(null); const handleCurrentChange = ({ row }) => { currentTenantRef.value = row; }; - const [registerTable, { getCheckboxRecords }] = useSmartTable({ + const [registerTable] = useSmartTable({ id: 'system-tenant-manager', columns: getTableColumns(), height: 'auto', @@ -170,22 +167,6 @@ code: 'useYnFalse', auth: Permission.useYn, }, - { - name: t('system.views.tenant.manager.title.setPackage'), - customRender: 'ant', - props: { - preIcon: 'ant-design:setting-outlined', - type: 'primary', - onClick: () => { - const selectRows = getCheckboxRecords(); - if (!selectRows || selectRows.length !== 1) { - warnMessage(t('system.views.tenant.manager.message.selectOneRow')); - return false; - } - openModal(true, { tenantId: selectRows[0].id }); - }, - }, - }, ], }, }); diff --git a/src/modules/smart-system/views/tenant/tenantManager/components/TenantSetPackageModal.vue b/src/modules/smart-system/views/tenant/tenantManager/components/TenantSetPackageModal.vue deleted file mode 100644 index 20923a4c0..000000000 --- a/src/modules/smart-system/views/tenant/tenantManager/components/TenantSetPackageModal.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/src/modules/smart-system/views/tenant/tenantManager/components/TenantSubscribeList.vue b/src/modules/smart-system/views/tenant/tenantManager/components/TenantSubscribeList.vue new file mode 100644 index 000000000..a11df4262 --- /dev/null +++ b/src/modules/smart-system/views/tenant/tenantManager/components/TenantSubscribeList.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/src/modules/smart-system/views/tenant/tenantManager/components/TenantUserList.vue b/src/modules/smart-system/views/tenant/tenantManager/components/TenantUserList.vue index 92cb960d5..2d38a1865 100644 --- a/src/modules/smart-system/views/tenant/tenantManager/components/TenantUserList.vue +++ b/src/modules/smart-system/views/tenant/tenantManager/components/TenantUserList.vue @@ -12,11 +12,16 @@ import { useSizeSetting } from '@/hooks/setting/UseSizeSetting'; import { useModal } from '@/components/Modal'; - import { getTabUserListColumns, getTabUserListSearchSchemas } from '../SysTenantListView.config'; + import { + getTabUserListColumns, + getTabUserListSearchSchemas, + Permission, + } from '../SysTenantListView.config'; import { listTenantUserApi, removeBindUserApi } from '../SysTenantListView.api'; import { useDesign } from '@/hooks/web/useDesign'; import { useI18n } from '@/hooks/web/useI18n'; import TenantAddUserModal from './TenantAddUserModal.vue'; + import { hasPermission } from '@/utils/auth'; const props = defineProps({ tenantId: propTypes.number, @@ -98,7 +103,7 @@ props: computed(() => { return { onClick: () => openAddUserModal(true, { tenantId: props.tenantId }), - disabled: !unref(computedChoseTenant), + disabled: !unref(computedChoseTenant) || !hasPermission(Permission.bindUser), }; }), }, @@ -106,7 +111,7 @@ code: 'delete', props: computed(() => { return { - disabled: !unref(computedChoseTenant), + disabled: !unref(computedChoseTenant) || !hasPermission(Permission.bindUser), }; }), }, diff --git a/src/modules/smart-system/views/tenant/tenantManager/lang/zh_CN.ts b/src/modules/smart-system/views/tenant/tenantManager/lang/zh_CN.ts index 9b197e45d..c8db8379b 100644 --- a/src/modules/smart-system/views/tenant/tenantManager/lang/zh_CN.ts +++ b/src/modules/smart-system/views/tenant/tenantManager/lang/zh_CN.ts @@ -33,6 +33,13 @@ export default { bindTime: '绑定时间', bindBy: '绑定人', }, + subscribe: { + tenantId: '租户', + packageId: '套餐包', + effectTime: '生效日期', + expireTime: '失效日期', + userNumber: '用户数', + }, }, validate: { tenantCode: '请输入租户编号', diff --git a/src/modules/smart-system/views/tenant/tenantPackage/SysTenantPackageListView.config.ts b/src/modules/smart-system/views/tenant/tenantPackage/SysTenantPackageListView.config.ts index e4c52e357..087f0838c 100644 --- a/src/modules/smart-system/views/tenant/tenantPackage/SysTenantPackageListView.config.ts +++ b/src/modules/smart-system/views/tenant/tenantPackage/SysTenantPackageListView.config.ts @@ -117,6 +117,7 @@ export const getFormSchemas = (t: Function): FormSchema[] => { componentProps: { showTime: true, }, + required: true, }, { field: 'seq',