From c85c2d49dcab5de90a2ff78cd1ae07a6e3bcd675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AE=B6=E4=B8=9C?= <1654135867@qq.com> Date: Tue, 27 Aug 2024 10:58:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=99=E5=B8=88=E5=BA=93?= =?UTF-8?q?=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/system/userTEA/PasswordModal.vue | 42 + .../views/system/userTEA/UserAgentModal.vue | 45 + .../src/views/system/userTEA/UserDrawer.vue | 184 +++++ .../system/userTEA/UserQuitAgentModal.vue | 68 ++ .../views/system/userTEA/UserQuitModal.vue | 110 +++ .../system/userTEA/UserRecycleBinModal.vue | 138 ++++ .../src/views/system/userTEA/index.vue | 277 +++++++ .../src/views/system/userTEA/user.api.ts | 301 +++++++ .../src/views/system/userTEA/user.data.ts | 604 ++++++++++++++ .../src/views/system/userTEA/userDetails.vue | 54 ++ .../src/views/system/userTEA/userZJ.api.ts | 272 ++++++ .../src/views/system/userTEA/userZJ.data.ts | 771 ++++++++++++++++++ 12 files changed, 2866 insertions(+) create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/PasswordModal.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/UserAgentModal.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/UserDrawer.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/UserQuitAgentModal.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/UserQuitModal.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/UserRecycleBinModal.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/index.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/user.api.ts create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/user.data.ts create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/userDetails.vue create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/userZJ.api.ts create mode 100644 jeecgboot-vue3-master/src/views/system/userTEA/userZJ.data.ts diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/PasswordModal.vue b/jeecgboot-vue3-master/src/views/system/userTEA/PasswordModal.vue new file mode 100644 index 00000000..28267fe5 --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/PasswordModal.vue @@ -0,0 +1,42 @@ + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/UserAgentModal.vue b/jeecgboot-vue3-master/src/views/system/userTEA/UserAgentModal.vue new file mode 100644 index 00000000..f191b996 --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/UserAgentModal.vue @@ -0,0 +1,45 @@ + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/UserDrawer.vue b/jeecgboot-vue3-master/src/views/system/userTEA/UserDrawer.vue new file mode 100644 index 00000000..2391706c --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/UserDrawer.vue @@ -0,0 +1,184 @@ + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/UserQuitAgentModal.vue b/jeecgboot-vue3-master/src/views/system/userTEA/UserQuitAgentModal.vue new file mode 100644 index 00000000..f54a1e6c --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/UserQuitAgentModal.vue @@ -0,0 +1,68 @@ + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/UserQuitModal.vue b/jeecgboot-vue3-master/src/views/system/userTEA/UserQuitModal.vue new file mode 100644 index 00000000..70ca45a3 --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/UserQuitModal.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/UserRecycleBinModal.vue b/jeecgboot-vue3-master/src/views/system/userTEA/UserRecycleBinModal.vue new file mode 100644 index 00000000..6c96bcbc --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/UserRecycleBinModal.vue @@ -0,0 +1,138 @@ + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/index.vue b/jeecgboot-vue3-master/src/views/system/userTEA/index.vue new file mode 100644 index 00000000..1354a90d --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/index.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/user.api.ts b/jeecgboot-vue3-master/src/views/system/userTEA/user.api.ts new file mode 100644 index 00000000..d79d67d1 --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/user.api.ts @@ -0,0 +1,301 @@ +import { defHttp } from '/src/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + listNoCareTenant = '/sys/user/listAll', + listZjNoCareTenant = '/sys/user/listTEAAll', + listzdzx = '/sys/user/listzdzx', + list = '/sys/user/list', + save = '/sys/user/add', + edit = '/sys/user/edit', + saveZJ = '/seteacher/seteacher/addTEA', + editZJ = '/expert/expert/editZJ', + queryExpertById = '/expert/expert/queryById', + agentSave = '/sys/sysUserAgent/add', + agentEdit = '/sys/sysUserAgent/edit', + getUserRole = '/sys/user/queryUserRole', + duplicateCheck = '/sys/duplicate/check', + deleteUser = '/sys/user/delete', + deleteBatch = '/sys/user/deleteBatch', + importExcel = '/sys/user/importExcel', + exportXls = '/sys/user/exportXls', + + recycleBinList = '/sys/user/recycleBin', + putRecycleBin = '/sys/user/putRecycleBin', + deleteRecycleBin = '/sys/user/deleteRecycleBin', + allRolesList = '/sys/role/queryall', + allRolesListNoByTenant = '/sys/role/queryallNoByTenant', + allRolesListExcludeByTenant = '/sys/role/queryallExcludeByTenant', + allTenantList = '/sys/tenant/queryList', + allPostList = '/sys/position/list', + userDepartList = '/sys/user/userDepartList', + changePassword = '/sys/user/changePassword', + frozenBatch = '/sys/user/frozenBatch', + getUserAgent = '/sys/sysUserAgent/queryByUserName', + syncUser = '/act/process/extActProcess/doSyncUser', + userQuitAgent = '/sys/user/userQuitAgent', + getQuitList = '/sys/user/getQuitList', + putCancelQuit = '/sys/user/putCancelQuit', + updateUserTenantStatus='/sys/tenant/updateUserTenantStatus', + getUserTenantPageList='/sys/tenant/getUserTenantPageList', + exportXlsMb = '/sys/user/exportXlsMb', + //导出专家 + exportZjXls = '/expert/expert/exportXls', + //导出专家模板 + exportZjXlsMb = '/expert/expert/exportXlsMb', + //导入专家 + getZjImportUrl = '/expert/expert/importExcel', + + queryByUserId = '/expert/expert/queryByUserId', +} +/** + * 根据userid判断是否为专家 + * @param params + */ +export const queryByUserId = (params) => { + return defHttp.get({ url: Api.queryByUserId, params },{ successMessageMode: 'none' }); +}; +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +export const getExportUrlMb = Api.exportXlsMb; + +/** + * 导出 专家 + */ +export const getExportZjUrl = Api.exportZjXls; +/** + * 导出 专家模板 + */ +export const getExportZjUrlMb = Api.exportZjXlsMb; +/** + * 导入 专家 + */ +export const getZjImportUrl = Api.getZjImportUrl; +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口(查询用户,通过租户隔离) + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 列表接口(查询全部用户,不通过租户隔离) + * @param params + */ +export const listNoCareTenant = (params) => defHttp.get({ url: Api.listNoCareTenant, params }); + +/** + * 列表接口(查询角色为“专家”,不通过租户隔离) + * @param params + */ +export const listZjNoCareTenant = (params) => defHttp.get({ url: Api.listZjNoCareTenant, params }); + + +/** + * 列表接口(查询全部用户,不通过租户隔离) + * 适用于专家、学生、组委会查看自己的信息 + * @param params + */ +export const listzdzx = (params) => defHttp.get({ url: Api.listzdzx, params }); + +/** + * 用户角色接口 + * @param params + */ +export const getUserRoles = (params) => defHttp.get({ url: Api.getUserRole, params }, { errorMessageMode: 'none' }); +/** + * 专家信息接口 + * @param params + */ +export const queryExpertById = (params) => defHttp.get({ url: Api.queryExpertById, params }, { successMessageMode: 'none' }); + + +/** + * 删除用户 + */ +export const deleteUser = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteUser, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除用户 + * @param params + */ +export const batchDeleteUser = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新用户 + * @param params + */ +export const saveOrUpdateUser = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; +/** + * 保存或者更新专家用户 + * @param params + */ +export const saveOrUpdateUserZJ = (params, isUpdate) => { + let url = isUpdate ? Api.editZJ : Api.saveZJ; + return defHttp.post({ url: url, params }); +}; +/** + * 唯一校验 + * @param params + */ +export const duplicateCheck = (params) => defHttp.get({ url: Api.duplicateCheck, params }, { isTransformResponse: false }); +/** + * 获取全部角色(租户隔离) + * @param params + */ +export const getAllRolesList = (params) => defHttp.get({ url: Api.allRolesList, params }); +/** + * 获取全部角色(不租户隔离) + * @param params + */ +export const getAllRolesListNoByTenant = (params) => defHttp.get({ url: Api.allRolesListNoByTenant, params }); + + +/** + * 获取角色(排除:总管理) + * @param params + */ +export const getAllRolesListNoByExcludeTenant = (params) => defHttp.get({ url: Api.allRolesListExcludeByTenant, params }); + + +/** + * 获取全部租户 + */ +export const getAllTenantList = (params) => defHttp.get({ url: Api.allTenantList, params }); +/** + * 获取指定用户负责部门 + */ +export const getUserDepartList = (params) => defHttp.get({ url: Api.userDepartList, params }, { successMessageMode: 'none' }); +/** + * 获取全部职务 + */ +export const getAllPostList = (params) => { + return new Promise((resolve) => { + defHttp.get({ url: Api.allPostList, params }).then((res) => { + resolve(res.records); + }); + }); +}; +/** + * 回收站列表 + * @param params + */ +export const getRecycleBinList = (params) => defHttp.get({ url: Api.recycleBinList, params }); +/** + * 回收站还原 + * @param params + */ +export const putRecycleBin = (params, handleSuccess) => { + return defHttp.put({ url: Api.putRecycleBin, params }).then(() => { + handleSuccess(); + }); +}; +/** + * 回收站删除 + * @param params + */ +export const deleteRecycleBin = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteRecycleBin, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 修改密码 + * @param params + */ +export const changePassword = (params) => { + return defHttp.put({ url: Api.changePassword, params }); +}; +/** + * 冻结解冻 + * @param params + */ +export const frozenBatch = (params, handleSuccess) => { + return defHttp.put({ url: Api.frozenBatch, params }).then(() => { + handleSuccess(); + }); +}; +/** + * 获取用户代理 + * @param params + */ +export const getUserAgent = (params) => defHttp.get({ url: Api.getUserAgent, params }, { isTransformResponse: false }); +/** + * 保存或者更新用户代理 + * @param params + */ +export const saveOrUpdateAgent = (params) => { + let url = params.id ? Api.agentEdit : Api.agentSave; + return defHttp.post({ url: url, params }); +}; + +/** + * 用户同步流程 + * @param params + */ +export const syncUser = () => defHttp.put({ url: Api.syncUser }); + +/** + * 用户离职(新增代理人和用户状态变更操作) + * @param params + */ +export const userQuitAgent = (params) => { + return defHttp.put({ url: Api.userQuitAgent, params }); +}; + +/** + * 用户离职列表 + * @param params + */ +export const getQuitList = (params) => { + return defHttp.get({ url: Api.getQuitList, params }); +}; + +/** + * 取消离职 + * @param params + */ +export const putCancelQuit = (params, handleSuccess) => { + return defHttp.put({ url: Api.putCancelQuit, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; + +/** + * 待审批获取列表数据 + */ +export const getUserTenantPageList = (params)=>{ + return defHttp.get({url:Api.getUserTenantPageList,params}) +} + +/** + * 更新租户状态 + * @param params + */ +export const updateUserTenantStatus = (params)=>{ + return defHttp.put({ url: Api.updateUserTenantStatus, params }, { joinParamsToUrl: true,isTransformResponse: false }); +} diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/user.data.ts b/jeecgboot-vue3-master/src/views/system/userTEA/user.data.ts new file mode 100644 index 00000000..bbed1ed8 --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/user.data.ts @@ -0,0 +1,604 @@ +import { BasicColumn } from '/src/components/Table'; +import { FormSchema } from '/src/components/Table'; +import { getAllRolesListNoByTenant,getAllRolesListNoByExcludeTenant, getAllTenantList } from './user.api'; +import { rules } from '/src/utils/helper/validator'; +import { render } from '/src/utils/common/renderUtils'; +export const columns: BasicColumn[] = [ + { + title: '用户账号', + dataIndex: 'username', + width: 120, + }, + { + title: '用户姓名', + dataIndex: 'realname', + width: 100, + }, + { + title: '头像', + dataIndex: 'avatar', + width: 120, + customRender: render.renderAvatar, + }, + /*{ + title: '性别', + dataIndex: 'sex', + width: 80, + sorter: true, + customRender: ({ text }) => { + return render.renderDict(text, 'sex'); + }, + }, + { + title: '生日', + dataIndex: 'birthday', + width: 100, + },*/ + { + title: '手机号', + dataIndex: 'phone', + width: 100, + }, + { + title: '院系/部门', + width: 150, + dataIndex: 'orgCodeTxt', + }, +/* { + title: '负责部门', + width: 150, + dataIndex: 'departIds_dictText', + },*/ + { + title: '状态', + dataIndex: 'status_dictText', + width: 80, + }, +]; + +export const recycleColumns: BasicColumn[] = [ + { + title: '用户账号', + dataIndex: 'username', + width: 100, + }, + { + title: '用户姓名', + dataIndex: 'realname', + width: 100, + }, + { + title: '头像', + dataIndex: 'avatar', + width: 80, + customRender: render.renderAvatar, + }, + { + title: '性别', + dataIndex: 'sex', + width: 80, + sorter: true, + customRender: ({ text }) => { + return render.renderDict(text, 'sex'); + }, + }, +]; + +export const searchFormSchema: FormSchema[] = [ +/* { + label: '账号', + field: 'username', + component: 'JInput', + colProps: { span: 6 }, + },*/ + { + label: '名字', + field: 'realname', + component: 'JInput', + colProps: { span: 6 }, + }, + /*{ + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + colProps: { span: 6 }, + },*/ + { + label: '手机号码', + field: 'phone', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '用户状态', + field: 'status', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'user_status', + placeholder: '请选择状态', + stringToNumber: true, + }, + colProps: { span: 6 }, + }, +]; +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '专家账号', + field: 'username', + component: 'Input', + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'username', model, schema, true), + }, + { + label: '登录密码', + field: 'password', + component: 'StrengthMeter', + rules: [ + { + required: true, + message: '请输入登录密码', + }, + ], + }, + { + label: '确认密码', + field: 'confirmPassword', + component: 'InputPassword', + dynamicRules: ({ values }) => rules.confirmPassword(values, true), + }, + { + label: '用户姓名', + field: 'realname', + required: true, + component: 'Input', + }, + { + label: '工号', + field: 'workNo', + required: true, + component: 'Input', + dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'work_no', model, schema, true), + }, + /*{ + label: '职务', + field: 'post', + required: false, + component: 'JSelectPosition', + componentProps: { + rowKey: 'code', + labelKey: 'name', + }, + },*/ +/* { + label: '角色', + field: 'selectedroles', + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + component: 'ApiSelect', + componentProps: { + api: getAllRolesListNoByExcludeTenant, + labelField: 'roleName', + valueField: 'id', + }, + },*/ + { + label: '所属部门', + field: 'selecteddeparts', + component: 'JSelectDept', + componentProps: ({ formActionType, formModel }) => { + return { + sync: false, + checkStrictly: true, + defaultExpandLevel: 2, + multiple:false, + onSelect: (options, values) => { + const { updateSchema } = formActionType; + //所属部门修改后更新负责部门下拉框数据 + updateSchema([ + { + field: 'departIds', + componentProps: { options }, + }, + ]); + //所属部门修改后更新负责部门数据 + formModel.departIds && (formModel.departIds = formModel.departIds.filter((item) => values.value.indexOf(item) > -1)); + }, + }; + }, + }, + /*{ + label: '租户', + field: 'relTenantIds', + component: 'ApiSelect', + componentProps: { + mode: 'multiple', + api: getAllTenantList, + numberToString: true, + labelField: 'name', + valueField: 'id', + }, + },*/ + /*{ + label: '身份', + field: 'userIdentity', + component: 'RadioGroup', + defaultValue: 1, + componentProps: ({ formModel }) => { + return { + options: [ + { label: '普通用户', value: 1, key: '1' }, + { label: '上级', value: 2, key: '2' }, + ], + onChange: () => { + formModel.userIdentity == 1 && (formModel.departIds = []); + }, + }; + }, + },*/ + /* { + label: '负责部门', + field: 'departIds', + component: 'Select', + componentProps: { + mode: 'multiple', + }, + ifShow: ({ values }) => values.userIdentity == 2, + },*/ + { + label: '头像', + field: 'avatar', + component: 'JImageUpload', + componentProps: { + fileMax: 1, + }, + }, + { + label: '生日', + field: 'birthday', + component: 'DatePicker', + }, + { + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + }, + { + label: '邮箱', + field: 'email', + component: 'Input', + }, + { + label: '手机号码', + field: 'phone', + component: 'Input', + }, + /*{ + label: '座机', + field: 'telephone', + component: 'Input', + rules: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }], + }, + { + label: '工作流引擎', + field: 'activitiSync', + defaultValue: 1, + component: 'JDictSelectTag', + componentProps: { + dictCode: 'activiti_sync', + type: 'radio', + stringToNumber: true, + }, + },*/ + { + label: '学历', + field: 'expTitle', + component: 'Input', + }, + + { + label: '专业', + field: 'teamajor', + component: 'Input', + }, + { + label: '学位', + field: 'expXw', + component: 'Input', + }, + { + label: '职称', + field: 'expZc', + component: 'Input', + }, + { + label: '研究方向', + field: 'expYjfx', + component: 'Input', + }, + { + label: '从事工作', + field: 'expCsgz', + component: 'Input', + }, + { + label: '毕业院校', + field: 'expSc', + component: 'Input', + }, + { + label: '简介', + field: 'expResume', + component: 'InputTextArea', + }, + /*{ + label: '比赛', + field: 'compid', + component: 'Input', + show: false, + },*/ + /*{ + label: '比赛名称', + field: 'compName', + component: 'JPopup', + componentProps: ({ formActionType }) => { + const {setFieldsValue} = formActionType; + return{ + setFieldsValue:setFieldsValue, + code:"comp_select", + fieldConfig: [ + { source: 'id', target: 'compid' }, + { source: 'comp_name', target: 'compName' }, + ], + multi:true + } + }, + },*/ +/* { + label: '比赛状态', + field: 'stat', + component: 'JSwitch', + defaultValue: 'Y', + componentProps: {}, + },*/ +]; +export const formPasswordSchema: FormSchema[] = [ + { + label: '用户账号', + field: 'username', + component: 'Input', + componentProps: { readOnly: true }, + }, + { + label: '登录密码', + field: 'password', + component: 'StrengthMeter', + componentProps: { + placeholder: '请输入登录密码', + }, + rules: [ + { + required: true, + message: '请输入登录密码', + }, + ], + }, + { + label: '确认密码', + field: 'confirmPassword', + component: 'InputPassword', + dynamicRules: ({ values }) => rules.confirmPassword(values, true), + }, +]; + +export const formAgentSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'userName', + label: '用户名', + component: 'Input', + componentProps: { + readOnly: true, + allowClear: false, + }, + }, + { + field: 'agentUserName', + label: '代理人用户名', + required: true, + component: 'JSelectUser', + componentProps: { + rowKey: 'username', + labelKey: 'realname', + maxSelectCount: 10, + }, + }, + { + field: 'startTime', + label: '代理开始时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择代理开始时间', + }, + }, + { + field: 'endTime', + label: '代理结束时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择代理结束时间', + }, + }, + { + field: 'status', + label: '状态', + component: 'JDictSelectTag', + defaultValue: '1', + componentProps: { + dictCode: 'valid_status', + type: 'radioButton', + }, + }, +]; +export const formQuitAgentSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'userName', + label: '用户名', + component: 'Input', + componentProps: { + readOnly: true, + allowClear: false, + }, + }, + { + field: 'agentUserName', + label: '交接人员', + required: true, + component: 'JSelectUser', + componentProps: { + rowKey: 'username', + labelKey: 'realname', + maxSelectCount: 1, + }, + }, + { + field: 'startTime', + label: '交接开始时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择交接开始时间', + getPopupContainer: () => document.body, + }, + }, + { + field: 'endTime', + label: '交接结束时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择交接结束时间', + getPopupContainer: () => document.body, + }, + }, + { + field: 'status', + label: '状态', + component: 'JDictSelectTag', + defaultValue: '1', + componentProps: { + dictCode: 'valid_status', + type: 'radioButton', + }, + }, +]; + +//租户用户列表 +export const userTenantColumns: BasicColumn[] = [ + { + title: '用户账号', + dataIndex: 'username', + width: 120, + }, + { + title: '用户姓名', + dataIndex: 'realname', + width: 100, + }, + { + title: '头像', + dataIndex: 'avatar', + width: 120, + customRender: render.renderAvatar, + }, + { + title: '手机号', + dataIndex: 'phone', + width: 100, + }, + { + title: '部门', + width: 150, + dataIndex: 'orgCodeTxt', + }, + { + title: '状态', + dataIndex: 'status', + width: 80, + customRender: ({ text }) => { + if (text === '1') { + return '正常'; + } else if (text === '3') { + return '审批中'; + } else { + return '已拒绝'; + } + }, + }, +]; + +//用户租户搜索表单 +export const userTenantFormSchema: FormSchema[] = [ + { + label: '账号', + field: 'username', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '名字', + field: 'realname', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + colProps: { span: 6 }, + }, +]; diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/userDetails.vue b/jeecgboot-vue3-master/src/views/system/userTEA/userDetails.vue new file mode 100644 index 00000000..59991ee3 --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/userDetails.vue @@ -0,0 +1,54 @@ + + diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/userZJ.api.ts b/jeecgboot-vue3-master/src/views/system/userTEA/userZJ.api.ts new file mode 100644 index 00000000..91f8ce1a --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/userZJ.api.ts @@ -0,0 +1,272 @@ +import { defHttp } from '/src/utils/http/axios'; +import { Modal } from 'ant-design-vue'; + +enum Api { + listNoCareTenant = '/sys/user/listAll', + listzdzx = '/sys/user/listzdzx', + list = '/sys/user/list', + save = '/sys/user/add', + edit = '/sys/user/edit', + saveZJ = '/seteacher/seteacher/addTEA', + editZJ = '/seteacher/seteacher/editTEA', + queryExpertById = '/seteacher/seteacher/queryById', + agentSave = '/sys/sysUserAgent/add', + agentEdit = '/sys/sysUserAgent/edit', + getUserRole = '/sys/user/queryUserRole', + duplicateCheck = '/sys/duplicate/check', + deleteUser = '/sys/user/delete', + deleteBatch = '/sys/user/deleteBatch', + importExcel = '/sys/user/importExcel', + exportXls = '/sys/user/exportXls', + recycleBinList = '/sys/user/recycleBin', + putRecycleBin = '/sys/user/putRecycleBin', + deleteRecycleBin = '/sys/user/deleteRecycleBin', + allRolesList = '/sys/role/queryall', + allRolesListNoByTenant = '/sys/role/queryallNoByTenant', + allRolesListExcludeByTenant = '/sys/role/queryallExcludeByTenant', + allTenantList = '/sys/tenant/queryList', + allPostList = '/sys/position/list', + userDepartList = '/sys/user/userDepartList', + changePassword = '/sys/user/changePassword', + frozenBatch = '/sys/user/frozenBatch', + getUserAgent = '/sys/sysUserAgent/queryByUserName', + syncUser = '/act/process/extActProcess/doSyncUser', + userQuitAgent = '/sys/user/userQuitAgent', + getQuitList = '/sys/user/getQuitList', + putCancelQuit = '/sys/user/putCancelQuit', + updateUserTenantStatus='/sys/tenant/updateUserTenantStatus', + getUserTenantPageList='/sys/tenant/getUserTenantPageList', + exportXlsMb = '/sys/user/exportXlsMb', + queryByUserId = '/expert/expert/queryByUserId', +} +/** + * 根据userid判断是否为专家 + * @param params + */ +export const queryByUserId = (params) => { + return defHttp.get({ url: Api.queryByUserId, params },{ successMessageMode: 'none' }); +}; +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +export const getExportUrlMb = Api.exportXlsMb; +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; +/** + * 列表接口(查询用户,通过租户隔离) + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 列表接口(查询全部用户,不通过租户隔离) + * @param params + */ +export const listNoCareTenant = (params) => defHttp.get({ url: Api.listNoCareTenant, params }); + +/** + * 列表接口(查询全部用户,不通过租户隔离) + * 适用于专家、学生、组委会查看自己的信息 + * @param params + */ +export const listzdzx = (params) => defHttp.get({ url: Api.listzdzx, params }); + +/** + * 用户角色接口 + * @param params + */ +export const getUserRoles = (params) => defHttp.get({ url: Api.getUserRole, params }, { errorMessageMode: 'none' }); +/** + * 专家信息接口 + * @param params + */ +export const queryExpertById = (params) => defHttp.get({ url: Api.queryExpertById, params }, { successMessageMode: 'none' }); + + +/** + * 删除用户 + */ +export const deleteUser = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteUser, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 批量删除用户 + * @param params + */ +export const batchDeleteUser = (params, handleSuccess) => { + Modal.confirm({ + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); + }, + }); +}; +/** + * 保存或者更新用户 + * @param params + */ +export const saveOrUpdateUser = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }); +}; +/** + * 保存或者更新专家用户 + * @param params + */ +export const saveOrUpdateUserZJ = (params, isUpdate) => { + let url = isUpdate ? Api.editZJ : Api.saveZJ; + return defHttp.post({ url: url, params }); +}; +/** + * 唯一校验 + * @param params + */ +export const duplicateCheck = (params) => defHttp.get({ url: Api.duplicateCheck, params }, { isTransformResponse: false }); +/** + * 获取全部角色(租户隔离) + * @param params + */ +export const getAllRolesList = (params) => defHttp.get({ url: Api.allRolesList, params }); +/** + * 获取全部角色(不租户隔离) + * @param params + */ +export const getAllRolesListNoByTenant = (params) => defHttp.get({ url: Api.allRolesListNoByTenant, params }); + + +/** + * 获取角色(排除:总管理) + * @param params + */ +export const getAllRolesListNoByExcludeTenant = (params) => defHttp.get({ url: Api.allRolesListExcludeByTenant, params }); + + +/** + * 获取全部租户 + */ +export const getAllTenantList = (params) => defHttp.get({ url: Api.allTenantList, params }); +/** + * 获取指定用户负责部门 + */ +export const getUserDepartList = (params) => defHttp.get({ url: Api.userDepartList, params }, { successMessageMode: 'none' }); +/** + * 获取全部职务 + */ +export const getAllPostList = (params) => { + return new Promise((resolve) => { + defHttp.get({ url: Api.allPostList, params }).then((res) => { + resolve(res.records); + }); + }); +}; +/** + * 回收站列表 + * @param params + */ +export const getRecycleBinList = (params) => defHttp.get({ url: Api.recycleBinList, params }); +/** + * 回收站还原 + * @param params + */ +export const putRecycleBin = (params, handleSuccess) => { + return defHttp.put({ url: Api.putRecycleBin, params }).then(() => { + handleSuccess(); + }); +}; +/** + * 回收站删除 + * @param params + */ +export const deleteRecycleBin = (params, handleSuccess) => { + return defHttp.delete({ url: Api.deleteRecycleBin, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; +/** + * 修改密码 + * @param params + */ +export const changePassword = (params) => { + return defHttp.put({ url: Api.changePassword, params }); +}; +/** + * 冻结解冻 + * @param params + */ +export const frozenBatch = (params, handleSuccess) => { + return defHttp.put({ url: Api.frozenBatch, params }).then(() => { + handleSuccess(); + }); +}; +/** + * 获取用户代理 + * @param params + */ +export const getUserAgent = (params) => defHttp.get({ url: Api.getUserAgent, params }, { isTransformResponse: false }); +/** + * 保存或者更新用户代理 + * @param params + */ +export const saveOrUpdateAgent = (params) => { + let url = params.id ? Api.agentEdit : Api.agentSave; + return defHttp.post({ url: url, params }); +}; + +/** + * 用户同步流程 + * @param params + */ +export const syncUser = () => defHttp.put({ url: Api.syncUser }); + +/** + * 用户离职(新增代理人和用户状态变更操作) + * @param params + */ +export const userQuitAgent = (params) => { + return defHttp.put({ url: Api.userQuitAgent, params }); +}; + +/** + * 用户离职列表 + * @param params + */ +export const getQuitList = (params) => { + return defHttp.get({ url: Api.getQuitList, params }); +}; + +/** + * 取消离职 + * @param params + */ +export const putCancelQuit = (params, handleSuccess) => { + return defHttp.put({ url: Api.putCancelQuit, params }, { joinParamsToUrl: true }).then(() => { + handleSuccess(); + }); +}; + +/** + * 待审批获取列表数据 + */ +export const getUserTenantPageList = (params)=>{ + return defHttp.get({url:Api.getUserTenantPageList,params}) +} + +/** + * 更新租户状态 + * @param params + */ +export const updateUserTenantStatus = (params)=>{ + return defHttp.put({ url: Api.updateUserTenantStatus, params }, { joinParamsToUrl: true,isTransformResponse: false }); +} diff --git a/jeecgboot-vue3-master/src/views/system/userTEA/userZJ.data.ts b/jeecgboot-vue3-master/src/views/system/userTEA/userZJ.data.ts new file mode 100644 index 00000000..a58ea02d --- /dev/null +++ b/jeecgboot-vue3-master/src/views/system/userTEA/userZJ.data.ts @@ -0,0 +1,771 @@ +import { BasicColumn } from '/src/components/Table'; +import { FormSchema } from '/src/components/Table'; +import { getAllRolesListNoByTenant,getAllRolesListNoByExcludeTenant, getAllTenantList } from './userZJ.api'; +import { rules } from '/src/utils/helper/validator'; +import { render } from '/src/utils/common/renderUtils'; +export const columns: BasicColumn[] = [ + { + title: '用户账号', + dataIndex: 'username', + width: 120, + }, + { + title: '用户姓名', + dataIndex: 'realname', + width: 100, + }, + { + title: '头像', + dataIndex: 'avatar', + width: 120, + customRender: render.renderAvatar, + }, + /* { + title: '性别', + dataIndex: 'sex', + width: 80, + sorter: true, + customRender: ({ text }) => { + return render.renderDict(text, 'sex'); + }, + }, + { + title: '生日', + dataIndex: 'birthday', + width: 100, + },*/ + { + title: '手机号', + dataIndex: 'phone', + width: 100, + }, + { + title: '部门', + width: 150, + dataIndex: 'orgCodeTxt', + }, + { + title: '负责部门', + width: 150, + dataIndex: 'departIds_dictText', + }, + { + title: '状态', + dataIndex: 'status_dictText', + width: 80, + }, +]; + +export const recycleColumns: BasicColumn[] = [ + { + title: '用户账号', + dataIndex: 'username', + width: 100, + }, + { + title: '用户姓名', + dataIndex: 'realname', + width: 100, + }, + { + title: '头像', + dataIndex: 'avatar', + width: 80, + customRender: render.renderAvatar, + }, + { + title: '性别', + dataIndex: 'sex', + width: 80, + sorter: true, + customRender: ({ text }) => { + return render.renderDict(text, 'sex'); + }, + }, +]; + +export const searchFormSchema: FormSchema[] = [ + { + label: '账号', + field: 'username', + component: 'JInput', + colProps: { span: 6 }, + }, + { + label: '名字', + field: 'realname', + component: 'JInput', + colProps: { span: 6 }, + }, + { + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + colProps: { span: 6 }, + }, + { + label: '手机号码', + field: 'phone', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '用户状态', + field: 'status', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'user_status', + placeholder: '请选择状态', + stringToNumber: true, + }, + colProps: { span: 6 }, + }, +]; +export const formSchemaZJ: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '专家账号', + field: 'username', + component: 'Input', + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'username', model, schema, true), + }, + { + label: '登录密码', + field: 'password', + component: 'StrengthMeter', + rules: [ + { + required: true, + message: '请输入登录密码', + }, + ], + }, + { + label: '确认密码', + field: 'confirmPassword', + component: 'InputPassword', + dynamicRules: ({ values }) => rules.confirmPassword(values, true), + }, + { + label: '用户姓名', + field: 'realname', + required: true, + component: 'Input', + }, + { + label: '工号', + field: 'workNo', + required: true, + component: 'Input', + dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'work_no', model, schema, true), + }, + /*{ + label: '职务', + field: 'post', + required: false, + component: 'JSelectPosition', + componentProps: { + rowKey: 'code', + labelKey: 'name', + }, + },*/ + { + label: '角色', + field: 'selectedroles', + component: 'ApiSelect', + componentProps: { + api: getAllRolesListNoByExcludeTenant, + labelField: 'roleName', + valueField: 'id', + }, + }, + { + label: '所属部门', + field: 'selecteddeparts', + component: 'JSelectDept', + componentProps: ({ formActionType, formModel }) => { + return { + sync: false, + checkStrictly: true, + defaultExpandLevel: 2, + + onSelect: (options, values) => { + const { updateSchema } = formActionType; + //所属部门修改后更新负责部门下拉框数据 + updateSchema([ + { + field: 'departIds', + componentProps: { options }, + }, + ]); + //所属部门修改后更新负责部门数据 + formModel.departIds && (formModel.departIds = formModel.departIds.filter((item) => values.value.indexOf(item) > -1)); + }, + }; + }, + }, + /*{ + label: '租户', + field: 'relTenantIds', + component: 'ApiSelect', + componentProps: { + mode: 'multiple', + api: getAllTenantList, + numberToString: true, + labelField: 'name', + valueField: 'id', + }, + },*/ + /*{ + label: '身份', + field: 'userIdentity', + component: 'RadioGroup', + defaultValue: 1, + componentProps: ({ formModel }) => { + return { + options: [ + { label: '普通用户', value: 1, key: '1' }, + { label: '上级', value: 2, key: '2' }, + ], + onChange: () => { + formModel.userIdentity == 1 && (formModel.departIds = []); + }, + }; + }, + },*/ + /* { + label: '负责部门', + field: 'departIds', + component: 'Select', + componentProps: { + mode: 'multiple', + }, + ifShow: ({ values }) => values.userIdentity == 2, + },*/ + { + label: '头像', + field: 'avatar', + component: 'JImageUpload', + componentProps: { + fileMax: 1, + }, + }, + { + label: '生日', + field: 'birthday', + component: 'DatePicker', + }, + { + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + }, + { + label: '邮箱', + field: 'email', + component: 'Input', + }, + { + label: '手机号码', + field: 'phone', + component: 'Input', + }, + /*{ + label: '座机', + field: 'telephone', + component: 'Input', + rules: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }], + }, + { + label: '工作流引擎', + field: 'activitiSync', + defaultValue: 1, + component: 'JDictSelectTag', + componentProps: { + dictCode: 'activiti_sync', + type: 'radio', + stringToNumber: true, + }, + },*/ + { + label: '专家毕业院校', + field: 'expSc', + component: 'Input', + }, + { + label: '专家履历', + field: 'expResume', + component: 'InputTextArea', + }, + { + label: '专家学历', + field: 'expTitle', + component: 'Input', + }, + { + label: '比赛', + field: 'compid', + component: 'Input', + show: false, + }, + { + label: '比赛名称', + field: 'compName', + component: 'JPopup', + componentProps: ({ formActionType }) => { + const {setFieldsValue} = formActionType; + return{ + setFieldsValue:setFieldsValue, + code:"comp_select", + fieldConfig: [ + { source: 'id', target: 'compid' }, + { source: 'comp_name', target: 'compName' }, + ], + multi:true + } + }, + }, + { + label: '状态', + field: 'stat', + component: 'JSwitch', + componentProps:{ + }, + }, +]; + +export const formSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + label: '用户账号', + field: 'username', + component: 'Input', + dynamicDisabled: ({ values }) => { + return !!values.id; + }, + dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'username', model, schema, true), + }, + { + label: '登录密码', + field: 'password', + component: 'StrengthMeter', + rules: [ + { + required: true, + message: '请输入登录密码', + }, + ], + }, + { + label: '确认密码', + field: 'confirmPassword', + component: 'InputPassword', + dynamicRules: ({ values }) => rules.confirmPassword(values, true), + }, + { + label: '用户姓名', + field: 'realname', + required: true, + component: 'Input', + }, + { + label: '工号', + field: 'workNo', + required: true, + component: 'Input', + dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'work_no', model, schema, true), + }, + { + label: '职务', + field: 'post', + required: false, + component: 'JSelectPosition', + componentProps: { + rowKey: 'code', + labelKey: 'name', + }, + }, + { + label: '角色', + field: 'selectedroles', + component: 'ApiSelect', + componentProps: { + mode: 'multiple', + api: getAllRolesListNoByTenant, + labelField: 'roleName', + valueField: 'id', + }, + }, + { + label: '所属部门', + field: 'selecteddeparts', + component: 'JSelectDept', + componentProps: ({ formActionType, formModel }) => { + return { + sync: false, + checkStrictly: true, + defaultExpandLevel: 2, + + onSelect: (options, values) => { + const { updateSchema } = formActionType; + //所属部门修改后更新负责部门下拉框数据 + updateSchema([ + { + field: 'departIds', + componentProps: { options }, + }, + ]); + //所属部门修改后更新负责部门数据 + formModel.departIds && (formModel.departIds = formModel.departIds.filter((item) => values.value.indexOf(item) > -1)); + }, + }; + }, + }, + { + label: '租户', + field: 'relTenantIds', + component: 'ApiSelect', + componentProps: { + mode: 'multiple', + api: getAllTenantList, + numberToString: true, + labelField: 'name', + valueField: 'id', + }, + }, + { + label: '身份', + field: 'userIdentity', + component: 'RadioGroup', + defaultValue: 1, + componentProps: ({ formModel }) => { + return { + options: [ + { label: '普通用户', value: 1, key: '1' }, + { label: '上级', value: 2, key: '2' }, + ], + onChange: () => { + formModel.userIdentity == 1 && (formModel.departIds = []); + }, + }; + }, + }, + { + label: '负责部门', + field: 'departIds', + component: 'Select', + componentProps: { + mode: 'multiple', + }, + ifShow: ({ values }) => values.userIdentity == 2, + }, + { + label: '头像', + field: 'avatar', + component: 'JImageUpload', + componentProps: { + fileMax: 1, + }, + }, + { + label: '生日', + field: 'birthday', + component: 'DatePicker', + }, + { + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + }, + { + label: '邮箱', + field: 'email', + component: 'Input', + dynamicRules: ({ model, schema }) => { + return [ + { ...rules.duplicateCheckRule('sys_user', 'email', model, schema, true)[0] }, + { ...rules.rule('email', false)[0] }, + ]; + }, + }, + { + label: '手机号码', + field: 'phone', + component: 'Input', + dynamicRules: ({ model, schema }) => { + return [ + { ...rules.duplicateCheckRule('sys_user', 'phone', model, schema, true)[0] }, + { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }, + ]; + }, + }, + { + label: '座机', + field: 'telephone', + component: 'Input', + rules: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }], + }, + // { + // label: '工作流引擎', + // field: 'activitiSync', + // defaultValue: 1, + // component: 'JDictSelectTag', + // componentProps: { + // dictCode: 'activiti_sync', + // type: 'radio', + // stringToNumber: true, + // }, + // }, +]; + +export const formPasswordSchema: FormSchema[] = [ + { + label: '用户账号', + field: 'username', + component: 'Input', + componentProps: { readOnly: true }, + }, + { + label: '登录密码', + field: 'password', + component: 'StrengthMeter', + componentProps: { + placeholder: '请输入登录密码', + }, + rules: [ + { + required: true, + message: '请输入登录密码', + }, + ], + }, + { + label: '确认密码', + field: 'confirmPassword', + component: 'InputPassword', + dynamicRules: ({ values }) => rules.confirmPassword(values, true), + }, +]; + +export const formAgentSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'userName', + label: '用户名', + component: 'Input', + componentProps: { + readOnly: true, + allowClear: false, + }, + }, + { + field: 'agentUserName', + label: '代理人用户名', + required: true, + component: 'JSelectUser', + componentProps: { + rowKey: 'username', + labelKey: 'realname', + maxSelectCount: 10, + }, + }, + { + field: 'startTime', + label: '代理开始时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择代理开始时间', + }, + }, + { + field: 'endTime', + label: '代理结束时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择代理结束时间', + }, + }, + { + field: 'status', + label: '状态', + component: 'JDictSelectTag', + defaultValue: '1', + componentProps: { + dictCode: 'valid_status', + type: 'radioButton', + }, + }, +]; + +export const formQuitAgentSchema: FormSchema[] = [ + { + label: '', + field: 'id', + component: 'Input', + show: false, + }, + { + field: 'userName', + label: '用户名', + component: 'Input', + componentProps: { + readOnly: true, + allowClear: false, + }, + }, + { + field: 'agentUserName', + label: '交接人员', + required: true, + component: 'JSelectUser', + componentProps: { + rowKey: 'username', + labelKey: 'realname', + maxSelectCount: 1, + }, + }, + { + field: 'startTime', + label: '交接开始时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择交接开始时间', + getPopupContainer: () => document.body, + }, + }, + { + field: 'endTime', + label: '交接结束时间', + component: 'DatePicker', + required: true, + componentProps: { + showTime: true, + valueFormat: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择交接结束时间', + getPopupContainer: () => document.body, + }, + }, + { + field: 'status', + label: '状态', + component: 'JDictSelectTag', + defaultValue: '1', + componentProps: { + dictCode: 'valid_status', + type: 'radioButton', + }, + }, +]; + +//租户用户列表 +export const userTenantColumns: BasicColumn[] = [ + { + title: '用户账号', + dataIndex: 'username', + width: 120, + }, + { + title: '用户姓名', + dataIndex: 'realname', + width: 100, + }, + { + title: '头像', + dataIndex: 'avatar', + width: 120, + customRender: render.renderAvatar, + }, + { + title: '手机号', + dataIndex: 'phone', + width: 100, + }, + { + title: '部门', + width: 150, + dataIndex: 'orgCodeTxt', + }, + { + title: '状态', + dataIndex: 'status', + width: 80, + customRender: ({ text }) => { + if (text === '1') { + return '正常'; + } else if (text === '3') { + return '审批中'; + } else { + return '已拒绝'; + } + }, + }, +]; + +//用户租户搜索表单 +export const userTenantFormSchema: FormSchema[] = [ + { + label: '账号', + field: 'username', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '名字', + field: 'realname', + component: 'Input', + colProps: { span: 6 }, + }, + { + label: '性别', + field: 'sex', + component: 'JDictSelectTag', + componentProps: { + dictCode: 'sex', + placeholder: '请选择性别', + stringToNumber: true, + }, + colProps: { span: 6 }, + }, +];