intra-mart实现logicDesigner与forma联动
一、前言
有一个需求,想实现从页面上传一个excel文件,点击提交,就转发给forma模块,然后用户在forma模块里,确认下自动填写的信息是否正确,正确的话就点击保存,存入数据库;不正确的话可以修改,修改正确后保存入库。
这个功能,想用intra-mart框架实现,框架自带低代码平台模块,logicDesigner和forma等。
logicDesigner大概就相当于一个接口,写完后有一个url地址,可以传参数调用,内部自己写好处理逻辑后,可以返回值。
forma就相当于一个表单模块,自己拖组件画好页面后,可以一键生成数据库;访问时也是通过url访问,但是会展示一个页面,在页面上填好参数,点击保存,就会把数据保存到数据库。
二、思路
由于是低代码平台,只能用提供的组件实现,不能全用代码搞定,有些地方是不太灵活的;写软件效率高了,灵活度低了。
forma就是一个像表单的页面,不能直接加上传excel文件并处理、自动填好的逻辑;
logicDesigner是一个接口,有入参出参,可以写内部处理逻辑,但是要与forma对接起来才行(虽然可以写逻辑、读取excel直接sql入库,但是就是想用forma、人工确认下数据是否正确,再决定是否入库)。
最后实现的是,先用bloomMaker写一个上传页面,然后页面调用logicDesigner执行处理逻辑,logicDesigner里再启动一个BPM任务,BPM里把任务分派给指定用户,指定用户处理BPM任务时、打开forma确认,此时forma里就有已经填好的数据了;用户可以确认数据是否正确、决定是否入库。
整个流程用到了bloomMaker,logicDesigner,BPM,forma。
三、实现步骤与代码
1.bloomMaker
这个是intra-mart框架里的一个模块,可以用来低代码开发页面。
首先创建一个imui页面,如下:

(1)声明变量和常量
然后声明下变量和常量(就和代码里声明一样,自己起名字就行):
{"requestData": {"fileKey": "","note": ""},"respCode": 0,"respMsg": ""
}
这个是变量,选择json格式填进去就行;
点击请求按钮,就会把requestData发送给logicDesigner,后面会提到;
respCode是logicDesigner处理完毕后返回的值,例如200;
respMsg是logicDesigner处理完毕后返回的消息体;
{"ENDPOINT_URL": "logic/api/logic_designer/upload_geren_qqs","SUCCESS": "ファイルアップロード成功、BPMのタスクに確認してください","ERROR": "エラー発生","ERROR2": "ファイルの様式は正しくありません"
}
这个是常量,ENDPOINT_URL是logicDesigner的url,根据需要自己改;
其它的就是些提示信息。
(2)页面布局
然后页面中拖进去的组件是这些:
先拖进去一个表单容器,里面有标题、两行;
第一行第二列拖进去一个文件上传组件,value需要填成$variable.requestData.fileKey;
$是jquery,variable是变量,这个是框架起的,不能改;后面两个就是自己变量的名字;
这个东西,当点击这个按钮上传完毕文件后,框架就会给这个变量赋值,是一个128长度的文件唯一编号;后续会用。
第二行第二列拖进去一个文本框,value需要选择变数值,值为$variable.requestData.note;
这个东西,当用户在文本框输入内容时,框架就会给这个变量赋值,值为文本框的内容。
“登录”按钮,绑定的事件是register(自己起名字的一个动作),如下:

这个后面会写到。
(3)编写按钮事件

画面右侧,选择アクション(动作),上面是新建按钮;下面是已经写好了一个,出现的修改按钮。

创建了一个名字是register的动作,左边选的是给某个url发请求,拖到右边;
右边url里写的就是常量$constant.ENDPOINT_URL,这个就是自己创建的常量;
方法post,请求体用$variable.requestData;
接收返回报文时,用$variable.respCode存储响应值,用$variable.respMsg存储响应体。
如果想加成功/失败消息提示,也可以加,不是重点,这里不写了。(注意失败提示需要加在右上方的发生错误时标签里)。
2.logicDesigner
这个模块可以低代码编写接口处理逻辑,收到入参、处理、返回出参。
首先创建一个逻辑流。

