Files
xj-admin/src/views/system/user/personnelManagement/personnelManagement.data.ts
T
lianlonggang eeb1496483 feat(upload): 配置文件上传组件的业务路径和文本提示
- 在 JImageUpload 组件中添加 bizPath 属性以指定上传路径
- 为头像上传功能统一设置 bizPath: 'avatar'
- 为图片上传功能设置 bizPath: 'img'
- 为视频上传功能设置 bizPath: 'video'
- 为PDF文件上传设置 bizPath: 'bizfile'
- 为APP文件上传设置 bizPath: 'appfile'
- 添加 text 属性统一显示 '上传头像' 提示文本
- 在系统横幅管理中配置图片上传的业务路径
- 为新资源管理模块添加完整的数据结构定义
2026-04-30 08:56:14 +08:00

400 lines
12 KiB
TypeScript

import { BasicColumn, FormSchema } from '/@/components/Table';
import { h, ref } from 'vue';
import { checkPassword } from '/@/hooks/checkPassword/checkPassword';
import { getEmergencyList } from '/@/views/consult/agentManagement/agentManagement.api';
import { allCenterApi } from '/@/views/emergency/scheduling/scheduling.api';
import { rules } from '/@/utils/helper/validator';
import { Image } from 'ant-design-vue';
import { getFamaleDefaultImage, getFileAccessHttpUrl } from '/@/utils/common/compUtils';
import { EyeOutlined } from '@ant-design/icons-vue';
import { ComponentType } from '/@/components/Form/src/types';
//列表数据
export const columns = function (showGoodAt: boolean): BasicColumn[] {
return [
{
title: '用户账号',
align: 'center',
width: 150,
fixed: 'left',
dataIndex: 'username',
},
{
title: '姓名',
align: 'center',
fixed: 'left',
dataIndex: 'realname',
},
{
title: '头像',
align: 'center',
dataIndex: 'avatar',
width: 100,
customRender: ({ text }) => {
const t = text ? text.replace(',', '') : null;
return h(Image, {
placeholder: true,
src: getFileAccessHttpUrl(t),
height: 50,
width: 50,
fallback: getFamaleDefaultImage(''),
previewMask: () => {
return h(EyeOutlined, {
style: {
color: 'white',
},
});
},
});
},
},
{
title: '所属应急中心',
align: 'center',
dataIndex: 'centerName',
},
{
title: '职称',
align: 'center',
width: 90,
dataIndex: 'post_dictText',
},
{
title: '毕业院校',
align: 'center',
dataIndex: 'school',
},
{
title: '学历',
align: 'center',
dataIndex: 'edu_dictText',
},
{
title: '擅长症状',
align: 'center',
dataIndex: 'goodAt',
ifShow: showGoodAt,
},
];
};
//查询数据
export const searchFormSchema: FormSchema[] = [
{
label: '姓名',
field: 'name',
component: 'Input',
},
{
label: '所属应急中心',
field: 'centerId',
component: 'ApiSelect',
componentProps: {
//@ts-ignore
api: allCenterApi,
labelField: 'centerName',
valueField: 'id',
immediate: true,
resultField: 'records',
showSearch: true,
filterOption: (input: string, option: any): boolean => {
const str: string = input?.trim()?.toLowerCase();
return option.label.toLowerCase().indexOf(str) >= 0;
},
getPopupContainer: () => document.body,
},
},
];
//表单数据
// @ts-ignore
export const formSchema = function (showGoodAt: boolean): FormSchema[] {
return [
// 主键Id
{
label: '',
field: 'userId',
show: false,
component: 'Input',
},
{
label: '用户账号',
field: 'username',
component: 'Input',
componentProps: ({ formModel }) => {
return {
autocomplete: 'off',
onInput: (event: Event) => {
const target = event.target;
formModel.username = target?.value?.replace(/[^\w]/g, '');
},
};
},
rules: [{ required: true, message: '请输入用户账号' }],
dynamicDisabled: ({ values }) => {
return !!values.userId;
},
},
{
label: '头像',
field: 'avatar',
component: 'JImageUpload',
required: true,
componentProps: () => ({
text: '上传头像',
bizPath: 'avatar',
maxCount: 1,
}),
},
{
label: '密码',
field: 'password',
component: 'StrengthMeter',
componentProps: {
//@ts-ignore
autocomplete: 'new-password',
readOnly: true,
onfocus: (field) => {
field.target.readOnly = false;
},
},
dynamicRules: () => {
return [
{
required: true,
validator: (_, value) => {
const { message } = checkPassword(value);
if (message === 'ok') {
return Promise.resolve();
} else {
return Promise.reject(message);
}
},
trigger: 'blur',
},
];
},
ifShow: ({ values }) => {
return !values.userId;
},
},
{
label: '确认密码',
field: 'confirmPassword',
component: 'InputPassword',
dynamicRules: ({ values }) => rules.confirmPassword(values, true),
ifShow: ({ values }) => {
return !values.userId;
},
},
{
label: '姓名',
field: 'realname',
component: 'Input',
required: true,
},
{
label: '所属应急中心',
field: 'centerId',
component: 'ApiSelect',
required: true,
componentProps: {
//@ts-ignore
api: getEmergencyList,
params: {
pageNo: 1,
pageSize: 200,
},
labelField: 'centerName',
valueField: 'id',
immediate: true,
resultField: 'records',
showSearch: true,
filterOption: (input: string, option: any): boolean => {
const str: string = input?.trim()?.toLowerCase();
return option.label.toLowerCase().indexOf(str) >= 0;
},
getPopupContainer: () => document.body,
},
},
{
label: '擅长症状',
field: 'goodAt',
component: 'InputTextArea',
required: true,
ifShow: showGoodAt,
},
{
label: '职称',
field: 'post',
component: 'JDictSelectTag',
componentProps: () => ({
dictCode: 'z_doct_lev',
getPopupContainer: () => document.body,
}),
required: true,
},
{
label: '毕业院校',
field: 'school',
component: 'Input',
},
{
label: '学历',
field: 'edu',
component: 'JDictSelectTag',
componentProps: {
//@ts-ignore
dictCode: 'education',
showSearch: true,
filterOption: (input: string, option: any): boolean => {
const str: string = input.trim().toLowerCase();
return option.label.toLowerCase().indexOf(str) >= 0;
},
getPopupContainer: () => document.body,
},
},
{
label: '人员类型',
field: 'type',
component: 'Input',
show: false,
},
];
};
interface DetailForm extends FormSchema {
value: string;
customRender?: Function;
component: ComponentType | 'Image';
}
export function useDetailForm(showGoodAt: boolean) {
const detailFormSchema = ref<DetailForm[]>([
{
label: '用户账号',
field: 'username',
component: 'Input',
value: '',
},
{
label: '姓名',
field: 'realname',
component: 'Input',
value: '',
},
{
label: '头像',
field: 'avatar',
component: 'Image',
value: '',
},
{
label: '所属应急中心',
field: 'centerName',
component: 'Input',
value: '',
},
{
label: '职称',
field: 'post_dictText',
component: 'Input',
value: '',
},
{
label: '毕业院校',
field: 'school',
component: 'Input',
value: '',
},
{
label: '学历',
field: 'edu_dictText',
component: 'Input',
value: '',
},
{
label: '擅长症状',
field: 'goodAt',
component: 'InputTextArea',
value: '',
ifShow: showGoodAt,
},
]);
function setData(record: Recordable, list: DetailForm[], callback?: Function) {
if (callback) {
callback(list);
return;
}
list = list.filter((item) => {
return item.ifShow === undefined || item.ifShow;
});
list.forEach((item) => {
const { field } = item;
const isEmpty = (obj, field) => {
if (!obj) return true;
return obj[field] === undefined || obj[field] === null || obj[field] === '';
};
if (!isEmpty(record, field)) {
if (Object.hasOwn(item, 'customRender')) {
// @ts-ignore
item.value = item.customRender(record);
} else if (Object.hasOwn(item, 'slot')) {
//@ts-ignore
item.value = { ...record, dataIndex: field };
} else {
item.value = record[field] || '';
}
} else {
item.value = '';
}
});
return list;
}
function getDetailSchema() {
return detailFormSchema.value.filter((item) => {
return item.ifShow === undefined || item.ifShow;
});
}
function setDetailFormData(record: Recordable) {
//@ts-ignore
setData(record, getDetailSchema());
}
return {
detailFormSchema,
getDetailSchema,
setDetailFormData,
};
}
/**
* 流程表单调用这个方法获取formSchema
*/
export function getBpmFormSchema(): FormSchema[] {
// 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema
return formSchema;
}
/**
* @description: 人员类型
*/
export function getPersonType(t: string) {
enum PersonType {
'professional' = '6', //专业人员
'operation' = '5', //操作人员
}
return PersonType[t];
}
export const week_text = (key) => {
const type = {
1: '星期一',
2: '星期二',
3: '星期三',
4: '星期四',
5: '星期五',
6: '星期六',
7: '星期日',
};
return type[key];
};