Files
geg-gas-web/src/hooks/web/useWorkFlowForm.ts

500 lines
14 KiB
TypeScript
Raw Normal View History

2024-02-05 09:15:37 +08:00
import { buildOption } from '/@/utils/helper/designHelper';
import { FormProps } from '/@/components/Form';
import { separator } from '/@/views/workflow/design/bpmn/config/info';
import { TaskApproveOpinion, WorkFlowFormParams } from '/@/model/workflow/bpmnConfig';
import { FormConfigItem } from '/@/model/workflow/formSetting';
import { FormSchema } from '/@/components/Form';
import { TableItem } from '/@/model/workflow/formSetting';
import { disableTypes, hiddenComponentType, requiredDisabled } from '/@bpmn/config/formPermission';
/*
** JSON配置**
data{
formJson json配置
formConfigChildren
formConfigKey key
opinions 簿
opinionsComponents 簿
}
isViewProcess
uploadComponentIds: 所有上传文件的文件夹id
*/
export function changeFormJson(
data: {
formJson: any; // 表单json配置 FormJson | FormProps
formConfigChildren: Array<FormConfigItem>; // 工作流节点表单权限配置
formConfigKey: String; //唯一节点表单key
opinions?: Array<TaskApproveOpinion> | undefined; //意见簿意见
opinionsComponents?: Array<string> | undefined; //意见簿组件
},
isViewProcess: Boolean,
uploadComponentIds: Array<string>,
) {
const returnData = handlerFormPermission(
data.formJson.list ? buildOption(data.formJson, false) : data.formJson,
data.formConfigChildren,
data.formConfigKey,
isViewProcess,
{ uploadComponentIds, opinions: data.opinions, opinionsComponents: data.opinionsComponents },
);
// uploadComponent 带上所有上传文件的文件夹id
return returnData;
}
// 获取工作流表单权限map
/*
Map
[
Key:{
{
edit:是否可编辑权限,
view:是否可查看权限,
disabled:是否禁用权限,
children:[]
}
}
]
*/
export function getPermissionConfigMap(formConfigChildren) {
const map = new Map();
formConfigChildren.forEach((element) => {
map.set(element.key, element);
});
return map;
}
function handlerFormPermission(
buildOptionJson: FormProps,
formConfigChildren,
formKey,
isViewProcess,
otherParams,
) {
const permissionConfigMap = getPermissionConfigMap(formConfigChildren);
const formShow: Number = 0; //表单是否有显示的组件有则大于0
buildOptionJson.schemas = schemeList(
buildOptionJson.schemas,
permissionConfigMap,
formKey,
formShow,
isViewProcess,
otherParams,
);
return {
buildOptionJson,
uploadComponentIds: otherParams.uploadComponentIds,
};
}
function schemeList(
schemas,
permissionConfigMap,
formKey,
formShow,
isViewProcess,
otherParams,
tableName?,
) {
schemas = schemas.map((schema) => {
if (['Card', 'Grid', 'Tab'].includes(schema.component)) {
formShow += 1;
if (schema.children && schema.children.length > 0) {
schema.children.forEach((ele2) => {
if (ele2.list && ele2.list.length > 0) {
ele2.list = schemeList(
ele2.list,
permissionConfigMap,
formKey,
formShow,
isViewProcess,
otherParams,
tableName,
);
}
});
}
} else if (schema.component === 'TableLayout') {
formShow += 1;
if (schema.children && schema.children.length > 0) {
schema.children.forEach((ele2) => {
if (ele2.list && ele2.list.length > 0) {
ele2.list.forEach((ele3) => {
if (ele3.children && ele3.children.length > 0) {
ele3.children = schemeList(
ele3.children,
permissionConfigMap,
formKey,
formShow,
isViewProcess,
otherParams,
tableName,
);
}
});
}
});
}
} else if (schema.component == 'SubForm') {
if (
schema.componentProps &&
schema.componentProps.columns &&
schema.componentProps.columns.length > 0
) {
const permissionConfig = permissionConfigMap.has(schema.key)
? permissionConfigMap.get(schema.key)
: null;
// 查看流程
if (isViewProcess) {
schema.dynamicDisabled = true;
}
if (!permissionConfig?.view) {
schema.show = false;
} else {
formShow += 1;
if (!permissionConfig?.edit) {
schema.dynamicDisabled = true;
}
}
schema.componentProps.columns = schema.componentProps.columns.map((ele3) => {
const tableItemPermissionConfig = permissionConfig.children.find((x) => {
if (x.key) {
return x.key === ele3.key;
}
if (x.fieldId) {
return x.fieldId === ele3.dataIndex;
}
});
return getSchemePermissionItem(
ele3,
tableItemPermissionConfig,
formKey,
isViewProcess,
otherParams,
);
});
}
} else if (schema.component == 'OneForOne') {
const permissionConfig = permissionConfigMap.has(schema.key)
? permissionConfigMap.get(schema.key)
: null;
if (!permissionConfig?.view) {
schema.show = false;
} else {
formShow += 1;
}
if (schema.componentProps?.childSchemas?.length > 0) {
const onePermissionConfigMap = getPermissionConfigMap(permissionConfig.children);
schema.componentProps.childSchemas = schemeList(
schema.componentProps.childSchemas,
onePermissionConfigMap,
formKey,
formShow,
isViewProcess,
otherParams,
schema.field,
);
}
} else {
const permissionConfig = permissionConfigMap.has(schema.key)
? permissionConfigMap.get(schema.key)
: null;
schema = getSchemePermissionItem(
schema,
permissionConfig,
formKey,
isViewProcess,
otherParams,
tableName,
);
if (permissionConfig?.view) {
formShow += 1;
}
}
return schema;
});
return formShow > 0 ? schemas : null;
}
function getSchemePermissionItem(
schema,
permissionConfig,
formKey,
isViewProcess,
otherParams,
tableName?,
) {
if (permissionConfig) {
//查看
schema.show = permissionConfig.view;
// 必填
if (schema.componentProps) schema.componentProps.required = permissionConfig.required;
schema.required = permissionConfig.required;
//编辑
if (schema.componentProps) schema.componentProps.disabled = !permissionConfig.edit;
schema.dynamicDisabled = !permissionConfig.edit;
// 查看流程
if (isViewProcess) {
schema.dynamicDisabled = true;
}
} else {
schema.show = false;
schema.dynamicDisabled = true;
}
// 修改意见簿
if (schema.component == 'Opinion') {
const key = formKey + separator + schema.key;
schema.defaultValue = [];
if (otherParams.opinionsComponents?.includes(key)) {
schema.defaultValue = otherParams.opinions;
}
}
// 上传组件集合
if (schema.component == 'Upload') {
let key = '';
if (tableName) {
key = formKey + separator + tableName + separator + schema.field;
} else {
key = formKey + separator + schema.field;
}
otherParams.uploadComponentIds.push(key);
}
if (permissionConfig?.isSubTable) {
// 子表单上传组件集合
if (schema.componentType == 'Upload') {
const key =
formKey + separator + permissionConfig.tableName + separator + permissionConfig.fieldId;
otherParams.uploadComponentIds.push(key);
}
}
return schema;
}
// 根据工作流页面权限,设置表单属性(必填,禁用,显示)
export function changeWorkFlowForm(formProps: FormProps, obj: WorkFlowFormParams) {
const {
formConfigChildren,
formConfigKey,
opinions,
opinionsComponents,
isViewProcess,
uploadIds,
formModels,
} = obj;
const returnData: {
buildOptionJson: FormProps;
uploadComponentIds: Array<string>;
formModels: any;
isViewProcess: boolean;
} = {
buildOptionJson: {}, //重新的配置Json文件
uploadComponentIds: [], //
formModels,
isViewProcess: false,
};
try {
const { buildOptionJson, uploadComponentIds } = changeFormJson(
{
formJson: formProps,
formConfigChildren,
formConfigKey: formConfigKey,
opinions,
opinionsComponents,
},
isViewProcess,
uploadIds,
);
returnData.buildOptionJson = buildOptionJson;
returnData.uploadComponentIds = uploadComponentIds;
return returnData;
} catch (error) {
return returnData;
}
}
// 根据表单json 生成权限配置
export function getWorkflowPermissionConfig(schema) {
let children: Array<TableItem> = [];
if (schema.length > 0) {
children = getSchemasConfig(schema);
}
return children;
}
function getSchemasConfig(list: FormSchema[]) {
const arr: Array<TableItem> = [];
if (list && list.length > 0) {
list.forEach((ele1) => {
if (['Card', 'Grid', 'Tab'].includes(ele1.component)) {
if (ele1.children && ele1.children.length > 0) {
ele1.children.forEach((ele2) => {
if (ele2.list && ele2.list.length > 0) {
arr.push(...getSchemasConfig(ele2.list));
}
});
}
} else if (ele1.component === 'TableLayout') {
if (ele1.children && ele1.children.length > 0) {
ele1.children.forEach((ele2) => {
if (ele2.list && ele2.list.length > 0) {
ele2.list.forEach((ele3) => {
if (ele3.children && ele3.children.length > 0) {
arr.push(...getSchemasConfig(ele3.children));
}
});
}
});
}
} else if (ele1.component == 'SubForm') {
arr.push(getTableConfig(ele1));
} else if (ele1.component === 'OneForOne') {
const obj: TableItem = getItemConfig(ele1);
obj.isSubTable = true;
obj.showChildren = false;
const tempList: FormSchema[] = ele1.componentProps?.childSchemas || [];
obj.children.push(...getSchemasConfig(tempList));
arr.push(obj);
} else {
arr.push(getItemConfig(ele1));
}
});
}
return arr;
}
function getItemConfig(element) {
const children: Array<TableItem> = [];
let required = true;
let view = true;
let edit = true;
let disabled = false;
let isSaveTable = false; //组件是否存表
const type = element.type;
if (disableTypes.includes(element.type)) {
required = false;
view = true;
edit = false;
disabled = true;
}
if (requiredDisabled.includes(element.type)) {
required = false;
}
// 隐藏组件权限不要设置
if (element.type === hiddenComponentType) {
required = false;
view = false;
edit = false;
disabled = true;
}
if (element.type === 'input' && element.componentProps.isSave) {
required = false;
view = true;
edit = false;
disabled = true;
isSaveTable = true;
}
return {
required,
view,
edit,
disabled,
isSaveTable,
tableName: '',
fieldName: element.label,
fieldId: element.field,
isSubTable: false,
showChildren: true,
type,
key: element.key,
children,
};
}
function getTableConfig(element) {
const children: Array<TableItem> = [];
if (
element.componentProps &&
element.componentProps.columns &&
element.componentProps.columns.length > 0
) {
element.componentProps.columns.forEach((ele2) => {
if (ele2.dataIndex) children.push(getTableItemConfig(element.field, ele2));
});
}
return {
required: true,
view: true,
edit: true,
disabled: false,
isSubTable: true,
showChildren: false,
tableName: element.field,
fieldName: element.label,
fieldId: element.field,
type: element.type,
key: element.key,
children,
};
}
function getTableItemConfig(tableName: string, element) {
let isSaveTable = false; //组件是否存表
if (element.type === 'input' && element.componentProps.isSave) {
isSaveTable = true;
}
return {
required: true,
view: true,
edit: true,
disabled: false,
isSubTable: true,
isSaveTable,
showChildren: false,
tableName: tableName,
fieldName: element.title,
fieldId: element.dataIndex,
type: element.type,
key: element.key,
children: [],
};
}
// 辅助设置表单Disabled
export function changeSchemaDisabled(schemas) {
const layoutComponents = ['tab', 'grid', 'card'];
schemas?.map((info) => {
if (layoutComponents.includes(info.type!)) {
info.children?.map((childInfo) => {
childInfo.list.map((com) => {
if (layoutComponents.includes(com.type)) {
changeSchemaDisabled(childInfo.list);
} else {
com.dynamicDisabled = true;
}
});
});
} else if (info.type == 'table-layout') {
info.children?.map((childInfo) => {
childInfo.list.map((com) => {
com.children.map((el) => {
if (layoutComponents.includes(el.type) || el.type == 'table-layout') {
changeSchemaDisabled(com.children);
} else {
el.dynamicDisabled = true;
}
});
});
});
} else if (info.type == 'one-for-one') {
changeSchemaDisabled(info.componentProps.childSchemas);
} else {
info.dynamicDisabled = true;
}
});
return schemas;
}