From ecf2e4250455217a324e07e771b1a73f309b4c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AE=97=E9=98=B3?= <1627320840@qq.com> Date: Tue, 21 Oct 2025 05:59:06 +0000 Subject: [PATCH 1/3] update src/components/Common/FlowDesign/Config/Nodes/ConditionNode/index.tsx. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 王宗阳 <1627320840@qq.com> --- .../Config/Nodes/ConditionNode/index.tsx | 126 ++++++++++++++---- 1 file changed, 98 insertions(+), 28 deletions(-) diff --git a/src/components/Common/FlowDesign/Config/Nodes/ConditionNode/index.tsx b/src/components/Common/FlowDesign/Config/Nodes/ConditionNode/index.tsx index 0ad67de7c..10e1e7d1c 100644 --- a/src/components/Common/FlowDesign/Config/Nodes/ConditionNode/index.tsx +++ b/src/components/Common/FlowDesign/Config/Nodes/ConditionNode/index.tsx @@ -11,6 +11,12 @@ import { AiOutlineDelete } from 'react-icons/ai'; import { model } from '@/ts/base'; import orgCtrl from '@/ts/controller'; +/** + * 组件的属性接口定义 + * @param current 当前节点对象(包含条件等信息) + * @param conditions 可供选择的字段条件列表(字段模型数组) + * @param refresh 父组件传入的刷新方法,用于更新视图 + */ interface Iprops { current: WorkNodeDisplayModel; conditions: model.FieldModel[]; @@ -18,38 +24,58 @@ interface Iprops { } /** - * @description: 条件 - * @return {*} + * @description 条件节点组件(用于渲染一个可动态添加、编辑、删除的条件组) + * @returns React 组件 */ - const ConditionNode: React.FC = (props) => { + // 若没有可供选择的条件字段,直接提示 if (props.conditions.length < 1) return <>请先选择主表且有特性; + + /** key用于强制重新渲染Form,当条件列表变化时更新 */ const [key, setKey] = useState(0); + + /** antd Form 实例 */ const [form] = Form.useForm(); + + /** 当前节点的状态(包含所有条件) */ const [currentNode, setCurrentNode] = useState(); + /** + * 当 props.current 变化时(比如切换节点) + * 同步更新 currentNode 和 Form 表单数据 + */ useEffect(() => { setCurrentNode(props.current); form.setFieldsValue({ allContent: props.current.conditions }); }, [props]); - /**点击添加的时候默认增加一行 */ + /** + * 点击 “添加条件” 按钮时调用 + * 在当前节点的条件数组中新增一个空条件对象 + */ const addConditionGroup = () => { props.current?.conditions?.push({ - pos: props.current?.conditions.length + 1, - paramKey: '', - paramLabel: '', - key: '', - label: '', - type: dataType.NUMERIC, - val: undefined, - display: '', + pos: props.current?.conditions.length + 1, // 条件位置序号 + paramKey: '', // 参数键(字段id) + paramLabel: '', // 参数名 + key: '', // 条件符号(例如 >、=) + label: '', // 条件文字描述 + type: dataType.NUMERIC, // 数据类型(默认数值型) + val: undefined, // 值 + display: '', // 显示文本 }); + // 更新key以强制重新渲染 setKey(key + 1); }; + /** + * 根据字段类型返回不同的“操作符选择框”(例如 =、>、<、≠ 等) + * @param condition 当前条件对象 + * @param index 条件索引 + */ const loadOperateItem = (condition: conditiondType, index: number) => { if (condition.type != 'NUMERIC') { + // 非数值类型(字符串/枚举等),仅提供“等于/不等于” return ( = (props) => { } }; + /** + * 根据字段类型渲染不同的“值输入框” + * 比如:字典型显示下拉框,数值型显示数字输入框,其他显示普通文本框 + */ const loadValueItem = (condition: conditiondType, index: number) => { switch (condition.type) { case 'DICT': + // 枚举/字典类型 return ( = (props) => { } }; + /** + * 将字段的 valueType(文本类型)转换为统一的数据类型枚举 + */ const convertType = (valueType?: string) => { switch (valueType) { case '分类型': case '选择型': - return dataType.DICT; + return dataType.DICT; // 枚举/字典 case '日期型': - return dataType.DATE; + return dataType.DATE; // 日期 case '用户型': - return dataType.BELONG; + return dataType.BELONG; // 用户 case '数值型': case '货币型': - return dataType.NUMERIC; + return dataType.NUMERIC; // 数值 } - return dataType.STRING; + return dataType.STRING; // 默认字符串 }; + /** + * 表单值变化时调用(例如选择字段、修改值等) + * 作用:同步 form 中的值到 currentNode.conditions + */ const onChange = async () => { const currentValue = await form.getFieldsValue(); - const newArr: string[] = []; // 重置当前条件 不然会越来越多 给不上值 + const newArr: string[] = []; // 用于记录参数key(防止重复累积) + currentNode?.conditions.map((item: conditiondType, index: number) => { - /** 怎么知道paramKey有没有变化 */ + // 将表单值写回到 condition 对象中 item.val = String(currentValue.allContent[index].val); item.label = currentValue.allContent[index].label; item.paramKey = currentValue.allContent[index].paramKey; item.paramLabel = currentValue.allContent[index].paramLabel; - /**当前数组得替换一下 */ newArr.push(currentValue.allContent[index].paramKey); - // setParamKeyArr(newArr); + item.type = currentValue.allContent[index].type; - /**当前条件查找,填写paramLabel */ + + // 查找当前选择的字段信息(来自 props.conditions) const findCon = props.conditions.find((innItem) => { return innItem.id === currentValue.allContent[index].paramKey; }); + + // 同步字段名称、类型 item.paramLabel = findCon ? findCon?.name : ''; item.type = convertType(findCon?.valueType); item.key = currentValue.allContent[index].key; + if (findCon) { - /** 大于小于条件查找 */ + // 查找操作符的文字描述 const conkeys = getConditionKeys(item.type).find( (innItem: { value: string; label: string }) => { return innItem.value === currentValue.allContent[index].key; }, ); item.label = conkeys ? conkeys?.label : ''; - /** 查询符合条件的枚举值 */ + + // 若为字典类型,则查找选中项的显示文本 if (item.type === dataType.DICT) { const findConLabel = findCon?.lookups?.find((innItem) => { return innItem.value === currentValue.allContent[index].val; }); - /** 枚举值赋值 */ item.valLabel = findConLabel?.text || ''; } } + + // 拼接完整的显示文本,例如 “年龄 > 18” item.display = `${item.paramLabel} ${item.label} ${item.valLabel || item.val} `; }); + + // 通知父组件刷新 props.refresh(); }; + /** + * 组件渲染部分 + * 使用 Card + Form 动态渲染条件列表 + */ return (
= (props) => { } className={cls['card-info']} bodyStyle={{ padding: '0px', border: 'none' }} - extra={+ 添加}> + extra={+ 添加} // “添加条件”按钮 + > + {/* 使用Form包裹所有条件输入项 */}
+ {/* 遍历渲染每一组条件 */} {(currentNode?.conditions || []).map((condition, index) => (
+ {/* 条件组头部(删除按钮 + 序号) */}
= (props) => { cursor: 'pointer', }} onClick={() => { + // 点击删除当前条件 currentNode!.conditions.splice(index, 1); setCurrentNode(currentNode); - setKey(key + 1); - }}> + setKey(key + 1); // 触发刷新 + }} + >
参数 {index + 1}
+ + {/* 条件组内容(参数选择 + 操作符 + 值输入) */}
+ {/* 参数字段选择 */}