(1)定义入参出参、常量
入参的json格式是:
{"fileKey": "","note": ""
}
注意入参,之前bloomMaker传来的报文是requestData对应的值,值就是这个json格式的,所以这样就能接收到。
出参其实可以不写,这个逻辑里没有用到,写多了。

这个是写入参出参的截图(左边两个参数,不用管右边输出部分的参数,写多了),如果用json格式会比较方便,如果手动写,注意:
选了配列型にする,就能把这个变量变成数组;
选了配下に配置する,就能在这个变量下新建子变量。
变量这次没有用到,常量如下:

PublicStoragePath的值是ReqGeRen_Path/,可以随便写个路径,缓存文件用;
bpm_key的值是upload_geren_qqs,这个是BPM流程的ID,需要与自己创建的保持一致,后面会写到;
timeZone的值是Asia/Tokyo,根据时区需要写,处理表格会用。
(2)画流程图

把左边需要的组件,拖到右边,连好线。
下面是详细说明:
●第一个开始,不用写;
●第二个是IM-BloomMaker里的ファイル情報の登録,作用是文件持久化;
本来上传的文件,会在Session Scope Storage里,当用户退出就消失了;
执行这个就能把文件存到数据库;

双击打开,把入参fileKey链接到key上,这样才能使用。
fileKey是bloomMaker框架上传文件时自动生成的那个变量。
●第三个是IM-BloomMaker里的ファイル情報の取得,用来获取文件详细信息;

双击打开,把fileKey链接到key上,意思是读取这个文件的信息。
●第四个是一个自定义的sql任务,执行后把文件信息入库:
从左边栏目找到增加用户定义:

里面有制作SQL定义:

点击后会打开新建页面,先写入参,这个出参不能编辑,只能写入参:

入参的json格式如下:
{"id": "","file_key": "","file_name": "","note": "","create_date": null
}
这些入参是sql语句用的;id用框架的id,create_date是时间戳格式,也用框架的;
file_key、note是bloomMaker传来的;
file_name是读取到的。

继续编写下面的,数据库类型选择一个,看自己配了几个数据库链接,这里是tenant的数据库;
选执行sql类型是insert;
sql语句如下:
INSERT INTO gsd_upload_file(id, file_key, file_name, note, create_date)
VALUES(/*id*/'testId', /*file_key*/'testK', /*file_name*/'testName', /*note*/'testNote', /*create_date*/'2025-01-01')
其中/**/部分,里面的内容对应入参变量,框架执行sql时就会填写为入参值了;''里的是默认值,有入参用入参,没有就用默认值。
把这个组件保存好,连线后,双击打开:

给入参赋值的连线如图,其中,在左上下拉菜单里,可以找到session情报和之前获取文件的组件im_bmGetFileInfo1(第三步的组件),点击追加,就会出现在左边;
在右上的下拉菜单里,可以找到identifier,点击按钮加入,这个就是框架生成的id参数;
然后连线,fileKey和note是入参,id是系统生成的,file_name是第三步组件取得的文件名,create_date是session里取得的当前时间。
●第五个是ストレージ操作里的ストレージ出力(バイナリ),作用是把二进制格式的文件内容保存到storage缓存里。

双击打开,入参连线如图;
其中storage传入了一个string格式的路径,用到了concat拼接常量PublicStoragePath和变量fileKey,拼好后就是ReqGeRen_Path/ladskjlafkejwf...这样的,意思是把文件缓存到这个路径下(文件名起成fileKey);
binary是文件内容,把第三步读取到的文件内容contents赋值过去。
●第六个是Excel入力定義編集,也是自定义的。
从左边栏目找到增加用户定义:

