Browse Source

访客,开放平台文档提交

zed 7 months ago
parent
commit
7821e9c11e

+ 269 - 0
开放平台/123.md

@@ -0,0 +1,269 @@
+# 开放平台总体设计文档
+### 功能模块
+#### 开放平台用户管理
+##### 禁用接口
+* 对于已经发布的接口,可以通过页面禁用接口。
+* 接口地址:/openapi/interface/disable/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:
+* 响应参数:JSON格式
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 导入接口
+* 可以通过excel导入其他环境已经配置好的接口。
+* 接口地址:/openapi/interface/import
+* 请求方式:POST
+* 平台: 总部端
+* 请求参数:multipart_file         //excel文件
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 导出接口
+* 可以导出当前环境的接口信息。
+* 接口地址:/openapi/interface/export
+* 请求方式:GET
+* 平台: 总部端
+* 请求参数: json
+```json
+{
+  "ids" : "1,2,3"    //多个接口id用逗号隔开。 不传则导出全部
+}
+```
+
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": [
+        {
+            "id": 1,
+            "name": "车场接口",
+            "path": "/api/v1/car/parking",
+            "method": "GET",
+            "type": 0,
+            "serviceType": 1,
+            "version": "v1",
+            "status": 1,
+            "doc": "",
+            "enable": 1,
+            "limitCount": 100,
+            "createTime": "2021-01-01 00:00:00",
+            "updateTime": "2021-01-01 00:00:00",
+            "createUser": "admin",
+            "updateUser": "admin"
+        }
+    ]
+}
+```
+##### 查询详情
+* 接口地址:/openapi/interface/{1}
+* 请求方式:GET
+* 平台: 总部端
+* 请求参数:路径参数
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "id": 1,
+        "name": "车场接口",
+        "path": "/api/v1/car/parking",
+        "method": "GET",
+        "type": 0,
+        "serviceType": 1,
+        "version": "v1",
+        "status": 1,
+        "doc": "",
+        "enable": 1,
+        "limitCount": 100,
+        "createTime": "2021-01-01 00:00:00",
+        "updateTime": "2021-01-01 00:00:00",
+        "createUser": "admin",
+        "updateUser": "admin"
+    }
+}
+```
+
+##### 查询接口列表(分页)
+* 接口地址:/openapi/interface/page
+* 请求方式:GET
+* 平台: 总部端,开放平台
+* 请求参数:分页参数
+
+| 参数名         | 类型 | 说明   | 是否必填 |
+|-------------| --- |------| --- |
+| current     | int | 页码   | 是 |
+| size        | int | 每页条数 | 是 |
+| name        | string | 应用名称 | 否 |
+| serviceType | string | 服务行业 | 否 |
+| status      | int | 状态   | 否 |
+| path        | string | 访问路径 | 否 |
+
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "total": 10,
+        "pages": 20,
+        "current": 1,
+        "size": 10,
+        "records": [
+            {
+                "id": 1,
+                "name": "车场接口",
+                "path": "/api/v1/car/parking",
+                "method": "GET",
+                "type": 0,
+                "serviceType": 1,
+                "version": "v1",
+                "status": 1,
+                "doc": "",
+                "enable": 1,
+                "limitCount": 100,
+                "createTime": "2021-01-01 00:00:00",
+                "updateTime": "2021-01-01 00:00:00",
+                "createUser": "admin",
+                "updateUser": "admin"
+            }
+        ]
+    }
+}
+```
+
+
+
+#### 开放平台安全管理
+开放平台安全校验模块负责对接车场、人行项目的安全校验,包括接口的安全校验、数据加密、数据权限校验、数据流量监控等。
+##### token生成
+* 开放平台对外提供的接口,都需要通过token进行访问。
+* 开放平台用户,需要通过appId, appSecret, timestamp, sign生成token。
+* token具有有效期。有效期时长可以配置。默认为两天。
+* token是采用jwt生成的。
+* 接口地址:/openapi/token/generate
+* 请求方式:POST
+* 请求参数:JSON格式
+```json
+{
+    "appId": "123456",
+    "appSecret": "123456",
+    "timestamp": 1610123456789,
+    "sign": "123456"
+}
+```
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
+    }
+}
+```
+
+
+##### token校验
+* 开放平台对外提供的接口,都需要通过token进行访问。
+* 开放平台用户,需要通过token校验。
+* 通过jwt解析token。对比jwt中的body数据是否正确。并获取当前应用的一些权限。
+##### 签名方式
+* 所有的接口按照接口都需要参数签名。
+* 对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。
+* 对于post, put请求,加密参数会在body中。
+* 对于get, delete请求,加密参数会在url中。
+
+##### 签名校验
+* 所有的接口都需要校验签名。
+* 对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。
+* 对比签名是否正确。
+
+##### 接口权限校验
+* 开放平台对外提供的接口,都需要进行权限校验。
+* 查看当前应用的接口绑定关系。
+* 根据当前应用的权限,判断当前接口是否有权限访问。
+
+##### 接口流量监控
+* 开放平台对外提供的接口,都需要进行流量监控。
+* 每个接口都需要记录访问次数。按照秒,分,时,天,月,年进行统计。目前只统计当前值。就是当前秒,当前分,过时的就丢弃。
+* 对于接口都存在一个访问限制数。
+* 限制数目前设置的是当前秒的限制数。
+* 限制数达到后,接口会被禁用。
+
+
+### 数据库设计
+#### 应用管理表
+| 字段名             | 参数名称  | 类型           | 能否为空 | 说明             |
+|-----------------|-------|--------------|------|----------------|
+| id              | 主键    | int          | 否    | 应用id           |
+| name            | 应用名称  | varchar(16)  | 否    | 应用名称           |
+| app_id          | 应用id  | varchar(32)  | 否    | 应用id           |
+| app_secret      | 应用密钥  | varchar(32)  | 否    | 应用密钥           |
+| status          | 应用状态  | int          | 否    | 应用状态 0 禁用 1 启用 |
+| create_time     | 创建时间  | datetime     | 否    | 创建时间           |
+| update_time     | 更新时间  | datetime     | 是    | 更新时间           |
+| user_id         | 创建人   | varchar(16)  | 否    | 创建人            |
+| expiration_time | 过期时间  | datetime     | 否    | 过期时间           |
+| is_delete       | 是否已删除 | int          | 否    | 0 正常 1 已删除     |
+| remark          | 备注    | varchar(255) | 是    | 备注             |
+
+
+#### 应用项目关联表
+| 字段名          | 参数名称   | 类型          | 能否为空 | 说明              |
+|--------------|--------|-------------|-------|-----------------|
+| id           | 主键     | int         | 否     | 主键              |
+| app_id       | 应用id     | varchar(32) | 否     | 应用id  应用表的主键    |
+| project_id | 项目id     | int         | 否     | 项目id   对应项目表的主键 |
+
+#### 接口管理表
+| 字段名             | 参数名称  | 类型           | 能否为空 | 说明                        |
+|-----------------|-------|--------------|------|---------------------------|
+| id              | 主键    | int          | 否    | 接口id                      |
+| name            | 接口名称  | varchar(16)  | 否    | 接口名称                      |
+| path            | 接口路径  | varchar(128) | 否    | 接口路径                      |
+| method          | 请求方式  | varchar(16)  | 否    | 请求方式                      |
+| type            | 接口类型  | int          | 否    | 接口类型 0 上行 1下行             |
+| service_type    | 服务类型  | int          | 否    | 1 车位 2 支付 3 月卡 4 车场 5 优惠券 |
+| version         | 版本号   | varchar(16)  | 否    | 版本号  v1 v2                |
+| doc             | 接口文档  | text         | 是    | 接口文档                      |
+| status          | 接口状态  | int          | 否    | 接口状态 0 禁用 1 启用          |
+| enable          | 是否启用  | int          | 否    | 是否启用 0 禁用 1 启用          |
+| limit_count     | 限制次数  | int          | 否    | 限制次数                      |
+| create_time     | 创建时间  | datetime     | 否    | 创建时间                      |
+| update_time     | 更新时间  | datetime     | 是    | 更新时间                      |
+| create_user     | 创建人   | varchar(16)  | 否    | 创建人                       |
+| update_user     | 更新人   | varchar(16)  | 是    | 更新人                       |
+| is_delete       | 是否已删除 | int          | 否    | 0 正常 1 已删除                |
+| remark          | 备注    | varchar(255) | 是    | 备注                         |
+
+
+#### 应用接口授权关联表
+| 字段名          | 参数名称   | 类型          | 能否为空 | 说明              |
+|--------------|--------|-------------|-------|-----------------|
+| id           | 主键     | int         | 否     | 主键              |
+| app_id       | 应用id     | varchar(32) | 否     | 应用id  应用表的主键    |
+| interface_id | 接口id     | int         | 否     | 接口id   接口表的主键 |
+
+
+### 数据接口列表

BIN
开放平台/ka.html


File diff suppressed because it is too large
+ 1208 - 0
开放平台/saved_resource.html


+ 942 - 0
开放平台/开放平台总体设计.md

