当前位置: 首页 > news >正文

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_keynote是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路径,这里就是PublicStoragePathfileKey拼接的字符串,第五步执行后就会把文件保存到这个位置,可以读取到;
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 系统已经停止维护了&#xff…...

在 Windows 和 Linux 系统上安装和部署 Ollama

引言 Ollama 是一个强大的本地大语言模型&#xff08;LLM&#xff09;运行工具&#xff0c;允许用户轻松下载和运行不同的 AI 模型&#xff0c;如 LLaMA、Mistral 和 Gemma。无论是开发者还是研究人员&#xff0c;Ollama 都提供了一种简单而高效的方式来在本地环境中部署 AI 模…...

从零开始学习Slam--数学概念

正交矩阵 矩阵的转置等于它的逆矩阵&#xff0c;这样的矩阵称之为正交矩阵 即&#xff1a; Q T Q I Q^T Q I QTQI&#xff0c; 这样的矩阵列向量都是单位向量且两两正交。 旋转矩阵属于特殊的正交群&#xff0c;即SO(n)&#xff0c;这里n通常是3&#xff0c;所以SO(3)就是…...

【零基础到精通Java合集】第十五集:Map集合框架与泛型

课程标题:Map集合框架与泛型(15分钟) 目标:掌握泛型在Map中的键值类型约束,理解类型安全的键值操作,熟练使用泛型Map解决实际问题 0-1分钟:泛型Map的意义引入 以“字典翻译”类比泛型Map:明确键和值的类型(如英文→中文)。说明泛型Map的作用——确保键值对的类型一…...

从小米汽车召回看智驾“命门”:智能化时代 — 时间就是安全

2025年1月&#xff0c;小米因车辆“授时同步异常”召回3万余辆小米SU7&#xff0c;成为其造车历程中的首个重大安全事件。 从小米SU7召回事件剖析&#xff0c;授时同步何以成为智能驾驶的命门&#xff1f; 2024年11月&#xff0c;多名车主反馈SU7标准版的智能泊车辅助功能出现…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...