GAF 扩展开发示例

GAF 扩展开发示例

前几篇文章对GAF的各个模块功能进行详细介绍,接下来就通过一个管网示例,实践扩展开发流程。该管网示例,涉及了GAF的数据管理、服务发布、场景搭建、工作流配置、二次扩展开发、构建和部署相关的功能,以此综合使用GAF。

管网示例

需求分析

搭建一个简单的供水管网管理系统。具体如下:

  1. 完成基础数据整理并导入供水管网数据;
  2. 对管网二三维数据在地图上进行查看、添加查询、分析等地图功能;
  3. 可查看管网漏损分区、管径等专题图;
  4. 能对管网异常数据填报纠错申请,并由管理员进行审核;
  5. 对管线相关的维修事件(即任务)进行管理。

数据准备和服务发布

使用iDesktopX处理数据,制作地图和专题图,得到管网、DMA、消防栓和管径等级地图。如下图所示。

GAF 扩展开发示例_第1张图片

使iDesktopX GAF 插件,注册工作空间和数据源到GAF后台。如下图所示。

GAF 扩展开发示例_第2张图片

GAF 扩展开发示例_第3张图片

在GAF后台管理界面查看注册的工作空间和空间数据源。

服务发布页面发布工作空间,发布后的服务自动注册到服务管理。

GAF 扩展开发示例_第4张图片

发布后的地图服务管网关联对应的数据服务管网

GAF 扩展开发示例_第5张图片

前后端工程创建

根据模板创建前端工程pipeline和后端工程pipeline。 可参考 GAF快速开始-功能模块组件扩展开发流程 文章的后端工程创建与说明前端工程创建与说明小节。

mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
-DgroupId="com.supermap.pipeline" \
-DartifactId="pipeline" \
-Dversion="1.0.0-SNAPSHOT" \
-DpackageName="com.supermap.pipeline" \
-DgafVersion="3.0.0.pro-alpha-SNAPSHOT" \
-DservicePrefix="pipeline" \
-DarchetypeGroupId="com.supermap.gaf.archetype" \
-DarchetypeArtifactId="gaf-spring-rest-archetype" \
-DarchetypeVersion="3.0.0" -DinteractiveMode=false \
-DarchetypeCatalog=https://nexus.gaf.net.cn/repository/maven-public/
npm config set registry https://nexus.gaf.net.cn/repository/npm-group
yarn global add @gaf/create-gaf-project
create-gaf-project pipeline

子应用
pipeline
pipeline
10200
GAF MAP UI 框架
是
pipeline

GAF 扩展开发示例_第6张图片

代码生成

对数据源表event生成前后端的单表代码。 直接参考 GAF快速开始-功能模块组件扩展开发流程 的 代码生成 小节。

注意:参考时将需要填写的extend1都修改为pipeline

场景搭建

根据发布并注册的地图服务管网、消防栓、DMA和管径等级,搭建场景管网示例。可参考GAF“场景搭建“能力介绍 的场景配置小节。

搭建过程中,底图采用天地图。

GAF 扩展开发示例_第7张图片

资源目录配置管径等级、消防栓、DMA和管网底图服务。

GAF 扩展开发示例_第8张图片

业务工具条配置,选择属性查询(根据缓冲区选择)、综合查询、面积量算、距离量算。基础工具条全选。

GAF 扩展开发示例_第9张图片

在相机配置后,下载代码。将配置的场景代码,集成到前端工程pipeline。可参考GAF“场景搭建“能力介绍 的集成到前端模板工程小节

集成并配置前端路由,如下图所示。

GAF 扩展开发示例_第10张图片 GAF 扩展开发示例_第11张图片

工作流配置和扩展开发

添加管线修改上报单

GAF 扩展开发示例_第12张图片

设计表单(导入已设计的表单json)。可查看附录-管线修改上报单.json

GAF 扩展开发示例_第13张图片

添加管线修改申请流程,并导入设计好的流程。可查看附录-管线修改上报流程.bpmn20.xml

GAF 扩展开发示例_第14张图片

GAF 扩展开发示例_第15张图片

注意: 查看候选用户,根据实际情况选择。

由于在管理员审批节点加入了监听器,工作流引擎将会在管理员审批完成后,调用pipelineModifyService.modify(task),则需要扩展开发通过管线的数据服务修改管线数据的代码。监听器配置如下图。

GAF 扩展开发示例_第16张图片

对管线修改申请流程模型进行发布,在流程定义里面进行授权。

进行扩展开发。

# 下载工作流扩展开发模板
git clone http://code.gaf.net.cn/share/gaf-gbpm-extend.git