里面有新建Excel输入处理逻辑:

打开页面后,这个组件的输入输出都不能手动编辑,需要修改其它信息、才会自动生成输出参数;

输入下方内容,这里选择的是读取哪个sheet,左边是指定sheet名字,这里选的是右边,指定sheet序号(从零开始);
继续向下:

这个填的就是怎么处理excel表了,例如,选择第0个sheet表,B2格子,进行读取,然后输出的变量叫req_no,格式是string;

还可以把excel格子读取成list,如图,选第0个sheet,从B列到E列,从18行开始向下读取,当格子内容全部为空时停止读取;
然后返回的list名字为req_table,返回的变量名字叫tb1_textbox1,类型string,等。
保存后,这个组件的输出就自动生成好了,拖入右边,连好线,双击打开,先配置好入参:

需要传入file路径,这里就是PublicStoragePath与fileKey拼接的字符串,第五步执行后就会把文件保存到这个位置,可以读取到;
targetTimezone是时区,使用了常量Asia/Tokyo;
密码没有传,测试excel文件没有加密。
●第七个是开启BPM工作流,执行后创建BPM任务,提醒指定用户继续处理。

拖入面板,连好线后,双击打开,配置入参:

先把第六步处理好后的结果加入到左边(这个就是第六步的出参),然后连线到右边variables,表示把整个变量给到BPM,供后续使用;
processDefinitionKey传的是常量,表示启动哪个BPM,这个需要与后续创建的BPM模版对应。
●第八个是终了,这个也可以填些出参的,调用logicDesigner处理结束后,就会返回出参。
这个例子里不需要写,跳过。(想写出参时,也得先定义出参变量才行,然后双击打开,填写出参变量赋值连线)
3.BPM
个人感觉这个就是像任务流的一个东西,可以指定用户,层层处理,层层审批。
logicDesigner执行完毕后,会创建一个BPM进程。
所以要先写一个BPM模版,才能被调用。

打开サイトマップ-プロセスデザイナ(网站地图-进程设计),这里创建一个プロセス(进程模版)。
创建后,先点击画面空白区域,在右边填写下:

这里写了进程定义key是upload_geren_qqs,上方logicDesigner就是根据这个值来开启这个BPM进程;
处理对象用户,记得添加上允许开启进程的用户。
然后拖组件,如图:

一个开始,一个用户任务,一个结束。
点击用户任务,在右边配置:

可以配置一个负责人,多个有权限处理这个进程的人;
重点是配置下フォームキー,值为forma:seikyusyo,意思是这个任务会打开名叫seikyusyo的forma页面。
logicDesigner中,给这个BPM进程的variables传递了一个json对象,json对象中就是从excel里读取并处理好的内容,json里变量的key与forma页面元素一一对应;
然后这个forma就可以自动填写完毕,用户浏览后确认是否入库即可。
先用检查模式保存,才能发布;

用这个deploy发布,才能使用。

4.forma
这个东西可以低代码开发表单页面,一键生成数据库,自带新增、修改、查询页面。

需要注意的点就是,创建后的id与BPM里的forma:对应,需要先选テーブル設定创建好数据库表,选権限設定设置好可以使用的用户;
メニュー設定可以设置这个forma的入口按钮,有新增页面和一览页面两种。(其实就是两个url+入参,正常创建好的forma可以用这两个入口使用);
内容样例如下:

