From 45cf9d10150a2e1206d6cd8cd59b20eb40b2c36a Mon Sep 17 00:00:00 2001 From: freshzxf Date: Sat, 27 Jan 2024 14:02:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=95=E7=94=A8=E5=9E=8B=E5=9B=9E?= =?UTF-8?q?=E5=A1=AB=E6=95=B0=E6=8D=AE=E7=AD=89=E5=8A=9F=E8=83=BD=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E6=8F=90=E4=BA=A4=EF=BC=88=E5=BE=85=E5=AE=8C=E5=96=84?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkForm/Design/config/attribute.tsx | 9 +- .../Design/form/customItem/dataBox.tsx | 56 ++++++++----- .../WorkForm/Viewer/customItem/dataBox.tsx | 83 +++++++++++++------ .../DataStandard/WorkForm/Viewer/formItem.tsx | 8 +- .../DataStandard/WorkForm/Viewer/index.tsx | 18 +++- .../elements/widgets/card/List.tsx | 3 + .../tools/editModal/formEditModal.tsx | 5 +- src/executor/tools/generate/columns.tsx | 27 ++++++ src/executor/tools/task/start/default.tsx | 1 + src/executor/tools/workForm/detail.tsx | 6 +- src/executor/tools/workForm/index.tsx | 4 +- src/executor/tools/workForm/primary.tsx | 3 +- src/utils/tools.ts | 2 +- 13 files changed, 168 insertions(+), 57 deletions(-) diff --git a/src/components/DataStandard/WorkForm/Design/config/attribute.tsx b/src/components/DataStandard/WorkForm/Design/config/attribute.tsx index 2dbe32c52..03e9ab1e9 100644 --- a/src/components/DataStandard/WorkForm/Design/config/attribute.tsx +++ b/src/components/DataStandard/WorkForm/Design/config/attribute.tsx @@ -135,10 +135,15 @@ const AttributeConfig: React.FC = ({ // disabled: true, // }} />, + , = ({ = (props) => { @@ -27,14 +27,14 @@ const DataBox: React.FC = (props) => { height, readOnly, field, - attributes, defaultValue, + attributes, // allowViewDetail, multiple, nameAttribute, } = props; - const attr = attributes.find((item: schema.XAttribute) => item.id === props.name)!; - const targetFormId = attr.property?.formId; + const attr = attributes?.find((item: schema.XAttribute) => item.id === props.name)!; + const targetFormId = attr?.property?.formId; const [form, setForm] = useState(); const [formInst, setFormInst] = useState(); const [formBelong, setFormBelong] = useState(); @@ -44,6 +44,9 @@ const DataBox: React.FC = (props) => { ); // 点击选择数据 const onClick = () => { + if (!targetFormId) { + return message.warning('该属性未关联表单,请更新属性信息!'); + } EditModal.showFormSelect({ form: form!, fields: formInst?.fields!, @@ -80,23 +83,32 @@ const DataBox: React.FC = (props) => { // 初始化 useAsyncLoad(async () => { if (targetFormId) { - const targetFormMetadata = orgCtrl.user.findMetadata(targetFormId); - if (targetFormMetadata) { - const targetFormBelong = orgCtrl.targets.find( - (i) => i.id === targetFormMetadata.belongId, - )!; + let formList: XForm[] = []; + let targetFormMetadata = orgCtrl.user.findMetadata(targetFormId); + if (!targetFormMetadata && props.target) { + formList = await props.target?.resource.formColl.find([targetFormId]); + } + if (targetFormMetadata || formList.length) { + const targetFormBelong = targetFormMetadata + ? orgCtrl.targets.find((i) => i.id === targetFormMetadata?.belongId)! + : props.target; // 设置归属 setFormBelong(targetFormBelong as IBelong); - const formList = await targetFormBelong?.resource.formColl.find([targetFormId]); - // 设置表单 - setForm(formList[0]); - const formInst = new Form( - { ...formList[0], id: formList[0].id + '_' }, - targetFormBelong.directory, - ); - await formInst.loadFields(); - // 设置表单实例 - setFormInst(formInst); + if (!formList.length) { + formList = + (await targetFormBelong?.resource.formColl.find([targetFormId])) || []; + } + if (formList.length && targetFormBelong) { + // 设置表单 + setForm(formList[0]); + const formInst = new Form( + { ...formList[0], id: formList[0].id + '_' }, + targetFormBelong.directory, + ); + await formInst.loadFields(); + // 设置表单实例 + setFormInst(formInst); + } return formInst; } } diff --git a/src/components/DataStandard/WorkForm/Viewer/customItem/dataBox.tsx b/src/components/DataStandard/WorkForm/Viewer/customItem/dataBox.tsx index 7b2bafa02..dad105388 100644 --- a/src/components/DataStandard/WorkForm/Viewer/customItem/dataBox.tsx +++ b/src/components/DataStandard/WorkForm/Viewer/customItem/dataBox.tsx @@ -1,8 +1,8 @@ import React, { useState, useEffect, useCallback } from 'react'; -import { Button } from 'antd'; +import { Button, message } from 'antd'; import _ from 'lodash'; import { EditModal } from '@/executor/tools/editModal'; -import { IBelong, IForm } from '@/ts/core'; +import { IBelong, IForm, ITarget } from '@/ts/core'; import { schema } from '@/utils/excel'; import orgCtrl from '@/ts/controller'; import { Form } from '@/ts/core/thing/standard/form'; @@ -14,12 +14,14 @@ import { jsonParse } from '@/utils/tools'; import { FieldModel, FiledLookup } from '@/ts/base/model'; interface DataBoxProps extends ISelectBoxOptions { + form?: schema.XForm; field: FieldModel; attributes: XAttribute[]; multiple: boolean; + allowSetFieldsValue?: boolean; nameAttribute: string; - target: schema.XTarget; - // onValueChange?: any; + target?: ITarget; + setFieldsValue?: (data: any) => void; } const DataBox: React.FC = (props) => { const { @@ -27,14 +29,15 @@ const DataBox: React.FC = (props) => { height, readOnly, field, - attributes, defaultValue, + attributes, // allowViewDetail, + allowSetFieldsValue, multiple, nameAttribute, } = props; - const attr = attributes.find((item: schema.XAttribute) => item.id === props.name)!; - const targetFormId = attr.property?.formId; + const attr = attributes?.find((item: schema.XAttribute) => item.id === props.name)!; + const targetFormId = attr?.property?.formId; const [form, setForm] = useState(); const [formInst, setFormInst] = useState(); const [formBelong, setFormBelong] = useState(); @@ -42,8 +45,20 @@ const DataBox: React.FC = (props) => { const [selectTarget, setSelectTarget] = useState( jsonParse(defaultValue, defaultValue), ); + + // 设置当前字段值 + const setFieldValue = (dataSource: FiledLookup[]) => { + setDataSource(dataSource); + field.lookups = dataSource; + setSelectTarget( + multiple ? dataSource?.map((item) => item.value) : dataSource?.[0]?.value, + ); + }; // 点击选择数据 const onClick = () => { + if (!form) { + return message.warning('未查询到关联表单,无法选择数据!'); + } EditModal.showFormSelect({ form: form!, fields: formInst?.fields!, @@ -55,7 +70,18 @@ const DataBox: React.FC = (props) => { value: item.id, text: item[nameAttribute], })); - setDataSource(dataSource); + + // 需要设置表单值 + if (allowSetFieldsValue) { + const toSetData = Object.keys(values[0]) + .filter((id: any) => !isNaN(id) && id !== field.id) + .reduce((pre: any, cur) => { + pre[cur] = values[0][cur]; + return pre; + }, {}); + props.setFieldsValue && props.setFieldsValue(toSetData); + } + setFieldValue(dataSource); }, }); }; @@ -63,7 +89,7 @@ const DataBox: React.FC = (props) => { const onValueChanged = useCallback((e: any) => { const value = e.value; setSelectTarget(value); - if (!value) setDataSource([]); + if (!value) setFieldValue([]); props.onValueChanged?.apply(this, [ { value: JSON.stringify(Array.isArray(value) ? value : [value]) } as any, ]); @@ -80,23 +106,32 @@ const DataBox: React.FC = (props) => { // 初始化 useAsyncLoad(async () => { if (targetFormId) { - const targetFormMetadata = orgCtrl.user.findMetadata(targetFormId); - if (targetFormMetadata) { - const targetFormBelong = orgCtrl.targets.find( - (i) => i.id === targetFormMetadata.belongId, - )!; + let formList: XForm[] = []; + let targetFormMetadata = orgCtrl.user.findMetadata(targetFormId); + if (!targetFormMetadata && props.target) { + formList = await props.target?.resource.formColl.find([targetFormId]); + } + if (targetFormMetadata || formList.length) { + const targetFormBelong = targetFormMetadata + ? orgCtrl.targets.find((i) => i.id === targetFormMetadata?.belongId)! + : props.target; // 设置归属 setFormBelong(targetFormBelong as IBelong); - const formList = await targetFormBelong?.resource.formColl.find([targetFormId]); - // 设置表单 - setForm(formList[0]); - const formInst = new Form( - { ...formList[0], id: formList[0].id + '_' }, - targetFormBelong.directory, - ); - await formInst.loadFields(); - // 设置表单实例 - setFormInst(formInst); + if (!formList.length) { + formList = + (await targetFormBelong?.resource.formColl.find([targetFormId])) || []; + } + if (formList.length && targetFormBelong) { + // 设置表单 + setForm(formList[0]); + const formInst = new Form( + { ...formList[0], id: formList[0].id + '_' }, + targetFormBelong.directory, + ); + await formInst.loadFields(); + // 设置表单实例 + setFormInst(formInst); + } return formInst; } } diff --git a/src/components/DataStandard/WorkForm/Viewer/formItem.tsx b/src/components/DataStandard/WorkForm/Viewer/formItem.tsx index 75d903857..834afef84 100644 --- a/src/components/DataStandard/WorkForm/Viewer/formItem.tsx +++ b/src/components/DataStandard/WorkForm/Viewer/formItem.tsx @@ -13,7 +13,7 @@ import { DateBox, NumberBox, SelectBox, TextArea, TextBox } from 'devextreme-rea import React, { useEffect, useState } from 'react'; import { ValueChangedEvent } from 'devextreme/ui/text_box'; import { formatDate } from '@/utils'; -import { IBelong, TargetType } from '@/ts/core'; +import { IBelong, ITarget, TargetType } from '@/ts/core'; import { useEffectOnce } from 'react-use'; interface IFormItemProps { @@ -26,6 +26,8 @@ interface IFormItemProps { belong: IBelong; rules: model.RenderRule[]; onValuesChange?: (field: string, value: any) => void; + setFieldsValue?: (data: any) => void; + target?: ITarget; } const FormItem: React.FC = (props) => { @@ -67,6 +69,7 @@ const FormItem: React.FC = (props) => { props.onValuesChange?.apply(this, [props.field.id, e.value]); } }, + setFieldsValue: props.setFieldsValue, width: getItemWidth(props.numStr), }; @@ -107,8 +110,9 @@ const FormItem: React.FC = (props) => { return ( ); case '多级选择框': diff --git a/src/components/DataStandard/WorkForm/Viewer/index.tsx b/src/components/DataStandard/WorkForm/Viewer/index.tsx index 6beda6418..64357ac4c 100644 --- a/src/components/DataStandard/WorkForm/Viewer/index.tsx +++ b/src/components/DataStandard/WorkForm/Viewer/index.tsx @@ -1,5 +1,5 @@ import { common, model, schema } from '@/ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import React, { useEffect } from 'react'; import Toolbar, { Item } from 'devextreme-react/toolbar'; import FormItem from './formItem'; @@ -21,6 +21,7 @@ const WorkFormViewer: React.FC<{ rules: model.RenderRule[]; formData?: model.FormEditData; onValuesChange?: (fieldId: string, value: any, data: any) => void; + target?: ITarget; }> = (props) => { props.data.name = props.form.name; const [key, forceUpdate] = useObjectUpdate(props.rules); @@ -192,6 +193,13 @@ const WorkFormViewer: React.FC<{ } } }; + const setFieldsValue = (data: any) => { + Object.keys(data).forEach((fieldId) => { + onValueChange(fieldId, data[fieldId], true); + }); + forceUpdate(); + }; + useEffect(() => { if (props.changedFields) { props.changedFields @@ -285,10 +293,17 @@ const WorkFormViewer: React.FC<{ onValuesChange={onValueChange} /> {props.fields.map((field) => { + if (field.valueType === '引用型') { + field.formId = props.form?.attributes?.find( + (attr) => attr.id === field.id, + )?.formId; + } return ( a.destId == field.id, @@ -298,6 +313,7 @@ const WorkFormViewer: React.FC<{ belong={props.belong} notifyEmitter={notifyEmitter} onValuesChange={onValueChange} + setFieldsValue={setFieldsValue} /> ); })} diff --git a/src/executor/design/pageBuilder/elements/widgets/card/List.tsx b/src/executor/design/pageBuilder/elements/widgets/card/List.tsx index a490d5d06..73580166b 100644 --- a/src/executor/design/pageBuilder/elements/widgets/card/List.tsx +++ b/src/executor/design/pageBuilder/elements/widgets/card/List.tsx @@ -143,6 +143,9 @@ const View: React.FC> = (props) => { if (props.work?.id) { const work = await props.ctx.view.pageInfo.loadWork(props.work.id); const node = await work?.loadNode(); + if (!keys.length) { + return message.warning('未选择商品,发起失败!'); + } if (work && node) { const instance: model.InstanceDataModel = { data: {}, diff --git a/src/executor/tools/editModal/formEditModal.tsx b/src/executor/tools/editModal/formEditModal.tsx index fbe5c264c..fbf8ca4e5 100644 --- a/src/executor/tools/editModal/formEditModal.tsx +++ b/src/executor/tools/editModal/formEditModal.tsx @@ -1,7 +1,7 @@ import { Modal } from 'antd'; import React from 'react'; import { kernel, model, schema } from '@/ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import WorkFormViewer from '@/components/DataStandard/WorkForm/Viewer'; interface IFormEditProps { @@ -11,6 +11,7 @@ interface IFormEditProps { create: boolean; initialValues?: any; onSave: (values: any) => void; + target?: ITarget; } const FormEditModal = ({ @@ -20,6 +21,7 @@ const FormEditModal = ({ create, initialValues, onSave, + target, }: IFormEditProps) => { const editData: any = { ...initialValues }; const modal = Modal.confirm({ @@ -38,6 +40,7 @@ const FormEditModal = ({ fields={fields} data={editData} belong={belong} + target={target} /> ), diff --git a/src/executor/tools/generate/columns.tsx b/src/executor/tools/generate/columns.tsx index bbfe5f303..0e2a73266 100644 --- a/src/executor/tools/generate/columns.tsx +++ b/src/executor/tools/generate/columns.tsx @@ -5,6 +5,8 @@ import EntityIcon from '@/components/Common/GlobalComps/entityIcon'; import { generateUuid } from '@/ts/base/common'; import { ellipsisText, formatDate } from '@/utils'; import { Button } from 'antd'; +import { jsonParse } from '@/utils/tools'; +import { FiledLookup } from '@/ts/base/model'; /** 使用form生成表单列 */ export const GenerateColumn = ( @@ -63,6 +65,31 @@ export const GenerateColumn = ( return (field.lookups || []).find((i) => i.value === value)?.text || value; }; break; + case '引用型': + props.dataType = 'string'; + props.width = 150; + props.allowFiltering = false; + cellRender.render = (data: any) => { + const arrData = jsonParse(data.value, data.value); + const lookups = field.lookups?.filter((item) => arrData.includes(item.value)); + if (lookups) { + return lookups.map((lookup: FiledLookup, i: number) => { + return ( + + ); + }); + } + return ''; + }; + break; case '数值型': props.dataType = 'number'; props.width = 150; diff --git a/src/executor/tools/task/start/default.tsx b/src/executor/tools/task/start/default.tsx index ea7d6543c..3885b968a 100644 --- a/src/executor/tools/task/start/default.tsx +++ b/src/executor/tools/task/start/default.tsx @@ -101,6 +101,7 @@ const DefaultWayStart: React.FC = ({ allowEdit belong={apply.belong} data={apply.instanceData} + target={target} nodeId={apply.instanceData.node.id} /> {loadGateway(apply)} diff --git a/src/executor/tools/workForm/detail.tsx b/src/executor/tools/workForm/detail.tsx index ea8af345a..563b6cda0 100644 --- a/src/executor/tools/workForm/detail.tsx +++ b/src/executor/tools/workForm/detail.tsx @@ -1,5 +1,5 @@ import { model, schema } from '../../../ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import { useEffect, useState } from 'react'; import React from 'react'; import { Tabs } from 'antd'; @@ -17,6 +17,7 @@ interface IProps { data: model.InstanceDataModel; getFormData: (form: schema.XForm) => model.FormEditData; onChanged?: (id: string, data: model.FormEditData, field: string, value: any) => void; + target?: ITarget; } const DetailTable: React.FC = (props) => { @@ -94,6 +95,7 @@ const DetailTable: React.FC = (props) => { }; } }; + console.log(formData.after); return ( = (props) => { form: form, fields: fields, belong: props.belong, + target: props.target, create: true, onSave: (values) => { + console.log(values); formData.after.push(values); setFormData({ ...formData }); }, diff --git a/src/executor/tools/workForm/index.tsx b/src/executor/tools/workForm/index.tsx index 8f001acaa..f6f3f8f13 100644 --- a/src/executor/tools/workForm/index.tsx +++ b/src/executor/tools/workForm/index.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { common, model, schema } from '../../../ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import PrimaryForms from './primary'; import DetailForms from './detail'; import { formatDate } from '@/utils'; @@ -13,6 +13,7 @@ interface IWorkFormProps { belong: IBelong; nodeId: string; data: model.InstanceDataModel; + target?: ITarget; } /** 流程节点表单 */ @@ -217,7 +218,6 @@ const WorkForm: React.FC = (props) => { setChangedFields(refreshFields); } }; - return (
{node.primaryForms && node.primaryForms.length > 0 && ( diff --git a/src/executor/tools/workForm/primary.tsx b/src/executor/tools/workForm/primary.tsx index 26295f157..79dcf1c40 100644 --- a/src/executor/tools/workForm/primary.tsx +++ b/src/executor/tools/workForm/primary.tsx @@ -1,5 +1,5 @@ import { kernel, model, schema } from '../../../ts/base'; -import { IBelong } from '@/ts/core'; +import { IBelong, ITarget } from '@/ts/core'; import { useState } from 'react'; import React from 'react'; import { Tabs } from 'antd'; @@ -15,6 +15,7 @@ interface IProps { data: model.InstanceDataModel; getFormData: (form: schema.XForm) => model.FormEditData; onChanged?: (id: string, data: model.FormEditData, field: string, value: any) => void; + target?: ITarget; } const PrimaryForm: React.FC = (props) => { diff --git a/src/utils/tools.ts b/src/utils/tools.ts index d04612b5f..77684e60a 100644 --- a/src/utils/tools.ts +++ b/src/utils/tools.ts @@ -362,7 +362,7 @@ const loadGatewayNodes = ( return memberNodes; }; -const jsonParse = (val: any, defaultVal = null) => { +const jsonParse = (val: any, defaultVal: any = null) => { if (!val || typeof val !== 'string') { // console.warn('JSON.parse need string param'); return defaultVal; -- Gitee