194 lines
6.1 KiB
TypeScript
194 lines
6.1 KiB
TypeScript
import { message } from 'ant-design-vue';
|
||
import { FormType } from '/@/enums/workflowEnum';
|
||
import { FormConfigItem, FormSettingItem, TableItem } from '/@/model/workflow/formSetting';
|
||
import {
|
||
getCustomJson,
|
||
getSystemJson,
|
||
importWorkflowPermission,
|
||
} from '/@/utils/formSettings/formJson';
|
||
import { randomTime } from '/@bpmn/util/random';
|
||
import { updateFormFieldIdRelevance } from './useUpdateAllFormInfo';
|
||
import { getWorkflowPermissionConfig } from '/@/hooks/web/useWorkFlowForm';
|
||
export const visitorsBookType = 'opinion'; //意见簿类型
|
||
export const hiddenComponentType = 'hiddenComponent'; //隐藏组件类型
|
||
export const titleType = 'title'; //标题类型
|
||
export const dividerType = 'divider'; //分割线类型
|
||
export const infoType = 'info'; //信息体
|
||
export const autoCodeType = 'auto-code'; //编码
|
||
export const buttonType = 'button'; //按钮
|
||
// 标题,分割线、信息体,按钮,编码,意见簿,只允许查看权限
|
||
export const disableTypes = [
|
||
visitorsBookType,
|
||
titleType,
|
||
dividerType,
|
||
infoType,
|
||
//autoCodeType,
|
||
'qrcode', //二维码组件
|
||
]; //表单字段仅仅只有查看权限
|
||
// 开关,滑块,颜色选择,评分,图片 组件权限中,必填权限为disable
|
||
export const requiredDisabled = [
|
||
visitorsBookType,
|
||
titleType,
|
||
dividerType,
|
||
infoType,
|
||
//autoCodeType,
|
||
buttonType,
|
||
'switch',
|
||
'slider',
|
||
'rate',
|
||
'picker-color',
|
||
'image',
|
||
];
|
||
export const doNotShowControl = ['qrcode']; //表单设置不显示编辑和必填操作项的组件
|
||
export const doNotTypes = [visitorsBookType, titleType, dividerType, 'image', 'qrcode']; //不需要考虑的类型
|
||
export async function formPermissionList(list: Array<FormSettingItem>) {
|
||
const returnList: Array<FormConfigItem> = [];
|
||
if (list.length > 0) {
|
||
for (let index = 0; index < list.length; index++) {
|
||
const formConfig = await getFormConfig(list[index]);
|
||
returnList.push(formConfig);
|
||
}
|
||
}
|
||
return returnList;
|
||
}
|
||
export async function getFormConfig(item: {
|
||
key?: string;
|
||
formId: string;
|
||
formName: string;
|
||
formType: FormType;
|
||
name?: string;
|
||
}) {
|
||
const formId = item.formId;
|
||
const formType = item.formType;
|
||
const formName = item.formName;
|
||
const name = item.name ? item.name : item.formName;
|
||
const key = item.key ? item.key : 'form_' + item.formId + '_' + randomTime();
|
||
const formConfig: FormConfigItem = {
|
||
key,
|
||
formType,
|
||
formId,
|
||
formName,
|
||
name,
|
||
showChildren: false,
|
||
requiredAll: true,
|
||
viewAll: true,
|
||
editAll: true,
|
||
children: [],
|
||
};
|
||
if (formType == FormType.CUSTOM) {
|
||
const schema = await getSchemasList(formId, formType);
|
||
if (schema.length > 0) {
|
||
formConfig.children = getWorkflowPermissionConfig(schema);
|
||
}
|
||
} else if (formType == FormType.SYSTEM) {
|
||
const systemJson = await getSchemasList(formId, formType);
|
||
try {
|
||
const val = await importWorkflowPermission(systemJson.systemComponent);
|
||
formConfig.children = val.permissionList;
|
||
} catch (error) {
|
||
//兼容旧系统表单
|
||
const schema = await getSchemasList(formId, 1);
|
||
if (schema.length > 0) {
|
||
formConfig.children = getWorkflowPermissionConfig(schema);
|
||
}
|
||
}
|
||
}
|
||
return formConfig;
|
||
}
|
||
// 删除表单:表单中字段被删除:删除已引用该表单数据字段的所有配置
|
||
function updateFormDataRelevance(
|
||
oldData: FormConfigItem,
|
||
oldChildMap: Map<string, FormConfigItem>,
|
||
newData: FormConfigItem,
|
||
) {
|
||
const formKey = oldData.key;
|
||
const oldChild = oldData.children;
|
||
const newChildMap = new Map();
|
||
const newChild = newData?.children || [];
|
||
if (newChild && Array.isArray(newChild)) {
|
||
newChild.forEach((ele) => {
|
||
if (ele.children.length > 0) {
|
||
ele.children.forEach((item) => {
|
||
newChildMap.set(item.tableName + item.key, item);
|
||
});
|
||
}
|
||
newChildMap.set(ele.key, ele);
|
||
});
|
||
}
|
||
|
||
// 旧表单的字段有,却在新表单中被上删除了,那么就要查找然后删除对应关联了
|
||
if (oldChild && Array.isArray(oldChild)) {
|
||
oldChild.forEach((oldItem) => {
|
||
if (oldChildMap.has(oldItem.key) && !newChildMap.has(oldItem.key)) {
|
||
updateFormFieldIdRelevance(formKey, oldItem.key);
|
||
}
|
||
//子表不会被关联
|
||
// if (newItem.children.length > 0) {
|
||
// }
|
||
});
|
||
}
|
||
}
|
||
export function compareFormInfo(oldData: FormConfigItem, newData: FormConfigItem) {
|
||
const oldChildMap = new Map();
|
||
const oldChild = oldData.children;
|
||
if (oldChild && Array.isArray(oldChild)) {
|
||
oldChild.forEach((old) => {
|
||
if (old.children.length > 0) {
|
||
old.children.forEach((item) => {
|
||
oldChildMap.set(item.tableName + item.key, item);
|
||
});
|
||
}
|
||
oldChildMap.set(old.key, old);
|
||
});
|
||
}
|
||
|
||
const newChild = newData?.children || [];
|
||
const children: Array<TableItem> = [];
|
||
updateFormDataRelevance(oldData, oldChildMap, newData);
|
||
if (newChild && Array.isArray(newChild)) {
|
||
newChild.forEach((newItem) => {
|
||
const tempChildren: Array<TableItem> = [];
|
||
if (newItem.children.length > 0) {
|
||
newItem.children.forEach((item) => {
|
||
tempChildren.push(
|
||
oldChildMap.has(item.tableName + item.key)
|
||
? oldChildMap.get(item.tableName + item.key)
|
||
: item,
|
||
);
|
||
});
|
||
}
|
||
newItem.children = tempChildren;
|
||
newItem = oldChildMap.has(newItem.key)
|
||
? oldChildMap.get(newItem.key).type == 'form'
|
||
? newItem
|
||
: oldChildMap.get(newItem.key)
|
||
: newItem;
|
||
children.push(newItem);
|
||
});
|
||
}
|
||
newData.children = children;
|
||
return newData;
|
||
}
|
||
export async function getSchemasList(formId: string, formType: FormType) {
|
||
try {
|
||
if (formType == FormType.CUSTOM) {
|
||
const customJson: any = await getCustomJson(formId);
|
||
if (customJson && customJson.schemas) {
|
||
return customJson.schemas;
|
||
}
|
||
} else if (formType == FormType.SYSTEM) {
|
||
const systemJson = await getSystemJson(formId);
|
||
if (systemJson) {
|
||
return systemJson;
|
||
} else {
|
||
message.error('读取系统表单失败');
|
||
return [];
|
||
}
|
||
} else {
|
||
return [];
|
||
}
|
||
} catch (error) {
|
||
return [];
|
||
}
|
||
}
|