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

500 lines
14 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}