首页 > HZERO低代码开发, HZERO安装部署 > HZERO 低代码开发安装验证

HZERO 低代码开发安装验证

2025年11月5日

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。 本文是安装后的低代码开发功能验证。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本系类文章是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

飞搭低代码开发验证

1)新建低代码数据微服务

   低代码里面新建业务对象的时候,系统会自动创建物理表,这个物理表需要有落地的数据库,在微服务模式下,通常每个微服务对应一个数据库,为了管理清晰,我们通常会把新建的数据库对象放入一个独立的微服务对应的数据库中。为此我们要新建一个微服务,命名为ps-lowcodedata

   我们从model工程拷贝新建一个工程 ,编码为ps-lowcodedata

cd /d02/hzero-apaas/project

mkdir ps-lowcode-data

cp -rf ./ps-modeler/* ./ps-lowcodedata

可参考 开放平台/HZERO指导手册 /手工创建项目进行修改(父项目依赖保留apaas的parent ,mysql依赖保留,其他参考Hzero指导手册);

为了能够在飞搭新建领域的时候,能选择到这个微服务,我们需要在POM中添加依赖(参考开放平台/飞搭部署文档):

        <!– 作为领域服务需要 依赖–>

        <dependency>

            <groupId>org.hzero.boot</groupId>

            <artifactId>hzero-boot-modeler-driver</artifactId>

        </dependency>

        <dependency>

            <groupId>org.hzero.boot</groupId>

            <artifactId>hzero-boot-modeler-client</artifactId>

        </dependency>

在application.yml中我们给服务命名为hzero-lowcodedata, 数据源设置为hzero_lowcodedata;

spring:

  application:

    name: hzero-lowcodedata

  datasource:

    url: ${SPRING_DATASOURCE_URL:jdbc:mysql://db.hzero.com.cn:3306/hzero_lowcodedata?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&allowPublicKeyRetrieval=true}

    username: ${SPRING_DATASOURCE_USERNAME:hzero}

    password: ${SPRING_DATASOURCE_PASSWORD:hzero}

然后在数据库里面创建一个hzero_lowcodedata的库,赋权给hzero用户;

mysql -u root -p

CREATE DATABASE IF NOT EXISTS hzero_lowcodedata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

GRANT ALL PRIVILEGES ON hzero_lowcodedata.* TO ‘hzero’@’%’;

FLUSH PRIVILEGES;

EXIT;

Run.sh 中Agent去掉,其他保留;

修改完成后,启动服务,可在注册中心看到:

在飞搭新建领域的时候,选服务也可以选到了:

我们新建一个调研问卷的领域:

领域名称:调研问卷

领域编码:RSHQ

服务:hzero-lowcodedata

描述:各种调研问卷

领域图标:lingyu

然后新建一个业务对象:飞搭应用调研问卷

问题1、 建了一个业务对象,使用飞搭的通用导入功能,结果在上传导入文件时报错:数据上传失败;

分析:

检查页面,看网络部分调用,返回都是200 OK,不过最后一个API 调用返回的reponse是:
{

    “status”: “UPLOAD_FAILED”,

    “processing”: false,

    “percentNum”: 100,

    “batchNumber”: “9cb166baa41bc4cd8b54b33b3c5125cb”,

    “numbers”: [

查飞搭模型服务的日志,应该是调用hzero的file服务,应该是file服务出问题了。

2025-07-22T15:11:29.835+08:00 ERROR 7985 — [hzero-modeler] [ XNIO-1 task-2] .BusinessObjectImportTemplateServiceImpl : UPLOAD_FILE_ERROR

io.choerodon.core.exception.CommonException: 文件上传失败,请检查配置信息
at org.hzero.core.util.ResponseUtils.lambda$static$1(ResponseUtils.java:54) ~[hzero-starter-core-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.core.util.ResponseUtils.getResponse(ResponseUtils.java:133) ~[hzero-starter-core-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.core.util.ResponseUtils.getResponse(ResponseUtils.java:82) ~[hzero-starter-core-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.boot.file.FileClient.uploadAttachment(FileClient.java:185) ~[hzero-boot-file-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.boot.file.FileClient.uploadAttachment(FileClient.java:215) ~[hzero-boot-file-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.modeler.business.app.service.impl.BusinessObjectImportTemplateServiceImpl.uploadFile(BusinessObjectImportTemplateServiceImpl.java:843) ~[hzero-modeler-2.9.1-1.12.BETA.6.jar!/:2.9.1-1.12.BETA.6]
at org.hzero.modeler.business.app.service.impl.BusinessObjectImportTemplateServiceImpl.importUploadField(BusinessObjectImportTemplateServiceImpl.java:783) ~[hzero-modeler-2.9.1-1.12.BETA.6.jar!/:2.9.1-1.12.BETA.6]
at

查file服务的配置,文件存储使用了mino服务,但因为之前没调试过,链接测试是失败的。

按照之前安装mino时的配置,更正这里的配置,让测试链接通过:

再次导入,成功了:

 问题解决。

我们并新建了一个租户,新建了了一个用户张三,赋予了新租户的租户管理员角色,然后在新的租户下面新建了一个领域:POC演示-知识产权管理。

在进行低代码开发时发现:

问题2、设计模式下点击附件字段时,提示权限不够的错误:“该用户没有此接口或值集的访问权限, 请联系管理员分配权限后访问

看起来是lowcode服务调用了hfile 的hfle/v1/2/lovs/sql/data服务,但用户张三没有配置该服务的权限。这个问题有点怪,默认应该给权限,而不是要额外去设置。

我们尝试切换到admin用户,就没有这个问题,确实是用户权限问题,但按理有租户管理员角色的用户默认应该有此权限,否则就是每个开发用户都要额外去配置权限了。

备注:另外虽然在设计时报这个错,但运行时是可以正常工作的。

针对问题2:

研发团队提醒可能是LOV和报表鉴权问题,建议按飞搭部署文档要求改一下:

解决方案尝试:参考飞搭部署文档要求:

HZERO1.10.3或1.11.0以上版本可在HZERO网关服务的yml中添加启动参数,默认跳过Lov和报表鉴权

# 是否开启请求头参数 H-AS-Check 鉴权

hzero:

gateway:

helper:

# 是否开启请求头参数 H-AS-Check 鉴权

encryption:

enabled: true

但经过测试,这个方法无效,我们更改了yml配置文件,重启了网关服务,问题依旧,然后我们让飞搭服务也重启了,页面字段删掉重新保存 ,问题依然存在。

然后搜索开放平台文档,在飞搭的FAQ中发现类似问题,飞搭给的解决方案第二种是:

按照这种方法试验了一下,问题依然存在。

备注,在飞搭2.9的部署文档中,飞搭后端工程部署/HZERO服务调整 章节,其他调整都OK,但针对platform的调整,增加对hzero-apaas-common的依赖没有问题,增加对hzero-boot-modeler-driver和hzero-boot-modeler-client的依赖会导致服务启动失败。 本来增加这两个依赖的目的是让platform服务能成为飞搭新建领域时能成为可选微服务。但实际上也没必要,因为我们自定义的领域通常都会选择lowcodedata服务作为基础微服务的。 把platform也作为自定义领域的可选微服务反而不好,违背了微服务的数据隔离原则。

问题3:Master-Detail界面,保存明细出错:在专利授权申请界面,填入专利授权明细,然后先保存明细,再保存头记录会报错:

然后从列表页,进入Form页详情的时候也会报这个错;

去数据库查看,发现专利授权明细表里面,没有保存父表的记录ID,是空的。

同样的问题在公司法体的明细子记录操作上也存在:

分析:

虽然两个主从表结构的明细表中都没有保存跟主表主键关联的字段值,但两者还是不一样,在第一个例子中,他会报加密后的主键的错误,那是因为明细表中关联字段的类型不是“关联关系”类型的,而是整数型的,这违背了设计者的期望,所以就报错; 解决方案就是把明细表上的关联字段在业务对象上更改为“关联关系”类型;

第二个例子中,确实明细表的业务对象上关联字段设置为“关联关系”类型的,所以没有报错,但为什么也没有存储到数据库?

那是因为,表单设计时,在明细列表中没有把这个关联字段放到界面上去,并且没有设置默认值,所以平台没有保存具体的值到数据库;解决方案是:你需要把这个字段放到界面上去,然后显示模式设置为隐藏,然后再给这个字段设置默认值,这样就会保存到数据库了;

你如果不这样做,低代码的设计者不会自动为这个字段赋值,并保存。这个设计感觉是个缺陷,因为已经建立了主从关系,当明细表新增记录的时候,低代码平台应该自动赋值默认值,而不应该再要求低代码的开发人员再去把这个字段放到界面上,并一定要设置这个字段的默认值才实现保存。 这样做增加了低代码开发人员的工作量。

其他实践发现:
1、如果你在明细对象已经设置了“关联关系”类型的字段,关联了主表的主键,那么在界面设计时增加明细列表组件的时候,平台会自动为你创建master-detail的页面关系,不需要手工创建。

2、在Master-detail 关系的界面中,如果你要控制明细行上有LOV配置的字段的选择内容根据主表记录的某个字段值进行过滤,那么可以通过在这个字段属性-“数据范围控制”来设置。

  1. 在保存头记录的时候,并不会自动保存行记录,需要在按钮行为的生效关系中把之前定义的主从关系加上,加上后点击主记录的保存,会同时把子记录的保存也执行了。

问题4:我们在点击 业务对象的值列表时报错:程序出现错误,请联系管理员

后台模型服务日志中有错误的详细情况:

  • 异常信息​:
    io.choerodon.core.exception.CommonException: 程序出现错误,请联系管理员
    触发位置:TableModelMetadataHandlerRedisImpl.loadModelCacheFromDb()。
  • 直接原因​:
    在尝试从数据库加载模型缓存时,ResponseUtils.getResponse()方法调用失败(可能因数据库查询异常、缓存数据不完整或Redis连接问题)

问题5:新建前端自定义脚本报错:数据不存在。

分析:点击脚本分类值列表,发现是空的,但看上去有默认值“自定义分类” 实际上这个默认值是假的,空的;

添加值列表的值之后,再确定,问题就解决了。 问题已反馈给产研,作为Bug解决修复。

问题6:执行自定义脚本时报错:pool没有初始化

分析,看你起来这个错误是lowcode服务报的错误,把错误信息给AI知识库,回答的信息产品组看了之后,全是错误的,都是回答H0规则引擎相关的东西,跟实际原因和解决不搭边。

产品组说实际原因之前安装部署时 漏掉了飞搭客户端部署这个步骤,是要参考开放平台飞搭文档进行进行飞搭客户端部署:

我们的错误发生在lowcode服务中,所以我们要在lowcode服务的application.yml中增加客户端配置。

实际执行:

我们按文档在lowcode 服务的POM添加了下面这两个引用之后,服务启动就失败了:

            <dependency>

                <groupId>org.hzero.boot</groupId>

                <artifactId>hzero-boot-modeler-driver</artifactId>

            </dependency>

            <dependency>

                <groupId>org.hzero.boot</groupId>

                <artifactId>hzero-boot-modeler-event-driver</artifactId>

            </dependency>

Error starting ApplicationContext. To display the condition evaluation report re-run your application with ‘debug’ enabled.
2025-08-15T11:05:03.015+08:00 ERROR 62965 — [hzero-lowcode] [ main] o.s.boot.SpringApplication : Application run failed

回撤,恢复原状,正常重启lowcode 服务,服务恢复正常。

然后再尝试再lowcodedata服务中添加这两个引用后重启,服务启动成功,OK,那就用lowcodedata服务 当作客户端服务试用吧。

更改lowcodedata服务的application.yml文件,按要求添加飞搭客户端服务配置,再次重启成功。

再回到执行脚本的地方,点击按钮,执行脚本,这次没有报“pool没有初始化”的错误,看起来脚本是被执行了。

看执行日志,也确实被执行了:

但是没有按照我们预期的产生结果,我们预期是从启信宝查询公司的商标信息,导入到本地的公司商标信息对象中,但实际上没有出现这样的结果。

在前端只能看到成功执行了脚本,并不能看到脚本执行的明细,去lowcodedata服务的日志中看到一条提示:

开始处理公司: 上海汉得信息技术股份有限公司 的商标信息

处理过程中发生错误: require is not defined

上面这条提示是我们在脚本中打的log , 看起来脚本执行遇到问题了,提示错误是“require is not defined”

我们再到model服务中看看,是否能找到更多线索。。。 没有找到。

那我们怎么查问题呢? 最土的办法就是去脚本里面多打几处日志,定位问题发生的位置。

AI写的代码中进行MD5加密处理的时候require了一个通用库,这个库脚本引擎不支持,所以报了“ require is not defined”错误,

改成在线编辑中插入函数,查找md5, 用了H0.Tenant.DataSecurityHelper.md5

方法,运行后继续报错: 处理过程中发生错误: _h0_data_encrypt is not defined

跟产品组沟通了,检查了运行客户端的lowcodedata服务的yml配置文件,没啥问题,他自己的飞搭2.9适配hzero 1.12环境中没有复现该错误,于是建议我升级到新的版本,从2.9.1-1.12.BETA.6 升级到2.9.1-1.12.BETA.8

我把modeler,lowcode,lowcodedata三个服务全部升级到了2.9.1-1.12.BETA.8,就正常执行了,后台服务日志中显示正确反馈了md5加密结果:

进入getIntellectualPropertyStat() sign=  5bb8e4aa0bb5fc9c19a0c43403a79951

不过接着又报了错误:

处理过程中发生错误: require is not defined

看来还有地方是AI写的代码 require 了什么内容,得继续寻找修改, 是requestAPI方法里面,AI代码 const request = require(‘request’); 因为飞搭脚本运行环境不支持所以报错,替代方法是飞搭提供了BASE.HttpClient.doGet(url,header,body) 四个API可以替代,于是就把飞搭提供的四个API的介绍全部给了豆包,让豆包重写了requestAPI方法。

重写之后可以用,后面碰到要用request的地方也都让豆包重写了,脚本可以从启信宝获取到商标信息,然后就是往业务对象中插入,刚开始用http 调用,因为通过网关调用需要token,否则也会报权限错误,但脚本环境没有获取当前用户token的API,产品组建议改成feign调用,可能是种子数据有问题,我的环境中缺少feign调用的例子文档,产品组给了个例子,按照例子调用报错误:

Feign调用批量更新失败: Cannot read property ‘selectClient’ of undefined

处理过程中发生错误: 批量更新失败: Cannot read property ‘selectClient’ of undefined

跟支持组同事沟通了一下,他说有些功能在租户不支持,到平台层才支持,建议试试平台层,于是在平台层去新建了一个内容一致的脚本,配置入参后发布,在租户层调用,结果系统没有任何报错,但也实际没有执行脚本。 前端页面日志显示成功完成了事件的整个流程,但实际执行一闪而过,后台服务也没有任何痕迹。很奇怪。

所以尝试下来平台层也解决不了这个问题。

再回到租户层的脚本使用,至少后服务中能看到整个执行的日志,也确实能看到成功获取到了启信宝的商标信息。

接下来,换方法,让AI直接用脚本函数来插入内容到业务对象,而不是使用飞塔提供的业务对象的增删改的API了。

经测试已经成功了。

问题7:在页面编辑界面/取值/复合取值,写了一个除法取值的公式后校验未通过,一直报错:括号未正确匹配

分析:看其他复合取值是可以成功校验通过的,仔细比较发现报错的原因是界面字段名称包含了中文的括号。

这是作为bug处理 还是不作为Bug,但要在帮助文档中做重点提醒?

问题8:在页面编辑界面/取值/复合取值,支持if语法,但提示 else关键字无法识别;

分析:

我是在if 条件满足的{}里面加了分号的,所以遇到这种问题了,产品组说支持if else, 但不支持加分号的多条语句。

也就是相当于仅支持单行的if else;经测试,简单的可以,但复杂的不行,会报错“无法解析字符”但同样的表达式,三元操作是可以的:

解决方法:用三元操作替代:

问题9:在页面编辑界面点保存按钮时报错:[valuePaths[12].value 长度需要在0和1200之间; ]

分析:在页面编辑界面/取值/自定义取值 处,有个自定义取值的设置的JS代码字符数超过了1200, 删掉大多数代码,仅保留少数代码后界面保存成功。

那么1200个字符数控制是否太少了?下面这段自定义取值代码业不长,字符数已经达到1743个了。

产品组说应该是后端限制了,让后端加大长度限制。

问题10:飞搭如何实现类似明道云表单编辑界面的规则配置?

比如当某个字段值为A的时候,要隐藏一批界面上的字段,同时显示一批字段,并让一批字段只读。

分析,目前没有完全一样的功能,但可以变通实现,方法如下:

  1. 先建“条件”,把“条件”当规则用。
  2. 点击界面上任何一个字段,可以在右边属性页看到“批量操作”。
  3. 在“批量操作”界面,选择一批字段进行“批量属性设置”,并选择启动这些属性设置的“条件”。(按类型分几次操作,比如隐藏的一批操作一次,显示的一批再操作一次,只读的一批再操作一次)
  4. 打开“条件”编辑界面,选择依赖查询(条件右边的三个小点停留一会显示菜单里面能看到这个“依赖查询”),可以看到该条件下所有的依赖(也就是引用到该条件的地方),实际上相当于看到了该“条件”规则下所有影响到的各种设置和改变。

备注:

发现问题1: 就是字段按条件显示/隐藏 的属性设置,只能设置一条规则,但实际需求是两条规则,即:当满足条件A时隐藏,当满足条件B时显示。这个怎么设置?

跟产品组沟通了一下,这个没问题,对于这种非此即彼的二选一类型的属性,一旦设置条件,那么不满足组条件的自然就是相当于设置了反面条件。

发现问题2:想批量撤销之前的一批字段的属性设置(比例批量取消3个字段的条件只读属性设置),目前看还不行,尝试了批量操作里面的“重置”没起作用。

临时解决方案是逐个取消。

问题11:写了一段用H0.Tenant.ModelerHelper.selectList 获取记录的JS脚本,用到查询条件>=, AI写的代码用的比较操作符是“GREATER_EQUAL” 运行后报错,提示这个比较操作符不被支持。

又改成“GE”,“GREATER_OR_EQUAL” 还是报错:”localizedMessage”: “Operator type [GREATER_OR_EQUAL] not supported”,AI能建议的就这几种,都不行。

分析:产品组沟通提示用这个方法的示例上面的配置条件功能配置查询条件,然后点“插入”生成代码,看看用的是什么操作符。

经测试,用的是 GREATER_THAN_OR_EQUAL_TO ,难怪AI试来试去都不对。

建议以后写代码的时候都用 系统提供方法的 配置插入的功能。

问题12:计算结果字段跟被计算字段不能联动

问题详细描述:我有字段A,B,C,设置C字段的默认值是符合取值 =A/B ,但A或者B字段的值改变的时候,发现C的值没有跟随联动。

分析:跟产品组沟通,产品组说需要在A字段和B字段上建立 “值改变”的触发器,在出发器中给C赋值为复合取值。

如果符合取值的计算字段涉及了5个以上字段的计算,则实现联动就非常麻烦,需要在5个字段上添加触发器。

当前解决方案:通过触发器实现,希望将来低代码产品能自动联动,无需开发人员再设置触发器(目前市场上主流低代码平台都是这么实现的)

问题13:打开详情页面,由于默认宽度比较窄,显示太拥挤了。

分析:打开详情页面虽然是平台默认功能,无需开发即可实现,但实际也是平台自动帮忙写了一个按钮触发器,调了一个跳转至详情页的事件流,事件流里面调用了一个“页面弹窗”的节点,在这个节点配置中可以看到默认的详情页宽度是800像素。

解决方案:调整默认节点配置中宽度像素到合理的值,比如可以选择百分比,设置为80%;

问题14:设计了一个移动页面,预览时提示“抱歉,你访问的页面不存在”

分析:可能是飞搭移动端部署没完成。

在 开放平台/社区与合作伙伴/文档中心/汉得aPaaS平台-飞搭/本地化部署&升级/飞搭移动端部署 这个章节有具体指导。

一、依赖安装

cd /d02/hzero/front/front

cp package.json package.json.bak20251030

yarn add apaas-mobile-provider@release -W –registry=http://nexus.saas.hand-china.com/repository/hzero-npm-group/

Done in 14.27s.

yarn add @hips/plugin-usein-hzeroapp -W -D –registry=http://nexus.saas.hand-china.com/repository/hzero-npm-group/

Done in 16.19s.

执行后查看package.json 发现 “apaas-mobile-provider”: “^2.4.1” 文档说建议2.6.X最新版本,需要更改成 ~2.6.0 ,更改后再次yarn

yarn

Done in 14.34s.

  • 环境变量配置:

更改  \d02\hzero\front\front\config\config.ts

添加:

      MOBILE_PREVIEWER_HOST: ‘BUILD_MOBILE_PREVIEWER_HOST’,

      FEIDA_MOBILE_ACCESS_URL: ‘BUILD_FEIDA_MOBILE_ACCESS_URL’,

      AMAP_KEY: ‘BUILD_AMAP_KEY’,

      AMAP_JSCODE: ‘BUILD_AMAP_JSCODE’,

      AMAP_SERVICE_HOST: ‘BUILD_AMAP_SERVICE_HOST’,

      VUE_APP_HTTP_BASE_URL: ‘BUILD_HWKF_MOBILE_PREVIEWER_HOST’,

      FEIDA_MOBILE_MF_URL: ‘BUILD_FEIDA_MOBILE_MF_URL’

  • 依赖构建配置

更改  \d02\hzero\front\front\config\config.ts

添加:

  plugins: [

    require.resolve(‘hzero-front’),

    ‘@hips/plugin-usein-hzeroapp’,

  ],

  hzeroUseHips: [

    {

      import: { name: ‘apaas-mobile-provider’, distDir: ‘dist’ },

      export: { name: ‘mobile-provider’, distDir: process.env.BUILD_DIST_PATH },

      usage: “command”,

      env: {

        HttpBaseUrl: ‘BUILD_MOBILE_API_HOST’,  // 移动端基地址

        ClientId: ‘BUILD_CLIENT_ID’, // clientId,与 PC 使用同一个变量即可

        AMapKey: ‘BUILD_AMAP_KEY’, // 仅当需要使用地图组件时需要

        AMapJsCode: ‘BUILD_AMAP_JSCODE’, // 仅当需要使用地图组件时需要

        AMapServiceHost: ‘BUILD_AMAP_SERVICE_HOST’, // 仅当需要使用地图组件时需要

        ApaasMFUrl: ‘BUILD_FEIDA_MOBILE_MF_URL’, // 提供给工作流的 MF 组件访问地址

        AIGCBaseUrl: ‘BUILD_AIGC_HOST’, // 使用 AIGC 相关能力需要

      },

    },

  ],

更改\d02\hzero\front\front\package.json

添加:

    “build:mobile”: “cross-env UMI_ENV=prod BUILD_DIST_PATH=./dist node ./node_modules/umi/bin/umi.js build-hips-subapp”

更改后执行:

yarn run build:app

Done in 7.33s.

再执行yarn build:mobile

Done in 2.11s.

更改 /d02/hzero/front/enterpoint_replace.sh

添加:

BUILD_MOBILE_API_HOST=”http://gateway.hzero.com.cn:8080″

BUILD_MOBILE_PREVIEWER_HOST=”http://dev.hzero.com.cn”

BUILD_FEIDA_MOBILE_ACCESS_URL=”http://dev.hzero.com.cn/mobile-provider/”

BUILD_AMAP_KEY=””

BUILD_AMAP_JSCODE=””

BUILD_AMAP_SERVICE_HOST=””

BUILD_FEIDA_MOBILE_MF_URL=””

sed -i “s#BUILD_MOBILE_PREVIEWER_HOST#$BUILD_MOBILE_PREVIEWER_HOST#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_FEIDA_MOBILE_ACCESS_URL#$BUILD_FEIDA_MOBILE_ACCESS_URL#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_MOBILE_API_HOST#$BUILD_MOBILE_API_HOST#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_MOBILE_API_HOST#$BUILD_MOBILE_API_HOST#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AMAP_KEY#$BUILD_AMAP_KEY#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_AMAP_KEY#$BUILD_AMAP_KEY#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AMAP_JSCODE#$BUILD_AMAP_JSCODE#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_AMAP_JSCODE#$BUILD_AMAP_JSCODE#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AMAP_SERVICE_HOST#$BUILD_AMAP_SERVICE_HOST#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_AMAP_SERVICE_HOST#$BUILD_AMAP_SERVICE_HOST#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_CLIENT_ID#$BUILD_CLIENT_ID#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_FEIDA_MOBILE_MF_URL#$BUILD_FEIDA_MOBILE_MF_URL#g” /d02/hzero/front/dist/packages/hwkf-mobile/index.html

sed -i “s#BUILD_FEIDA_MOBILE_MF_URL#$BUILD_FEIDA_MOBILE_MF_URL#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AIGC_HOST#$BUILD_AIGC_HOST#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

更改:/d02/hzero/front/front/src

添加:
const configureParams = () => ({

  showMobileUedConfig: true, // 开启用户主题配置页面移动端配置显示

});

export default { configureParams };

  • 部署替换

cd /d02/hzero/front/front

bash apply_update_to_runtime_env.sh

replace complete!

五、修改Ngnix配置

cd /etc/nginx/sites-available

cp default default.bak20251030

编辑default,添加:

location ^~ /mobile-provider {

    root /d02/hzero/front/dist/packages;

    try_files $uri /mobile-provider/index.html;

}

然后修改default , 然后重启nginx , 然后再次运行

  • 启动服务,再次预览移动端界面

从功能第一个List主页面进入,再打开表单页可以正常预览,直接进第二个页面还是不能正常预览,不过在清掉缓存后再打开就可以了:

问题解决。

问题15: 详情页面参数用模糊查询可以,但精确查询不行。

详细描述:把检测报告的移动端详情页面设置为功能首页,然后公开分享移动端功能,得到一个公开分享链接:

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7

更改详情页面的脚本事件-详情查询,把查询条件从主键改成报告编号(在取值界面 新增页面参数 repNo 表示报告编号),查询条件为 等于

拼接分享链接,加上&repNo=ACS20240921001

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240921001

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&editFlag=false&repNo=ACS20240922002

测试发现查询内容为空。但是如果把查询条件改成模糊匹配, 则能查询出该报告编号对应的内容。这是问什么呢? 经过试验,原来是参数名区分大小写!

问题16: 如果要打印很逼真的标签,现有的标签打印管理功能排版不方便。

分析: 目前的标签打印管理主要使用与简洁的条码或者二维码标签打印。如果要打印很逼真的标签,比如能效等级标签,建议用RTF模板,如果其中含有二维码,可以参考文档  汉得焱牛开放平台/社区与合作伙伴/文档中心/HZERO汉得企业级PaaS平台/1.10.3 RELEASE/服务列表/报表平台/开发者指南/高级操作/定义模板文件/RTF模板/二维码。

在report 服务的application.yml中已经配置了    

# 二维码生成url

qrCodeUrl:${HZERO_QR_CODE_URL:${hzero.gatewayPath}/hrpt/v1/codes?text=}

所以在RTF模板中,设置一个图片占位符,在设置图片格式的可选文字中,设置url:{concat(QR_CODE_URL,MESSAGE_CODE)} 即可,其中Message_code 就是一段要转成二维码显示的字符串,在这个需求场景中就是 移动页面共享链接带查询报告编号的URL

测试:word2016 , 按文档提示在图片的可选文字加上内容之后,报表预览不显示任何内容,应该是后台处理出错了。

报表服务的后台日志显示:

at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]

Caused by: oracle.xml.xslt.XSLException: <Line 74, Column 229>: XML-22013: (Error) Error in expression: ‘concat(QR_CODE_URL,<?mbSharelinkErcode?>)}’)’.

把日志中相关错误信息给豆包,豆包分析认为:问题点在于:在 XSL 的concat函数中,使用了 <?manufacturerName?> 这种 XML 处理指令(PI)格式 来引用变量,但这是不符合 XPath 语法的。XSL 中引用数据变量应使用 XPath 表达式(如 /DATA/ROW/mbSharelinkErcode),而非 XML 处理指令(<? … ?> 格式仅用于 XML 解析器的指令,不能直接作为变量引用)。

按照豆包建议修改后:

实际测试,

使用 normalize-space(/DATA/ROW/mbSharelinkErcode) or ‘default’ 生成的二维码不对。不是我们期望的移动页面链接地址

使用url:{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’,/DATA/ROW/mbSharelinkErcode)} 生成的二维码可以打开移动页面,但是移动页面未查询到指定记录。

查看 数据集 对应的例子xml输出,mbSharelinkErcode 是含有报告编号参数的:

<data>

<row>

<mbSharelinkErcode>http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240922002</mbSharelinkErcode>

</row>

</data>

但是生成的二维码为什么就不含报告编号参数呢? 是生成二维码的API问题?

尝试把值直接替换进去试试:

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240922002

http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240922002

发现这个二维码实际解析出来的地址确实丢了后面的报告编号参数:

二维码解析出来的内容就是http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7

也就是说这个二维码生成API有bug ,这个事如果不去改API,有什么方法能绕过这个Bug吗?

豆包认为 问题出在URL 参数的转义处理上:当mbSharelinkErcode的值本身包含&符号(如&repNo=…)时,直接拼接进codes?text=后面会被解析为新的 URL 参数分隔符,导致&repNo=…被二维码生成 API 误判为codes接口自身的参数,而非text参数的一部分,从而被截断。

解决方法:对 URL 进行URL 编码(Percent-Encoding)

需要将mbSharelinkErcode的值进行 URL 编码,把特殊字符(如&、?等)转换为编码后的形式(&→%26,?→%3F),确保整个链接作为text的完整参数传递。可以用encode-for-uri进行转移,比如:

<fo:external-graphic

  src=”url(‘{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’, encode-for-uri(/DATA/ROW/mbSharelinkErcode))}’)”

  …

/>

按照豆包的方法修改测试可行。

====

另外我们看数据集的例子输出xml

<DATA>

<QR_CODE_URL>${hzero.gatewayPath}/hrpt/v1/codes?text=</QR_CODE_URL>

<ROW>

….

</ROW>  

可以看到QR_CODE_URL这个字段是存在数据集中的,是报表服务自动加上去的,之前文档上直接用这个字段是不行的,文档中给的例子是:url:{concat(QR_CODE_URL,MESSAGE_CODE)} ,那么我们改成带路径的是否可以呢?试试:

url:{concat(/DATA/QR_CODE_URL,encode-for-uri(/DATA/ROW/mbSharelinkErcode))}

测试结果也是后台报错:

2025-11-02T13:32:40.229+08:00  WARN 3266 — [hzero-report] [  XNIO-1 task-2] oracle.xdo                               : java.io.FileNotFoundException: /d02/hzero/project/ps-report/target/${hzero.gatewayPath}/hrpt/v1/codes (No such file or directory)

看起来带路径之后,字段内容是正确获取到了,但hzero.gatewayPath没有被正确替换,说明还是有bug;

算了,还是改回直接可用的吧:

url:{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’,encode-for-uri(/DATA/ROW/mbSharelinkErcode))}

模板设计:

标签报表生成:

扫描二维码之后显示的移动页面。

备注,刚开始RTF模板做的标签打印无法正常显示,以为是 是RTF文档格式问题,按照帮助文档提供的BIPubliser地址链接到Oracle网站下载,但发现Oracle最新版的已经不叫BIPublisher,要下载之前版本的才有BiPublisher, 如果下载bupublisher 10g desktop, 提示要安装JRE, 于是下载bipublisher 11g, 这里面有两个版本,64位和32位的,安装64位的,提示要安装32位的,安装32位的提示要先安装JRE16以上 版本,去Oracle网站下载,16以上没有JRE,只有JDK,下了个JDK, 按照AI提示linke了JRE,然后配置环境变量设置JAVA_HOME 和Path,但重新安装Bipublisher的时还提示要安装JRE,AI说可能是版本问题,因为安装的JDK是64位的,32的BiPublisher可能要去找32的JRE,所以就去找32的JRE16以上的版本,发现没有,说是Oracle自Java11之后就不再提供32的版本了,所以必须用64位的,看了安装的word 2016之前是32的,于是就重新安装64的, 然后想着这次安装64的BIPublisher应该允许了,不会提示我再去安装32的了,可惜,即使office从32位换到了64位,安装64位的BIPubliser的时候依然提示要求装32位的BIPublisher,没办法,那干脆下载全套 BI Publisher 10.1.3.4.2 for Windows (32/64 bit) ,这个下载很慢,等着…

下载这个安装后有很多rtf模板的例子, 这个可以参考下,至于是否一定要用BiPublisher Desktop for Office的插件,我看未必,现在xsl-fo 相关语法问题都可以直接问豆包,元宝之类的AI , 那个biPubliser 都是很多年前的版本,跟最新版本的Office 和Java JRE版本的兼容都有问题,要打一个版本匹配的组合,将来会是个麻烦问题,因此能不用就不用了。

另外,多次测试过程中还碰到后台报表服务报内存溢出的错误:

jakarta.servlet.ServletException: Handler dispatch failed: java.lang.OutOfMemoryError: Java heap space

解决方案: 把内存从400M调整到800M;

总结:如果有类似需求:

工厂机器能效检测报告,检测完成后需要打印对应的能效等级标签,标签贴到机器上,购买机器的用户扫描标签上的二维码,可以看到该机器的详细能效官方鉴定信息,这个详细信息的布局是适配手机移动页面的。

解题步骤如下:

  1. 新建业务对象 [能效检测报告]
  2. 新建 PC布局页面
  3. 新建 移动布局页面,表单类型,新建完成后自动生成列表查询页面和详情页面。并生成一个移动页面功能。把表单详情页设置为功能首页。
  4. 设置 移动布局页面 功能的公开分享链接
  5. 在移动布局页面的 表单详情页/取值/页面参数 中添加参数:报告编码 repNo (注意大小写)
  6. 更改移动布局页面的 表单详情页 的事件流/详情查询,把查询条件从默认的主键ID 改成报告编号,等于参数报告编码 repNo (注意大小写)

7、在业务对象【能效检测报告】上添加一个字段:<移动报告公开分享链接>, 取值来源: 复合取值 ,合并 移动布局页面功能的公开分享链接 和 &repNo=数据域的报告编号

8、在业务对象 [能效检测报告] PC布局页面添加一个按钮【打印能效标签】,调用标签报表打印功能

9、制作标签报表的RTF模板,使用表格布局,图片+背景设置使得设计跟我们看到的冰箱空调上的能效等级标签类似。其中的二维码部分,使用一个任意图片作为占位符,控制显示大小和位置,使用微软的Word编辑图片的”可选文字“,可选文字中输入类似这样的字符串:

url:{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’,encode-for-uri(/DATA/ROW/mbSharelinkErcode))} 这里的mbSharelinkErcode就是对应的字段:<移动报告公开分享链接>

http://dev.hzero.com.cn:8080 是服务器网关地址。

备注:要用微软Word才能编辑图片的可选文字,WPS没有这个功能。如果曾经被WPS编辑保存过,导致可选文字无法显示,那么用Word再打开,先另存为docx 把格式改过来,再另存为RTF就有了。

  1. 定义数据集和报表
  2. 按钮的响应时间中国调用报表。

完成。

问题17: 报表平台/标签打印管理 ,如果模板类型选择 富文本,则编辑模板时会白屏,一直转圈,检查发现前端错误:

plugin.js:1  Uncaught SyntaxError: Unexpected token ‘<‘

ckeditor.js:267  Uncaught TypeError: Cannot read properties of null (reading ‘icons’)

    at Object.<anonymous> (ckeditor.js:267:254)

    at Object.<anonymous> (ckeditor.js:266:243)

    at x (ckeditor.js:261:193)

    at Array.y (ckeditor.js:261:336)

    at z (ckeditor.js:261:420)

at ckeditor.js:262:360

分析:因为我们用清透主题时,已经升级了hzero-front的版本,这个可能是报表服务的前端版本没有升级,检查 /d02/hzero/front/dist/packages/hzero_front_hrpt/package.json ,看到版本是  “version”: “1.12.2”, 应该说是挺新的,查nexus 制品库,看看有没有更新的版本:

https://nexus.saas.hand-china.com/service/rest/repository/browse/hzero-ui/hzero-front-hrpt/

https://nexus.saas.hand-china.com/ 搜hzero-ui , 进入查找 hzero-front-hrpt , 以html方式预览,可以清晰的看到时间,发现1.12.2 已经是最新的了,没有更新的了。

hzero-front-hrpt-1.12.2.tgzFri Sep 12 07:26:03 Z 20256699748 

看起来不是升级的事了,问下前端架构组吧,看是什么原因,怎么解决 ,这个问题在trail环境也存在,但是在开发环境不存在,开发环境是正常的。

跟前端架构组沟通,反馈是:之前是因为 hzero-front 里配置加了个 ckeditor 插件  但是 ckeditor 里边没有  会报这个错  但现在用这个 hzero-front 应该没有这个问题的,建议升级到 hzero-front@1.12.3-beta-international.2 hzero-boot-public@2.1.58-alpha.0 再测试。

编辑 /d02/hzero/front/front/package.json

    “hzero-front”: “1.12.3-beta-international.2”,

yarn

Done in 19.91s.

编辑 d02\hzero\front\front\node_modules\hzero-front\package.json

 “hzero-boot-public”: “2.1.58-alpha.0”,

cd d02\hzero\front\front\node_modules\hzero-front

yarn

[5/5] Building fresh packages…
success Saved lockfile.
$ node ./postinstall/index.js
$ npm run transpile:umi && npm run transpile

> hzero-front@1.12.3-beta-international.2 transpile:umi
> tsc -p tsconfig-hzerojs.json

error TS5058: The specified path does not exist: ‘tsconfig-hzerojs.json’.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

先不管这个错误了,回到主目录:重新编译hzero-front

cd d02\hzero\front\front\

yarn run build:ms hzero-front

Done in 159.61s

bash apply_update_to_runtime_env.sh

重启服务再试。发现问题依旧,ckeditor 目录下的plugins目录还是旧的。

单独编译父模块:

      yarn run build:app

Done in 18.83s.

这下plugins目录更新了

再次部署:

bash apply_update_to_runtime_env.sh

再起服务,再次测试,这下OK了:

问题解决。

 

 

关于作者:

昵称:Jack.shang
档案信息:jack.shang 程序员->项目经理->技术总监->项目总监->部门总监->事业部总经理->子公司总经理->集团产品运营支持
联系方式:你可以通过syfvb@hotmail.com联系作者
点击查看发表过的所有文章...
本文永久链接: http://blog.retailsolution.cn/archives/4747

 

 

对本文的评价:

 

 

本文的评论功能被关闭了.