使用IDE打开,根据模板提示,创建PipelineModifyService类和modify方法,并编写管线修改的逻辑代码。然后使用maven命令mvn clean package打成jar包,然后将其上传到文件存储中,得到jar包的url。

https://file.gaf.net.cn/resource/system/public/extend-jars/gaf-gbpm-extend-1.0-SNAPSHOT-jar-with-dependencies.jar

在后端工作流微服务gaf-gbpm,加入如下配置,yaml格式。

# 注意:jars值的格式为 "jar:${jar包的url}!/"
supermap:
  dynamic:
    allowedDynamic: true
    jars: "jar:https://file.gaf.net.cn/resource/system/public/extend-jars/gaf-gbpm-extend-1.0-SNAPSHOT-jar-with-dependencies.jar!/"

将yaml格式转换为properties格式,在微服务配置中心增加配置。

GAF 扩展开发示例_第17张图片

若使用单机linux部署,则使用脚本命令./deploy.sh restart gaf-gbpm重启工作流微服务gaf-gbpm。

若基于iManger K8S部署,则在管理界面重新部署gaf-gbpm。

前端开发

修改前端工程中集成的场景搭建的代码,点选管线,查询其属性信息,并能修改,提交上一步的管线修改上报单发起管线修改上报流程。

具体查看资料

前后端构建部署

前后端构建部署参考参考 GAF快速开始-功能模块组件扩展开发流程 的 构建部署小节,只需要注意把 每一个extend1替换pipeline,并且把端口31333替换为31332。

配置路由

部署完成后,在GAF后台组件扩展菜单下,后端微服务路由配置添加路由,如下图所示。

GAF 扩展开发示例_第18张图片

前端微应用界面添加路由配置,如下图。注意,微应用入口的ip地址。

GAF 扩展开发示例_第19张图片

配置菜单

在GAF后台界面,系统设置的菜单管理下,新增菜单扩展示例及其子菜单维修事件管理。

GAF 扩展开发示例_第20张图片 GAF 扩展开发示例_第21张图片

GAF 扩展开发示例_第22张图片

资料和视频

资料参考,https://file.gaf.net.cn/resource/system/public/gxslzl/%E7%AE%A1%E7%BA%BF%E7%A4%BA%E4%BE%8B%E8%B5%84%E6%96%99.zip

视频参考,https://file.gaf.net.cn/resource/system/public/gxslzl/%E7%AE%A1%E7%BA%BF%E7%A4%BA%E4%BE%8B%E8%A7%86%E9%A2%91.zip

附录

管线修改上报单.json

