> 后端讨论希望达成的目标:1、走通所有细节;2、表设计;3、任务分配;4、开始工作 # 1、前提 ## 1.1 质量要求 高可用 ``` 程序Down掉能重启:https://www.yuque.com/smartstone/nx/agent ``` 高性能 ``` 响应时间:1秒以内 吞吐量:200个模块、5000个开关、5秒一次的上传频率 ``` 高扩展 ``` 不同设备,不同协议 ``` ## 1.2 相关系统 ``` --智能照明版:局域网,前后端分离,后端提供接口 --总部运营版:云端,提供给智能照明版相关接口 --电工端:云端,后端提供接口 --局域网开放平台:局域网,提供给智能照明版有关设备和数据的接口 --局域网调度平台:管理背景作业 ``` ## 1.3 安装 实际需要安装部署方案,安装手册等。 ``` --安装成服务:https://www.yuque.com/smartstone/nx/agent --容器:先放一下,以后再说。 ``` ## 1.4 功能模块化 ``` --所有功能在一个应用程序内,一次性加载,通过总部运营后台配置(一定可以做) --一个接口一个组件,动态加载,通过总部运营后台配置(决定做,对后期多项目开发影响巨大) ``` ## 1.5 架构 ``` DC.DDD.Domain DC.DDD.Infrastructure DD.Infra DD.Libs DD.ZNZM.Infra DD.ZNZM.Application DD.ZNZMP.API ``` ## 1.6 脚手架 ``` 为各个版本打下基础 --办公楼版 --智能照明版:目前2.0,未来对单灯的控制 --能耗版:接入三相,电量是重点 --物流版:接入利群物流产业园内的各种设备数据 --学生公寓版:对负荷的控制 --工地版:管理工地用电 --铁塔版:5G基站远程用电管理,电量计量 ``` ## 1.7 采用`Endpoint`模式 ``` 弃用Controller,采用Endpoint模式 ``` ## 1.8 外网接通性 在智能照明版中,认定外网安装系统时是可以接通的,可以保证平常没有外网的情况下,系统也可以工作。 # 2、总部运营版 总部运营后台。销售员创建项目。 ``` IsProject=1, IsProject=1表示这个组织有其数据库相关配置 Name 备注:如果不是具有数据库相关组织,IsProject=1;如果是调用开放平台接口的第三方,那么IsProject=0, IsThirdPaty=1; ``` 财务审核项目,最终`CEO`审核通过。意味着可以对项目进行后续安装施工运维了。 总部运营后台。管理员为项目设置基本信息。 ``` NSpace: 用来表示在Redis缓存中的命名空间,当需要查询模块的实时数据,就会到这个命名空间中去找。项目的命名空间需要同步给开放平台,因为只有开放平台才收到模块的数据,并把数据根据命名空间存入Redis缓存。开放平台在什么时候知道项目的命名空间呢?是在总部运营后台,当把模块和项目进行绑定的时候,把该项目的命名空间同步给开放平台。 APIKey: 给调用开放平台的第三方使用。如果组织是第三方合作公司,需要为项目设置APIKey。也是在模块和项目进行绑定的时候,把APIKey同步给开放平台。然后第三方方,才可以吧APIKey放在Header中调用开放平台接口。 Version: 这个字段在总部运营后台的数据库hd_new中,暂时还没有,需要加上,用来表示项目属于哪个版本。 ``` 总部运营后台。管理员为项目配置数据库相关。 ``` 包括关系数据库、时序数据库、Redis数据库等。 这些配置会在项目现场安装的时候,在控制台上依次选择执行,默认从云端获取这些配置,分别创建生成各种数据库。 ``` 总部运营后台。管理员为项目设置授权。 ``` -- 使用Key -- 把Key保存在硬盘上,不保存在Cookie ``` 总部运营后台。管理员为项目设置功能模块。 ``` --基础模块:为所有项目版本可以共用的功能模块 --版本模块:为某个项目版本特定开发的功能模块 ``` 总部运营后台。管理员为项目设置位置。 ``` 位置信息、配电间信息、电箱信息会在工程部的CAD图纸上预先标明。 --设置无限级位置:大楼、楼层、区域....一版最多设置五级就够了 --设置配电间 --设置配电间内的电箱:电箱编号 ``` 总部运营后台。管理员输入模块。 ``` -- 模块号:目前手动录入。以后通过批量导入,或者扫描枪扫码入库。 -- 模块通讯方式:HTTP, UDP等等 -- 模块软件版本 ``` 总部运营后台。管理员把模块和项目进行绑定。 ``` --总部运营后台的projectmac记录关系 --需要调用开放平台接口,把模块的NSpace, APIKey, 通讯方式同步给开放平台 1、总部projectmacs表如下: Mac OrganizationId BindTime UnBindTime Protocol 2、开放平台的projects表记录项目信息: NSpace APIKey 3、开放平台的macs表记录如下: Mac ProjectId ProtocolType ``` 总部运营后台。管理员创建电工。 ``` 首先会创建一个名称为总部的Organization, 然后为总部添加一个员工Employee, 并分别在User和UserRole中增加一条记录。 ``` 总部运营后台。管理员设置电工和项目的绑定。 ``` 相当于电工和某个版本的项目进行了绑定。 ``` # 3、电工版 电工版。电工登录后,选择项目。点击"位置上传", 扫描模块的二维码或者选择手动输入,点击确定。位置和模块信息存入总部。 # 4、智能照明版 智能照明版。电工点击可执行文件,自动安装时序数据库、`MySQL`、`Redis`, 初次使用默认用户名和密码,数据库信息放配置文件中,使用加密字符串。 智能照明版。电工登录,如果还没有授权,进入授权页,电工输入`Key`, 系统内部会把`Key`存入硬盘,调用总部验证接口验证通过(总部记录操作记录,启用时间,操作人,等等),然后跳转到登录页。 智能照明版。电工登录,最终点击位置管理中的开关管理。 ``` --电工点击下载按钮 --电工在excel表格中输入开关的名称、第几行、第几列 --电工上传表格 在Breaker领域中: Row Column Addr ``` 智能照明版。电工手动创建或者批量导入员工。默认员工的角色是游客。 智能照明版。电工在权限管理中,把某个游客设置为管理员,管理员只有一个。电工完成工作。 智能照明版。管理员登录,在权限管理中,把某个游客设置为操作员或电工。 智能照明版。管理员为操作员或电工分配开关。 智能照明版。管理员或电工创建场景。如果电工创建了某个场景,这个场景自动归属于这个电工。当然,同样的场景可以指定给不同的电工或操作员。 ``` --关于同一个开关,在同一时间有多个合闸、分断怎么办? 原则:同一个开关,如果在1分钟之内有多个指令冲突,就在场景编辑的开关列表中文字备注说明或者图标说明该开关有冲突。鼠标移动上备注说明文字或图标上时,气泡显示冲突细节,包括:和哪个场景的哪个开关时间冲突,然后建议修改开关场景触发时间或者把开关从该场景中删除。 --开关状态 判断场景执行情况时的开关状态,是从实时数据中取出来的状态。 --场景历史执行 记录执行失败的情况。记录每次场景的开关总数,未执行原因,等等。 --场景执行结果 对某个开关来说,10:00执行场景,这个场景中的最后一个开关10:02执行完毕,在QUartz中保存两条记录,一条是10:00,表示开始执行场景;另一条是10:02,表示开始判断执行结果,从实时数据中获取,并且把失败执行结果保存起来。 ``` 首页 ``` --场景:当日哪些执行的 --总负荷如何计算? 每个开关的最大负荷=linetype * specification --首页数据 首先背景作业每隔一段时间把首页数据统计到某个专属表或缓存里,这样首页打开的速度就会快;另外,再有一个背景作业,不断地把首页的变化数据通过长连接(推荐使用SignalR)推送到首页。 --场景监测 在判断场景执行结果时,通过SignalR往首页主动推送场景的执行结果。 ``` 首页点击进入的报警详情 ``` 同一开关的报警记录是从时序数据库的历史报警中获取 ``` 首页点击进入,场景执行详情 | 重新执行次数 | 场景未执行原因 | 建议方案 | | ------------ | -------------- | ---------------------------- | | 1, 2 | 模块离线 | 已上报,正在处理 | | 1, 2 | 开关离线 | 已上报,正在处理 | | 1,2 | 线下手动分断 | 已上报,正在处理 | | 1 | 未知原因 | 重新执行按钮 | | 2 | 未知原因 | 重新执行按钮 | | 3 | 未知原因 | 已重试两次,已上报,正在处理 | ``` --点击重新执行按钮 点击的这行有一个加载按钮,这一行不允许再次点击,大概5-10秒,通过SignalR反馈结果。 ``` 首页设置 ``` 授权成功后,把总部有关的设置信息保存到局域网数据库 ``` 位置管理 ``` --加载第一级位置信息,如果没有 提醒电工登录电工端上传位置信息。 --修改 修改的时候调用总部接口。 --无限级 支持无限级,但实际级数不会太多。 ``` 开关健康管理 ``` 判断是否有外网的解决办法 --把没有上传成功的攒下来到某个时间点批量上传 --如果长时间没有上传,外网异常报警 如何上报? 前提是必须网络正常 --自动上报 --手动上报 所有局域网开关健康数据汇总之总部云端数据库。 开关健康指标定义策略:包括什么才算频繁跳闸次数、什么才叫多长时间不动作、什么叫异常负荷、什么叫高负荷(多长时间内)。 --频繁跳闸次数 从跳闸历史报警中获取。 --长时间没有动作 每一个开关都有一个动作记录表,记录所有的合闸和分断。开关动作记录表大致包括: 时间 操作人 合闸或分断:合闸或分断分很多种,比如线下合闸、可视化合闸、场景自动触发合闸、场景手动触发合闸,等等。 电流值:把动作之前最近一次实时数据的电流取到并保存 电压值: 负荷值 --线上线下合闸分断次数 从开关动作记录表获取。如果没有一次高负载,显示否;如果有多次高负载,记录高负载次数。开关动作还要记录每次动作当下的电流、电压、负荷等。 --负荷异常次数 --报警次数 --预警次数 --更换记录 电工端来操作,包括模块或开关的更换。 --高负载记录 在时序数据库层面,实时数据中加一个合闸或分断的标签,求平均值时把分断状态的负荷排除出去。 负载率=平均负载/额定负载 ``` 模块健康管理 ``` --模块更换记录 从总部获取。 --离线记录 从总部历史报警获取。 ``` 数据查询 ``` --开关数据查询 从时序数据库历史实时数据获取 --报警数据查询 从时序数据库历史报警获取。 --负载数据查询 从时序数据库历史实时数据获取 --电费数据查询 一个小时两个时间点的电量。 ``` # 5、开放平台 - 合闸分断接口 - 频繁跳闸次数判断 - 历史实时数据 - 报警查询 # 6、系统监测 ``` CPU 内存 网络 应用程序挂掉 ``` # 7、关于场景细节 ``` --如果一个开关当前状态为线下手动分断(Control=false),如果场景下的开关为合闸,如何处理这种情况?如何告知用户? 原则:只要Control=false就不能控制。场景执行结果或可视化界面显示黄色按钮告知。 --如果一个开关在多个场景中设置的时间点靠得很近怎么办? 原则: -- 如果两个场景中的时间同一秒,后设置的这个不允许,并给提示。 -- 如果两个场景中的时间相差几秒,允许。 -- 根据开关场景设置的时间线判断 -- 如果第一个场景执行失败, 重试根据时间线 ``` # 调光灯设置负荷 ``` 需求:如果开关下的负载包括调光灯,在报警策略中设置功率限定,设置一个最小值和最大值,不在限定范围内就报警 --如何实现? 谁来设置开关是否是调光灯?电工在Excel中填写是否是调光灯。 Breaker下应该有有一个字段表示是否包含调光灯 在功率限定报警详情中包含两条记录,一个是上限,一个是下限 ```