Browse Source

补充文档

jxing 4 years ago
parent
commit
d9bc6013e5

+ 81 - 0
docs/dev/data-center/relations/jiaojie/revit-algorithm.md

@@ -0,0 +1,81 @@
+# revit-algorithm 服务补充文档
+
+# 项目结构
+    主要分为两大块, 一个是后台基于springboot scheduling的后台处理线程, 一个是对外接口
+    使用的pg数据库  datacenter库revit模式和revit_calc模式
+    
+# 依赖的服务
+    1. 文件服务(带有分块上传接口): 主要上传和下载 模型文件, 模型报告, 模型底图, 模型导出json的zip数据
+    2. 调度器: 将模型转发给调度器处理, 包括检查和导出数据
+    3. 消息中心: 发送通知, 刷新类消息
+    4. 数据中心: 将模型的数据(主要是元空间, 设备, 部件)同步给数据中心
+
+# 后台scheduling服务
+    
+    1. 跟后台scheduling相关的包基本都在 cn.sagacloud.server.algorithm.backstage里
+    2. 其中state包里, 是模型文件的各种状态, 都实现了ModelState接口 
+        ModelState接口 提供了prepareModel 函数, 主要用来做当前状态处理的准备工作
+                            handle 函数, 主要用来处理当前状态的主业务流程
+    3. state包里的类, 名字结尾的数字表示模型当前的状态
+        0 : 初始状态 
+            主流程: 将处在0状态时间超过1天的模型删除
+        
+        1 : 上传完成状态
+            将模型依次发送到模型调度器处理(模型检查任务), 进入状态10
+            
+        10 : 等待调度器处理状态
+            调用调度器接口查询模型处理结果, 如果未处理完则继续等待, 如果已处理完成则做进一步检查
+            检查调度器返回的模型检查结果是否符合模型建模规范, 全部正确则进入状态2
+            如果不符合规范, 则进入状态11
+        
+        11 : 模型检查失败状态
+            直接删除模型, 并将模型所在的楼层版本回退到上一个版本
+        
+        2 : 初步检查通过状态
+            将模型依次发送到模型调度器处理(模型数据导出任务), 进入状态20
+        
+        20 : 等待模型导出状态
+            调用调度器接口查询模型处理结果, 如果未处理完则继续等待, 如果已处理完成则进入状态3
+            如果调度器导出模型数据失败, 则进入状态21
+            
+        21 : 模型导出数据失败状态
+            同11状态
+        
+        3 : 模型核心处理状态
+            1). 模型数据提取, 获取在文件服务器(Ali OSS)中存放的模型jsonz数据, 解压并解析成对象, 然后保存到数据库revit模式内
+            2). 多模型检查, 把当前模型跟上下楼层模型之间做检查(轴网检查, 标高检查)
+            3). 同步模型数据到数据中心(设备, 部件, 模型空间)
+            4). 记录同步数据过程中的增删日志
+            如果以上流程出现程序异常, 则进入31状态
+            
+        31 : 模型数据处理失败状态
+            在31状态一定的时间之后, 将模型状态切换到3
+            
+        4 : 模型完成状态
+            给模型文件版本号
+            计算因为模型空间的改变而受到影响的业务空间, 并给业务空间设置标记
+            
+            
+        
+    
+# 注意事项, 常见问题
+    1. 如果出现模型上传之后报错需要删除模型重新上传的情况, 使用model-file/delete-file接口删除模型
+    
+    2. 如果模型出现问题, 可以看一下模型文件表的sync_error_msg列的错误信息, 如果有的话
+    
+# 表
+    model_file 模型表
+    model_floor 楼层表
+    model_folder 文件夹表
+    model_monitor 模型文件处理流程监控表
+    sync_log 同步数据到数据中心的日志表
+    其他为模型构件信息表
+    
+# 打包
+    gradle 视图里找到 --> 项目名称 --> Tasks --> other -->
+    buildDevJar  : 构建dev环境的jar包 
+    buildDevWar  : 构建dev环境的war包 
+    buildProdJar  : 构建prod环境的jar包 
+    buildProdWar  : 构建prod环境的war包 
+    以上是在项目内的build.gradle文件内部写的 groovy 脚本, 可以根据需要更改
+    

