import { BasicColumn, FormSchema } from '/@/components/Table'; import { h } from 'vue'; import { Image, message } from 'ant-design-vue'; import { getFamaleDefaultImage, getFileAccessHttpUrl } from '/@/utils/common/compUtils'; import { getSecondaryDepartmentList, getThirdDepartmentList } from '/@/views/system/user/user.api'; import { allSecondaryDepartsNew, getFourthDepartsNew } from '/@/utils/system/api'; import { rules } from '/@/utils/helper/validator'; import { checkPassword } from '/@/hooks/checkPassword/checkPassword'; import { isShowIdCard } from '/@/utils/getEnv'; //列表数据 export const columns: BasicColumn[] = [ { title: '员工账号', align: 'center', fixed: 'left', dataIndex: 'username', }, { title: '员工姓名', align: 'center', fixed: 'left', dataIndex: 'realname', }, { title: '性别', align: 'center', dataIndex: 'sex_dictText', width: 64, }, { title: '员工编号', align: 'center', dataIndex: ['extension', 'empSysno'], width: 80, }, { title: '头像', align: 'center', dataIndex: 'avatar', width: 64, customRender: ({ text, record }) => { return h(Image, { placeholder: true, src: getFileAccessHttpUrl(text) || '', height: 40, width: 40, fallback: getFamaleDefaultImage(record.sex), }); }, }, { title: '身份证号', align: 'center', dataIndex: 'idCard', width: 160, ifShow: isShowIdCard(), }, { title: '手机号', align: 'center', dataIndex: 'phone', width: 120, }, { title: '状态', dataIndex: 'status_dictText', width: 80, slots: { customRender: 'statusTag' }, }, { title: '单位名称', align: 'center', dataIndex: ['secondDepart', 'departName'], }, { title: '部门名称', align: 'center', dataIndex: ['departTree', '2'], width: 180, }, { title: '四级部门名称', align: 'center', dataIndex: ['departTree', '3'], width: 180, }, { title: '出生日期', align: 'center', dataIndex: 'birthday', }, { title: '职务', align: 'center', dataIndex: ['extension', 'empJob_dictText'], }, { title: '行政级别', align: 'center', dataIndex: ['extension', 'empLevel_dictText'], }, { title: '民族', align: 'center', dataIndex: ['extension', 'empNation_dictText'], }, { title: '学历', align: 'center', dataIndex: ['extension', 'empDegree_dictText'], }, { title: '婚姻状况', align: 'center', dataIndex: ['extension', 'empMarriage_dictText'], }, { title: '籍贯', align: 'center', dataIndex: ['extension', 'empNativeplace'], }, // { // title: '工种', // align: 'center', // dataIndex: ['extension', 'medicalWorkTypeCode_dictText'], // }, // { // title: '用工形式', // align: 'center', // dataIndex: ['extension', 'empType_dictText'], // }, ]; //查询数据 export const searchFormSchema: FormSchema[] = [ { label: '员工账号', field: 'username', component: 'Input', }, { label: '员工姓名', field: 'realname', component: 'Input', }, { label: '员工编号', field: 'empNo', component: 'Input', }, { label: '身份证号', field: 'idCard', component: 'Input', ifShow: isShowIdCard(), }, { label: '手机号', field: 'phone', component: 'Input', }, { label: '单位名称', field: 'orgCode', component: 'ApiSelect', componentProps: ({ formModel }) => { return { api: allSecondaryDepartsNew, resultField: 'result', labelField: 'departName', valueField: 'orgCode', immediate: true, onChange: (_value, option) => { formModel.departId = option?.id || ''; formModel.orgCode2 = ''; }, onDeselect: () => { formModel.departId = ''; formModel.orgCode2 = ''; }, showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }; }, }, { label: '部门名称', field: 'orgCode2', component: 'ApiSelect', componentProps: ({ formModel }) => { return { api: getThirdDepartmentList, resultField: 'list', labelField: 'departName', params: { secondDepartId: formModel?.departId || '', }, valueField: 'orgCode', immediate: false, onFocus: () => { if (!formModel.departId) { return message.warn('请先选择单位!'); } }, showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }; }, }, { label: '四级部门名称', field: 'deptCode', component: 'ApiSelect', componentProps: ({ formModel }) => { return { api: getFourthDepartsNew, resultField: 'result', labelField: 'departName', params: { idOrCode: formModel.orgCode2 || '', }, valueField: 'orgCode', immediate: false, onFocus: () => { if (!formModel.orgCode2) { return message.warn('请先选择部门!'); } }, showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }; }, }, ]; //表单数据 export const formSchema: (isUpdate: boolean) => FormSchema[] = (isUpdate) => { return [ { label: '员工账号', field: 'username', component: 'Input', componentProps: ({ formModel }) => { return { onInput: () => { formModel.username = formModel.username.replace(/[^a-zA-Z0-9_]/g, ''); }, autocomplete: 'off', placeholder: '请输入员工姓名全拼+数字', }; }, required: true, dynamicDisabled: isUpdate, }, { label: '密码', field: 'password', component: 'StrengthMeter', componentProps: { autocomplete: 'new-password', readOnly: true, onfocus: (field) => { field.target.readOnly = false; }, }, dynamicRules: () => { return [ { required: true, validator: (_, value) => { let { message } = checkPassword(value); if (message === 'ok') { return Promise.resolve(); } else { return Promise.reject(message); } }, trigger: 'blur', }, ]; }, required: !isUpdate, ifShow: !isUpdate, }, { label: '员工姓名', field: 'realname', component: 'Input', required: true, }, { label: '员工编号', field: 'empSysno', component: 'Input', componentProps: ({ formModel }) => { return { onInput: () => { formModel.empSysno = formModel.empSysno.replace(/[^0-9]/g, ''); }, }; }, dynamicRules: ({ model, schema }) => { let rule = rules.duplicateCheckRuleAndDelFlag('health_user_employee_ex', 'emp_sysno', 'false', model, schema, false); rule[0] = { ...rule[0], required: true }; return rule; }, }, { label: '性别', field: 'sex', component: 'JDictSelectTag', componentProps: { dictCode: 'sex2', }, required: true, }, { label: '头像', field: 'avatar', component: 'JImageUpload', componentProps: { maxCount: 1, }, }, { label: '', field: 'secondDepartName', component: 'Input', defaultValue: '', dynamicDisabled: true, show: false, }, { label: '部门', field: 'orgCode', component: 'JSelectDeptStaff', componentProps: ({ formModel }) => { return { sync: true, checkStrictly: true, defaultExpandLevel: 1, initOptions: isUpdate ? [ { value: formModel.departId, label: ' ' + formModel.secondDepartName + ' - ' + formModel.departName + ' ', }, ] : [], }; }, required: true, }, { label: '出生日期', field: 'birthday', component: 'DatePicker', componentProps: { showTime: false, valueFormat: 'YYYY-MM-DD', }, required: true, }, { label: '身份证号', field: 'idCard', component: 'Input', componentProps: ({ formModel }) => { return { onInput: () => { formModel.idCard = formModel.idCard.replace(/[^Xx0-9]/g, ''); }, }; }, // rules: [ // { // required: true, // }, // { // pattern: /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/, // message: '${label}格式有误', // }, // ], // dynamicRules: ({ model, schema }) => // rules.idcard(true).concat(rules.duplicateCheckRuleAndDelFlag('sys_user', 'id_card', 'false', model, schema, false)), // dynamicRules: ({ model, schema }) => rules.idcard(true).concat(rules.duplicateCheckRule('sys_user', 'id_card', model, schema, false)), }, /*{ label: '身份证正面', field: 'empIdcardFace', component: 'JImageUpload', componentProps: { maxCount: 1, }, }, { label: '身份证反面', field: 'empIdcardBack', component: 'JImageUpload', componentProps: { maxCount: 1, }, },*/ { label: '手机号', field: 'phone', component: 'Input', componentProps: ({ formModel }) => { return { onInput: () => { formModel.phone = formModel.phone.replace(/[^0-9]/g, ''); }, }; }, // rules: [ // { // required: true, // }, // { // pattern: /^1[3456789][0-9]{9}$/, // message: '${label}格式有误', // }, // ], }, { label: '邮箱', field: 'email', component: 'Input', rules: [ { pattern: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, message: '${label}格式有误', }, ], }, { label: '职务', field: 'empJob', component: 'JDictSelectTag', componentProps: { dictCode: 'e_job', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, { label: '职称', field: 'empTitle', component: 'JDictSelectTag', componentProps: { dictCode: 'e_title', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, // { // label: '子组', // field: 'empGroup', // component: 'JDictSelectTag', // componentProps: { // dictCode: 'emp_group', // showSearch: true, // filterOption: (input: string, option: any): boolean => { // const str: string = input.trim().toLowerCase(); // return option.label.toLowerCase().indexOf(str) >= 0; // }, // }, // }, { label: '职位', field: 'empPosition', component: 'JDictSelectTag', componentProps: { dictCode: 'emp_position', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, { label: '行政级别', field: 'empLevel', component: 'JDictSelectTag', componentProps: { dictCode: 'emp_level', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, { label: '员工状态', field: 'empStatus', component: 'JDictSelectTag', componentProps: { dictCode: 'emp_status', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, { label: '政治面貌', field: 'empPolitical', component: 'JDictSelectTag', componentProps: { dictCode: 'emp_political', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, { label: '民族', field: 'empNation', component: 'JDictSelectTag', componentProps: { dictCode: 'nation', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, { label: '学历', field: 'empDegree', component: 'JDictSelectTag', componentProps: { dictCode: 'emp_education', showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.trim().toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, }, }, { label: '婚姻状况', field: 'empMarriage', component: 'JDictSelectTag', componentProps: { dictCode: 'mr_state', }, }, { label: '籍贯', field: 'empNativeplace', component: 'Input', }, { label: '入职时间', field: 'empWorktime', component: 'DatePicker', componentProps: { showTime: false, valueFormat: 'YYYY-MM-DD', }, }, // { // label: '体检形式', // field: 'medicalOnJob', // component: 'JDictSelectTag', // componentProps: { // dictCode: 'medical_on_job', // }, // }, // { // label: '工种', // field: 'medicalWorkTypeCode', // component: 'JDictSelectTag', // componentProps: { // dictCode: 'medical_worktype', // showSearch: true, // }, // }, // { // label: '其他工种', // field: 'medicalWorkTypeOther', // component: 'Input', // ifShow: ({ model }) => { // return model.medicalWorkTypeCode === '0014' || model.medicalWorkTypeCode === '0033' || model.medicalWorkTypeCode === '999999'; // }, // required: ({ model }) => { // return model.medicalWorkTypeCode === '0014' || model.medicalWorkTypeCode === '0033' || model.medicalWorkTypeCode === '999999'; // }, // }, // { // label: '危害因素', // field: 'medicalHazardFactorCode', // component: 'JDictSelectTag', // componentProps: { // dictCode: 'medical_hazard', // showSearch: true, // mode: 'multiple', // }, // }, // { // label: '其他危害', // field: 'medicalHazardFactorOther', // component: 'Input', // ifShow: ({ model }) => { // return model.medicalHazardFactorCode?.join(',').indexOf('0999') > -1; // }, // required: ({ model }) => { // return model.medicalHazardFactorCode?.join(',').indexOf('0999') > -1; // }, // }, // { // label: '接害时间', // field: 'medicalHazardDate', // component: 'DatePicker', // componentProps: { // showTime: false, // valueFormat: 'YYYY-MM-DD', // }, // }, // { // label: '用工形式', // field: 'empType', // component: 'JDictSelectTag', // componentProps: { // dictCode: 'contract', // }, // }, // { // label: '上市员工', // field: 'listedFlag', // component: 'JDictSelectTag', // componentProps: { // type: 'radio', // dictCode: 'sf_10', // }, // }, { label: '工作地点', field: 'workSpace', component: 'Input', }, { label: '居住地点', field: 'liveSpace', component: 'Input', }, { label: '', field: 'id', component: 'Input', show: false, }, { label: '', field: 'personType', component: 'Input', defaultValue: '1', dynamicDisabled: true, show: false, }, { label: '', field: 'departName', component: 'Input', dynamicDisabled: true, show: false, }, { label: '', field: 'departId', component: 'Input', dynamicDisabled: true, show: false, }, ]; }; //迁移用户 export const migrateUserFormSchema: FormSchema[] = [ { label: '员工姓名', field: 'realname', component: 'Input', componentProps: { disabled: true, }, }, { label: '员工编号', field: 'workNo', component: 'Input', componentProps: { disabled: true, }, }, { label: '单位名称', field: 'oldSecond', component: 'Input', componentProps: { disabled: true, }, }, { label: '部门名称', field: 'oldThird', component: 'Input', componentProps: { disabled: true, }, }, { label: '迁移单位', field: 'toDepartCode', component: 'ApiTreeSelect', required: true, componentProps: ({ formModel }) => { let treeData: any; return { api: getSecondaryDepartmentList, fieldNames: { label: 'departName', value: 'orgCode', }, immediate: true, onSelect: (val, v) => { formModel.toDepartId = v.id; }, onOptionsChange: (data) => { treeData = data; }, showSearch: true, filterOption: (input: string, option: any): boolean => { const str: string = input.toLowerCase(); return option.label.toLowerCase().indexOf(str) >= 0; }, loadData: async (treeNode: any) => { return new Promise(async (resolve) => { const { id } = treeNode.dataRef; const result = await getThirdDepartmentList({ secondDepartId: id }); const add = (pid, children, treeArray) => { if (treeArray && treeArray.length > 0) { // @ts-ignore for (const item of treeArray) { if (item.id == pid) { if (!children || children.length == 0) { item.isLeaf = true; } else { item['children'] = children; } return; } else { add(pid, children, item.children); } } } }; add(id, result, treeData); resolve(treeData); }); }, getPopupContainer: () => document.body, }; }, }, { label: '', field: 'isBind', component: 'ApiSelect', slot: 'isBind', required: true, componentProps: { options: [ { label: '是(解除绑定,手表仍属于当前单位)', value: '1', }, { label: '否(不解除绑定,手表跟随用户一并迁移至新单位)', value: '0', }, ], }, show: false, }, { label: '是否解绑', field: 'watchStatus', component: 'Input', show: false, }, { label: '迁移部门id', field: 'toDepartId', component: 'Input', show: false, }, { label: '原部门Code', field: 'fromDepartCode', component: 'Input', show: false, }, { label: '原部门Id', field: 'fromDepartId', component: 'Input', show: false, }, { label: '', field: 'userId', component: 'Input', show: false, }, ];