@@ -0,0 +1,942 @@
+# 开放平台总体设计文档
+## 概述
+### 背景
+在富士行云V2平台中,将有很多的车场,人行项目接入。为了方便车场,人行项目运营方可以在他们自己已有的平台,或者其他第三方平台对接我们的数据,并提供数据服务。
+### 目标
+为了实现开放平台的功能,我们需要设计一个开放平台的总体设计文档,包括功能模块、系统架构、数据库设计、接口设计、安全设计、流量监控与分析等。
+### 范围
+本文档仅涉及开放平台的总体设计,不涉及具体的功能模块设计。
+## 总体设计
+### 系统架构
+系统依赖富士行云V2整体的spring cloud微服务架构。通过gateway在新的路径前缀下路由到开放平台,在通过openfeign、nacos、 load_balance  等组件实现服务间的调用。
+具体实现就利用我们现有的中台服务(transferService). 在中台服务上面去建立一个新的目录(openapi),在openapi目录下建立应用管理、接口管理、开发接口三个模块。
+### 功能模块
+#### 开放平台用户管理
+对接方需要注册开放平台用户,用户去绑定应用,一个用户可以创建一个或者多个应用。应用去绑定项目,应用也可以绑定一个或者多个项目。
+
+##### 注册用户
+* 接口地址:/openapi/user/register
+* 请求方式:POST
+* 平台: 开放平台
+* 请求参数:JSON格式
+```json
+{
+    "username": "13800000000",
+    "password": "123456",     //前端传入的应该是rsa加密的后的密码
+    "phoneNumber": "13800000000",
+    "nikeName": "admin"
+}
+```
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功",
+  "data": {
+    "id": 1,
+    "username": "13800000000",  
+    "phoneNumber": "13800000000",
+    "nikeName": "admin",
+    "createTime": "2019-08-30 17:56:40",
+    "updateTime": "2019-08-30 17:56:40"
+  }
+}
+```
+
+##### 修改密码
+* 接口地址:/openapi/user/updatePassword
+* 请求方式:PUT
+* 平台: 开放平台
+* 请求参数:JSON格式
+```json
+{
+    "oldPassword": "123456",      //前端传入的应该是rsa加密的后的旧密码
+    "newPassword": "<PASSWORD>"  //前端传入的应该是rsa加密的后的新密码
+}
+```
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功"
+}
+```
+##### 重置密码
+* 接口地址:/openapi/user/resetPassword
+* 请求方式:PUT
+* 平台: 开放平台
+* 请求参数:JSON格式
+```json
+{
+    "userId": 1, 
+    "newPassword": "123456",  //前端传入的应该是rsa加密的后的新密码  
+    "smsCode": "1234"   //短信验证码
+}
+```
+
+##### 用户登录
+* 接口地址:/openapi/user/login
+* 请求方式:POST
+* 平台: 开放平台
+* 请求参数:JSON格式
+```json
+{
+  "username": "13800000000",
+  "password": "123456",  //前端传入的应该是rsa加密的后的密码
+  "verfiyCode": "1234"  //验证码
+}
+```
+* 响应参数:JSON格式
+* 响应示例:
+
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功",
+  "data": {
+    "token": ""      //除了登录  其他的开放平台用户操作都需要带上这个token
+  }
+}
+```
+
+##### 退出登录
+* 接口地址:/openapi/user/logout
+* 请求方式:PUT
+* 平台: 开放平台
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功"
+}
+```
+
+##### 获取用户信息
+* 接口地址:/openapi/user/info/{1}
+* 请求方式:GET
+* 平台: 开放平台
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功",
+  "data": {
+    "id": 1,
+    "username": "13800000000",
+    "phoneNumber": "13800000000",
+    "nikeName": "admin",
+    "createTime": "2019-08-30 17:56:40",
+    "updateTime": "2019-08-30 17:56:40"
+  }
+}
+```
+
+##### 获取用户分页列表
+* 接口地址:/openapi/user/page
+* 请求方式:GET
+* 平台: 总部端
+* 请求参数:JSON格式
+```json
+{
+ "current": 1,
+  "size": 10,
+  "username": "13800000000",
+  "nikeName": "admin",
+  "phoneNumber": "13800000000"
+  
+}
+```
+
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功",
+  "data": [
+    {
+      "id": 1,
+      "username": "13800000000",
+      "phoneNumber": "13800000000",
+      "nikeName": "admin",
+      "createTime": "2019-08-30 17:56:40",
+      "updateTime": "2019-08-30 17:56:40"
+    }
+  ]
+}
+```
+
+##### 用户注销
+* 接口地址:/openapi/user/delete/{1}
+* 请求方式:DELETE
+* 平台: 总部端
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功"
+}
+```
+
+#### 开放平台应用管理
+开放平台应用管理模块负责对接车场、人行项目的应用,包括应用的注册、认证、授权、管理等。
+##### 新增应用
+在系统添加一个应用,用于对接车场、人行项目的开放接口。
+需要输入应用名称、服务行业、应用描述、应用logo、用户名(负责人)、手机号码。
+
+具体参数表格如下:
+
+| 字段名         | 参数名称   | 类型  | 说明              | 是否必填 |
+|-------------|--------|-----|-----------------|------|
+| name        | 应用名称   | 字符串 | 应用名称            | 是    |
+| serviceType | 服务行业   | 字符串 | 服务行业            | 是    |
+| remark      | 应用描述   | 字符串 | 应用描述            | 否    |
+| logo        | 应用logo | 字符串 | 应用logo 存oss key | 否    |
+| userId      | 用户id   | 字符串 | 开放平台用户id        | 是    |
+
+* 接口地址:/openapi/app/add
+* 请求方式:POST
+* 平台: 开放平台
+* 请求参数:JSON格式
+```json
+{
+"name": "车场应用",
+"serviceType": "车场",
+"remark": "车场应用",
+"logo": "osskey",
+"userId": 1
+}
+```
+* 响应参数:JSON格式
+响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "id": 1,
+        "name": "车场应用",
+        "serviceType": "车场",
+        "remark": "车场应用",
+        "logo": "osskey",
+        "userId": 1,
+        "createTime": "2021-01-01 00:00:00",
+        "updateTime": "2021-01-01 00:00:00",
+        "expirationTime " : "2021-01-01 00:00:00",
+        "status" : 1 // 0启用 1禁用
+    }
+}    
+```
+
+##### 绑定项目
+* 新增的应用是没有绑定项目的,需要绑定项目才能使用接口。
+* 通过调用系统服务获取到项目列表,选择需要绑定的项目,点击绑定按钮。
+* 可以绑定多个项目
+* 接口地址:/openapi/app/bind/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:JSON格式
+body 体中参数
+```json
+{
+    "projectIds": [1,2,3]
+}
+```
+* 响应参数:JSON格式
+响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 配置接口
+* 新增的应用是没有配置接口的,需要配置授权了接口,才能访问到这些开放接口。
+* 通过接口关联查询得到接口列表,选择需要配置的接口,点击配置按钮。
+* 可以配置多个接口,可以选择全部配置、部分配置。
+* 接口地址:/openapi/app/config/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:JSON格式
+body 体中参数
+```json
+{
+    "interfaceIds": [1,2,3]
+}
+```
+* 响应参数:JSON格式
+响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 修改有效期
+* 应用的有效期是可以修改的,可以根据需要修改。
+* 应用有效期过了,则该应用不能通过开放接口访问
+* 接口有效期可以修改比当前有效期以前,也可以修改比当前有效期以后。
+* 如果有效期修改在当前时间以前,也是运行的,则等于直接失效了。
+* 接口地址:/openapi/app/expiration/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:JSON格式
+  body 体中参数
+```json
+{
+    "expirationTime": "2021-01-01 00:00:00"
+}
+```
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+##### 禁用应用
+* 平台新创建的应用一开始是禁用状态的。需要平台认为的开启才可以使用。
+* 平台也可以在之后禁用应用,禁用后该应用不能通过开放接口访问
+* 接口地址:/openapi/app/disable/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:路径参数
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+##### 启用应用
+* 应用处于禁用状态时,需要平台认为的开启才可以使用。
+* 接口地址:/openapi/app/enable/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:路径参数
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+  "code": 1000000,
+  "msg": "操作成功",
+  "data": null
+}
+```
+##### 删除应用
+* 对于已经废弃的应用,平台可以通过接口删除
+* 接口地址:/openapi/app
+* 请求方式:delete
+* 平台: 总部端
+* 请求参数:路径参数
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+##### 重置应用秘钥
+* 新创建的应用的秘钥是随机生成的32位数字跟英文大写字母。
+* 如果用户签名秘钥存在泄露的情况,可以自己重置签名秘钥,平台也可以重置签名秘钥。
+* 重置的签名秘钥也是随机生成的。
+* 接口地址:/openapi/app/resetSignKey/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:路径参数
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+##### 重置签名密钥
+* 应用的签名秘钥用户数据接口的参数加签用的。应用生成的时候,签名秘钥是随机生成的
+* 应用有效期过了,则该应用不能通过开放接口访问
+* 接口有效期可以修改比当前有效期以前,也可以修改比当前有效期以后。
+* 如果有效期修改在当前时间以前,也是运行的,则等于直接失效了。
+* 接口地址:/openapi/app/expiration/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:JSON格式
+  body 体中参数
+```json
+{
+    "expirationTime": "2021-01-01 00:00:00"
+}
+```
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+##### 重置永久token
+* 方便用户调试使用,设置了永久token。
+* 如果用户不需要永久token,可以重置永久token。
+* 接口地址:/openapi/app/resetToken/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:路径参数
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+##### 修改通知回调地址
+* 对于一些下行的接口,或者推送的接口,需要应用配置下行的地址。
+* 回调的地址支持到端口后的特定前缀。例如:http://www.baidu.com/callback, 推送的消息会发送到http://www.baidu.com/callback/push/xxx
+* 新创建的应用的通知回调地址为空。没有配置的情况下,平台不会推送消息。
+* 平台对于每个应用只支持推送一个通知回调地址。
+* 接口地址:/openapi/app/callback/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:JSON格式
+  body 体中参数
+```json
+{
+    "callbackAddress": "2021-01-01 00:00:00"
+}
+```
+* 响应参数:JSON格式
+  响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+##### 查询详情
+* 接口地址:/openapi/app/{1}
+* 请求方式:GET
+* 平台: 总部端,开放平台
+* 请求参数:路径参数
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "id": 1,
+        "name": "车场应用",
+        "serviceType": "车场",
+        "remark": "车场应用",
+        "logo": "osskey",
+        "userName": "admin",
+        "phoneNumber": "13800138000",
+        "createTime": "2021-01-01 00:00:00",
+        "updateTime": "2021-01-01 00:00:00",
+        "createUser": "admin",
+        "updateUser": "admin",
+        "expirationTime " : "2021-01-01 00:00:00",
+        "status" : 1, // 0启用 1禁用
+    }
+}
+```
+
+##### 查询应用列表(分页)
+* 接口地址:/openapi/app/page
+* 请求方式:GET
+* 平台: 总部端,开放平台
+* 请求参数:分页参数
+
+
+
+| 参数名         | 类型 | 说明 | 是否必填 |
+|-------------| --- | --- | --- |
+| current     | int | 页码 | 是 |
+| size        | int | 每页条数 | 是 |
+| name        | string | 应用名称 | 否 |
+| serviceType | string | 服务行业 | 否 |
+| status      | int | 状态 | 否 |
+| phoneNumber | string | 手机号码 | 否 |
+
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+      "total": 10,
+      "pages": 20,
+      "current": 1,
+      "size": 10,
+      "records": [
+            {
+                "id": 1,
+                "name": "车场应用",
+                "serviceType": "车场",
+                "remark": "车场应用",
+                "logo": "osskey",
+                "userName": "admin",
+                "phoneNumber": "13800138000",
+                "createTime": "2021-01-01 00:00:00",
+                "updateTime": "2021-01-01 00:00:00",
+                "createUser": "admin",
+                "updateUser": "admin",
+                "expirationTime " : "2021-01-01 00:00:00",
+                "status" : 1, // 0启用 1禁用
+            }
+        ]
+    }
+}
+```
+
+
+#### 开放平台接口管理
+开放平台数据接口管理模块负责对接车场、人行项目的接口,包括接口的注册、认证、授权、管理等。我们将配置两类接口,一个是上行接口,一个是下行接口。
+上行接口
+##### 新增接口
+开放平台对外提供的接口,包括车场、人行项目的接口。都是在这里添加。
+需要的参数有,接口名称,路径,请求方式,接口类型,版本,发布状态,接口展示文档,启用状态,访问限制次数。
+    
+    具体参数表格如下:
+    
+   | 字段名          | 参数名称   | 类型  | 说明                        | 是否必填 |
+   |--------------|--------|-----|---------------------------|------|
+    | name         | 接口名称   | 字符串 | 接口名称                      | 是    |
+    | path         | 路径     | 字符串 | 接口路径                      | 是    |
+    | method       | 请求方式   | 字符串 | 请求方式  POST PUT GET DELETE | 是    |
+    | type         | 接口类型   | int | 接口类型  0 上行 1 下行           | 是    |
+    | serviceType | 业务类型   | int | 1 车位 2 支付 3 月卡 4 车场 5 优惠券 | 是    |
+    | version      | 版本     | 字符串 | 版本号     v1  v2 ...        | 是    |
+    | status       | 发布状态   | int | 发布状态      0 未发出 1 已发布     | 是    |
+    | doc          | 接口展示文档 | 字符串 | 接口展示文档  markdown格式        | 否    |
+    | enable       | 启用状态   | int | 启用状态     0 启用 1 禁用        | 是    |
+    | limitCount   | 访问限制次数 | int | 每秒访问限制次数                  | 否    |
+
+* 接口地址:/openapi/interface/add
+* 请求方式:POST
+* 平台: 总部端
+* 请求参数:JSON格式
+```json
+{
+    "name": "车场接口",
+    "path": "/api/v1/car/parking",
+    "method": "GET",
+    "type": 0,
+    "serviceType": 1,
+    "version": "v1",
+    "doc": "",
+    "limitCount": 100
+}
+```
+    
+* 响应参数:JSON格式
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "id": 1,
+        "name": "车场接口",
+        "path": "/api/v1/car/parking",
+        "method": "GET",
+        "type": 0,
+        "serviceType": 1,
+        "version": "v1",
+        "status": 1,
+        "doc": "",
+        "enable": 1,
+        "limitCount": 100,
+        "createTime": "2021-01-01 00:00:00",
+        "updateTime": "2021-01-01 00:00:00",
+        "createUser": "admin",
+        "updateUser": "admin"
+    }
+}
+```
+
+##### 编辑接口
+* 对于已经发布的接口,需要修改接口信息。
+* 可以修改的参数有接口名称、路径、请求方式、接口类型、版本、接口展示文档、访问限制次数。参考新增的表格。
+* 修改的时候传入参数如果没有修改,则不传。参数为空的时候等于不修改。
+* 接口地址:/openapi/interface/edit/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:JSON格式
+```json
+{
+    "name": "车场接口",
+    "path": "/api/v1/car/parking",
+    "method": "GET",
+    "type": 0,
+    "serviceType": 1,
+    "version": "v1",
+    "doc": "",
+    "limitCount": 100
+}
+```
+
+* 响应参数:JSON格式
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "id": 1,
+        "name": "车场接口",
+        "path": "/api/v1/car/parking",
+        "method": "GET",
+        "type": 0,
+        "serviceType": 1,
+        "version": "v1",
+        "status": 1,
+        "doc": "",
+        "enable": 1,
+        "limitCount": 100,
+        "createTime": "2021-01-01 00:00:00",
+        "updateTime": "2021-01-01 00:00:00",
+        "createUser": "admin",
+        "updateUser": "admin"
+    }
+}
+```
+
+##### 删除接口
+* 对于已经废弃的接口,需要删除接口。或者批量删除接口。
+* 接口地址:/openapi/interface
+* 请求方式:DELETE
+* 平台: 总部端
+* 请求参数:
+ids 多个用逗号隔开
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 配置接口文档
+* 接口中需要配置给开放平台展示的接口文档。需要markdown格式。
+* 管理员通过前端页面编辑接口文档。
+* 接口地址:/openapi/interface/doc/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:JSON格式
+```json
+{
+    "doc": "接口文档"
+}
+```
+* 响应参数:JSON格式
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 发布接口
+* 对于已经配置的接口,需要发布接口。
+* 接口地址:/openapi/interface/publish/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:
+* 响应参数:JSON格式
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 禁用接口
+* 对于已经发布的接口,可以通过页面禁用接口。
+* 接口地址:/openapi/interface/disable/{1}
+* 请求方式:PUT
+* 平台: 总部端
+* 请求参数:
+* 响应参数:JSON格式
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 导入接口
+* 可以通过excel导入其他环境已经配置好的接口。
+* 接口地址:/openapi/interface/import
+* 请求方式:POST
+* 平台: 总部端
+* 请求参数:multipart_file         //excel文件
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": null
+}
+```
+
+##### 导出接口
+* 可以导出当前环境的接口信息。
+* 接口地址:/openapi/interface/export
+* 请求方式:GET
+* 平台: 总部端
+* 请求参数: json
+```json
+{
+  "ids" : "1,2,3"    //多个接口id用逗号隔开。 不传则导出全部
+}
+```
+
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": [
+        {
+            "id": 1,
+            "name": "车场接口",
+            "path": "/api/v1/car/parking",
+            "method": "GET",
+            "type": 0,
+            "serviceType": 1,
+            "version": "v1",
+            "status": 1,
+            "doc": "",
+            "enable": 1,
+            "limitCount": 100,
+            "createTime": "2021-01-01 00:00:00",
+            "updateTime": "2021-01-01 00:00:00",
+            "createUser": "admin",
+            "updateUser": "admin"
+        }
+    ]
+}
+```
+##### 查询详情
+* 接口地址:/openapi/interface/{1}
+* 请求方式:GET
+* 平台: 总部端
+* 请求参数:路径参数
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "id": 1,
+        "name": "车场接口",
+        "path": "/api/v1/car/parking",
+        "method": "GET",
+        "type": 0,
+        "serviceType": 1,
+        "version": "v1",
+        "status": 1,
+        "doc": "",
+        "enable": 1,
+        "limitCount": 100,
+        "createTime": "2021-01-01 00:00:00",
+        "updateTime": "2021-01-01 00:00:00",
+        "createUser": "admin",
+        "updateUser": "admin"
+    }
+}
+```
+
+##### 查询接口列表(分页)
+* 接口地址:/openapi/interface/page
+* 请求方式:GET
+* 平台: 总部端,开放平台
+* 请求参数:分页参数
+
+| 参数名         | 类型 | 说明   | 是否必填 |
+|-------------| --- |------| --- |
+| current     | int | 页码   | 是 |
+| size        | int | 每页条数 | 是 |
+| name        | string | 应用名称 | 否 |
+| serviceType | string | 服务行业 | 否 |
+| status      | int | 状态   | 否 |
+| path        | string | 访问路径 | 否 |
+
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "total": 10,
+        "pages": 20,
+        "current": 1,
+        "size": 10,
+        "records": [
+            {
+                "id": 1,
+                "name": "车场接口",
+                "path": "/api/v1/car/parking",
+                "method": "GET",
+                "type": 0,
+                "serviceType": 1,
+                "version": "v1",
+                "status": 1,
+                "doc": "",
+                "enable": 1,
+                "limitCount": 100,
+                "createTime": "2021-01-01 00:00:00",
+                "updateTime": "2021-01-01 00:00:00",
+                "createUser": "admin",
+                "updateUser": "admin"
+            }
+        ]
+    }
+}
+```
+
+
+
+#### 开放平台安全管理
+开放平台安全校验模块负责对接车场、人行项目的安全校验,包括接口的安全校验、数据加密、数据权限校验、数据流量监控等。
+##### token生成
+* 开放平台对外提供的接口,都需要通过token进行访问。
+* 开放平台用户,需要通过appId, appSecret, timestamp, sign生成token。
+* token具有有效期。有效期时长可以配置。默认为两天。
+* token是采用jwt生成的。
+* 接口地址:/openapi/token/generate
+* 请求方式:POST
+* 请求参数:JSON格式
+```json
+{
+    "appId": "123456",
+    "appSecret": "123456",
+    "timestamp": 1610123456789,
+    "sign": "123456"
+}
+```
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
+    }
+}
+```
+
+
+##### token校验
+* 开放平台对外提供的接口,都需要通过token进行访问。
+* 开放平台用户,需要通过token校验。
+* 通过jwt解析token。对比jwt中的body数据是否正确。并获取当前应用的一些权限。
+##### 签名方式
+* 所有的接口按照接口都需要参数签名。
+* 对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。
+* 对于post, put请求,加密参数会在body中。
+* 对于get, delete请求,加密参数会在url中。
+
+##### 签名校验
+* 所有的接口都需要校验签名。
+* 对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。
+* 对比签名是否正确。
+
+##### 接口权限校验
+* 开放平台对外提供的接口,都需要进行权限校验。
+* 查看当前应用的接口绑定关系。
+* 根据当前应用的权限,判断当前接口是否有权限访问。
+
+##### 接口流量监控
+* 开放平台对外提供的接口,都需要进行流量监控。
+* 每个接口都需要记录访问次数。按照秒,分,时,天,月,年进行统计。目前只统计当前值。就是当前秒,当前分,过时的就丢弃。
+* 对于接口都存在一个访问限制数。
+* 限制数目前设置的是当前秒的限制数。
+* 限制数达到后,接口会被禁用。
+
+
+### 数据库设计
+#### 应用管理表
+| 字段名             | 参数名称  | 类型           | 能否为空 | 说明             |
+|-----------------|-------|--------------|------|----------------|
+| id              | 主键    | int          | 否    | 应用id           |
+| name            | 应用名称  | varchar(16)  | 否    | 应用名称           |
+| app_id          | 应用id  | varchar(32)  | 否    | 应用id           |
+| app_secret      | 应用密钥  | varchar(32)  | 否    | 应用密钥           |
+| status          | 应用状态  | int          | 否    | 应用状态 0 禁用 1 启用 |
+| create_time     | 创建时间  | datetime     | 否    | 创建时间           |
+| update_time     | 更新时间  | datetime     | 是    | 更新时间           |
+| user_id         | 创建人   | varchar(16)  | 否    | 创建人            |
+| expiration_time | 过期时间  | datetime     | 否    | 过期时间           |
+| is_delete       | 是否已删除 | int          | 否    | 0 正常 1 已删除     |
+| remark          | 备注    | varchar(255) | 是    | 备注             |
+
+
+#### 应用项目关联表
+| 字段名          | 参数名称   | 类型          | 能否为空 | 说明              |
+|--------------|--------|-------------|-------|-----------------|
+| id           | 主键     | int         | 否     | 主键              |
+| app_id       | 应用id     | varchar(32) | 否     | 应用id  应用表的主键    |
+| project_id | 项目id     | int         | 否     | 项目id   对应项目表的主键 |
+
+#### 接口管理表
+| 字段名             | 参数名称  | 类型           | 能否为空 | 说明                        |
+|-----------------|-------|--------------|------|---------------------------|
+| id              | 主键    | int          | 否    | 接口id                      |
+| name            | 接口名称  | varchar(16)  | 否    | 接口名称                      |
+| path            | 接口路径  | varchar(128) | 否    | 接口路径                      |
+| method          | 请求方式  | varchar(16)  | 否    | 请求方式                      |
+| type            | 接口类型  | int          | 否    | 接口类型 0 上行 1下行             |
+| service_type    | 服务类型  | int          | 否    | 1 车位 2 支付 3 月卡 4 车场 5 优惠券 |
+| version         | 版本号   | varchar(16)  | 否    | 版本号  v1 v2                |
+| doc             | 接口文档  | text         | 是    | 接口文档                      |
+| status          | 接口状态  | int          | 否    | 接口状态 0 禁用 1 启用          |
+| enable          | 是否启用  | int          | 否    | 是否启用 0 禁用 1 启用          |
+| limit_count     | 限制次数  | int          | 否    | 限制次数                      |
+| create_time     | 创建时间  | datetime     | 否    | 创建时间                      |
+| update_time     | 更新时间  | datetime     | 是    | 更新时间                      |
+| create_user     | 创建人   | varchar(16)  | 否    | 创建人                       |
+| update_user     | 更新人   | varchar(16)  | 是    | 更新人                       |
+| is_delete       | 是否已删除 | int          | 否    | 0 正常 1 已删除                |
+| remark          | 备注    | varchar(255) | 是    | 备注                         |
+
+
+#### 应用接口授权关联表
+| 字段名          | 参数名称   | 类型          | 能否为空 | 说明              |
+|--------------|--------|-------------|-------|-----------------|
+| id           | 主键     | int         | 否     | 主键              |
+| app_id       | 应用id     | varchar(32) | 否     | 应用id  应用表的主键    |
+| interface_id | 接口id     | int         | 否     | 接口id   接口表的主键 |
+
+
+### 数据接口列表

+ 193 - 0
开放平台/开放平台用户手册.html

@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>开放平台用户手册</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            line-height: 1.6;
+            margin: 20px;
+        }
+        h1, h2, h3, h4 {
+            color: #333;
+        }
+        pre {
+            background: #f4f4f4;
+            padding: 10px;
+            border-radius: 5px;
+            overflow: auto;
+        }
+        table {
+            width: 100%;
+            border-collapse: collapse;
+            margin: 20px 0;
+        }
+        th, td {
+            border: 1px solid #ddd;
+            padding: 8px;
+        }
+        th {
+            background-color: #f2f2f2;
+        }
+    </style>
+</head>
+<body>
+<h1>开放平台用户手册</h1>
+<h2>接入指南</h2>
+<h3>注册用户</h3>
+<ul>
+    <li>打开富士行云的开放平台,点击“注册”按钮,填写相关信息,提交注册申请。</li>
+    <li>注册成功后可以登录富士行云开放平台。用于后续的应用开通,接口调用等。</li>
+</ul>
+<h3>创建应用</h3>
+<h4>创建应用</h4>
+<ul>
+    <li>用户登录后,可以创建应用,创建应用需要填写应用名称、应用描述、应用类型、应用回调地址等。</li>
+    <li>创建成功后,等待审批通过。</li>
+</ul>
+<h4>绑定项目</h4>
+<ul>
+    <li>应用审批通过,需要工作人员协助绑定项目。</li>
+</ul>
+<h4>开通接口</h4>
+<ul>
+    <li>绑定项目成功后,可以开通接口。开通哪些接口也是需要工作人员协助开通的。</li>
+</ul>
+<h3>申请token</h3>
+<ul>
+    <li>应用开通接口后,可以申请token。申请token需要填写appId、appSecret、timestamp、sign等信息。</li>
+    <li>具体的申请token接口调用方法,请参考接口规范和接口列表。</li>
+</ul>
+<h3>接口调用</h3>
+<ul>
+    <li>调用接口在请求头中需要加入token。</li>
+    <li>需要对接口的参数进行签名。签名需要用到应用中的signatureKey。</li>
+</ul>
+<h2>接口规范</h2>
+<h3>字符集和编码</h3>
+<ul>
+    <li>接口请求和响应的字符集和编码统一为UTF-8。</li>
+    <li>接口请求和响应的消息体采用JSON格式。</li>
+</ul>
+<h3>通讯规范</h3>
+<ul>
+    <li>接口采用https协议进行通讯。</li>
+    <li>所有的开放接口都采用post请求。</li>
+</ul>
+<h3>请求参数</h3>
+<ul>
+    <li>所有的请求都需要携带token。token在请求头中加入Authorization字段。</li>
+    <li>所有的请求消息体都在http body中。</li>
+    <li>所有的上行接口请求都需要携带sign字段,用户验证签名。</li>
+    <li>请求中都需要携带timestamp字段,用于验证请求是否超时。</li>
+</ul>
+<p>请求体示例:</p>
+<pre><code>{
+    "name": "fujica",
+    "type": 1,
+    "timestamp": 1610123456789,
+    "sign": "12djuhd123fsdas83"
+}</code></pre>
+<h3>响应参数</h3>
+<ul>
+    <li>所有的响应都携带code、msg、data字段。</li>
+    <li>code为响应状态码,msg为响应消息,data为响应数据。</li>
+    <li>code为1000000表示请求成功,其他表示请求失败。</li>
+</ul>
+<p>响应体示例:</p>
+<pre><code>{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "name": "fujica",
+        "type": 1
+    }
+}</code></pre>
+<h3>签名算法</h3>
+<ul>
+    <li>接口的请求参数,需要加签的字段,会在接口参数中说明。</li>
+    <li>对所有需要加签的参数,按照ASCII码排序,然后拼接成字符串。</li>
+    <li>用应用的signatureKey进行AES加密。</li>
+    <li>加密后的字符串,作为sign参数的值。</li>
+</ul>
+<p>签名算法示例:</p>
+<p>请求参数:</p>
+<pre><code>{
+    "name": "fujica",
+    "type": 1,
+    "timestamp": 1610123456789,
+    "sign": "12djuhd123fsdas83"
+}</code></pre>
+<p>加密字段:name type</p>
+<p>加密后的字符串:fujica1</p>
+<p>加密后的字符串进行AES加密,加密密钥为应用的signatureKey。假设signatureKey为123456</p>
+<p>加密结果:</p>
+<h3>SDK下载与使用</h3>
+<ul>
+    <li>富士行云开放平台后续将提供SDK下载,用户可以根据自己的开发语言,下载对应的SDK。</li>
+</ul>
+<h3>错误码</h3>
+<p>富士行云开放平台后续会提供错误码,用于接口调用失败时,提供错误原因。</p>
+<p>错误码表格:</p>
+<table>
+    <thead>
+    <tr>
+        <th>错误码</th>
+        <th>错误原因</th>
+        <th>解决方案</th>
+    </tr>
+    </thead>
+    <tbody>
+    <tr>
+        <td>1000000</td>
+        <td>操作成功</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td>1000001</td>
+        <td>系统异常</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td>1000002</td>
+        <td>参数异常</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td>1000003</td>
+        <td>签名异常</td>
+        <td></td>
+    </tr>
+    </tbody>
+</table>
+<h2>接口列表</h2>
+<h3>上行接口</h3>
+<h4>获取token</h4>
+<ul>
+    <li>接口地址:/open/oauth/token</li>
+    <li>请求方式:POST</li>
+    <li>请求参数:JSON格式</li>
+</ul>
+<pre><code>{
+    "appId": "123456",
+    "appSecret": "123456",
+    "timestamp": 1610123456789,
+    "sign": "123456"
+}</code></pre>
+<ul>
+    <li>响应参数:JSON格式</li>
+</ul>
+<p>响应示例:</p>
+<pre><code>{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
+    }
+}</code></pre>
+<h3>下行接口</h3>
+<p>下行接口需要配置了回调地址的应用才能调用。另外下行接口不加签。</p>
+</body>
+</html>

+ 118 - 0
开放平台/开放平台用户手册.md