+ 17 - 0
docs/dev/data-center/relations/jiaojie/scheduler.md

@@ -0,0 +1,17 @@
+# 调度器服务补充文档 (服务名: scheduler)
+    在项目启动时候, 会启动TimedTaskRunner(实现了Springboot的ApplicationRunner接口)任务, 将netty(默认6666端口)服务端一同启动
+    使用的数据库是pg, datacenter库的scheduler_str模式
+    
+    git地址 : http://git.sagacloud.cn/revit/ServiceRevit
+    
+# 调度器逻辑
+    1. 定期更新数据库里的任务到内存中
+    2. 获取一个可以分配的任务
+    3. 获取一个可以接受任务的客户端
+    4. 发送任务给客户端
+    
+# revit客户端
+    目前在公司内网的172.16.44.63下, 172.16.44.63的信息参考server.md
+    
+# 常见问题
+    1. 当以war包放入tomcat内启动服务时, 如果需要重启该服务, 则必须重启tomcat. 原因是netty监听6666端口时, 在关闭服务时tomcat不能关闭监听线程

+ 30 - 0
docs/dev/data-center/relations/jiaojie/server.md

@@ -0,0 +1,30 @@
+# 测试服1  windows
+    IP : 172.16.42.210      administrator/233
+    
+    revit-algorithm服务  (在桌面, 点revit-algorithm.cmd可以开启服务)
+    scheduler调度器服务 (在桌面, 点scheduler.cmd可以开启服务)
+    activemq服务 (在桌面, 点activemq.cmd可以开启服务)
+    
+    hbase虚拟机 node 1-4  (saga/saga)    node1是master节点, node2-4是region server节点  启动方式在桌面  启动集群.txt 里. 
+    
+    启动tomcat (包含数据平台, 文件服务) , 点击桌面的  tomcat启动.cmd 开启
+    
+# 测试服2  linux
+
+    IP : 172.16.44.234      saga/saga     或   root/saga
+    
+    测试服的pg数据库, 重启时会自动启动pg数据库
+    
+    
+    
+
+# 测试服3  windows
+    
+    IP : 172.16.44.63      Garrett/123456
+    
+    启动revit客户端, 点击桌面的Client.exe快捷方式. 
+    revit客户端使用的数据库 是在本机的mysql(8.0版本). 3306端口, root/123456, 数据库名: worker_str
+    
+
+# 数据库结构和内容
+    目前以47.93.22.124 上pg数据库的内容为准, 包括 revit模式内容, revit_calc模式内容的, public模式下的计算函数

+ 68 - 0
docs/dev/data-center/relations/other/grid_check.md

