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 },
+ },
+];