@@ -0,0 +1,118 @@
+# 开放平台用户手册
+## 接入指南
+### 注册用户
+* 打开富士行云的开放平台,点击“注册”按钮,填写相关信息,提交注册申请。
+* 注册成功后可以登录富士行云开放平台。用于后续的应用开通,接口调用等。
+### 创建应用
+#### 创建应用
+* 用户登录后,可以创建应用,创建应用需要填写应用名称、应用描述、应用类型、应用回调地址等。
+* 创建成功后,等待审批通过。
+#### 绑定项目
+* 应用审批通过,需要工作人员协助绑定项目。
+#### 开通接口
+* 绑定项目成功后,可以开通接口。开通哪些接口也是需要工作人员协助开通的。
+### 申请token
+* 应用开通接口后,可以申请token。申请token需要填写appId、appSecret、timestamp、sign等信息。
+* 具体的申请token接口调用方法,请参考接口规范和接口列表
+### 接口调用
+* 调用接口在请求头中需要加入token。
+* 需要对接口的参数进行签名。签名需要用到应用中的signatureKey。
+
+## 接口规范
+### 字符集和编码
+* 接口请求和响应的字符集和编码统一为UTF-8。
+* 接口请求和响应的消息体采用JSON格式。
+### 通讯规范
+* 接口采用https协议进行通讯。
+* 所有的开放接口都采用post请求。
+### 请求参数
+* 所有的请求都需要携带token。token在请求头中加入Authorization字段。
+* 所有的请求消息体都在http body中。
+* 所有的上行接口请求都需要携带sign字段,用户验证签名。
+* 请求中都需要携带timestamp字段,用于验证请求是否超时。
+* 请求体示例:
+```json
+{
+    "name": "fujica",
+    "type": 1,
+    "timestamp": 1610123456789,
+    "sign": "12djuhd123fsdas83"
+}
+```
+### 响应参数
+* 所有的响应都携带code、msg、data字段。
+* code为响应状态码,msg为响应消息,data为响应数据。
+* code为1000000表示请求成功,其他表示请求失败。
+* 响应体示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "name": "fujica",
+        "type": 1
+    }
+}
+```
+### 签名算法
+* 接口的请求参数,需要加签的字段,会在接口参数中说明。
+* 对所有需要加签的参数,按照ASCII码排序,然后拼接成字符串。
+* 用应用的signatureKey进行AES加密。
+* 加密后的字符串,作为sign参数的值。
+* 签名算法示例:
+* 请求参数:
+```json
+{
+   "name": "fujica",
+  "type": 1,
+ "timestamp": 1610123456789,
+"sign": "12djuhd123fsdas83"
+}
+```
+* 加密字段:name type
+* 加密后的字符串:fujica1
+* 加密后的字符串进行AES加密,加密密钥为应用的signatureKey。假设signatureKey为123456
+* 加密结果:
+ 
+### SDK下载与使用
+* 富士行云开放平台后续将提供SDK下载,用户可以根据自己的开发语言,下载对应的SDK。
+### 错误码
+* 富士行云开放平台后续会提供错误码,用于接口调用失败时,提供错误原因。
+* 错误码表格:
+
+| 错误码 | 错误原因 | 解决方案 |
+| --- |------|-----|
+| 1000000 | 操作成功 |   |
+| 1000001 | 系统异常 |   |
+| 1000002 | 参数异常 |   |
+| 1000003 | 签名异常 |   |
+
+
+## 接口列表
+### 上行接口
+#### 获取token
+* 接口地址:/open/oauth/token
+* 请求方式:POST
+* 请求参数:JSON格式
+```json
+{
+    "appId": "123456",
+    "appSecret": "123456",
+    "timestamp": 1610123456789,
+    "sign": "123456"
+}
+```
+* 响应参数:JSON格式
+* 响应示例:
+```json
+{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
+    }
+}
+```
+
+### 下行接口
+下行接口需要配置了回调地址的应用才能调用。另外下行接口不加签。

+ 216 - 0
开放平台/用户手册.html

@@ -0,0 +1,216 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>开放平台用户手册</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            line-height: 1.6;
+            margin: 20px;
+        }
+        h1, h2, h3, h4 {
+            color: #333;
+        }
+        pre {
+            background-color: #f4f4f4;
+            padding: 10px;
+            border-radius: 5px;
+            border: 1px solid #ddd;
+        }
+        table {
+            width: 100%;
+            border-collapse: collapse;
+            margin: 20px 0;
+        }
+        th, td {
+            padding: 10px;
+            border: 1px solid #ddd;
+            text-align: left;
+        }
+        th {
+            background-color: #f4f4f4;
+        }
+    </style>
+</head>
+<body>
+<h1>开放平台用户手册</h1>
+
+<h2>接入指南</h2>
+
+<h3>注册用户</h3>
+<ul>
+    <li>打开富士行云的开放平台,点击“注册”按钮,填写相关信息,提交注册申请。</li>
+    <li>注册成功后可以登录富士行云开放平台。用于后续的应用开通,接口调用等。</li>
+</ul>
+
+<h3>创建应用</h3>
+
+<h4>创建应用</h4>
+<ul>
+    <li>用户登录后,可以创建应用,创建应用需要填写应用名称、应用描述、应用类型、应用回调地址等。</li>
+    <li>创建成功后,等待审批通过。</li>
+</ul>
+
+<h4>绑定项目</h4>
+<ul>
+    <li>应用审批通过,需要工作人员协助绑定项目。</li>
+</ul>
+
+<h4>开通接口</h4>
+<ul>
+    <li>绑定项目成功后,可以开通接口。开通哪些接口也是需要工作人员协助开通的。</li>
+</ul>
+
+<h3>申请token</h3>
+<ul>
+    <li>应用开通接口后,可以申请token。申请token需要填写appId、appSecret、timestamp、sign等信息。</li>
+    <li>具体的申请token接口调用方法,请参考接口规范和接口列表。</li>
+</ul>
+
+<h3>接口调用</h3>
+<ul>
+    <li>调用接口在请求头中需要加入token。</li>
+    <li>需要对接口的参数进行签名。签名需要用到应用中的signatureKey。</li>
+</ul>
+
+<h2>接口规范</h2>
+
+<h3>字符集和编码</h3>
+<ul>
+    <li>接口请求和响应的字符集和编码统一为UTF-8。</li>
+    <li>接口请求和响应的消息体采用JSON格式。</li>
+</ul>
+
+<h3>通讯规范</h3>
+<ul>
+    <li>接口采用https协议进行通讯。</li>
+    <li>所有的开放接口都采用post请求。</li>
+</ul>
+
+<h3>请求参数</h3>
+<ul>
+    <li>所有的请求都需要携带token。token在请求头中加入Authorization字段。</li>
+    <li>所有的请求消息体都在http body中。</li>
+    <li>所有的上行接口请求都需要携带sign字段,用于验证签名。</li>
+    <li>请求中都需要携带timestamp字段,用于验证请求是否超时。</li>
+</ul>
+<p>请求体示例:</p>
+<pre><code>{
+    "name": "fujica",
+    "type": 1,
+    "timestamp": 1610123456789,
+    "sign": "12djuhd123fsdas83"
+}</code></pre>
+
+<h3>响应参数</h3>
+<ul>
+    <li>所有的响应都携带code、msg、data字段。</li>
+    <li>code为响应状态码,msg为响应消息,data为响应数据。</li>
+    <li>code为1000000表示请求成功,其他表示请求失败。</li>
+</ul>
+<p>响应体示例:</p>
+<pre><code>{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "name": "fujica",
+        "type": 1
+    }
+}</code></pre>
+
+<h3>签名算法</h3>
+<ul>
+    <li>接口的请求参数,需要加签的字段,会在接口参数中说明。</li>
+    <li>对所有需要加签的参数,按照ASCII码排序,然后拼接成字符串。</li>
+    <li>用应用的signatureKey进行AES加密。</li>
+    <li>加密后的字符串,作为sign参数的值。</li>
+</ul>
+<p>签名算法示例:</p>
+<p>请求参数:</p>
+<pre><code>{
+    "name": "fujica",
+    "type": 1,
+    "timestamp": 1610123456789,
+    "sign": "12djuhd123fsdas83"
+}</code></pre>
+<p>加密字段:name type</p>
+<p>加密后的字符串:fujica1</p>
+<p>加密后的字符串进行AES加密,加密密钥为应用的signatureKey。假设signatureKey为123456</p>
+<p>加密结果:</p>
+
+<h3>SDK下载与使用</h3>
+<ul>
+    <li>富士行云开放平台后续将提供SDK下载,用户可以根据自己的开发语言,下载对应的SDK。</li>
+</ul>
+
+<h3>错误码</h3>
+<ul>
+    <li>富士行云开放平台后续会提供错误码,用于接口调用失败时,提供错误原因。</li>
+</ul>
+<p>错误码表格:</p>
+<table>
+    <thead>
+    <tr>
+        <th>错误码</th>
+        <th>错误原因</th>
+        <th>解决方案</th>
+    </tr>
+    </thead>
+    <tbody>
+    <tr>
+        <td>1000000</td>
+        <td>操作成功</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td>1000001</td>
+        <td>系统异常</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td>1000002</td>
+        <td>参数异常</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td>1000003</td>
+        <td>签名异常</td>
+        <td></td>
+    </tr>
+    </tbody>
+</table>
+
+<h2>接口列表</h2>
+
+<h3>上行接口</h3>
+
+<h4>获取token</h4>
+<ul>
+    <li>接口地址:/open/oauth/token</li>
+    <li>请求方式:POST</li>
+    <li>请求参数:JSON格式</li>
+</ul>
+<pre><code>{
+    "appId": "123456",
+    "appSecret": "123456",
+    "timestamp": 1610123456789,
+    "sign": "123456"
+}</code></pre>
+<ul>
+    <li>响应参数:JSON格式</li>
+</ul>
+<p>响应示例:</p>
+<pre><code>{
+    "code": 1000000,
+    "msg": "操作成功",
+    "data": {
+        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
+    }
+}</code></pre>
+
+<h3>下行接口</h3>
+<p>下行接口需要配置了回调地址的应用才能调用。另外下行接口不加签。</p>
+</body>
+</html>

+ 0 - 481
开放平台总体设计.md

@@ -1,481 +0,0 @@
-# 开放平台总体设计文档
-## 概述
-### 背景
-在富士行云V2平台中,将有很多的车场,人行项目接入。为了方便车场,人行项目运营方可以在他们自己已有的平台,或者其他第三方平台对接我们的数据,并提供数据服务。
-### 目标
-为了实现开放平台的功能,我们需要设计一个开放平台的总体设计文档,包括功能模块、系统架构、数据库设计、接口设计、安全设计、流量监控与分析等。
-### 范围
-本文档仅涉及开放平台的总体设计,不涉及具体的功能模块设计。
-## 总体设计
-### 系统架构
-系统依赖富士行云V2整体的spring cloud微服务架构。通过gateway在新的路径前缀下路由到开放平台,在通过openfeign、nacos、 load_balance  等组件实现服务间的调用。
-具体实现就利用我们现有的中台服务(transferService). 在中台服务上面去建立一个新的目录(openapi),在openapi目录下建立应用管理、接口管理、开发接口三个模块。
-### 功能模块
-#### 开放平台用户管理
-#### 开放平台应用管理
-开放平台应用管理模块负责对接车场、人行项目的应用,包括应用的注册、认证、授权、管理等。
-##### 新增应用
-在系统添加一个应用,用于对接车场、人行项目的开放接口。
-需要输入应用名称、服务行业、应用描述、应用logo、用户名(负责人)、手机号码。
-
-具体参数表格如下:
-
-| 字段名           | 参数名称   | 类型  | 说明              | 是否必填 |
-|---------------|--------|-----|-----------------|------|
-| name          | 应用名称   | 字符串 | 应用名称            | 是    |
-| serviceType   | 服务行业   | 字符串 | 服务行业            | 是    |
-| remark        | 应用描述   | 字符串 | 应用描述            | 否    |
-| logo          | 应用logo | 字符串 | 应用logo 存oss key | 否    |
-| userName      | 用户名    | 字符串 | 负责人用户名          | 是    |
-| phoneNumber   | 手机号码   | 字符串 | 负责人手机号码         | 是    |
-
-* 接口地址:/openapi/app/add
-* 请求方式:POST
-* 请求参数:JSON格式
-```json
-{
-    "name": "车场应用",
-    "serviceType": "车场",
-    "remark": "车场应用",
-    "logo": "osskey",
-    "userName": "admin",
-    "phoneNumber": "13800138000"
-}
-```
-* 响应参数:JSON格式
-响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": {
-        "id": 1,
-        "name": "车场应用",
-        "serviceType": "车场",
-        "remark": "车场应用",
-        "logo": "osskey",
-        "userName": "admin",
-        "phoneNumber": "13800138000",
-        "createTime": "2021-01-01 00:00:00",
-        "updateTime": "2021-01-01 00:00:00",
-        "createUser": "admin",
-        "updateUser": "admin",
-        "expirationTime " : "2021-01-01 00:00:00",
-        "status" : 1, // 0启用 1禁用
-    }
-}    
-```
-
-##### 绑定项目
-* 新增的应用是没有绑定项目的,需要绑定项目才能使用接口。
-* 通过调用系统服务获取到项目列表,选择需要绑定的项目,点击绑定按钮。
-* 可以绑定多个项目
-* 接口地址:/openapi/app/bind/{1}
-* 请求方式:PUT
-* 请求参数:JSON格式
-body 体中参数
-```json
-{
-    "projectIds": [1,2,3]
-}
-```
-* 响应参数:JSON格式
-响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-
-##### 配置接口
-* 新增的应用是没有配置接口的,需要配置授权了接口,才能访问到这些开放接口。
-* 通过接口关联查询得到接口列表,选择需要配置的接口,点击配置按钮。
-* 可以配置多个接口,可以选择全部配置、部分配置。
-* 接口地址:/openapi/app/config/{1}
-* 请求方式:PUT
-* 请求参数:JSON格式
-body 体中参数
-```json
-{
-    "interfaceIds": [1,2,3]
-}
-```
-* 响应参数:JSON格式
-响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-
-##### 修改有效期
-* 应用的有效期是可以修改的,可以根据需要修改。
-* 应用有效期过了,则该应用不能通过开放接口访问
-* 接口有效期可以修改比当前有效期以前,也可以修改比当前有效期以后。
-* 如果有效期修改在当前时间以前,也是运行的,则等于直接失效了。
-* 接口地址:/openapi/app/expiration/{1}
-* 请求方式:PUT
-* 请求参数:JSON格式
-  body 体中参数
-```json
-{
-    "expirationTime": "2021-01-01 00:00:00"
-}
-```
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-##### 禁用应用
-* 平台新创建的应用一开始是禁用状态的。需要平台认为的开启才可以使用。
-* 平台也可以在之后禁用应用,禁用后该应用不能通过开放接口访问
-* 接口地址:/openapi/app/disable/{1}
-* 请求方式:PUT
-* 请求参数:路径参数
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-##### 启用应用
-* 应用处于禁用状态时,需要平台认为的开启才可以使用。
-* 接口地址:/openapi/app/enable/{1}
-* 请求方式:PUT
-* 请求参数:路径参数
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-  "code": 200,
-  "msg": "success",
-  "data": null
-}
-```
-##### 删除应用
-* 对于已经废弃的应用,平台可以通过接口删除
-* 接口地址:/openapi/app
-* 请求方式:delete
-* 请求参数:路径参数
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-##### 重置应用秘钥
-* 新创建的应用的秘钥是随机生成的32位数字跟英文大写字母。
-* 如果用户签名秘钥存在泄露的情况,可以自己重置签名秘钥,平台也可以重置签名秘钥。
-* 重置的签名秘钥也是随机生成的。
-* 接口地址:/openapi/app/resetSignKey/{1}
-* 请求方式:PUT
-* 请求参数:路径参数
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-##### 重置签名密钥
-* 应用的签名秘钥用户数据接口的参数加签用的。应用生成的时候,签名秘钥是随机生成的
-* 应用有效期过了,则该应用不能通过开放接口访问
-* 接口有效期可以修改比当前有效期以前,也可以修改比当前有效期以后。
-* 如果有效期修改在当前时间以前,也是运行的,则等于直接失效了。
-* 接口地址:/openapi/app/expiration/{1}
-* 请求方式:PUT
-* 请求参数:JSON格式
-  body 体中参数
-```json
-{
-    "expirationTime": "2021-01-01 00:00:00"
-}
-```
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-##### 重置永久token
-* 方便用户调试使用,设置了永久token。
-* 如果用户不需要永久token,可以重置永久token。
-* 接口地址:/openapi/app/resetToken/{1}
-* 请求方式:PUT
-* 请求参数:路径参数
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-##### 修改通知回调地址
-* 对于一些下行的接口,或者推送的接口,需要应用配置下行的地址。
-* 回调的地址支持到端口后的特定前缀。例如:http://www.baidu.com/callback, 推送的消息会发送到http://www.baidu.com/callback/push/xxx
-* 新创建的应用的通知回调地址为空。没有配置的情况下,平台不会推送消息。
-* 平台对于每个应用只支持推送一个通知回调地址。
-* 接口地址:/openapi/app/callback/{1}
-* 请求方式:PUT
-* 请求参数:JSON格式
-  body 体中参数
-```json
-{
-    "callbackAddress": "2021-01-01 00:00:00"
-}
-```
-* 响应参数:JSON格式
-  响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-##### 查询详情
-* 接口地址:/openapi/app/{1}
-* 请求方式:GET
-* 请求参数:路径参数
-* 响应参数:JSON格式
-* 响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": {
-        "id": 1,
-        "name": "车场应用",
-        "serviceType": "车场",
-        "remark": "车场应用",
-        "logo": "osskey",
-        "userName": "admin",
-        "phoneNumber": "13800138000",
-        "createTime": "2021-01-01 00:00:00",
-        "updateTime": "2021-01-01 00:00:00",
-        "createUser": "admin",
-        "updateUser": "admin",
-        "expirationTime " : "2021-01-01 00:00:00",
-        "status" : 1, // 0启用 1禁用
-    }
-}
-```
-
-##### 查询应用列表(分页)
-* 接口地址:/openapi/app/page
-* 请求方式:GET
-* 请求参数:分页参数
-
-
-
-| 参数名         | 类型 | 说明 | 是否必填 |
-|-------------| --- | --- | --- |
-| current     | int | 页码 | 是 |
-| size        | int | 每页条数 | 是 |
-| name        | string | 应用名称 | 否 |
-| serviceType | string | 服务行业 | 否 |
-| status      | int | 状态 | 否 |
-| phoneNumber | string | 手机号码 | 否 |
-
-* 响应参数:JSON格式
-* 响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": {
-        "total": 10,
-        "list": [
-            {
-                "id": 1,
-                "name": "车场应用",
-                "serviceType": "车场",
-                "remark": "车场应用",
-                "logo": "osskey",
-                "userName": "admin",
-                "phoneNumber": "13800138000",
-                "createTime": "2021-01-01 00:00:00",
-                "updateTime": "2021-01-01 00:00:00",
-                "createUser": "admin",
-                "updateUser": "admin",
-                "expirationTime " : "2021-01-01 00:00:00",
-                "status" : 1, // 0启用 1禁用
-            }
-        ]
-    }
-}
-```
-
-
-#### 开放平台接口管理
-开放平台数据接口管理模块负责对接车场、人行项目的接口,包括接口的注册、认证、授权、管理等。我们将配置两类接口,一个是上行接口,一个是下行接口。
-上行接口
-##### 新增接口
-开放平台对外提供的接口,包括车场、人行项目的接口。都是在这里添加。
-需要的参数有,接口名称,路径,请求方式,接口类型,版本,发布状态,接口展示文档,启用状态,访问限制次数。
-    
-    具体参数表格如下:
-    
-   | 字段名          | 参数名称   | 类型  | 说明                        | 是否必填 |
-   |--------------|--------|-----|---------------------------|------|
-    | name         | 接口名称   | 字符串 | 接口名称                      | 是    |
-    | path         | 路径     | 字符串 | 接口路径                      | 是    |
-    | method       | 请求方式   | 字符串 | 请求方式  POST PUT GET DELETE | 是    |
-    | type         | 接口类型   | int | 接口类型  0 上行 1 下行           | 是    |
-    | serviceType | 业务类型   | int | 1 车位 2 支付 3 月卡 4 车场 5 优惠券 | 是    |
-    | version      | 版本     | 字符串 | 版本号     v1  v2 ...        | 是    |
-    | status       | 发布状态   | int | 发布状态      0 未发出 1 已发布     | 是    |
-    | doc          | 接口展示文档 | 字符串 | 接口展示文档  markdown格式        | 否    |
-    | enable       | 启用状态   | int | 启用状态     0 启用 1 禁用        | 是    |
-    | limitCount   | 访问限制次数 | int | 每秒访问限制次数                  | 否    |
-
-* 接口地址:/openapi/interface/add
-* 请求方式:POST
-* 请求参数:JSON格式
-```json
-{
-    "name": "车场接口",
-    "path": "/api/v1/car/parking",
-    "method": "GET",
-    "type": 0,
-    "serviceType": 1,
-    "version": "v1",
-    "doc": "",
-    "limitCount": 100
-}
-```
-    
-* 响应参数:JSON格式
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": {
-        "id": 1,
-        "name": "车场接口",
-        "path": "/api/v1/car/parking",
-        "method": "GET",
-        "type": 0,
-        "serviceType": 1,
-        "version": "v1",
-        "status": 1,
-        "doc": "",
-        "enable": 1,
-        "limitCount": 100,
-        "createTime": "2021-01-01 00:00:00",
-        "updateTime": "2021-01-01 00:00:00",
-        "createUser": "admin",
-        "updateUser": "admin"
-    }
-}
-```
-
-##### 编辑接口
-* 对于已经发布的接口,需要修改接口信息。
-* 可以修改的参数有接口名称、路径、请求方式、接口类型、版本、接口展示文档、访问限制次数。参考新增的表格。
-* 修改的时候传入参数如果没有修改,则不传。参数为空的时候等于不修改。
-* 接口地址:/openapi/interface/edit/{1}
-* 请求方式:PUT
-* 请求参数:JSON格式
-```json
-{
-    "name": "车场接口",
-    "path": "/api/v1/car/parking",
-    "method": "GET",
-    "type": 0,
-    "serviceType": 1,
-    "version": "v1",
-    "doc": "",
-    "limitCount": 100
-}
-```
-
-* 响应参数:JSON格式
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": {
-        "id": 1,
-        "name": "车场接口",
-        "path": "/api/v1/car/parking",
-        "method": "GET",
-        "type": 0,
-        "serviceType": 1,
-        "version": "v1",
-        "status": 1,
-        "doc": "",
-        "enable": 1,
-        "limitCount": 100,
-        "createTime": "2021-01-01 00:00:00",
-        "updateTime": "2021-01-01 00:00:00",
-        "createUser": "admin",
-        "updateUser": "admin"
-    }
-}
-```
-
-##### 删除接口
-* 对于已经废弃的接口,需要删除接口。或者批量删除接口。
-* 接口地址:/openapi/interface
-* 请求方式:DELETE
-* 请求参数:
-ids 多个用逗号隔开
-* 响应参数:JSON格式
-* 响应示例:
-```json
-{
-    "code": 200,
-    "msg": "success",
-    "data": null
-}
-```
-
-##### 配置接口文档
-接口中需要配置给开放平台
-##### 发布接口
-##### 禁用接口
-##### 导入接口
-##### 导出接口
-##### 查询详情
-##### 查询接口列表(分页)
-
-#### 开放平台安全管理
-开放平台安全校验模块负责对接车场、人行项目的安全校验,包括接口的安全校验、数据加密、数据权限校验、数据流量监控等。
-##### token生成
-##### token校验
-##### 签名方式
-##### 签名校验
-##### 接口权限校验
-##### 接口流量监控
-
-
-### 数据库设计
-#### 应用管理表
-#### 应用项目关联表
-#### 接口管理表
-#### 应用接口授权关联表
-#### 安全管理redis数据结构设计
-### 数据接口列表

+ 108 - 0
访客mq/车行与人行访客相关mq统计.md

@@ -0,0 +1,108 @@
+## 下行-服务到本地
+
+
+| 序号 | 应用场景  | topic | tag                        |
+|----|-------|-------|----------------------------|
+| 1  | app信息同步 | fspark_onlineInfo_sync    | #parkId_appInfo_sync       |
+| 2  | 优惠券同步 | fspark_onlineInfo_sync    | ##parkId_couponInfo_sync   |
+| 3  | 月卡类型定价同步 | fspark_onlineInfo_sync    | ##parkId_cardType_sync     |
+| 4  | 月卡信息同步 | fspark_onlineInfo_sync    | #parkId_cardRenew_sync     |
+| 5  | 线上支付同步 | fspark_onlineInfo_sync    | #parkId_onlinePayInfo_sync |
+| 6  | 停车场黑名单同步 | fspark_onlineInfo_sync    | #parkId_blackcar_sync                       |
+| 7  | 下发停车场信息 | fspark_onlineInfo_sync    | #parkId_parkinfo_sync                       |
+| 8  | 下发停车场计费规则 | fspark_onlineInfo_sync    | #parkId_parkjf_sync                       |
+| 9  | 下发车位预定信息 | fspark_onlineInfo_sync    | #parkId_ydplace_sync                       |
+| 10 | 下发确认车位预定信息 | fspark_onlineInfo_sync    | #parkId_ydplaceok_sync_sync                       |
+| 11 | 下发远程开车位锁 | fspark_onlineInfo_sync    | #parkId_openplacelock_sync                       |
+| 12 | 请求C#线下计费 | fspark_onlineInfo_sync    | #parkId_localjf_sync                       |
+| 13 | 下发无牌车入场信息    | fspark_onlineInfo_sync    | # parkId_nocarnoupincar_sync                       |
+| 14 | 下发无牌车出场信息  | fspark_onlineInfo_sync    | #parkId_nocarnoupoutcar_sync                       |
+| 15 | 下发在场记录修正或删除信息  | fspark_onlineInfo_sync    | #parkId_modifycar_sync                       |
+| 16 | 下发预约记录  | fspark_onlineInfo_sync    | #parkId_downreserver_sync                       |
+| 17 | 下发电子发票  | fspark_onlineInfo_sync    | #parkId_invoice_sync                       |
+| 18 | 下发出入场车牌  | fspark_onlineInfo_sync    | #parkId_out_licensenumber_sync                       |
+| 19 | 下发入场补录  | fspark_onlineInfo_sync    | #parkId_add_parkin_sync                       |
+| 20 | 云端借道设置信息  | fspark_onlineInfo_sync    | #parkId_through_sync                       |
+| 21 | 优惠券设置同步  | fspark_onlineInfo_sync    | #parkId_couponConfig_sync                       |
+| 22 | 云坐席下发配置信息  | fspark_onlineInfo_sync    | #parkid_sendcloudconfig_sync                       |
+| 23 | 停车管家手动入场信息下发  | fspark_onlineInfo_sync    | #parkid_parkinsend_sync                       |
+| 24 | 停车管家手动出场信息下发  | fspark_onlineInfo_sync    | #parkid_parkoutsend_sync                       |
+| 25 | 云端下发长租临停套餐对应进出模式  | fspark_onlineInfo_sync    | #parkId_inoutModel_sync                       |
+| 26 | 云端下发长租临停套餐对应开闸模式,车辆类型入场权限  | fspark_onlineInfo_sync    | #parkId_carPower_sync                       |
+| 27 | 云端下发固定临停  | fspark_onlineInfo_sync    | #parkId_fixedcharge_sync                       |
+| 28 | 批量注销月卡下发  | fspark_onlineInfo_sync    | #parkId_cancelCardList_sync                       |
+| 29 | 云端下发手动出入场开闸  | fspark_onlineInfo_sync    | #parkId_handler_parkinout_sync                       |
+| 30 | 下发车场预约配置  | fspark_onlineInfo_sync    | #parkId_reserver_sync                       |
+| 31 | 下发车位配置  | fspark_onlineInfo_sync    | #parkId_downplaceconfig_sync                       |
+| 32 | 云端下发跟车未缴费操作  | fspark_onlineInfo_sync    | #parkId_car_following_operate_sync                       |
+| 33 | 云端下发事件原因配置  | fspark_onlineInfo_sync    | #parkId_event_reason_config_sync                       |
+| 34 | 云端下发云坐席传图片指令  | fspark_onlineInfo_sync    | #parkId_event_upload_img_sync                       |
+| 35 | 抬杆/落杆指令下发  | fspark_onlineInfo_sync    | #parkid_liftdownbarrier_sync                       |
+| 36 | 屏幕显示内容下发  | fspark_onlineInfo_sync    | #parkid_screenDisplay_sync                       |
+| 37 | 酒店登记下发  | fspark_onlineInfo_sync    | #parkid_hotelregister_sync                       |
+| 38 | 取消出入场下发  | fspark_onlineInfo_sync    | #parkid_cancelparkinout_sync                       |
+| 39 | 下发车牌   | fspark_onlineInfo_sync    | #parkId_sendLicenseNumber_sync                       |
+| 40 | 请求C#线下固定计费   | fspark_onlineInfo_sync    | #parkId_flatcharge_sync                       |
+| 41 | 请求线下重推场内记录   | fspark_onlineInfo_sync    | #parkId_upparkin_sync                       |
+| 42 | 下发车牌和救诊号   | fspark_onlineInfo_sync    | #parkId_sendNumber_sync                       |
+| 43 | 储值账户下发MQ   | fspark_onlineInfo_sync    | #mqcode_depositinfo_sync                       |
+| 44 | 储值账户退款下发MQ   | fspark_onlineInfo_sync    | #mqcode_depositrefund_sync                       |
+| 45 | 储值账户充值记录下发MQ   | fspark_onlineInfo_sync    | #mqcode_renewrec_sync                       |
+| 46 | 长租车-退款记录下发MQ   | fspark_onlineInfo_sync    | #mqcode_refundrec_sync                       |
+| 47 | 下发访客凭证   | fspark_onlineInfo_sync    | #projectid_visitorvouther_sync                       |
+| 48 | 下发访客配置   | fspark_onlineInfo_sync    | #projectid_visitorconfigure_sync                       |
+| 49 | 访客策略配置下发   | fspark_onlineInfo_sync    | #projectid_visitorconfig_sync                       |
+| 50 | 访客登记下发   | fspark_onlineInfo_sync    | #projectid_visitorregister_sync                       |
+
+
+## 上行-本地到服务端
+
+| 序号 | 应用场景  | topic | tag                        |
+|----|-------|-------|----------------------------|
+| 1  | 获得停车场信息 | fspark_localInfo_sync    | #parkId_getparkinfo_sync   |
+| 2  | 获得停车场计费模板信息   | fspark_localInfo_sync    | #parkId_getparkjf_sync     |
+| 3  | 上传软件版本   | fspark_localInfo_sync    | #parkId_getparkjf_sync_ACK |
+| 4  | 上传入场信息   | fspark_localInfo_sync    | # parkId_upincar_sync                       |
+| 5  | 计费请求   | fspark_localInfo_sync    | #parkId_getjfinfo_sync                       |
+| 6  | 上传出场信息   | fspark_localInfo_sync    | #parkId_upoutcar_sync                       |
+| 7  | 通道信息上传   | fspark_localInfo_sync    | #parkId_upchannel_sync                       |
+| 8  | 上传楼层信息   | fspark_localInfo_sync    | #parkId_upfloors_sync                       |
+| 9  | 上传分区信息   | fspark_localInfo_sync    | #parkId_upareas_sync                       |
+| 10 | 运维事件上传   | fspark_localInfo_sync    | #parkId_upoplog_sync                       |
+| 11 | 设备信息上传   | fspark_localInfo_sync    | #parkId_updevinfo_sync                       |
+| 12 | 上传被扫付款信息   | fspark_localInfo_sync    | #parkId_onlinePayBeSwept_sync                      |
+| 13 | 上传本地支付信息   | fspark_localInfo_sync    | #parkId_uploadPayinfo_sync                       |
+| 14 | 获取节假日信息   | fspark_localInfo_sync    | #parkId_getholidayinfo_sync                       |
+| 15 | 上传车辆压地感信息   | fspark_localInfo_sync    | #parkId_upcarno_sync                       |
+| 16 | 长租车月卡操作信息上传   | fspark_localInfo_sync    | #parkId_upcardRenew_sync                       |
+| 17 | 月卡类型定价上传   | fspark_localInfo_sync    | #parkId_upcardType_sync                       |
+| 18 | 套餐对应开闸模式上传   | fspark_localInfo_sync    | #parkId_upOpenModel_sync                       |
+| 19 | 车道对应车型入场权限上传   | fspark_localInfo_sync    | #parkId_upCarPower_sync                       |
+| 20 | 上传停车场计费规则   | fspark_localInfo_sync    | #parkId_chargemodel_sync                       |
+| 21 | 上传节假日信息   | fspark_localInfo_sync    | #parkId_upholiday_sync                       |
+| 22 | 上传换班信息   | fspark_localInfo_sync    | #parkId_shift_sync                       |
+| 23 | 上传岗亭人员相关信息   | fspark_localInfo_sync    | #parkId_upboxpersonnelinfo_sync                      |
+| 24 | 上传入位/离位时间   | fspark_localInfo_sync    | #parkId_upplaceinoutcar_sync                       |
+| 25 | 上传车道开闸信息   | fspark_localInfo_sync    | #parkId_upOpenModel_sync                       |
+| 26 | 上传车道通行信息   | fspark_localInfo_sync    | #parkId_upCarPower_sync                       |
+| 27 | 上传车辆进出模式和满位入场权限   | fspark_localInfo_sync    | #parkId_upInoutModel_sync                       |
+| 28 | 上传借道设置   | fspark_localInfo_sync    | #parkId_upThrough_sync                       |
+| 29 | 本地固定临停数据增删改上传   | fspark_localInfo_sync    | #parkId_fixedchargeup_sync                       |
+| 30 | 线下批量上传月卡信息   | fspark_localInfo_sync    | #parkId_batchcardinfo_sync                       |
+| 31 | 月卡信息同步   | fspark_localInfo_sync    | #parkId_cardRenew_sync                       |
+| 32 | 上传跟车未缴费   | fspark_localInfo_sync    | #parkId_no_pay_car_following_sync                       |
+| 33 | 上传事件原因配置   | fspark_localInfo_sync    | #parkId_event_reason_config_sync                       |
+| 34 | 上传停车场信息   | fspark_localInfo_sync    | #parkId_upparkinfo_sync                       |
+| 35 | 储值账户-信息上传MQ   | fspark_localInfo_sync    | #mqcode_depositinfo_sync                       |
+| 36 | 储值账户退款上传MQ   | fspark_localInfo_sync    | #mqcode_depositrefund_sync                       |
+| 37 | 储值账户充值记录上传MQ   | fspark_localInfo_sync    | #mqcode_renewrec_sync                       |
+| 38 | 长租车-退款记录上传MQ   | fspark_localInfo_sync    | #mqcode_refundrec_sync                       |
+| 39 | 储值账户-消费明细记录上传HTTP   | fspark_localInfo_sync    | /uploadDepositConsumeRec_sync (POST)                       |
+| 40 | 上传访客通行记录   | fspark_localInfo_sync    | #projectid_visitoraccessrecord_sync                       |
+| 41 | 访客策略配置上传   | fspark_localInfo_sync    | #projectid_visitorconfig_sync                       |
+| 42 | 打印访客凭证条配置   | fspark_localInfo_sync    | #projectid_visitorprintconfig_sync                       |
+| 43 | 访客登记上传   | fspark_localInfo_sync    | #projectid_visitorregister_sync                       |
+| 44 | 访客黑名单   | fspark_localInfo_sync    | #projectid_visitorblacklist_sync                       |
+| 45 | 访客登记地点 | fspark_localInfo_sync    | #projectid_visitorplace_sync                       |
+| 46 | xxx | fspark_localInfo_sync    | xxxx                       |
+| 47 | xxx | fspark_localInfo_sync    | xxxx                       |

+ 147 - 0
访客mq/车行跟人行访客mq统计.html

@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>车行与人行访客相关mq统计</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+        }
+        table {
+            width: 100%;
+            border-collapse: collapse;
+            margin: 20px 0;
+        }
+        table, th, td {
+            border: 1px solid #ddd;
+        }
+        th, td {
+            padding: 8px;
+            text-align: left;
+        }
+        th {
+            background-color: #f2f2f2;
+        }
+        h2 {
+            color: #333;
+        }
+    </style>
+</head>
+<body>
+<h2>下行-服务到本地</h2>
+<table>
+    <tr>
+        <th>序号</th>
+        <th>应用场景</th>
+        <th>topic</th>
+        <th>tag</th>
+    </tr>
+    <tr><td>1</td><td>app信息同步</td><td>fspark_onlineInfo_sync</td><td>#parkId_appInfo_sync</td></tr>
+    <tr><td>2</td><td>优惠券同步</td><td>fspark_onlineInfo_sync</td><td>##parkId_couponInfo_sync</td></tr>
+    <tr><td>3</td><td>月卡类型定价同步</td><td>fspark_onlineInfo_sync</td><td>##parkId_cardType_sync</td></tr>
+    <tr><td>4</td><td>月卡信息同步</td><td>fspark_onlineInfo_sync</td><td>#parkId_cardRenew_sync</td></tr>
+    <tr><td>5</td><td>线上支付同步</td><td>fspark_onlineInfo_sync</td><td>#parkId_onlinePayInfo_sync</td></tr>
+    <tr><td>6</td><td>停车场黑名单同步</td><td>fspark_onlineInfo_sync</td><td>#parkId_blackcar_sync</td></tr>
+    <tr><td>7</td><td>下发停车场信息</td><td>fspark_onlineInfo_sync</td><td>#parkId_parkinfo_sync</td></tr>
+    <tr><td>8</td><td>下发停车场计费规则</td><td>fspark_onlineInfo_sync</td><td>#parkId_parkjf_sync</td></tr>
+    <tr><td>9</td><td>下发车位预定信息</td><td>fspark_onlineInfo_sync</td><td>#parkId_ydplace_sync</td></tr>
+    <tr><td>10</td><td>下发确认车位预定信息</td><td>fspark_onlineInfo_sync</td><td>#parkId_ydplaceok_sync_sync</td></tr>
+    <tr><td>11</td><td>下发远程开车位锁</td><td>fspark_onlineInfo_sync</td><td>#parkId_openplacelock_sync</td></tr>
+    <tr><td>12</td><td>请求C#线下计费</td><td>fspark_onlineInfo_sync</td><td>#parkId_localjf_sync</td></tr>
+    <tr><td>13</td><td>下发无牌车入场信息</td><td>fspark_onlineInfo_sync</td><td>#parkId_nocarnoupincar_sync</td></tr>
+    <tr><td>14</td><td>下发无牌车出场信息</td><td>fspark_onlineInfo_sync</td><td>#parkId_nocarnoupoutcar_sync</td></tr>
+    <tr><td>15</td><td>下发在场记录修正或删除信息</td><td>fspark_onlineInfo_sync</td><td>#parkId_modifycar_sync</td></tr>
+    <tr><td>16</td><td>下发预约记录</td><td>fspark_onlineInfo_sync</td><td>#parkId_downreserver_sync</td></tr>
+    <tr><td>17</td><td>下发电子发票</td><td>fspark_onlineInfo_sync</td><td>#parkId_invoice_sync</td></tr>
+    <tr><td>18</td><td>下发出入场车牌</td><td>fspark_onlineInfo_sync</td><td>#parkId_out_licensenumber_sync</td></tr>
+    <tr><td>19</td><td>下发入场补录</td><td>fspark_onlineInfo_sync</td><td>#parkId_add_parkin_sync</td></tr>
+    <tr><td>20</td><td>云端借道设置信息</td><td>fspark_onlineInfo_sync</td><td>#parkId_through_sync</td></tr>
+    <tr><td>21</td><td>优惠券设置同步</td><td>fspark_onlineInfo_sync</td><td>#parkId_couponConfig_sync</td></tr>
+    <tr><td>22</td><td>云坐席下发配置信息</td><td>fspark_onlineInfo_sync</td><td>#parkid_sendcloudconfig_sync</td></tr>
+    <tr><td>23</td><td>停车管家手动入场信息下发</td><td>fspark_onlineInfo_sync</td><td>#parkid_parkinsend_sync</td></tr>
+    <tr><td>24</td><td>停车管家手动出场信息下发</td><td>fspark_onlineInfo_sync</td><td>#parkid_parkoutsend_sync</td></tr>
+    <tr><td>25</td><td>云端下发长租临停套餐对应进出模式</td><td>fspark_onlineInfo_sync</td><td>#parkId_inoutModel_sync</td></tr>
+    <tr><td>26</td><td>云端下发长租临停套餐对应开闸模式,车辆类型入场权限</td><td>fspark_onlineInfo_sync</td><td>#parkId_carPower_sync</td></tr>
+    <tr><td>27</td><td>云端下发固定临停</td><td>fspark_onlineInfo_sync</td><td>#parkId_fixedcharge_sync</td></tr>
+    <tr><td>28</td><td>批量注销月卡下发</td><td>fspark_onlineInfo_sync</td><td>#parkId_cancelCardList_sync</td></tr>
+    <tr><td>29</td><td>云端下发手动出入场开闸</td><td>fspark_onlineInfo_sync</td><td>#parkId_handler_parkinout_sync</td></tr>
+    <tr><td>30</td><td>下发车场预约配置</td><td>fspark_onlineInfo_sync</td><td>#parkId_reserver_sync</td></tr>
+    <tr><td>31</td><td>下发车位配置</td><td>fspark_onlineInfo_sync</td><td>#parkId_downplaceconfig_sync</td></tr>
+    <tr><td>32</td><td>云端下发跟车未缴费操作</td><td>fspark_onlineInfo_sync</td><td>#parkId_car_following_operate_sync</td></tr>
+    <tr><td>33</td><td>云端下发事件原因配置</td><td>fspark_onlineInfo_sync</td><td>#parkId_event_reason_config_sync</td></tr>
+    <tr><td>34</td><td>云端下发云坐席传图片指令</td><td>fspark_onlineInfo_sync</td><td>#parkId_event_upload_img_sync</td></tr>
+    <tr><td>35</td><td>抬杆/落杆指令下发</td><td>fspark_onlineInfo_sync</td><td>#parkid_liftdownbarrier_sync</td></tr>
+    <tr><td>36</td><td>屏幕显示内容下发</td><td>fspark_onlineInfo_sync</td><td>#parkid_screenDisplay_sync</td></tr>
+    <tr><td>37</td><td>酒店登记下发</td><td>fspark_onlineInfo_sync</td><td>#parkid_hotelregister_sync</td></tr>
+    <tr><td>38</td><td>取消出入场下发</td><td>fspark_onlineInfo_sync</td><td>#parkid_cancelparkinout_sync</td></tr>
+    <tr><td>39</td><td>下发车牌</td><td>fspark_onlineInfo_sync</td><td>#parkId_sendLicenseNumber_sync</td></tr>
+    <tr><td>40</td><td>请求C#线下固定计费</td><td>fspark_onlineInfo_sync</td><td>#parkId_flatcharge_sync</td></tr>
+    <tr><td>41</td><td>请求线下重推场内记录</td><td>fspark_onlineInfo_sync</td><td>#parkId_upparkin_sync</td></tr>
+    <tr><td>42</td><td>下发车牌和救诊号</td><td>fspark_onlineInfo_sync</td><td>#parkId_sendNumber_sync</td></tr>
+    <tr><td>43</td><td>储值账户下发MQ</td><td>fspark_onlineInfo_sync</td><td>#mqcode_depositinfo_sync</td></tr>
+    <tr><td>44</td><td>储值账户退款下发MQ</td><td>fspark_onlineInfo_sync</td><td>#mqcode_depositrefund_sync</td></tr>
+    <tr><td>45</td><td>储值账户充值记录下发MQ</td><td>fspark_onlineInfo_sync</td><td>#mqcode_renewrec_sync</td></tr>
+    <tr><td>46</td><td>长租车-退款记录下发MQ</td><td>fspark_onlineInfo_sync</td><td>#mqcode_refundrec_sync</td></tr>
+    <tr><td>47</td><td>下发访客凭证</td><td>fspark_onlineInfo_sync</td><td>#projectid_visitorvouther_sync</td></tr>
+    <tr><td>48</td><td>下发访客配置</td><td>fspark_onlineInfo_sync</td><td>#projectid_visitorconfigure_sync</td></tr>
+    <tr><td>49</td><td>访客策略配置下发</td><td>fspark_onlineInfo_sync</td><td>#projectid_visitorconfig_sync</td></tr>
+    <tr><td>50</td><td>访客登记下发</td><td>fspark_onlineInfo_sync</td><td>#projectid_visitorregister_sync</td></tr>
+</table>
+
+<h2>上行-本地到服务端</h2>
+<table>
+    <tr>
+        <th>序号</th>
+        <th>应用场景</th>
+        <th>topic</th>
+        <th>tag</th>
+    </tr>
+    <tr><td>1</td><td>获得停车场信息</td><td>fspark_localInfo_sync</td><td>#parkId_getparkinfo_sync</td></tr>
+    <tr><td>2</td><td>获得停车场计费模板信息</td><td>fspark_localInfo_sync</td><td>#parkId_getparkjf_sync</td></tr>
+    <tr><td>3</td><td>上传软件版本</td><td>fspark_localInfo_sync</td><td>#parkId_getparkjf_sync_ACK</td></tr>
+    <tr><td>4</td><td>上传入场信息</td><td>fspark_localInfo_sync</td><td>#parkId_upincar_sync</td></tr>
+    <tr><td>5</td><td>计费请求</td><td>fspark_localInfo_sync</td><td>#parkId_getjfinfo_sync</td></tr>
+    <tr><td>6</td><td>上传出场信息</td><td>fspark_localInfo_sync</td><td>#parkId_upoutcar_sync</td></tr>
+    <tr><td>7</td><td>通道信息上传</td><td>fspark_localInfo_sync</td><td>#parkId_upchannel_sync</td></tr>
+    <tr><td>8</td><td>上传楼层信息</td><td>fspark_localInfo_sync</td><td>#parkId_upfloors_sync</td></tr>
+    <tr><td>9</td><td>上传分区信息</td><td>fspark_localInfo_sync</td><td>#parkId_upareas_sync</td></tr>
+    <tr><td>10</td><td>运维事件上传</td><td>fspark_localInfo_sync</td><td>#parkId_upoplog_sync</td></tr>
+    <tr><td>11</td><td>设备信息上传</td><td>fspark_localInfo_sync</td><td>#parkId_updevinfo_sync</td></tr>
+    <tr><td>12</td><td>上传被扫付款信息</td><td>fspark_localInfo_sync</td><td>#parkId_onlinePayBeSwept_sync</td></tr>
+    <tr><td>13</td><td>上传本地支付信息</td><td>fspark_localInfo_sync</td><td>#parkId_uploadPayinfo_sync</td></tr>
+    <tr><td>14</td><td>获取节假日信息</td><td>fspark_localInfo_sync</td><td>#parkId_getholidayinfo_sync</td></tr>
+    <tr><td>15</td><td>上传车辆压地感信息</td><td>fspark_localInfo_sync</td><td>#parkId_upcarno_sync</td></tr>
+    <tr><td>16</td><td>长租车月卡操作信息上传</td><td>fspark_localInfo_sync</td><td>#parkId_upcardRenew_sync</td></tr>
+    <tr><td>17</td><td>月卡类型定价上传</td><td>fspark_localInfo_sync</td><td>#parkId_upcardType_sync</td></tr>
+    <tr><td>18</td><td>套餐对应开闸模式上传</td><td>fspark_localInfo_sync</td><td>#parkId_upOpenModel_sync</td></tr>
+    <tr><td>19</td><td>车道对应车型入场权限上传</td><td>fspark_localInfo_sync</td><td>#parkId_upCarPower_sync</td></tr>
+    <tr><td>20</td><td>上传停车场计费规则</td><td>fspark_localInfo_sync</td><td>#parkId_chargemodel_sync</td></tr>
+    <tr><td>21</td><td>上传节假日信息</td><td>fspark_localInfo_sync</td><td>#parkId_upholiday_sync</td></tr>
+    <tr><td>22</td><td>上传换班信息</td><td>fspark_localInfo_sync</td><td>#parkId_shift_sync</td></tr>
+    <tr><td>23</td><td>上传岗亭人员相关信息</td><td>fspark_localInfo_sync</td><td>#parkId_upboxpersonnelinfo_sync</td></tr>
+    <tr><td>24</td><td>上传入位/离位时间</td><td>fspark_localInfo_sync</td><td>#parkId_upplaceinoutcar_sync</td></tr>
+    <tr><td>25</td><td>上传车道开闸信息</td><td>fspark_localInfo_sync</td><td>#parkId_upOpenModel_sync</td></tr>
+    <tr><td>26</td><td>上传车道通行信息</td><td>fspark_localInfo_sync</td><td>#parkId_upCarPower_sync</td></tr>
+    <tr><td>27</td><td>上传车辆进出模式和满位入场权限</td><td>fspark_localInfo_sync</td><td>#parkId_upInoutModel_sync</td></tr>
+    <tr><td>28</td><td>上传借道设置</td><td>fspark_localInfo_sync</td><td>#parkId_upThrough_sync</td></tr>
+    <tr><td>29</td><td>本地固定临停数据增删改上传</td><td>fspark_localInfo_sync</td><td>#parkId_fixedchargeup_sync</td></tr>
+    <tr><td>30</td><td>线下批量上传月卡信息</td><td>fspark_localInfo_sync</td><td>#parkId_batchcardinfo_sync</td></tr>
+    <tr><td>31</td><td>月卡信息同步</td><td>fspark_localInfo_sync</td><td>#parkId_cardRenew_sync</td></tr>
+    <tr><td>32</td><td>上传跟车未缴费</td><td>fspark_localInfo_sync</td><td>#parkId_no_pay_car_following_sync</td></tr>
+    <tr><td>33</td><td>上传事件原因配置</td><td>fspark_localInfo_sync</td><td>#parkId_event_reason_config_sync</td></tr>
+    <tr><td>34</td><td>上传停车场信息</td><td>fspark_localInfo_sync</td><td>#parkId_upparkinfo_sync</td></tr>
+    <tr><td>35</td><td>储值账户-信息上传MQ</td><td>fspark_localInfo_sync</td><td>#mqcode_depositinfo_sync</td></tr>
+    <tr><td>36</td><td>储值账户退款上传MQ	</td><td>fspark_localInfo_sync</td><td>#mqcode_depositrefund_sync</td></tr>
+    <tr><td>37</td><td>储值账户充值记录上传MQ</td><td>fspark_localInfo_sync</td><td>#mqcode_renewrec_sync</td></tr>
+    <tr><td>38</td><td>长租车-退款记录上传MQ</td><td>fspark_localInfo_sync</td><td>#mqcode_refundrec_sync</td></tr>
+    <tr><td>39</td><td>储值账户-消费明细记录上传HTTP</td><td>fspark_localInfo_sync</td><td>#/uploadDepositConsumeRec_sync (POST)</td></tr>
+    <tr><td>40</td><td>上传访客通行记录</td><td>fspark_localInfo_sync</td><td>#projectid_visitoraccessrecord_sync</td></tr>
+    <tr><td>41</td><td>访客策略配置上传</td><td>fspark_localInfo_sync</td><td>#projectid_visitorconfig_sync</td></tr>
+    <tr><td>42</td><td>打印访客凭证条配置</td><td>fspark_localInfo_sync</td><td>#projectid_visitorprintconfig_sync</td></tr>
+    <tr><td>43</td><td>访客登记上传</td><td>fspark_localInfo_sync</td><td>#projectid_visitorregister_sync</td></tr>
+    <tr><td>44</td><td>访客黑名单</td><td>fspark_localInfo_sync</td><td>#projectid_visitorblacklist_sync</td></tr>
+    <tr><td>45</td><td>访客登记地点	</td><td>fspark_localInfo_sync</td><td>#projectid_visitorplace_sync</td></tr>
+</table>
+</body>
+</html>

+ 294 - 0
访客mq/车行跟人行访客mq统计1.html

@@ -0,0 +1,294 @@
+<h1>访客需求整理</h1>
+
+<h2>车行</h2>
+
+<h3>v2计划</h3>
+
+<h4>概述</h4>
+
+<ul>
+    <li>相比V1的设计,V2同样设置了车场,车位预约。并且做了一些优化。</li>
+    <li>优化一:添加车场以天,周为单位的清场机制扩展。车场设置了清场机制,则在清场周期开始,总预约车位数刷新为设置的最大值。</li>
+    <li>优化二:对于一个预约周期内,相同的车辆在不同时间内,预约相同的车场(车场级预约),区域(车位级预约),则不锁定多个车位,只锁定一个车位。当预约靠前的记录使出的时候也不释放车位数。可以限制相同的车辆预约太多锁定了太多车位的问题。</li>
+    <li>优化三:对于相同车辆预约相同的车场(车场级预约),区域(车位级预约),如果前一次预约的还没有使出,但是超过了后一次预约的最后驶入时间,则自动作废后一次预约记录,多次预约以此类推。</li>
+    <li>优化四:对于爽约的车辆加入惩罚机制,在某个周期内,多次爽约,限制其在一定时间内不能预约停车。
+        <h4>详细设计</h4></li>
+</ul>
+
+<h5>车场预约管理</h5>
+
+<ul>
+    <li>车场预约信息包含
+        <ul>
+            <li>预约类型:车场预约 车位预约</li>
+            <li>预约车位数</li>
+            <li>可提前预约小时数</li>
+            <li>可预约停车时长</li>
+            <li>预约可提前入场时间</li>
+            <li>预约可延迟入场时间</li>
+            <li>预约车收费模版</li>
+            <li>是否开启预约</li>
+            <li>预约周期  自然天  自然周   全部时间段</li>
+            <li>违约判定周期 单位天</li>
+            <li>违约判定次数</li>
+            <li>违约限制天数</li>
+        </ul></li>
+    <li>管理员可以通过页面设置预约信息。</li>
+    <li><p>平台将预约信息下发给E8。</p>
+
+        <h5>区域预约管理</h5></li>
+    <li><p>区域预约信息包含</p>
+
+        <ul>
+            <li>区域名称</li>
+            <li>区域车位数</li>
+            <li>所属车场id</li>
+            <li>所属车位起始编号</li>
+            <li>所属车位结束编号</li>
+            <li>车位编号列表   跟车位起始结束编号互斥。有限选择车位起始结束编号。</li>
+            <li>区域预约收费模版  为空则取车场预约收费模版</li>
+        </ul></li>
+    <li>管理员可以通过页面设置区域预约信息。</li>
+    <li>平台将区域预约信息下发给E8。</li>
+    <li>ps:所属车位应该在车位表中去关联区域。不在这里展示出来</li>
+    <li>ps:车场的那几个预约参数,可以考虑在区域都有一份,细分每个区域,区域配置不存在,则使用车场配置。</li>
+</ul>
+
+<h5>车辆预约</h5>
+
+<ul>
+    <li>用户可以通过小程序来预约车位。</li>
+    <li>需要选择的信息包含
+        <ul>
+            <li>预约的车场</li>
+            <li>预约的区域 可选</li>
+            <li>预约的车位 可选</li>
+            <li>预约入场时间 (小程序页面应该提醒最早,最晚入场时间)</li>
+            <li>预约出场时间  (对应需要多次预约有用。相同时间段内)</li>
+            <li>预约车牌号</li>
+        </ul></li>
+    <li>平台收到预约信息后的处理
+        <ul>
+            <li>判断车场是否开启预约。没有开启预约则返回预约失败,错误信息:该车次不支持预约停车。</li>
+            <li>判断预约时间是否在车场预约周期内。不在则返回预约失败,错误信息:预约时间不在车场预约周期内。</li>
+            <li>判断预约时间是否在车场可提前预约小时数内。不在则返回预约失败,错误信息:预约时间不在车场可提前预约小时数内。</li>
+            <li>判断预约时间是否在车场可预约停车时长内。不在则返回预约失败,错误信息:预约时间不在车场可预约停车时长内。</li>
+            <li>判断是否已经存在预约记录,预约的周期包含当前的预约入场时间。</li>
+            <li>判断当前车辆是否在预约限制名单中,如果在则返回预约失败,错误信息:该车辆已被限制预约,${yyyy-HH-dd}后才可以预约。</li>
+            <li>如果是车场级预约:</li>
+            <li>判断当前车辆在当前车场是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功。不用操作车位数锁定。</li>
+            <li>如果当前预约周期没有存在预约记录。判断当前车场可预约车位数是否大于0。</li>
+            <li>如果可预约车位数大于0,则锁定车位。预约成功。</li>
+            <li>否则返回预约失败,错误信息:该车场已无可用停车位。</li>
+            <li>如果是车位级预约(区域):</li>
+            <li>判断当前车辆在当前车场当前区域是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功,并且指定的车位跟之前的保持一致。不用操作车位数锁定。</li>
+            <li>判断当前区域的可预约车位数是否大于0。</li>
+            <li>如果区域可预约车位数大于0,锁定车位。预约成功。</li>
+            <li>否则返回预约失败,错误信息:该车场已无可用停车位。</li>
+            <li>如果是车位级预约(车位):</li>
+            <li>不支持多次预约不同的车位。提醒已经在当前车场存在其他预约记录,并且预约了其他车位。为了方便车位管理,只支持再预约这个车位。</li>
+            <li>对于上面的限制,可能有点不太合理,可以限制限制最多预约车位数来限制。</li>
+            <li>其他的同车位级预约(区域)。</li>
+        </ul></li>
+    <li><p>预约成功后,将预约记录下发给E8。</p>
+
+        <h5>取消预约</h5></li>
+    <li><p>用户可以通过小程序来取消预约。</p></li>
+    <li>平台判断预约的记录是否存在。不存在则返回取消失败,错误信息:该预约记录不存在。</li>
+    <li>判断取消的预约记录是否已经驶入,已经驶入则返回取消失败,错误信息:该预约记录已驶入。</li>
+    <li>判断预约的记录是否已经过最后驶入时间,如果已经超过则返回取消失败,错误信息:该预约记录已超时。</li>
+    <li>取消预约成功,释放车位,更新预约记录。</li>
+    <li>如果当前车场当前周期存在多条预约记录,则不需要释放车位。</li>
+    <li>如果当前车场当前周期存在多条预约记录,并且是车位级预约(非区域),则不需要释放车位(需要根据车位预约的方式做调整)。</li>
+    <li><p>下发取消预约记录给E8。</p>
+
+        <h5>修改预约</h5></li>
+    <li><p>用户可以通过小程序来修改预约。</p></li>
+    <li>平台判断预约的记录是否存在。不存在则返回修改失败,错误信息:该预约记录不存在。</li>
+    <li>判断修改的预约记录是否已经驶入,已经驶入则返回修改失败,错误信息:该预约记录已驶入。</li>
+    <li>判断修改的预约记录是否已经过最后驶入时间,如果已经超过则返回修改失败,错误信息:该预约记录已超时。</li>
+    <li>如果修改为其他的预约周期,则不支持修改,需要取消预约,重新预约。</li>
+    <li>如果修改驶入时间,驶出时间周期内存在当前车辆已经预约的记录,则不支持修改。错误信息:该时间段内已有预约记录。</li>
+    <li>如果修改车牌,同样需要判断修改后的车牌是否存在时间交叉的停车记录。如果存在则不支持修改,错误信息:该车牌已存在预约记录。</li>
+    <li>不支持修改其他的车场。</li>
+    <li>修改区域,需要判断修改后的区域是否在车场中。</li>
+    <li>修改区域需要判断修改后的区域是否存在预约记录。存在的预约记录并且存在时间冲突,则不支持修改。错误信息:该区域已存在预约记录。</li>
+    <li><p>修改区域后需要判断区域的车位数,如果车位数不够,则不支持修改。错误信息:该区域已无可用停车位。</p>
+
+        <h5>预约记录管理</h5></li>
+    <li><p>平台需要提供预约记录管理接口,包括预约记录列表,查询预约记录详情。</p></li>
+    <li><p>小程序可以通过接口查询当前用户的预约记录列表,预约详情。</p>
+
+        <h5>车辆驶入</h5></li>
+    <li><p>车辆驶入,E8需要判断是否在当前时间段内存在预约记录。</p></li>
+    <li>不存在预约记录,则不予开闸。</li>
+    <li>存在预约记录,则判断是否已经驶入。已经驶入,给于开闸,记录多次驶入异常信息。</li>
+    <li>预约记录已经驶出,则不予开闸。</li>
+    <li>开闸后,E8将车辆驶入消息上传给平台。</li>
+    <li><p>平台更新预约驶入时间。(不确定这里应该跟E8怎么做这个同步关系。)</p>
+
+        <h5>车辆驶出</h5></li>
+    <li><p>E8上传车辆驶出记录。</p></li>
+    <li>平台收到记录后,更新预约驶出时间。</li>
+    <li>车场级预约:
+        <ul>
+            <li>判断当前预约周期内是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。</li>
+        </ul></li>
+    <li>车位级预约(区域):
+        <ul>
+            <li>判断当前预约周期内当前区域是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。</li>
+        </ul></li>
+    <li><p>车位级预约(车位):</p>
+
+        <ul>
+            <li>判断当前预约周期内当前车位是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。
+                <h5>爽约检查任务</h5></li>
+        </ul></li>
+    <li><p>需要确定一件事情,爽约限制的是车,还是人。</p></li>
+    <li>平台需要提供爽约检查任务。</li>
+    <li>对于已经过了最晚预约驶入时间的车辆,修改状态为爽约。</li>
+    <li>平台需要提供爽约列表,查询爽约详情。</li>
+    <li>定时任务检测出预约记录设置的爽约限制天数内爽约次数超过爽约次数限制的人。</li>
+    <li>将达到爽约次数限制的人,假如到限制列表中去。</li>
+    <li><p>对于在爽约限制列表中的人:</p>
+
+        <ul>
+            <li>限制其预约</li>
+            <li>预约的时候判断爽约限制是否已经到期,到期则移除。</li>
+            <li>同时添加定时任务,将检测爽约到期的用户,移除爽约限制列表。
+                <h5>表结构设计</h5></li>
+        </ul></li>
+    <li><p>后续再提供</p></li>
+</ul>
+
+<h2>人行</h2>
+
+<h3>v1实现</h3>
+
+<p>在v1中,访客分为访客预约跟邀请访客两种模式。其中访客预约是访客主动预约访问某个项目通道。邀请访客则是项目管理员主动邀请客户来访。</p>
+
+<h4>访客预约</h4>
+
+<h5>新增预约</h5>
+
+<ul>
+    <li>用户在小程序选择预约的项目。输入手机号码,姓名,被访人手机号码,开始时间,结束时间。随从人数,车辆,上传人脸。点击预约。</li>
+    <li>平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。</li>
+    <li><p>在预约时间段内,则预约成功。</p>
+
+        <h5>预约审核</h5></li>
+    <li><p>被访人,或者管理员收到预约访问请求,可以审核成功,审核失败。</p></li>
+    <li><p>用户会收到审核结果提醒,审核成功的则可以访问。</p>
+
+        <h5>访客来访开闸</h5></li>
+    <li><p>用户在预约时间段内,可以访问。</p></li>
+    <li>访问通行的鉴权方式可以是人脸,也可以是预约记录的二维码。
+        <h4>邀请访客</h4></li>
+</ul>
+
+<h5>新增邀请</h5>
+
+<ul>
+    <li>业主,管理员在小程序选择邀请项目。输入手机号码,姓名,开始时间,结束时间。随从人数,车辆,点击邀请。</li>
+    <li><p>平台收到邀请信息后,判断当前项目是否在预约时间段,不在则返回邀请失败。</p>
+
+        <h5>接收邀请</h5></li>
+    <li><p>被邀请人,收到邀请访问请求,可以接收,可以拒绝。</p>
+
+        <h5>访客来访开闸</h5></li>
+    <li><p>用户在邀请时间段内,可以访问。</p></li>
+    <li>访问通行的鉴权方式是预约记录的二维码。
+        <h3>v2计划</h3></li>
+</ul>
+
+<h4>概述</h4>
+
+<p>V2也只实现访客预约跟邀请访客两种模式。做出以下优化:
+    - 优化一:对于访客预约的时候,输入项目去查询项目是一个比较不友好的操作。用户不输入的时候,是没有可选的。可以提供通过被访人手机号码,通过被访人手机号码,自动定位到项目,供用户选择。这里存在的问题就是用户隐私。
+    也可以通过项目设置一个简单的项目预约编号,用户输入编号查询,或者直接输入项目预约编号预约。
+    - 优化二:用户预约之后,应该可以设置一个催办审核的按钮。用户在长时间没有得到审核,可以点击催办审核。
+    - 优化三:对于有些项目只想提供预约,或者只想提供邀请,可以设置项目预约模式。</p>
+
+<h4>详细设计</h4>
+
+<h5>项目预约管理</h5>
+
+<ul>
+    <li>管理员可以通过页面设置项目预约信息。预约相关设置包含:
+        <ul>
+            <li>预约时间周期 自然天  自然周</li>
+            <li>预约时间段 开始时间  结束时间</li>
+            <li>预约车场编号   前两万大写字母后四位数字 非必须</li>
+            <li>邀请是否自动接收 默认 否</li>
+            <li>预约模式   0 支持预约跟邀请  1 支持预约 2 支持邀请</li>
+        </ul></li>
+    <li><p>平台将项目预约配置下发给E8。</p>
+
+        <h5>访客预约</h5></li>
+    <li><p>访客通过跟项目方的协商得到项目方的名称或者预约项目编号。</p></li>
+    <li>用户在小程序选择预约的项目。需要输入的参数有:
+        <ul>
+            <li>手机号码</li>
+            <li>姓名</li>
+            <li>被访人手机号码</li>
+            <li>开始时间</li>
+            <li>结束时间</li>
+            <li>随行人数</li>
+            <li>随行车牌</li>
+            <li>人脸</li>
+        </ul></li>
+    <li>判断项目是否存在。不存在则返回预约失败,错误信息:项目不存在。</li>
+    <li>判断被访人电话是否为业主,如果是不是业主则返回预约失败,错误信息:被访人不存在。</li>
+    <li>平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。错误信息:预约时间不在预约周期内。</li>
+    <li>判断预约时间段在不在项目的通行时间段内。不在则返回预约失败,错误信息:预约时间不在项目通行时间段内。 ps:通行时间段内,通道才可以打开。可以考虑通行时间段当成预约时间段,也可以校验通行时间段来限制预约时间段的设置。</li>
+    <li>预约提交成功,并同步给E8</li>
+    <li>同步给E8的时候还需要下发预约人脸凭证,二维码凭证</li>
+    <li>平台将生成审核消息给被访人。被访人打开小程序也可以看到审核消息。</li>
+</ul>
+
+<h6>预约审核</h6>
+
+<ul>
+    <li>被访人收到预约请求,可以审核成功,审核失败。</li>
+    <li><p>当被访人存在多个预约请求,支持批量审核通过。</p>
+
+        <h6>用户来访开闸</h6></li>
+    <li><p>用户在预约时间段内,可以访问。</p></li>
+    <li>用户可以通过之前上传的人脸,通过用户人脸识别入场。</li>
+    <li>用户也可以通过预约的二维码入场。</li>
+    <li>E8设备通过凭证判断用户是否可以入参。</li>
+    <li>如果用户有随行车辆,则E8识别车牌凭证入场。</li>
+    <li>开闸后,E8将开闸的消息同步给平台。</li>
+    <li>平台将预约记录更新已完成。</li>
+</ul>
+
+<h5>邀请访客</h5>
+
+<h6>业主邀请</h6>
+
+<ul>
+    <li>业主在小程序邀请人员。输入参数有:
+        <ul>
+            <li>手机号码</li>
+            <li>姓名</li>
+            <li>开始时间</li>
+            <li>结束时间</li>
+            <li>随从人数</li>
+            <li>车牌</li>
+        </ul></li>
+    <li>判断当前项目是否在预约时间段,不在则返回邀请失败。错误信息:邀请时间不在预约周期内。</li>
+    <li>判断预约时间段在不在项目的通行时间段内。不在则返回邀请失败,错误信息:预约时间不在项目通行时间段内。</li>
+    <li>平台收到邀请记录,如果项目设置邀请自动接收,则状态为已接收。否则状态为未接收。</li>
+    <li><p>平台将生成审核消息给被邀请人。被邀请人打开小程序也可以看到审核消息。</p>
+
+        <h6>客户接收邀请</h6></li>
+    <li><p>被邀请人收到邀请请求,可以接收,可以拒绝。</p></li>
+    <li><p>接收邀请后,平台将下发凭证到E8,同步邀请记录到E8。</p>
+
+        <h6>用户来访开闸</h6></li>
+    <li><p>同预约访客开闸部分,不重述。</p></li>
+</ul>
+

File diff suppressed because it is too large
+ 1827 - 0
访客需求/1.html.html


+ 364 - 0
访客需求/fangke.html

@@ -0,0 +1,364 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>访客需求整理</title>
+</head>
+<body>
+<h1>访客需求整理</h1>
+
+<h2>车行</h2>
+
+<h3>v1实现</h3>
+
+<h4>新增预约</h4>
+<ul>
+    <li>V1的车辆提供了车场预约跟车位预约两种模式:</li>
+    <li>车场预约:预约车场,车场提供了可以预约的总车位数,每次预约后,车场剩余车位数减一。</li>
+    <li>车位预约:预约车位,提供了车位预约跟区域预约,车位预约固定到车位,区域预约则预约固定的某个区域,预约成功后,系统指定具体车位给预约用户。车场的车位数减一,区域的车位数减一。</li>
+    <li>车场提供了最早可以预约的时间。也就是不可以预约指定时间之后的车位。</li>
+    <li>对于预约只有预约驶入时间的具体限制,存在提前多少时间入场,延后多少时间入场的限制。必须在车辆没有在指定时间(包括延后时间)内未入场,或者车辆使出后才能释放车位。</li>
+    <li>车场预约的总车位不受日期限制。可预约数对所有时间生效。不存在不同时间交叉预约总预约车位数量大于总车位数的情况。</li>
+    <li>车位预约的不管是车位还是区域,预约后都确定了车位,在这个车位没有被释放前,不能存在重复预约当前车位。</li>
+</ul>
+
+<h4>修改预约</h4>
+<ul>
+    <li>在车辆未入场前,用户可以修改预约信息,包括车位,入场时间,车牌号,车牌颜色等。</li>
+</ul>
+
+<h4>取消预约</h4>
+<ul>
+    <li>在车辆未入场前,用户可以在具体的某个时间之前可以取消预约。取消预约也是可以释放预约车位跟车场预约车位数的。</li>
+</ul>
+
+<h4>预约驶入</h4>
+<ul>
+    <li>车辆存在预约记录,并且在指定时间,用户可以车辆驶入。</li>
+    <li>更新预约记录,记录驶入时间。</li>
+</ul>
+
+<h4>预约驶出</h4>
+<ul>
+    <li>车辆使出时间不做限制,用户可以在入场后任何时间使出。</li>
+    <li>更新预约记录,记录驶出时间。</li>
+    <li>释放车位跟车场预约车位数。</li>
+</ul>
+
+<h3>v2计划</h3>
+
+<h4>概述</h4>
+<ul>
+    <li>相比V1的设计,V2同样设置了车场,车位预约。并且做了一些优化。</li>
+    <li>优化一:添加车场以天,周为单位的清场机制扩展。车场设置了清场机制,则在清场周期开始,总预约车位数刷新为设置的最大值。</li>
+    <li>优化二:对于一个预约周期内,相同的车辆在不同时间内,预约相同的车场(车场级预约),区域(车位级预约),则不锁定多个车位,只锁定一个车位。当预约靠前的记录使出的时候也不释放车位数。可以限制相同的车辆预约太多锁定了太多车位的问题。</li>
+    <li>优化三:对于相同车辆预约相同的车场(车场级预约),区域(车位级预约),如果前一次预约的还没有使出,但是超过了后一次预约的最后驶入时间,则自动作废后一次预约记录,多次预约以此类推。</li>
+    <li>优化四:对于爽约的车辆加入惩罚机制,在某个周期内,多次爽约,限制其在一定时间内不能预约停车。</li>
+</ul>
+
+<h4>详细设计</h4>
+
+<h5>车场预约管理</h5>
+<ul>
+    <li>车场预约信息包含
+        <ul>
+            <li>预约类型:车场预约 车位预约</li>
+            <li>预约车位数</li>
+            <li>可提前预约小时数</li>
+            <li>可预约停车时长</li>
+            <li>预约可提前入场时间</li>
+            <li>预约可延迟入场时间</li>
+            <li>预约车收费模版</li>
+            <li>是否开启预约</li>
+            <li>预约周期  自然天  自然周   全部时间段</li>
+            <li>违约判定周期 单位天</li>
+            <li>违约判定次数</li>
+            <li>违约限制天数</li>
+        </ul>
+    </li>
+    <li>管理员可以通过页面设置预约信息。</li>
+    <li>平台将预约信息下发给E8。</li>
+</ul>
+
+<h5>区域预约管理</h5>
+<ul>
+    <li>区域预约信息包含
+        <ul>
+            <li>区域名称</li>
+            <li>区域车位数</li>
+            <li>所属车场id</li>
+            <li>所属车位起始编号</li>
+            <li>所属车位结束编号</li>
+            <li>车位编号列表   跟车位起始结束编号互斥。有限选择车位起始结束编号。</li>
+            <li>区域预约收费模版  为空则取车场预约收费模版</li>
+        </ul>
+    </li>
+    <li>管理员可以通过页面设置区域预约信息。</li>
+    <li>平台将区域预约信息下发给E8。</li>
+    <li>ps:所属车位应该在车位表中去关联区域。不在这里展示出来</li>
+    <li>ps:车场的那几个预约参数,可以考虑在区域都有一份,细分每个区域,区域配置不存在,则使用车场配置。</li>
+</ul>
+
+<h5>车辆预约</h5>
+<ul>
+    <li>用户可以通过小程序来预约车位。</li>
+    <li>需要选择的信息包含
+        <ul>
+            <li>预约的车场</li>
+            <li>预约的区域 可选</li>
+            <li>预约的车位 可选</li>
+            <li>预约入场时间 (小程序页面应该提醒最早,最晚入场时间)</li>
+            <li>预约出场时间  (对应需要多次预约有用。相同时间段内)</li>
+            <li>预约车牌号</li>
+        </ul>
+    </li>
+    <li>平台收到预约信息后的处理
+        <ul>
+            <li>判断车场是否开启预约。没有开启预约则返回预约失败,错误信息:该车次不支持预约停车。</li>
+            <li>判断预约时间是否在车场预约周期内。不在则返回预约失败,错误信息:预约时间不在车场预约周期内。</li>
+            <li>判断预约时间是否在车场可提前预约小时数内。不在则返回预约失败,错误信息:预约时间不在车场可提前预约小时数内。</li>
+            <li>判断预约时间是否在车场可预约停车时长内。不在则返回预约失败,错误信息:预约时间不在车场可预约停车时长内。</li>
+            <li>判断是否已经存在预约记录,预约的周期包含当前的预约入场时间。</li>
+            <li>判断当前车辆是否在预约限制名单中,如果在则返回预约失败,错误信息:该车辆已被限制预约,${yyyy-HH-dd}后才可以预约。</li>
+            <li>如果是车场级预约:
+                <ul>
+                    <li>判断当前车辆在当前车场是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功。不用操作车位数锁定。</li>
+                    <li>如果当前预约周期没有存在预约记录。判断当前车场可预约车位数是否大于0。</li>
+                    <li>如果可预约车位数大于0,则锁定车位。预约成功。</li>
+                    <li>否则返回预约失败,错误信息:该车场已无可用停车位。</li>
+                </ul>
+            </li>
+            <li>如果是车位级预约(区域):
+                <ul>
+                    <li>判断当前车辆在当前车场当前区域是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功,并且指定的车位跟之前的保持一致。不用操作车位数锁定。</li>
+                    <li>判断当前区域的可预约车位数是否大于0。</li>
+                    <li>如果区域可预约车位数大于0,锁定车位。预约成功。</li>
+                    <li>否则返回预约失败,错误信息:该车场已无可用停车位。</li>
+                </ul>
+            </li>
+            <li>如果是车位级预约(车位):
+                <ul>
+                    <li>不支持多次预约不同的车位。提醒已经在当前车场存在其他预约记录,并且预约了其他车位。为了方便车位管理,只支持再预约这个车位。</li>
+                    <li>对于上面的限制,可能有点不太合理,可以限制限制最多预约车位数来限制。</li>
+                    <li>其他的同车位级预约(区域)。</li>
+                </ul>
+            </li>
+        </ul>
+    </li>
+    <li>预约成功后,将预约记录下发给E8。</li>
+</ul>
+
+<h5>取消预约</h5>
+<ul>
+    <li>用户可以通过小程序来取消预约。</li>
+    <li>平台判断预约的记录是否存在。不存在则返回取消失败,错误信息:该预约记录不存在。</li>
+    <li>判断取消的预约记录是否已经驶入,已经驶入则返回取消失败,错误信息:该预约记录已驶入。</li>
+    <li>判断预约的记录是否已经过最后驶入时间,如果已经超过则返回取消失败,错误信息:该预约记录已超时。</li>
+    <li>取消预约成功,释放车位,更新预约记录。</li>
+    <li>如果当前车场当前周期存在多条预约记录,则不需要释放车位。</li>
+    <li>如果当前车场当前周期存在多条预约记录,并且是车位级预约(非区域),则不需要释放车位(需要根据车位预约的方式做调整)。</li>
+    <li>下发取消预约记录给E8。</li>
+</ul>
+
+<h5>修改预约</h5>
+<ul>
+    <li>用户可以通过小程序来修改预约。</li>
+    <li>平台判断预约的记录是否存在。不存在则返回修改失败,错误信息:该预约记录不存在。</li>
+    <li>判断修改的预约记录是否已经驶入,已经驶入则返回修改失败,错误信息:该预约记录已驶入。</li>
+    <li>判断修改的预约记录是否已经过最后驶入时间,如果已经超过则返回修改失败,错误信息:该预约记录已超时。</li>
+    <li>如果修改为其他的预约周期,则不支持修改,需要取消预约,重新预约。</li>
+    <li>如果修改驶入时间,驶出时间周期内存在当前车辆已经预约的记录,则不支持修改。错误信息:该时间段内已有预约记录。</li>
+    <li>如果修改车牌,同样需要判断修改后的车牌是否存在时间交叉的停车记录。如果存在则不支持修改,错误信息:该车牌已存在预约记录。</li>
+    <li>不支持修改其他的车场。</li>
+    <li>修改区域,需要判断修改后的区域是否在车场中。</li>
+    <li>修改区域需要判断修改后的区域是否存在预约记录。存在的预约记录并且存在时间冲突,则不支持修改。错误信息:该区域已存在预约记录。</li>
+    <li>修改区域后需要判断区域的车位数,如果车位数不够,则不支持修改。错误信息:该区域已无可用停车位。</li>
+</ul>
+
+<h5>预约记录管理</h5>
+<ul>
+    <li>平台需要提供预约记录管理接口,包括预约记录列表,查询预约记录详情。</li>
+    <li>小程序可以通过接口查询当前用户的预约记录列表,预约详情。</li>
+</ul>
+
+<h5>车辆驶入</h5>
+<ul>
+    <li>车辆驶入,E8需要判断是否在当前时间段内存在预约记录。</li>
+    <li>不存在预约记录,则不予开闸。</li>
+    <li>存在预约记录,则判断是否已经驶入。已经驶入,给予开闸,记录多次驶入异常信息。</li>
+    <li>预约记录已经驶出,则不予开闸。</li>
+    <li>开闸后,E8将车辆驶入消息上传给平台。</li>
+    <li>平台更新预约驶入时间。(不确定这里应该跟E8怎么做这个同步关系。)</li>
+</ul>
+
+<h5>车辆驶出</h5>
+<ul>
+    <li>E8上传车辆驶出记录。</li>
+    <li>平台收到记录后,更新预约驶出时间。</li>
+    <li>车场级预约:
+        <ul>
+            <li>判断当前预约周期内是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。</li>
+        </ul>
+    </li>
+    <li>车位级预约(区域):
+        <ul>
+            <li>判断当前预约周期内当前区域是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。</li>
+        </ul>
+    </li>
+    <li>车位级预约(车位):
+        <ul>
+            <li>判断当前预约周期内当前车位是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。</li>
+        </ul>
+    </li>
+</ul>
+
+<h5>爽约检查任务</h5>
+<ul>
+    <li>需要确定一件事情,爽约限制的是车,还是人。</li>
+    <li>平台需要提供爽约检查任务。</li>
+    <li>对于已经过了最晚预约驶入时间的车辆,修改状态为爽约。</li>
+    <li>平台需要提供爽约列表,查询爽约详情。</li>
+    <li>定时任务检测出预约记录设置的爽约限制天数内爽约次数超过爽约次数限制的人。</li>
+    <li>将达到爽约次数限制的人,加入到限制列表中去。</li>
+    <li>对于在爽约限制列表中的人:
+        <ul>
+            <li>限制其预约</li>
+            <li>预约的时候判断爽约限制是否已经到期,到期则移除。</li>
+            <li>同时添加定时任务,将检测爽约到期的用户,移除爽约限制列表。</li>
+        </ul>
+    </li>
+</ul>
+
+<h5>表结构设计</h5>
+<ul>
+    <li>后续再提供</li>
+</ul>
+
+<h2>人行</h2>
+<h3>v1实现</h3>
+<p>在v1中,访客分为访客预约跟邀请访客两种模式。其中访客预约是访客主动预约访问某个项目通道。邀请访客则是项目管理员主动邀请客户来访。</p>
+<h4>访客预约</h4>
+<h5>新增预约</h5>
+<ul>
+    <li>用户在小程序选择预约的项目。输入手机号码,姓名,被访人手机号码,开始时间,结束时间。随从人数,车辆,上传人脸。点击预约。</li>
+    <li>平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。</li>
+    <li>在预约时间段内,则预约成功。</li>
+</ul>
+<h5>预约审核</h5>
+<ul>
+    <li>被访人,或者管理员收到预约访问请求,可以审核成功,审核失败。</li>
+    <li>用户会收到审核结果提醒,审核成功的则可以访问。</li>
+</ul>
+<h5>访客来访开闸</h5>
+<ul>
+    <li>用户在预约时间段内,可以访问。</li>
+    <li>访问通行的鉴权方式可以是人脸,也可以是预约记录的二维码。</li>
+</ul>
+<h4>邀请访客</h4>
+<h5>新增邀请</h5>
+<ul>
+    <li>业主,管理员在小程序选择邀请项目。输入手机号码,姓名,开始时间,结束时间。随从人数,车辆,点击邀请。</li>
+    <li>平台收到邀请信息后,判断当前项目是否在预约时间段,不在则返回邀请失败。</li>
+</ul>
+<h5>接收邀请</h5>
+<ul>
+    <li>被邀请人,收到邀请访问请求,可以接收,可以拒绝。</li>
+</ul>
+<h5>访客来访开闸</h5>
+<ul>
+    <li>用户在邀请时间段内,可以访问。</li>
+    <li>访问通行的鉴权方式是预约记录的二维码。</li>
+</ul>
+<h3>v2计划</h3>
+<h4>概述</h4>
+<p>V2也只实现访客预约跟邀请访客两种模式。做出以下优化:</p>
+<ul>
+    <li>优化一:对于访客预约的时候,输入项目去查询项目是一个比较不友好的操作。用户不输入的时候,是没有可选的。可以提供通过被访人手机号码,通过被访人手机号码,自动定位到项目,供用户选择。这里存在的问题就是用户隐私。也可以通过项目设置一个简单的项目预约编号,用户输入编号查询,或者直接输入项目预约编号预约。</li>
+    <li>优化二:用户预约之后,应该可以设置一个催办审核的按钮。用户在长时间没有得到审核,可以点击催办审核。</li>
+    <li>优化三:对于有些项目只想提供预约,或者只想提供邀请,可以设置项目预约模式。</li>
+</ul>
+<h4>详细设计</h4>
+<h5>项目预约管理</h5>
+<ul>
+    <li>管理员可以通过页面设置项目预约信息。预约相关设置包含:
+        <ul>
+            <li>预约时间周期 自然天 自然周</li>
+            <li>预约时间段 开始时间 结束时间</li>
+            <li>预约车场编号 前两万大写字母后四位数字 非必须</li>
+            <li>邀请是否自动接收 默认 否</li>
+            <li>预约模式 0 支持预约跟邀请 1 支持预约 2 支持邀请</li>
+        </ul>
+    </li>
+    <li>平台将项目预约配置下发给E8。</li>
+</ul>
+<h5>访客预约</h5>
+<ul>
+    <li>访客通过跟项目方的协商得到项目方的名称或者预约项目编号。</li>
+    <li>用户在小程序选择预约的项目。需要输入的参数有:
+        <ul>
+            <li>手机号码</li>
+            <li>姓名</li>
+            <li>被访人手机号码</li>
+            <li>开始时间</li>
+            <li>结束时间</li>
+            <li>随行人数</li>
+            <li>随行车牌</li>
+            <li>人脸</li>
+        </ul>
+    </li>
+    <li>判断项目是否存在。不存在则返回预约失败,错误信息:项目不存在。</li>
+    <li>判断被访人电话是否为业主,如果是不是业主则返回预约失败,错误信息:被访人不存在。</li>
+    <li>平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。错误信息:预约时间不在预约周期内。</li>
+    <li>判断预约时间段在不在项目的通行时间段内。不在则返回预约失败,错误信息:预约时间不在项目通行时间段内。 ps:通行时间段内,通道才可以打开。可以考虑通行时间段当成预约时间段,也可以校验通行时间段来限制预约时间段的设置。</li>
+    <li>预约提交成功,并同步给E8</li>
+    <li>同步给E8的时候还需要下发预约人脸凭证,二维码凭证</li>
+    <li>平台将生成审核消息给被访人。被访人打开小程序也可以看到审核消息。</li>
+</ul>
+<h6>预约审核</h6>
+<ul>
+    <li>被访人收到预约请求,可以审核成功,审核失败。</li>
+    <li>当被访人存在多个预约请求,支持批量审核通过。</li>
+</ul>
+<h6>用户来访开闸</h6>
+<ul>
+    <li>用户在预约时间段内,可以访问。</li>
+    <li>用户可以通过之前上传的人脸,通过用户人脸识别入场。</li>
+    <li>用户也可以通过预约的二维码入场。</li>
+    <li>E8设备通过凭证判断用户是否可以入参。</li>
+    <li>如果用户有随行车辆,则E8识别车牌凭证入场。</li>
+    <li>开闸后,E8将开闸的消息同步给平台。</li>
+    <li>平台将预约记录更新已完成。</li>
+</ul>
+<h5>邀请访客</h5>
+<h6>业主邀请</h6>
+<ul>
+    <li>业主在小程序邀请人员。输入参数有:
+        <ul>
+            <li>手机号码</li>
+            <li>姓名</li>
+            <li>开始时间</li>
+            <li>结束时间</li>
+            <li>随从人数</li>
+            <li>车牌</li>
+        </ul>
+    </li>
+    <li>判断当前项目是否在预约时间段,不在则返回邀请失败。错误信息:邀请时间不在预约周期内。</li>
+    <li>判断预约时间段在不在项目的通行时间段内。不在则返回邀请失败,错误信息:预约时间不在项目通行时间段内。</li>
+    <li>平台收到邀请记录,如果项目设置邀请自动接收,则状态为已接收。否则状态为未接收。</li>
+    <li>平台将生成审核消息给被邀请人。被邀请人打开小程序也可以看到审核消息。</li>
+</ul>
+<h6>客户接收邀请</h6>
+<ul>
+    <li>被邀请人收到邀请请求,可以接收,可以拒绝。</li>
+    <li>接收邀请后,平台将下发凭证到E8,同步邀请记录到E8。</li>
+</ul>
+<h6>用户来访开闸</h6>
+<ul>
+    <li>同预约访客开闸部分,不重述。</li>
+</ul>
+</body>
+</html>

+ 294 - 0
访客需求/htk.html

@@ -0,0 +1,294 @@
+<h1>访客需求整理</h1>
+
+<h2>车行</h2>
+
+<h3>v2计划</h3>
+
+<h4>概述</h4>
+
+<ul>
+    <li>相比V1的设计,V2同样设置了车场,车位预约。并且做了一些优化。</li>
+    <li>优化一:添加车场以天,周为单位的清场机制扩展。车场设置了清场机制,则在清场周期开始,总预约车位数刷新为设置的最大值。</li>
+    <li>优化二:对于一个预约周期内,相同的车辆在不同时间内,预约相同的车场(车场级预约),区域(车位级预约),则不锁定多个车位,只锁定一个车位。当预约靠前的记录使出的时候也不释放车位数。可以限制相同的车辆预约太多锁定了太多车位的问题。</li>
+    <li>优化三:对于相同车辆预约相同的车场(车场级预约),区域(车位级预约),如果前一次预约的还没有使出,但是超过了后一次预约的最后驶入时间,则自动作废后一次预约记录,多次预约以此类推。</li>
+    <li>优化四:对于爽约的车辆加入惩罚机制,在某个周期内,多次爽约,限制其在一定时间内不能预约停车。
+        <h4>详细设计</h4></li>
+</ul>
+
+<h5>车场预约管理</h5>
+
+<ul>
+    <li>车场预约信息包含
+        <ul>
+            <li>预约类型:车场预约 车位预约</li>
+            <li>预约车位数</li>
+            <li>可提前预约小时数</li>
+            <li>可预约停车时长</li>
+            <li>预约可提前入场时间</li>
+            <li>预约可延迟入场时间</li>
+            <li>预约车收费模版</li>
+            <li>是否开启预约</li>
+            <li>预约周期  自然天  自然周   全部时间段</li>
+            <li>违约判定周期 单位天</li>
+            <li>违约判定次数</li>
+            <li>违约限制天数</li>
+        </ul></li>
+    <li>管理员可以通过页面设置预约信息。</li>
+    <li><p>平台将预约信息下发给E8。</p>
+
+        <h5>区域预约管理</h5></li>
+    <li><p>区域预约信息包含</p>
+
+        <ul>
+            <li>区域名称</li>
+            <li>区域车位数</li>
+            <li>所属车场id</li>
+            <li>所属车位起始编号</li>
+            <li>所属车位结束编号</li>
+            <li>车位编号列表   跟车位起始结束编号互斥。有限选择车位起始结束编号。</li>
+            <li>区域预约收费模版  为空则取车场预约收费模版</li>
+        </ul></li>
+    <li>管理员可以通过页面设置区域预约信息。</li>
+    <li>平台将区域预约信息下发给E8。</li>
+    <li>ps:所属车位应该在车位表中去关联区域。不在这里展示出来</li>
+    <li>ps:车场的那几个预约参数,可以考虑在区域都有一份,细分每个区域,区域配置不存在,则使用车场配置。</li>
+</ul>
+
+<h5>车辆预约</h5>
+
+<ul>
+    <li>用户可以通过小程序来预约车位。</li>
+    <li>需要选择的信息包含
+        <ul>
+            <li>预约的车场</li>
+            <li>预约的区域 可选</li>
+            <li>预约的车位 可选</li>
+            <li>预约入场时间 (小程序页面应该提醒最早,最晚入场时间)</li>
+            <li>预约出场时间  (对应需要多次预约有用。相同时间段内)</li>
+            <li>预约车牌号</li>
+        </ul></li>
+    <li>平台收到预约信息后的处理
+        <ul>
+            <li>判断车场是否开启预约。没有开启预约则返回预约失败,错误信息:该车次不支持预约停车。</li>
+            <li>判断预约时间是否在车场预约周期内。不在则返回预约失败,错误信息:预约时间不在车场预约周期内。</li>
+            <li>判断预约时间是否在车场可提前预约小时数内。不在则返回预约失败,错误信息:预约时间不在车场可提前预约小时数内。</li>
+            <li>判断预约时间是否在车场可预约停车时长内。不在则返回预约失败,错误信息:预约时间不在车场可预约停车时长内。</li>
+            <li>判断是否已经存在预约记录,预约的周期包含当前的预约入场时间。</li>
+            <li>判断当前车辆是否在预约限制名单中,如果在则返回预约失败,错误信息:该车辆已被限制预约,${yyyy-HH-dd}后才可以预约。</li>
+            <li>如果是车场级预约:</li>
+            <li>判断当前车辆在当前车场是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功。不用操作车位数锁定。</li>
+            <li>如果当前预约周期没有存在预约记录。判断当前车场可预约车位数是否大于0。</li>
+            <li>如果可预约车位数大于0,则锁定车位。预约成功。</li>
+            <li>否则返回预约失败,错误信息:该车场已无可用停车位。</li>
+            <li>如果是车位级预约(区域):</li>
+            <li>判断当前车辆在当前车场当前区域是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功,并且指定的车位跟之前的保持一致。不用操作车位数锁定。</li>
+            <li>判断当前区域的可预约车位数是否大于0。</li>
+            <li>如果区域可预约车位数大于0,锁定车位。预约成功。</li>
+            <li>否则返回预约失败,错误信息:该车场已无可用停车位。</li>
+            <li>如果是车位级预约(车位):</li>
+            <li>不支持多次预约不同的车位。提醒已经在当前车场存在其他预约记录,并且预约了其他车位。为了方便车位管理,只支持再预约这个车位。</li>
+            <li>对于上面的限制,可能有点不太合理,可以限制限制最多预约车位数来限制。</li>
+            <li>其他的同车位级预约(区域)。</li>
+        </ul></li>
+    <li><p>预约成功后,将预约记录下发给E8。</p>
+
+        <h5>取消预约</h5></li>
+    <li><p>用户可以通过小程序来取消预约。</p></li>
+    <li>平台判断预约的记录是否存在。不存在则返回取消失败,错误信息:该预约记录不存在。</li>
+    <li>判断取消的预约记录是否已经驶入,已经驶入则返回取消失败,错误信息:该预约记录已驶入。</li>
+    <li>判断预约的记录是否已经过最后驶入时间,如果已经超过则返回取消失败,错误信息:该预约记录已超时。</li>
+    <li>取消预约成功,释放车位,更新预约记录。</li>
+    <li>如果当前车场当前周期存在多条预约记录,则不需要释放车位。</li>
+    <li>如果当前车场当前周期存在多条预约记录,并且是车位级预约(非区域),则不需要释放车位(需要根据车位预约的方式做调整)。</li>
+    <li><p>下发取消预约记录给E8。</p>
+
+        <h5>修改预约</h5></li>
+    <li><p>用户可以通过小程序来修改预约。</p></li>
+    <li>平台判断预约的记录是否存在。不存在则返回修改失败,错误信息:该预约记录不存在。</li>
+    <li>判断修改的预约记录是否已经驶入,已经驶入则返回修改失败,错误信息:该预约记录已驶入。</li>
+    <li>判断修改的预约记录是否已经过最后驶入时间,如果已经超过则返回修改失败,错误信息:该预约记录已超时。</li>
+    <li>如果修改为其他的预约周期,则不支持修改,需要取消预约,重新预约。</li>
+    <li>如果修改驶入时间,驶出时间周期内存在当前车辆已经预约的记录,则不支持修改。错误信息:该时间段内已有预约记录。</li>
+    <li>如果修改车牌,同样需要判断修改后的车牌是否存在时间交叉的停车记录。如果存在则不支持修改,错误信息:该车牌已存在预约记录。</li>
+    <li>不支持修改其他的车场。</li>
+    <li>修改区域,需要判断修改后的区域是否在车场中。</li>
+    <li>修改区域需要判断修改后的区域是否存在预约记录。存在的预约记录并且存在时间冲突,则不支持修改。错误信息:该区域已存在预约记录。</li>
+    <li><p>修改区域后需要判断区域的车位数,如果车位数不够,则不支持修改。错误信息:该区域已无可用停车位。</p>
+
+        <h5>预约记录管理</h5></li>
+    <li><p>平台需要提供预约记录管理接口,包括预约记录列表,查询预约记录详情。</p></li>
+    <li><p>小程序可以通过接口查询当前用户的预约记录列表,预约详情。</p>
+
+        <h5>车辆驶入</h5></li>
+    <li><p>车辆驶入,E8需要判断是否在当前时间段内存在预约记录。</p></li>
+    <li>不存在预约记录,则不予开闸。</li>
+    <li>存在预约记录,则判断是否已经驶入。已经驶入,给于开闸,记录多次驶入异常信息。</li>
+    <li>预约记录已经驶出,则不予开闸。</li>
+    <li>开闸后,E8将车辆驶入消息上传给平台。</li>
+    <li><p>平台更新预约驶入时间。(不确定这里应该跟E8怎么做这个同步关系。)</p>
+
+        <h5>车辆驶出</h5></li>
+    <li><p>E8上传车辆驶出记录。</p></li>
+    <li>平台收到记录后,更新预约驶出时间。</li>
+    <li>车场级预约:
+        <ul>
+            <li>判断当前预约周期内是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。</li>
+        </ul></li>
+    <li>车位级预约(区域):
+        <ul>
+            <li>判断当前预约周期内当前区域是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。</li>
+        </ul></li>
+    <li><p>车位级预约(车位):</p>
+
+        <ul>
+            <li>判断当前预约周期内当前车位是否存在其他未开始的预约记录。</li>
+            <li>存在则不需要释放车位数。
+                <h5>爽约检查任务</h5></li>
+        </ul></li>
+    <li><p>需要确定一件事情,爽约限制的是车,还是人。</p></li>
+    <li>平台需要提供爽约检查任务。</li>
+    <li>对于已经过了最晚预约驶入时间的车辆,修改状态为爽约。</li>
+    <li>平台需要提供爽约列表,查询爽约详情。</li>
+    <li>定时任务检测出预约记录设置的爽约限制天数内爽约次数超过爽约次数限制的人。</li>
+    <li>将达到爽约次数限制的人,假如到限制列表中去。</li>
+    <li><p>对于在爽约限制列表中的人:</p>
+
+        <ul>
+            <li>限制其预约</li>
+            <li>预约的时候判断爽约限制是否已经到期,到期则移除。</li>
+            <li>同时添加定时任务,将检测爽约到期的用户,移除爽约限制列表。
+                <h5>表结构设计</h5></li>
+        </ul></li>
+    <li><p>后续再提供</p></li>
+</ul>
+
+<h2>人行</h2>
+
+<h3>v1实现</h3>
+
+<p>在v1中,访客分为访客预约跟邀请访客两种模式。其中访客预约是访客主动预约访问某个项目通道。邀请访客则是项目管理员主动邀请客户来访。</p>
+
+<h4>访客预约</h4>
+
+<h5>新增预约</h5>
+
+<ul>
+    <li>用户在小程序选择预约的项目。输入手机号码,姓名,被访人手机号码,开始时间,结束时间。随从人数,车辆,上传人脸。点击预约。</li>
+    <li>平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。</li>
+    <li><p>在预约时间段内,则预约成功。</p>
+
+        <h5>预约审核</h5></li>
+    <li><p>被访人,或者管理员收到预约访问请求,可以审核成功,审核失败。</p></li>
+    <li><p>用户会收到审核结果提醒,审核成功的则可以访问。</p>
+
+        <h5>访客来访开闸</h5></li>
+    <li><p>用户在预约时间段内,可以访问。</p></li>
+    <li>访问通行的鉴权方式可以是人脸,也可以是预约记录的二维码。
+        <h4>邀请访客</h4></li>
+</ul>
+
+<h5>新增邀请</h5>
+
+<ul>
+    <li>业主,管理员在小程序选择邀请项目。输入手机号码,姓名,开始时间,结束时间。随从人数,车辆,点击邀请。</li>
+    <li><p>平台收到邀请信息后,判断当前项目是否在预约时间段,不在则返回邀请失败。</p>
+
+        <h5>接收邀请</h5></li>
+    <li><p>被邀请人,收到邀请访问请求,可以接收,可以拒绝。</p>
+
+        <h5>访客来访开闸</h5></li>
+    <li><p>用户在邀请时间段内,可以访问。</p></li>
+    <li>访问通行的鉴权方式是预约记录的二维码。
+        <h3>v2计划</h3></li>
+</ul>
+
+<h4>概述</h4>
+
+<p>V2也只实现访客预约跟邀请访客两种模式。做出以下优化:
+    - 优化一:对于访客预约的时候,输入项目去查询项目是一个比较不友好的操作。用户不输入的时候,是没有可选的。可以提供通过被访人手机号码,通过被访人手机号码,自动定位到项目,供用户选择。这里存在的问题就是用户隐私。
+    也可以通过项目设置一个简单的项目预约编号,用户输入编号查询,或者直接输入项目预约编号预约。
+    - 优化二:用户预约之后,应该可以设置一个催办审核的按钮。用户在长时间没有得到审核,可以点击催办审核。
+    - 优化三:对于有些项目只想提供预约,或者只想提供邀请,可以设置项目预约模式。</p>
+
+<h4>详细设计</h4>
+
+<h5>项目预约管理</h5>
+
+<ul>
+    <li>管理员可以通过页面设置项目预约信息。预约相关设置包含:
+        <ul>
+            <li>预约时间周期 自然天  自然周</li>
+            <li>预约时间段 开始时间  结束时间</li>
+            <li>预约车场编号   前两万大写字母后四位数字 非必须</li>
+            <li>邀请是否自动接收 默认 否</li>
+            <li>预约模式   0 支持预约跟邀请  1 支持预约 2 支持邀请</li>
+        </ul></li>
+    <li><p>平台将项目预约配置下发给E8。</p>
+
+        <h5>访客预约</h5></li>
+    <li><p>访客通过跟项目方的协商得到项目方的名称或者预约项目编号。</p></li>
+    <li>用户在小程序选择预约的项目。需要输入的参数有:
+        <ul>
+            <li>手机号码</li>
+            <li>姓名</li>
+            <li>被访人手机号码</li>
+            <li>开始时间</li>
+            <li>结束时间</li>
+            <li>随行人数</li>
+            <li>随行车牌</li>
+            <li>人脸</li>
+        </ul></li>
+    <li>判断项目是否存在。不存在则返回预约失败,错误信息:项目不存在。</li>
+    <li>判断被访人电话是否为业主,如果是不是业主则返回预约失败,错误信息:被访人不存在。</li>
+    <li>平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。错误信息:预约时间不在预约周期内。</li>
+    <li>判断预约时间段在不在项目的通行时间段内。不在则返回预约失败,错误信息:预约时间不在项目通行时间段内。 ps:通行时间段内,通道才可以打开。可以考虑通行时间段当成预约时间段,也可以校验通行时间段来限制预约时间段的设置。</li>
+    <li>预约提交成功,并同步给E8</li>
+    <li>同步给E8的时候还需要下发预约人脸凭证,二维码凭证</li>
+    <li>平台将生成审核消息给被访人。被访人打开小程序也可以看到审核消息。</li>
+</ul>
+
+<h6>预约审核</h6>
+
+<ul>
+    <li>被访人收到预约请求,可以审核成功,审核失败。</li>
+    <li><p>当被访人存在多个预约请求,支持批量审核通过。</p>
+
+        <h6>用户来访开闸</h6></li>
+    <li><p>用户在预约时间段内,可以访问。</p></li>
+    <li>用户可以通过之前上传的人脸,通过用户人脸识别入场。</li>
+    <li>用户也可以通过预约的二维码入场。</li>
+    <li>E8设备通过凭证判断用户是否可以入参。</li>
+    <li>如果用户有随行车辆,则E8识别车牌凭证入场。</li>
+    <li>开闸后,E8将开闸的消息同步给平台。</li>
+    <li>平台将预约记录更新已完成。</li>
+</ul>
+
+<h5>邀请访客</h5>
+
+<h6>业主邀请</h6>
+
+<ul>
+    <li>业主在小程序邀请人员。输入参数有:
+        <ul>
+            <li>手机号码</li>
+            <li>姓名</li>
+            <li>开始时间</li>
+            <li>结束时间</li>
+            <li>随从人数</li>
+            <li>车牌</li>
+        </ul></li>
+    <li>判断当前项目是否在预约时间段,不在则返回邀请失败。错误信息:邀请时间不在预约周期内。</li>
+    <li>判断预约时间段在不在项目的通行时间段内。不在则返回邀请失败,错误信息:预约时间不在项目通行时间段内。</li>
+    <li>平台收到邀请记录,如果项目设置邀请自动接收,则状态为已接收。否则状态为未接收。</li>
+    <li><p>平台将生成审核消息给被邀请人。被邀请人打开小程序也可以看到审核消息。</p>
+
+        <h6>客户接收邀请</h6></li>
+    <li><p>被邀请人收到邀请请求,可以接收,可以拒绝。</p></li>
+    <li><p>接收邀请后,平台将下发凭证到E8,同步邀请记录到E8。</p>
+
+        <h6>用户来访开闸</h6></li>
+    <li><p>同预约访客开闸部分,不重述。</p></li>
+</ul>
+

File diff suppressed because it is too large
+ 1 - 0
访客需求/访客设计文档.html


+ 90 - 0
访客需求/访客需求文档.md

@@ -0,0 +1,90 @@
+# 访客需求整理
+## 人行
+### v1实现
+在v1中,访客分为访客预约跟邀请访客两种模式。其中访客预约是访客主动预约访问某个项目通道。邀请访客则是项目管理员主动邀请客户来访。
+#### 访客预约
+##### 新增预约
+- 用户在小程序选择预约的项目。输入手机号码,姓名,被访人手机号码,开始时间,结束时间。随从人数,车辆,上传人脸。点击预约。
+- 平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。
+- 在预约时间段内,则预约成功。
+##### 预约审核
+- 被访人,或者管理员收到预约访问请求,可以审核成功,审核失败。
+- 用户会收到审核结果提醒,审核成功的则可以访问。
+##### 访客来访开闸
+- 用户在预约时间段内,可以访问。
+- 访问通行的鉴权方式可以是人脸,也可以是预约记录的二维码。
+#### 邀请访客
+##### 新增邀请
+- 业主,管理员在小程序选择邀请项目。输入手机号码,姓名,开始时间,结束时间。随从人数,车辆,点击邀请。
+- 平台收到邀请信息后,判断当前项目是否在预约时间段,不在则返回邀请失败。
+##### 接收邀请
+- 被邀请人,收到邀请访问请求,可以接收,可以拒绝。
+##### 访客来访开闸
+- 用户在邀请时间段内,可以访问。
+- 访问通行的鉴权方式是预约记录的二维码。
+### v2计划
+#### 概述
+V2也只实现访客预约跟邀请访客两种模式。做出以下优化:
+- 优化一:对于访客预约的时候,输入项目去查询项目是一个比较不友好的操作。用户不输入的时候,是没有可选的。可以提供通过被访人手机号码,通过被访人手机号码,自动定位到项目,供用户选择。这里存在的问题就是用户隐私。
+也可以通过项目设置一个简单的项目预约编号,用户输入编号查询,或者直接输入项目预约编号预约。
+- 优化二:用户预约之后,应该可以设置一个催办审核的按钮。用户在长时间没有得到审核,可以点击催办审核。
+- 优化三:对于有些项目只想提供预约,或者只想提供邀请,可以设置项目预约模式。
+
+#### 详细设计
+##### 项目预约管理
+- 管理员可以通过页面设置项目预约信息。预约相关设置包含:
+  - 预约时间周期 自然天  自然周
+  - 预约时间段 开始时间  结束时间
+  - 预约车场编号   前两万大写字母后四位数字 非必须
+  - 邀请是否自动接收 默认 否
+  - 预约模式   0 支持预约跟邀请  1 支持预约 2 支持邀请
+- 平台将项目预约配置下发给E8。
+##### 访客预约
+- 访客通过跟项目方的协商得到项目方的名称或者预约项目编号。
+- 用户在小程序选择预约的项目。需要输入的参数有:
+  - 手机号码
+  - 姓名
+  - 被访人手机号码
+  - 开始时间
+  - 结束时间
+  - 随行人数
+  - 随行车牌
+  - 人脸
+- 判断项目是否存在。不存在则返回预约失败,错误信息:项目不存在。
+- 判断被访人电话是否为业主,如果是不是业主则返回预约失败,错误信息:被访人不存在。
+- 平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。错误信息:预约时间不在预约周期内。
+- 判断预约时间段在不在项目的通行时间段内。不在则返回预约失败,错误信息:预约时间不在项目通行时间段内。 ps:通行时间段内,通道才可以打开。可以考虑通行时间段当成预约时间段,也可以校验通行时间段来限制预约时间段的设置。
+- 预约提交成功,并同步给E8
+- 同步给E8的时候还需要下发预约人脸凭证,二维码凭证
+- 平台将生成审核消息给被访人。被访人打开小程序也可以看到审核消息。
+
+###### 预约审核
+- 被访人收到预约请求,可以审核成功,审核失败。
+- 当被访人存在多个预约请求,支持批量审核通过。
+###### 用户来访开闸
+- 用户在预约时间段内,可以访问。
+- 用户可以通过之前上传的人脸,通过用户人脸识别入场。
+- 用户也可以通过预约的二维码入场。
+- E8设备通过凭证判断用户是否可以入参。
+- 如果用户有随行车辆,则E8识别车牌凭证入场。
+- 开闸后,E8将开闸的消息同步给平台。
+- 平台将预约记录更新已完成。
+
+##### 邀请访客
+###### 业主邀请
+- 业主在小程序邀请人员。输入参数有:
+  - 手机号码
+  - 姓名
+  - 开始时间
+  - 结束时间
+  - 随从人数
+  - 车牌
+- 判断当前项目是否在预约时间段,不在则返回邀请失败。错误信息:邀请时间不在预约周期内。
+- 判断预约时间段在不在项目的通行时间段内。不在则返回邀请失败,错误信息:预约时间不在项目通行时间段内。
+- 平台收到邀请记录,如果项目设置邀请自动接收,则状态为已接收。否则状态为未接收。
+- 平台将生成审核消息给被邀请人。被邀请人打开小程序也可以看到审核消息。
+###### 客户接收邀请
+- 被邀请人收到邀请请求,可以接收,可以拒绝。
+- 接收邀请后,平台将下发凭证到E8,同步邀请记录到E8。
+###### 用户来访开闸
+- 同预约访客开闸部分,不重述。

+ 219 - 0
访客需求/访客需求文档1.md

@@ -0,0 +1,219 @@
+# 访客需求整理
+## 车行
+
+### v2计划
+#### 概述
+- 相比V1的设计,V2同样设置了车场,车位预约。并且做了一些优化。
+- 优化一:添加车场以天,周为单位的清场机制扩展。车场设置了清场机制,则在清场周期开始,总预约车位数刷新为设置的最大值。
+- 优化二:对于一个预约周期内,相同的车辆在不同时间内,预约相同的车场(车场级预约),区域(车位级预约),则不锁定多个车位,只锁定一个车位。当预约靠前的记录使出的时候也不释放车位数。可以限制相同的车辆预约太多锁定了太多车位的问题。
+- 优化三:对于相同车辆预约相同的车场(车场级预约),区域(车位级预约),如果前一次预约的还没有使出,但是超过了后一次预约的最后驶入时间,则自动作废后一次预约记录,多次预约以此类推。
+- 优化四:对于爽约的车辆加入惩罚机制,在某个周期内,多次爽约,限制其在一定时间内不能预约停车。
+#### 详细设计
+##### 车场预约管理
+- 车场预约信息包含
+  - 预约类型:车场预约 车位预约
+  - 预约车位数
+  - 可提前预约小时数
+  - 可预约停车时长
+  - 预约可提前入场时间
+  - 预约可延迟入场时间
+  - 预约车收费模版
+  - 是否开启预约
+  - 预约周期  自然天  自然周   全部时间段
+  - 违约判定周期 单位天
+  - 违约判定次数
+  - 违约限制天数
+- 管理员可以通过页面设置预约信息。
+- 平台将预约信息下发给E8。
+##### 区域预约管理
+- 区域预约信息包含
+  - 区域名称
+  - 区域车位数
+  - 所属车场id
+  - 所属车位起始编号
+  - 所属车位结束编号
+  - 车位编号列表   跟车位起始结束编号互斥。有限选择车位起始结束编号。
+  - 区域预约收费模版  为空则取车场预约收费模版
+- 管理员可以通过页面设置区域预约信息。
+- 平台将区域预约信息下发给E8。
+- ps:所属车位应该在车位表中去关联区域。不在这里展示出来
+- ps:车场的那几个预约参数,可以考虑在区域都有一份,细分每个区域,区域配置不存在,则使用车场配置。
+
+##### 车辆预约
+- 用户可以通过小程序来预约车位。
+- 需要选择的信息包含
+  - 预约的车场
+  - 预约的区域 可选
+  - 预约的车位 可选
+  - 预约入场时间 (小程序页面应该提醒最早,最晚入场时间)
+  - 预约出场时间  (对应需要多次预约有用。相同时间段内)
+  - 预约车牌号
+- 平台收到预约信息后的处理
+  - 判断车场是否开启预约。没有开启预约则返回预约失败,错误信息:该车次不支持预约停车。
+  - 判断预约时间是否在车场预约周期内。不在则返回预约失败,错误信息:预约时间不在车场预约周期内。
+  - 判断预约时间是否在车场可提前预约小时数内。不在则返回预约失败,错误信息:预约时间不在车场可提前预约小时数内。
+  - 判断预约时间是否在车场可预约停车时长内。不在则返回预约失败,错误信息:预约时间不在车场可预约停车时长内。
+  - 判断是否已经存在预约记录,预约的周期包含当前的预约入场时间。
+  - 判断当前车辆是否在预约限制名单中,如果在则返回预约失败,错误信息:该车辆已被限制预约,${yyyy-HH-dd}后才可以预约。
+  - 如果是车场级预约:
+    - 判断当前车辆在当前车场是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功。不用操作车位数锁定。
+    - 如果当前预约周期没有存在预约记录。判断当前车场可预约车位数是否大于0。
+    - 如果可预约车位数大于0,则锁定车位。预约成功。
+    - 否则返回预约失败,错误信息:该车场已无可用停车位。
+  - 如果是车位级预约(区域):
+    - 判断当前车辆在当前车场当前区域是否在当前预约周期是否已经存在预约记录。如果存在,则预约成功,并且指定的车位跟之前的保持一致。不用操作车位数锁定。
+    - 判断当前区域的可预约车位数是否大于0。
+    - 如果区域可预约车位数大于0,锁定车位。预约成功。
+    - 否则返回预约失败,错误信息:该车场已无可用停车位。
+  - 如果是车位级预约(车位):
+    - 不支持多次预约不同的车位。提醒已经在当前车场存在其他预约记录,并且预约了其他车位。为了方便车位管理,只支持再预约这个车位。
+    - 对于上面的限制,可能有点不太合理,可以限制限制最多预约车位数来限制。
+    - 其他的同车位级预约(区域)。
+- 预约成功后,将预约记录下发给E8。
+##### 取消预约
+- 用户可以通过小程序来取消预约。
+- 平台判断预约的记录是否存在。不存在则返回取消失败,错误信息:该预约记录不存在。
+- 判断取消的预约记录是否已经驶入,已经驶入则返回取消失败,错误信息:该预约记录已驶入。
+- 判断预约的记录是否已经过最后驶入时间,如果已经超过则返回取消失败,错误信息:该预约记录已超时。
+- 取消预约成功,释放车位,更新预约记录。
+- 如果当前车场当前周期存在多条预约记录,则不需要释放车位。
+- 如果当前车场当前周期存在多条预约记录,并且是车位级预约(非区域),则不需要释放车位(需要根据车位预约的方式做调整)。
+- 下发取消预约记录给E8。
+##### 修改预约
+- 用户可以通过小程序来修改预约。
+- 平台判断预约的记录是否存在。不存在则返回修改失败,错误信息:该预约记录不存在。
+- 判断修改的预约记录是否已经驶入,已经驶入则返回修改失败,错误信息:该预约记录已驶入。
+- 判断修改的预约记录是否已经过最后驶入时间,如果已经超过则返回修改失败,错误信息:该预约记录已超时。
+- 如果修改为其他的预约周期,则不支持修改,需要取消预约,重新预约。
+- 如果修改驶入时间,驶出时间周期内存在当前车辆已经预约的记录,则不支持修改。错误信息:该时间段内已有预约记录。
+- 如果修改车牌,同样需要判断修改后的车牌是否存在时间交叉的停车记录。如果存在则不支持修改,错误信息:该车牌已存在预约记录。
+- 不支持修改其他的车场。
+- 修改区域,需要判断修改后的区域是否在车场中。
+- 修改区域需要判断修改后的区域是否存在预约记录。存在的预约记录并且存在时间冲突,则不支持修改。错误信息:该区域已存在预约记录。
+- 修改区域后需要判断区域的车位数,如果车位数不够,则不支持修改。错误信息:该区域已无可用停车位。
+##### 预约记录管理
+- 平台需要提供预约记录管理接口,包括预约记录列表,查询预约记录详情。
+- 小程序可以通过接口查询当前用户的预约记录列表,预约详情。
+##### 车辆驶入
+- 车辆驶入,E8需要判断是否在当前时间段内存在预约记录。
+- 不存在预约记录,则不予开闸。
+- 存在预约记录,则判断是否已经驶入。已经驶入,给于开闸,记录多次驶入异常信息。
+- 预约记录已经驶出,则不予开闸。
+- 开闸后,E8将车辆驶入消息上传给平台。
+- 平台更新预约驶入时间。(不确定这里应该跟E8怎么做这个同步关系。)
+##### 车辆驶出
+- E8上传车辆驶出记录。
+- 平台收到记录后,更新预约驶出时间。
+- 车场级预约:
+  - 判断当前预约周期内是否存在其他未开始的预约记录。
+  - 存在则不需要释放车位数。
+- 车位级预约(区域):
+  - 判断当前预约周期内当前区域是否存在其他未开始的预约记录。
+  - 存在则不需要释放车位数。
+- 车位级预约(车位):
+  - 判断当前预约周期内当前车位是否存在其他未开始的预约记录。
+  - 存在则不需要释放车位数。
+##### 爽约检查任务
+- 需要确定一件事情,爽约限制的是车,还是人。
+- 平台需要提供爽约检查任务。
+- 对于已经过了最晚预约驶入时间的车辆,修改状态为爽约。
+- 平台需要提供爽约列表,查询爽约详情。
+- 定时任务检测出预约记录设置的爽约限制天数内爽约次数超过爽约次数限制的人。
+- 将达到爽约次数限制的人,假如到限制列表中去。
+- 对于在爽约限制列表中的人:
+  - 限制其预约
+  - 预约的时候判断爽约限制是否已经到期,到期则移除。
+  - 同时添加定时任务,将检测爽约到期的用户,移除爽约限制列表。
+##### 表结构设计
+- 后续再提供
+
+
+## 人行
+### v1实现
+在v1中,访客分为访客预约跟邀请访客两种模式。其中访客预约是访客主动预约访问某个项目通道。邀请访客则是项目管理员主动邀请客户来访。
+#### 访客预约
+##### 新增预约
+- 用户在小程序选择预约的项目。输入手机号码,姓名,被访人手机号码,开始时间,结束时间。随从人数,车辆,上传人脸。点击预约。
+- 平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。
+- 在预约时间段内,则预约成功。
+##### 预约审核
+- 被访人,或者管理员收到预约访问请求,可以审核成功,审核失败。
+- 用户会收到审核结果提醒,审核成功的则可以访问。
+##### 访客来访开闸
+- 用户在预约时间段内,可以访问。
+- 访问通行的鉴权方式可以是人脸,也可以是预约记录的二维码。
+#### 邀请访客
+##### 新增邀请
+- 业主,管理员在小程序选择邀请项目。输入手机号码,姓名,开始时间,结束时间。随从人数,车辆,点击邀请。
+- 平台收到邀请信息后,判断当前项目是否在预约时间段,不在则返回邀请失败。
+##### 接收邀请
+- 被邀请人,收到邀请访问请求,可以接收,可以拒绝。
+##### 访客来访开闸
+- 用户在邀请时间段内,可以访问。
+- 访问通行的鉴权方式是预约记录的二维码。
+### v2计划
+#### 概述
+V2也只实现访客预约跟邀请访客两种模式。做出以下优化:
+- 优化一:对于访客预约的时候,输入项目去查询项目是一个比较不友好的操作。用户不输入的时候,是没有可选的。可以提供通过被访人手机号码,通过被访人手机号码,自动定位到项目,供用户选择。这里存在的问题就是用户隐私。
+也可以通过项目设置一个简单的项目预约编号,用户输入编号查询,或者直接输入项目预约编号预约。
+- 优化二:用户预约之后,应该可以设置一个催办审核的按钮。用户在长时间没有得到审核,可以点击催办审核。
+- 优化三:对于有些项目只想提供预约,或者只想提供邀请,可以设置项目预约模式。
+
+#### 详细设计
+##### 项目预约管理
+- 管理员可以通过页面设置项目预约信息。预约相关设置包含:
+  - 预约时间周期 自然天  自然周
+  - 预约时间段 开始时间  结束时间
+  - 预约车场编号   前两万大写字母后四位数字 非必须
+  - 邀请是否自动接收 默认 否
+  - 预约模式   0 支持预约跟邀请  1 支持预约 2 支持邀请
+- 平台将项目预约配置下发给E8。
+##### 访客预约
+- 访客通过跟项目方的协商得到项目方的名称或者预约项目编号。
+- 用户在小程序选择预约的项目。需要输入的参数有:
+  - 手机号码
+  - 姓名
+  - 被访人手机号码
+  - 开始时间
+  - 结束时间
+  - 随行人数
+  - 随行车牌
+  - 人脸
+- 判断项目是否存在。不存在则返回预约失败,错误信息:项目不存在。
+- 判断被访人电话是否为业主,如果是不是业主则返回预约失败,错误信息:被访人不存在。
+- 平台收到预约信息后,判断当前项目是否在预约时间段,不在则返回预约失败。错误信息:预约时间不在预约周期内。
+- 判断预约时间段在不在项目的通行时间段内。不在则返回预约失败,错误信息:预约时间不在项目通行时间段内。 ps:通行时间段内,通道才可以打开。可以考虑通行时间段当成预约时间段,也可以校验通行时间段来限制预约时间段的设置。
+- 预约提交成功,并同步给E8
+- 同步给E8的时候还需要下发预约人脸凭证,二维码凭证
+- 平台将生成审核消息给被访人。被访人打开小程序也可以看到审核消息。
+
+###### 预约审核
+- 被访人收到预约请求,可以审核成功,审核失败。
+- 当被访人存在多个预约请求,支持批量审核通过。
+###### 用户来访开闸
+- 用户在预约时间段内,可以访问。
+- 用户可以通过之前上传的人脸,通过用户人脸识别入场。
+- 用户也可以通过预约的二维码入场。
+- E8设备通过凭证判断用户是否可以入参。
+- 如果用户有随行车辆,则E8识别车牌凭证入场。
+- 开闸后,E8将开闸的消息同步给平台。
+- 平台将预约记录更新已完成。
+
+##### 邀请访客
+###### 业主邀请
+- 业主在小程序邀请人员。输入参数有:
+  - 手机号码
+  - 姓名
+  - 开始时间
+  - 结束时间
+  - 随从人数
+  - 车牌
+- 判断当前项目是否在预约时间段,不在则返回邀请失败。错误信息:邀请时间不在预约周期内。
+- 判断预约时间段在不在项目的通行时间段内。不在则返回邀请失败,错误信息:预约时间不在项目通行时间段内。
+- 平台收到邀请记录,如果项目设置邀请自动接收,则状态为已接收。否则状态为未接收。
+- 平台将生成审核消息给被邀请人。被邀请人打开小程序也可以看到审核消息。
+###### 客户接收邀请
+- 被邀请人收到邀请请求,可以接收,可以拒绝。
+- 接收邀请后,平台将下发凭证到E8,同步邀请记录到E8。
+###### 用户来访开闸
+- 同预约访客开闸部分,不重述。