@@ -0,0 +1,68 @@
+# 一个建筑内的多楼层轴网冲突检查
+## 前置条件
+    
+    模型有轴网数据
+    
+## 处理逻辑
+
+    1. 查询出参与检查的所有模型(指定建筑文件夹下的所有已经处理完的模型 + 指定要被检查的模型)
+    2. 查询出 1 中参与检查模型的轴网数据
+    3. 将所有模型的轴网分组
+        分组逻辑:
+            1. 在对两个模型的轴网时, 只对比他们具有相同名字的轴网, 如果相同名字轴网的location表达的是同一条直线, 则认为轴网一致, 否则认为不一致
+            2. 只有轴网一致的模型才能分在一个分组内
+            3. 所有模型分完组后, 如果有两个或以上的分组, 则认为轴网不一致, 有冲突
+            返回结果中有分组id表示模型所处分组, 从0开始.
+
+# 函数
+
+<details>
+<summary>源码</summary>
+
+```
+CREATE OR REPLACE FUNCTION "revit_calc"."check_grid_valid"("project_id" varchar, "folder_id" varchar, "model_id" varchar)
+  RETURNS TABLE("id" varchar, "floor_name" varchar, "project_id" varchar, "folder_id" varchar, "fid" varchar, "accept_time" timestamptz, "version" int4, "note" text, "user_id" varchar, "user_name" varchar, "log" jsonb, "url" text, "md5" varchar, "status" int2, "group_id" int4, "plan_name" varchar) AS $BODY$
+    from relations.src.grid.check_grid import check_grid_upright
+
+
+    involved_model_sql = "select * from revit.model_floor_file_func('" + project_id + "') where folder_id = '"+ folder_id +"' and ( status in (4) or  fid = '" + model_id + "')"
+    grid_sql = "select * from revit.grid where model_id = "
+
+    involved_model = plpy.execute(involved_model_sql)
+    grid_data = dict()
+    for item in involved_model:
+        current_grid_sql = grid_sql + '\'{model_id}\''.format(model_id=item.get('fid'))
+        single_model_grid = plpy.execute(current_grid_sql)
+        grid_data[item.get('fid')] = single_model_grid
+    result = check_grid_upright(involved_model, grid_data)
+    return involved_model
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+  ROWS 1000
+```
+</details>
+
+## 输入
+    1. project_id : 项目id
+    2. folder_id : 建筑文件夹id
+    3. model_id : 模型id
+## 返回结果
+    
+    id : 楼层id
+    floor_name : 楼层名
+    project_id : 项目id
+    folder_id : 楼层所属建筑文件夹id
+    fid : 模型id
+    accept_time : 模型接受时间
+    version : 模型版本
+    note : 备注
+    user_id : 上传模型的用户id
+    user_name : 用户名
+    log : 日志
+    url : 模型下载地址
+    md5 : 模型文件md5
+    status : 模型当前状态
+    group_id : 模型所处分组
+    plan_name : 平面图名称
+    

+ 63 - 0
docs/dev/data-center/relations/other/level_check.md

@@ -0,0 +1,63 @@
+# 一个建筑内的多楼层标高冲突检查
+## 前置条件
+    
+    模型有标高数据
+    
+## 处理逻辑
+
+    1. 查询出参与检查的所有模型(指定建筑文件夹下的所有已经处理完的模型 + 指定要被检查的模型)
+    2. 查询出 1 中参与检查模型的标高数据
+    3. 将所有模型的标高按照楼层高低进行排序
+    4. 检查是否存在高楼层的标高低于低楼层的标高或者低楼层的标高高于高楼层的标高情况, 如果有, 则认为标高有冲突. 否则认为没有冲突
+
+# 函数
+
+<details>
+<summary>源码</summary>
+
+```
+CREATE OR REPLACE FUNCTION "revit_calc"."check_level_valid"("project_id" varchar, "folder_id" varchar, "model_id" varchar)
+  RETURNS TABLE("id" varchar, "floor_name" varchar, "project_id" varchar, "folder_id" varchar, "fid" varchar, "accept_time" timestamptz, "version" int4, "note" text, "user_id" varchar, "user_name" varchar, "log" jsonb, "url" text, "md5" varchar, "status" int2, "has_error" bool, "error" varchar, "level" float8, "plan_name" varchar) AS $BODY$
+    from relations.src.level.check_level import check_level_reasonable
+
+    involved_model_sql = "select * from revit.model_floor_file_func('" + project_id + "') where folder_id = '"+ folder_id +"' and ( status in (31, 4) or  fid = '" + model_id + "')"
+
+    involved_model = plpy.execute(involved_model_sql)
+    try:
+        # 返回结果为关系二维数组, 类似入参格式
+        result = check_level_reasonable(involved_model)
+        return involved_model
+    except Exception as e:
+        return dict()
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+  ROWS 1000
+```
+</details>
+
+## 输入
+    1. project_id : 项目id
+    2. folder_id : 建筑文件夹id
+    3. model_id : 模型id
+## 返回结果
+    
+    id : 楼层id
+    floor_name : 楼层名
+    project_id : 项目id
+    folder_id : 楼层所属建筑文件夹id
+    fid : 模型id
+    accept_time : 模型接受时间
+    version : 模型版本
+    note : 备注
+    user_id : 上传模型的用户id
+    user_name : 用户名
+    log : 日志
+    url : 模型下载地址
+    md5 : 模型文件md5
+    status : 模型当前状态
+    has_error : 是否有标高冲突
+    error : 错误信息(如果有的话)
+    level : 模型标高
+    plan_name : 平面图名称
+