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; // 工作流节点表单权限配置 formConfigKey: String; //唯一节点表单key opinions?: Array | undefined; //意见簿意见 opinionsComponents?: Array | undefined; //意见簿组件 }, isViewProcess: Boolean, uploadComponentIds: Array, ) { 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; 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 = []; if (schema.length > 0) { children = getSchemasConfig(schema); } return children; } function getSchemasConfig(list: FormSchema[]) { const arr: Array = []; 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 = []; 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 = []; 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; }