例如,想自动给这个input赋值,就要注意这个id,现在是project_name,前面BPM的variables里的json对象,json对象是有这个数据的,例如:
{
..."project_name":"abc","req_table": [{"tb1_textbox4": "100.0","tb1_textbox3": "100.0","tb1_textbox2": "100.0","tb1_textbox1": "b"},{"tb1_textbox4": "200.0","tb1_textbox3": "200.0","tb1_textbox2": "200.0","tb1_textbox1": "a"},
...
}
这样,就可以自动给这个值填进去, "project_name":"abc"
同理,想给forma的table填值,也是table的id、每列的id与json里的数据要对应好。
四、演示效果
1.用户先访问bloomMaker页面,点击按钮上传excel后,点击登录按钮,就能触发logicDesigner后续处理。

2.logicDesigner会开启一个BPM进程,用户可以在BPM-任务一览里查看到:


这里就能看到,属于自己的任务,可以点击按钮进行处理。
3.点击处理按钮后,就会跳转到forma页面,forma页面里的信息是自动填写好的:

用户自行确认,如果有需要修改的地方就修改,最后点击登录按钮,就能保存入库。
五、总结
细节有点多,可能写的有些乱。
总之就是,intra-mart框架里,想实现上传excel表格、用表格内容自动填写好forma页面、用户手动确认是否入库功能的话,就可以参考这个例子。
先用bloomMaker写入口页面,然后触发logicDesigner逻辑,读取excel,转换为json格式传给BPM;
BPM收到后,给一个指定用户分派任务,用户处理这个任务时,打开forma页面,此时forma页面是填写完毕的,确认是否修改、是否入库即可。
六、备注
1.bloommaker与logicDesigner,写好后还需要分别创建路由设置才行,路由设置就是自己写一个url、配好自己写好的组件,就可以访问到了;
注意还得给路由设置好权限,允许自己访问,才能测试。
2.BPM则是要设置好哪个用户能开始这个任务、哪个用户能处理这个任务。
BPM每次改动后,都得选deploy,重新部署一个可执行包。
3.forma也要设置好、哪个用户能访问这个forma页面。
相关文章:
intra-mart实现logicDesigner与forma联动
一、前言 有一个需求,想实现从页面上传一个excel文件,点击提交,就转发给forma模块,然后用户在forma模块里,确认下自动填写的信息是否正确,正确的话就点击保存,存入数据库;不正确的话…...
《大语言模型的原理发展与应用》:此文为AI自动生成
《大语言模型的原理发展与应用》:此文为AI自动生成 一、引言:大语言模型,AI 时代的 “新引擎” 在当今数字化浪潮中,大语言模型宛如一颗璀璨的明星,照亮了人工智能发展的道路,成为推动各领域变革的核心驱…...
生态安全相关
概念:生态安全指一个国家具有支撑国家生存发展的较为完整、不受威胁的生态系统,以及应对内外重大生态问题的能力。 (1)国外生态安全的研究进展 国际上对生态安全的研究是从“环境”与“安全”之间的关系展开的。开始的阶段&#x…...
DeepSeek-R1国产化系统gpu驱动+cuda+ollama+webui可视化离线私有化部署
1.概述 网上大部分教程都是在线部署,完全离线私有化部署的文章不多,本文介绍从GPU驱动、cuda、ollama、deepseek模型和open webui等完全离线安装几个方面,让小白0基础也可以私有化部署大模型deepseek-R1。 我使用的设备是银河麒麟V10操作系统…...
数据集/API 笔记:新加坡风速 API
data.gov.sg 数据范围:2016年12月 - 2025年3月 API 查询方式 curl --request GET \--url https://api-open.data.gov.sg/v2/real-time/api/wind-speedcurl --request GET \--url "https://api-open.data.gov.sg/v2/real-time/api/wind-speed?date2024-07-16…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
【C++】switch 语句编译报错:error: jump to case label
/home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp: In member function ‘virtual u32 CRkVpss::Control(u32, void*, u32)’: /home/share/mcrockit_3588/prj_linux/../source/rkvpss.cpp:242:8: error: jump to case label242 | case emRkComCmd_DBG_SaveInput:|…...
linux中使用firewall命令操作端口
一、开放端口 1. 开放一个端口 sudo firewall-cmd --zonepublic --add-port8443/tcp --permanent sudo firewall-cmd --reload 2. 开放一组连续端口 sudo firewall-cmd --zonepublic --add-port100-500/tcp --permanent sudo firewall-cmd --reload 3. 一次开放多个不连续…...
C++第六节:stack和queue
本节目标: stack的介绍与使用queue的介绍与使用priority_queue的介绍与使用容器适配器模拟实现与结语 1 stack(堆)的介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,只能从容器的一端进行元素的插…...
算法 并查集
目录 前言 一 并查集的思路 二 并查集的代码分析 三 实操我们的代码 四 并查集的代码优化 总结 前言 并查集主要是用来求解集合问题的,用来查找集合还有就是合并集合,可以把这个运用到最小生成树里面 一 并查集的思路 1 并查集的相关的操作…...
yarn application命令中各参数的详细解释
yarn application 命令用于管理和监控 YARN 上运行的应用程序,下面为你详细解释该命令中各参数的含义和用途: 通用参数 -help [command] 作用:显示 yarn application 命令的帮助信息。如果指定了 command,则显示该子命令的详细使…...
算法之数据结构
目录 数据结构 数据结构与算法面试题 数据结构 《倚天村 • 图解数据结构》 | 小傅哥 bugstack 虫洞栈 ♥数据结构基础知识体系详解♥ | Java 全栈知识体系 线性数据结构 | JavaGuide 数据结构与算法面试题 数据结构与算法面试题 | 小林coding...
Android 图片压缩详解
在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…...
迷你世界脚本计时器接口:MiniTimer
计时器接口:MiniTimer 彼得兔 更新时间: 2023-04-26 20:24:50 具体函数名及描述如下: 序号 函数名 函数描述 1 isExist(...) 判断计时器是否存在 2 createTimer(...) 添加计时器 3 deleteTimer(...) 删除计时器 4 startBackwardTimer(.…...
JavaScript的变量以及数据类型
JS变量 变量的声明 四种声明方式 1. <script>var abc;abc"变量声明1";alert(abc);</script>2. <script>var abc"变量声明2";alert(abc);</script><script>var abc1,abc2;abc1"变量声明3.1";abc2"变量声明3…...
私有云基础架构
基础配置 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 安装服务 web01 192.168.184.110 Apache、PHP database 192.168.184.111 MariaDB web02 192.168.184.112 Apache、PHP 由于 openEuler 22.09 系统已经停止维护了ÿ…...
在 Windows 和 Linux 系统上安装和部署 Ollama
引言 Ollama 是一个强大的本地大语言模型(LLM)运行工具,允许用户轻松下载和运行不同的 AI 模型,如 LLaMA、Mistral 和 Gemma。无论是开发者还是研究人员,Ollama 都提供了一种简单而高效的方式来在本地环境中部署 AI 模…...
从零开始学习Slam--数学概念
正交矩阵 矩阵的转置等于它的逆矩阵,这样的矩阵称之为正交矩阵 即: Q T Q I Q^T Q I QTQI, 这样的矩阵列向量都是单位向量且两两正交。 旋转矩阵属于特殊的正交群,即SO(n),这里n通常是3,所以SO(3)就是…...
【零基础到精通Java合集】第十五集:Map集合框架与泛型
课程标题:Map集合框架与泛型(15分钟) 目标:掌握泛型在Map中的键值类型约束,理解类型安全的键值操作,熟练使用泛型Map解决实际问题 0-1分钟:泛型Map的意义引入 以“字典翻译”类比泛型Map:明确键和值的类型(如英文→中文)。说明泛型Map的作用——确保键值对的类型一…...
从小米汽车召回看智驾“命门”:智能化时代 — 时间就是安全
2025年1月,小米因车辆“授时同步异常”召回3万余辆小米SU7,成为其造车历程中的首个重大安全事件。 从小米SU7召回事件剖析,授时同步何以成为智能驾驶的命门? 2024年11月,多名车主反馈SU7标准版的智能泊车辅助功能出现…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