{
	"list": [
		{
			"type": "tabs",
			"label": "标签页布局",
			"options": {
				"tabBarGutter": null,
				"type": "line",
				"tabPosition": "top",
				"size": "default",
				"animated": true
			},
			"columns": [
				{
					"value": "1",
					"label": "管线修改上报单",
					"list": [
						{
							"type": "input",
							"label": "管线数据集地址",
							"options": {
								"type": "text",
								"width": "100%",
								"defaultValue": "",
								"placeholder": "请输入",
								"clearable": false,
								"maxLength": null,
								"hidden": true,
								"disabled": false
							},
							"model": "datasetUrl",
							"key": "input_1652395264976",
							"help": "",
							"prefix": "",
							"suffix": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "input",
							"label": "管段要素id",
							"options": {
								"type": "text",
								"width": "100%",
								"defaultValue": "",
								"placeholder": "请输入",
								"clearable": false,
								"maxLength": null,
								"hidden": false,
								"disabled": false
							},
							"model": "featureId",
							"key": "input_1652395639152",
							"help": "",
							"prefix": "",
							"suffix": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "input",
							"label": "管段名称",
							"options": {
								"type": "text",
								"width": "100%",
								"defaultValue": "",
								"placeholder": "请输入",
								"clearable": false,
								"maxLength": null,
								"hidden": false,
								"disabled": false
							},
							"model": "name",
							"key": "input_1652426998299",
							"help": "",
							"prefix": "",
							"suffix": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "input",
							"label": "管段编码",
							"options": {
								"type": "text",
								"width": "100%",
								"defaultValue": "",
								"placeholder": "请输入",
								"clearable": false,
								"maxLength": null,
								"hidden": false,
								"disabled": false
							},
							"model": "code",
							"key": "input_1652427034932",
							"help": "",
							"prefix": "",
							"suffix": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "number",
							"label": "管径",
							"options": {
								"width": "100%",
								"defaultValue": 0,
								"min": null,
								"max": null,
								"precision": null,
								"step": 1,
								"hidden": false,
								"disabled": false,
								"placeholder": "请输入"
							},
							"model": "caliber",
							"key": "number_1652411719618",
							"help": "",
							"prefix": "",
							"suffix": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "input",
							"label": "材质",
							"options": {
								"type": "text",
								"width": "100%",
								"defaultValue": "",
								"placeholder": "请输入",
								"clearable": false,
								"maxLength": null,
								"hidden": false,
								"disabled": false
							},
							"model": "material",
							"key": "input_1652396339036",
							"help": "",
							"prefix": "",
							"suffix": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "input",
							"label": "上报人",
							"options": {
								"type": "text",
								"width": "100%",
								"defaultValue": "",
								"placeholder": "请输入",
								"clearable": false,
								"maxLength": null,
								"hidden": false,
								"disabled": false
							},
							"model": "reportBy",
							"key": "input_1652396907164",
							"help": "",
							"prefix": "",
							"suffix": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "date",
							"label": "上报日期",
							"options": {
								"width": "100%",
								"defaultValue": "",
								"rangeDefaultValue": [],
								"range": false,
								"showTime": false,
								"disabled": false,
								"hidden": false,
								"clearable": false,
								"placeholder": "请选择",
								"rangePlaceholder": [
									"开始时间",
									"结束时间"
								],
								"format": "YYYY-MM-DD"
							},
							"model": "reportDate",
							"key": "date_1652397051497",
							"help": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						},
						{
							"type": "textarea",
							"label": "备注 ",
							"options": {
								"width": "100%",
								"minRows": 4,
								"maxRows": 6,
								"maxLength": null,
								"defaultValue": "",
								"clearable": false,
								"hidden": false,
								"disabled": false,
								"placeholder": "请输入"
							},
							"model": "description",
							"key": "textarea_1652396860992",
							"help": "",
							"rules": [
								{
									"required": false,
									"message": "必填项"
								}
							]
						}
					]
				}
			],
			"key": "tabs_1652613006615",
			"model": "tabs_1652613006615"
		}
	],
	"config": {
		"layout": "horizontal",
		"labelCol": {
			"xs": 4,
			"sm": 4,
			"md": 4,
			"lg": 4,
			"xl": 4,
			"xxl": 4
		},
		"wrapperCol": {
			"xs": 18,
			"sm": 18,
			"md": 18,
			"lg": 18,
			"xl": 18,
			"xxl": 18
		},
		"hideRequiredMark": false,
		"customStyle": ""
	}
}

管线修改上报流程.bpmn20.xml


<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="demo">
  <bpmn2:process id="gxxgsblc" name="管线修改上报流程" isExecutable="true">
    <bpmn2:startEvent id="StartEvent_1" name="上报单提交" flowable:formKey="gxxgsbd" />
    <bpmn2:sequenceFlow id="Flow_0k6gxnw" sourceRef="StartEvent_1" targetRef="Activity_14zm30c" />
    <bpmn2:userTask id="Activity_14zm30c" name="管理员审批" flowable:category="todo" flowable:candidateUsers="63e63b95-6ede-4824-84c3-2417ba7ae902" >
      <bpmn2:extensionElements>
        <flowable:taskListener expression="${pipelineModifyService.modify(task)}" event="complete" />
      bpmn2:extensionElements>
    bpmn2:userTask>
    <bpmn2:endEvent id="Event_00mh30y" name="结束" />
    <bpmn2:sequenceFlow id="Flow_0l4z0ut" sourceRef="Activity_14zm30c" targetRef="Event_00mh30y" />
  bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_gxxgsblc">
    <bpmndi:BPMNPlane id="BPMNPlane_gxxgsblc" bpmnElement="gxxgsblc">
      <bpmndi:BPMNEdge id="BPMNEdge_Flow_0l4z0ut" bpmnElement="Flow_0l4z0ut">
        <di:waypoint x="430" y="178" />
        <di:waypoint x="592" y="178" />
      bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="BPMNEdge_Flow_0k6gxnw" bpmnElement="Flow_0k6gxnw">
        <di:waypoint x="196" y="178" />
        <di:waypoint x="330" y="178" />
      bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="BPMNShape_StartEvent_1" bpmnElement="StartEvent_1">
        <dc:Bounds x="160" y="160" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="151" y="196" width="56" height="14" />
        bpmndi:BPMNLabel>
      bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_Activity_14zm30c" bpmnElement="Activity_14zm30c">
        <dc:Bounds x="330" y="138" width="100" height="80" />
      bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_Event_00mh30y" bpmnElement="Event_00mh30y">
        <dc:Bounds x="592" y="160" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="599" y="196" width="22" height="14" />
        bpmndi:BPMNLabel>
      bpmndi:BPMNShape>
    bpmndi:BPMNPlane>
  bpmndi:BPMNDiagram>
bpmn2:definitions>

你可能感兴趣的:(GAF,java,gis,前端,微服务)