Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

wuxiang 4 napja
szülő
commit
1ef771c64a
25 módosított fájl, 589 hozzáadás és 917 törlés
  1. 28 68
      supervision-admin/resources/conf/acs/Face/AddFaceInfoInputParam.json
  2. 8 16
      supervision-admin/resources/conf/acs/Face/AddFaceInfoOutputParam.json
  3. 5 11
      supervision-admin/resources/conf/acs/Face/DeleteFaceInfoInputParam.json
  4. 5 11
      supervision-admin/resources/conf/acs/Face/DeleteFaceInfoOutputParam.json
  5. 22 22
      supervision-admin/resources/conf/acs/Face/FaceRecordTotalOutputParam.json
  6. 43 48
      supervision-admin/resources/conf/acs/Face/SearchFaceInfoInputParam.json
  7. 41 47
      supervision-admin/resources/conf/acs/Face/SearchFaceInfoOutputParam.json
  8. 16 45
      supervision-admin/resources/conf/acs/Face/SetUpFaceInfoInputParam.json
  9. 5 5
      supervision-admin/resources/conf/acs/Face/SetUpFaceInfoOutputParam.json
  10. 25 63
      supervision-admin/resources/conf/acs/Face/UpdateFaceInfoInputParam.json
  11. 5 11
      supervision-admin/resources/conf/acs/Face/UpdateFaceInfoOutputParam.json
  12. 36 44
      supervision-admin/resources/conf/acs/User/AddUserInfoInputParam.json
  13. 5 37
      supervision-admin/resources/conf/acs/User/AddUserInfoOutputParam.json
  14. 8 28
      supervision-admin/resources/conf/acs/User/DeleteUserInfoInputParam.json
  15. 10 0
      supervision-admin/resources/conf/acs/User/GetUserCountOutputParam.json
  16. 11 26
      supervision-admin/resources/conf/acs/User/GetUserInfoInputParam.json
  17. 38 109
      supervision-admin/resources/conf/acs/User/GetUserInfoOutputParam.json
  18. 33 174
      supervision-admin/resources/conf/acs/User/ModifyUserInfoInputParam.json
  19. 31 52
      supervision-admin/resources/conf/acs/User/SetUserInfoInputParam.json
  20. 5 10
      supervision-admin/resources/conf/acs/User/SetUserInfoOutputParam.json
  21. 43 44
      supervision-admin/src/main/java/com/supervision/web/ConnectSDK/carCamera/alarm/CarCameraAlarmDataParse.java
  22. 63 17
      supervision-admin/src/main/java/com/supervision/web/ConnectSDK/peopleDoor/Acs/FaceManage.java
  23. 83 24
      supervision-admin/src/main/java/com/supervision/web/ConnectSDK/peopleDoor/Acs/UserManage.java
  24. 17 5
      supervision-admin/src/main/java/com/supervision/web/ConnectSDK/peopleDoor/PeopleDoorDeviceManager.java
  25. 3 0
      supervision-admin/src/main/resources/application.yml

+ 28 - 68
supervision-admin/resources/conf/acs/Face/AddFaceInfoInputParam.json

@@ -1,74 +1,34 @@
 {
-  "faceURL": "test",
-  /*opt, string, 人脸url, range:[,]*/
-  "faceLibType": "blackFD",
-  /*req, enum, 人脸库类型, subType:string, [blackFD#名单库,staticFD#静态库], desc:人脸库类型: blackFD-名单库, staticFD-静态库, string类型, 最大长度为32*/
-  "FDID": "test",
-  /*req, string, 人脸库ID, range:[,], desc:人脸库ID, string类型, 最大长度为63字节,多个人脸库用逗号隔开;*/
-  "FPID": " test",
-  /*opt, string, 人脸记录ID, range:[,], desc:人脸记录ID(与非视频工号(人员ID)字段一致), string类型, 最大长度为63字节*/
-  "name": "张三",
-  /*req, string, 人脸图片对应的人员姓名, range:[,], desc:最大长度为96字节*/
-  "gender": "male",
-  /*opt, enum, 人脸图片对应的人员性别, subType:string, [male#男,female#女,unknown#未知], desc:最大长度为32*/
-  "bornTime": "2004-05-03",
-  /*req, string, 人脸图片对应的人员出生日期, range:[,], desc:最大长度为20*/
-  "city": "130100",
-  /*opt, string, 人脸图片对应的人员出生城市编号, range:[,], desc:人脸图片对应的人员出生城市编号(详见:全国各省份城市列表), string类型, 最大长度为32*/
-  "certificateType ": "ID",
-  /*opt, enum, 证件类型, subType:string, [ID#身份证,other#其他], desc:最大长度为10*/
-  "certificateNumber": "test",
-  /*opt, string, 证件号, range:[,], desc:string类型, 最大长度为32字节(由数字和字母 "0-9a-zA-Z"组成)*/
-  "caseInfo": "test",
-  /*opt, string, 备注信息, range:[,], desc:string类型, 最大长度为192字节, {dep if type == blackFD}*/
-  "tag": "aa,bb,cc,dd",
-  /*opt, string, 自定义标签, range:[,], desc:自定义标签,单个标签最大48字节,(最多4个标签, 英文逗号隔开, 最大长度为195字节), string类型, , {dep if faceLibType == blackFD}*/
-  "address": "test",
-  /*opt, string, 人员住址, range:[,], desc:最大长度为192字节, {dep if faceLibType == staticFD }*/
-  "customInfo": "test",
-  /*opt, string, 自定义信息, range:[,], desc:最大长度为192字节, {dep if faceLibType == staticFD }*/
-  "modelData": "test",
-  /*opt, string, 目标模型数据, range:[,], desc:目标模型数据,字符串类型,传输过程中针对二进制非建模数据进行base64的加密处理*/
-  "transfer": true,
-  /*opt, bool, PBG对接,
-  desc:boolean类型,PBG对接,需要设备开启微视云安全认证,为了兼容原有功能,对部分协议进行变更,
-  涉及到名单添加和名单修改2个接口,协议中增加是否转存的字段,不填默认不转存,如果是web操作,需要将此字段写成需要转存,智能应用服务器1.1.0增加*/
-  "operateType": "byTerminal",
-  /*opt, enum, 操作类型, subType:string, [byTerminal#按终端操作]*/
-  "terminalNoList": [
-    1
-  ],
-  /*opt, array, type为byTerminal, subType:int, range:[,], desc:type为byTerminal,byTerminalOrg时必填,终端ID列表(目前仅支持单个终端)*/
-  "PicFeaturePoints": [
-    /*opt, array, 图片特征点坐标, subType:object, range:[,]*/
+  "faceURL": "$faceURL",                          // 【可选】人脸URL(字符串类型)
+  "faceLibType": "$faceLibType",                       // 【必填】人脸库类型 [blackFD 名单库, staticFD 静态库],最大长度32
+  "FDID": "$FDID",                                // 【必填】人脸库ID(多个库以逗号分隔),最大长度63字节
+  "FPID": "$FPID",                                // 【可选】人脸记录ID(与人员ID一致),最大长度63字节
+  "name": "$name",                                // 【必填】人员姓名,最大长度96字节
+  "gender": "$gender",                            // 【可选】性别 [male 男, female 女, unknown 未知],最大长度32
+  "bornTime": "$bornTime",                        // 【必填】出生日期,最大长度20字节
+  "city": "$city",                                // 【可选】出生城市编号(详见全国城市列表),最大长度32字节
+  "certificateType": "$certificateType",          // 【可选】证件类型 [ID 身份证, other 其他],最大长度10字节
+  "certificateNumber": "$certificateNumber",      // 【可选】证件号(0-9a-zA-Z 组成),最大长度32字节
+  "caseInfo": "$caseInfo",                        // 【可选】备注信息(当类型为 blackFD 时有效),最大长度192字节
+  "tag": "$tag",                                  // 【可选】自定义标签(最多4个,英文逗号分隔),最大长度195字节(单个≤48字节)
+  "address": "$address",                          // 【可选】住址(当类型为 staticFD 时有效),最大长度192字节
+  "customInfo": "$customInfo",                    // 【可选】自定义信息(当类型为 staticFD 时有效),最大长度192字节
+  "modelData": "$modelData",                      // 【可选】模型数据(base64 编码的二进制建模数据)
+  "transfer": "$transfer",                        // 【可选】是否PBG转存(布尔值,设备需开启微视云安全认证)
+  "operateType": "$operateType",                  // 【可选】操作类型 [byTerminal 按终端操作]
+  "terminalNoList": ["$terminalNoList"],              // 【可选】终端ID列表(byTerminal/byTerminalOrg时必填,仅支持单个终端)
+  "PicFeaturePoints": [                           // 【可选】图片特征点坐标数组
     {
-      "featurePointType": "face",
-      /*req, enum, 特征点类型, subType:string, [face#人脸,leftEye#左眼,rightEye#右眼,leftMouthCorner#左嘴角,rightMouthCorner#右嘴角,nose#鼻子], desc:特征点类型:face-人脸,leftEye-左眼,rightEye-右眼,leftMouthCorner-左嘴角,rightMouthCorner-右嘴角,nose-鼻子*/
-      "coordinatePoint": {
-        /*opt, object, 坐标点, desc:坐标原点位于左上方*/
-        "x": 1,
-        /*req, int, x坐标, range:[0,1000], step:, unit:, unitType:, desc:坐标进行归一化处理*/
-        "y": 1,
-        /*req, int, y坐标, range:[0,1000], step:, unit:, unitType:, desc:坐标进行归一化处理*/
-        "width": 1,
-        /*opt, int, 宽度, range:[0,1000], step:, unit:, unitType:, desc:当featurePointType为face时必填*/
-        "height": 1
-        /*opt, int, 高度, range:[0,1000], step:, unit:, unitType:, desc:当featurePointType为face时必填*/
+      "featurePointType": "$featurePointType",     // 【必填】特征点类型 [face 人脸, leftEye 左眼, rightEye 右眼, leftMouthCorner 左嘴角, rightMouthCorner 右嘴角, nose 鼻子]
+      "coordinatePoint": {                        // 【可选】坐标点对象(原点位于左上角)
+        "x": "$x",                                // 【必填】x坐标(0-1000,归一化)
+        "y": "$y",                                // 【必填】y坐标(0-1000,归一化)
+        "width": "$width",                        // 【可选】宽度(featurePointType 为 face 时必填)
+        "height": "$height"                       // 【可选】高度(featurePointType 为 face 时必填)
       }
     }
   ],
-  "faceType": "normalFace",
-  /*opt, enum, 人脸类型, subType:string, [normalFace#普通人脸(默认),patrolFace#巡更人脸,hijackFace#胁迫人脸,superFace#超级人脸]*/
-  "saveFacePic": true,
-  /*opt, bool, 是否保存人脸底图*/
-  "leaderPermission": [
-    1,
-    2,
-    3,
-    4
-  ]
-  /*opt, array, 首次认证权限, subType:int, range:[1,4],
-  desc:数组为空表示清空人员首次认证权限
-  表示人员具有1,2,3,4门编号的首次认证权限*/
+  "faceType": "$faceType",                        // 【可选】人脸类型 [normalFace 普通, patrolFace 巡更, hijackFace 胁迫, superFace 超级人脸]
+  "saveFacePic": "$saveFacePic",                  // 【可选】是否保存人脸底图(布尔类型)
+  "leaderPermission": ["$doorNo1", "$doorNo2"]    // 【可选】首次认证权限(门编号数组,为空表示清空)
 }
-

+ 8 - 16
supervision-admin/resources/conf/acs/Face/AddFaceInfoOutputParam.json

@@ -1,18 +1,10 @@
 {
-  "requestURL": "test",
-  /*ro, opt, string, 请求URL, range:[,]*/
-  "statusCode": 1,
-  /*ro, req, int, 状态码, range:[,], step:, unit:, unitType:*/
-  "statusString": "test",
-  /*ro, req, string, 状态描述, range:[,]*/
-  "subStatusCode": "test",
-  /*ro, req, string, 子状态码, range:[,]*/
-  "errorCode": 1,
-  /*ro, opt, int, 错误码, range:[,], step:, unit:, unitType:, desc:当statusCode不为1时*/
-  "errorMsg": "ok",
-  /*ro, opt, string, 错误描述, range:[,], desc:当statusCode不为1时*/
-  "FPID": "test",
-  /*ro, opt, string, 人脸记录ID, range:[,], desc:人脸数据添加成功之后返回的人脸记录ID, 具有唯一性, string类型,最大长度为63字节, {dep if errcode == 1 && errMsg == ok}*/
-  "rowKey": "test"
-  /*ro, opt, string, 人脸记录rowKey, range:[,], desc:人脸数据添加成功之后返回的人脸记录rowKey, 具有唯一性, string类型,最大长度为64字节, {dep if errcode == 1 && errMsg == ok*/
+  "requestURL": "${requestURL}",           // 【可选】请求URL(字符串类型,占位符)
+  "statusCode": 1,              // 【必填】状态码(整数类型,占位符)
+  "statusString": "${statusString}",        // 【必填】状态描述(字符串类型,占位符)
+  "subStatusCode": "${subStatusCode}",      // 【必填】子状态码(字符串类型,占位符)
+  "errorCode": ${errorCode},                // 【可选】错误码(当 statusCode ≠ 1 时返回,占位符)
+  "errorMsg": "${errorMsg}",                // 【可选】错误描述(当 statusCode ≠ 1 时返回,占位符)
+  "FPID": "${FPID}",                        // 【可选】人脸记录ID(添加成功后返回,占位符,最大长度63字节)
+  "rowKey": "${rowKey}"                     // 【可选】人脸记录 rowKey(添加成功后返回,占位符,最大长度64字节)
 }

+ 5 - 11
supervision-admin/resources/conf/acs/Face/DeleteFaceInfoInputParam.json

@@ -1,16 +1,10 @@
 {
-  "FPID": [
-    /*opt, array, 人脸记录ID列表, subType:object, range:[,]*/
+  "FPID": [                             // 【可选】人脸记录ID列表(数组,对象类型)
     {
-      "value":  "test",
-      /*req, string, 人脸记录ID, range:[0,63]*/
-      "rowKey":  "test"
-      /*opt, string, 人脸记录数据库主键, range:[0,64], desc:可选,人脸记录数据库主键,根据rowKey进行查询,能提高查找效率,string,64字节 在轻量级产品中是必填字段*/
+      "value": "${FPID_value}",                  // 【必填】人脸记录ID(字符串类型,长度0–63字节)
+      "rowKey": "${rowKey}"                  // 【可选】数据库主键(rowKey,可提高查询效率,轻量级产品中必填,最大64字节)
     }
   ],
-  "operateType":  "byTerminal",
-  /*opt, enum, 操作类型, subType:string, [byTerminal#按终端操作]*/
-  "terminalNoList": [1]
-  /*opt, array, 终端ID列表, subType:int, range:[,], desc:可选,array,type为byTerminal,byTerminalOrg时必填,终端ID列表(目前仅支持单个终端)*/
+  "operateType": "${operateType}",          // 【可选】操作类型 [byTerminal 按终端操作]
+  "terminalNoList": [1]                 // 【可选】终端ID列表(byTerminal/byTerminalOrg时必填,仅支持单个终端)
 }
-

+ 5 - 11
supervision-admin/resources/conf/acs/Face/DeleteFaceInfoOutputParam.json

@@ -1,13 +1,7 @@
 {
-  "statusCode": 1,
-  /*ro, opt, int, 状态码, range:[,], step:, unit:, unitType:, desc:无法用1表示时(1表示成功且无特殊状态)必须返回*/
-  "statusString": "ok",
-  /*ro, opt, string, 状态描述, range:[1,64], desc:无法用ok表示时(ok表示成功且无特殊状态)必须返回*/
-  "subStatusCode": "ok",
-  /*ro, opt, string, 子状态码, range:[1,64], desc:无法用ok表示(ok表示成功且无特殊状态)必须返回*/
-  "errorCode": 1,
-  /*ro, opt, int, 错误码, range:[,], step:, unit:, unitType:, desc:当statusCode不为1时,与subStatusCode对应*/
-  "errorMsg": "ok"
-  /*ro, opt, string, 错误信息, range:[,], desc:当statusCode不为1时,必须返回,解释信息在协议约束中,允许设备在后续的版本迭代中,进行优化丰富提升(不限制死)*/
+  "statusCode": 1,                      // 【可选】状态码(整数类型,1 表示成功且无特殊状态,无法用 1 表示时必须返回)
+  "statusString": "ok",                 // 【可选】状态描述(字符串类型,ok 表示成功且无特殊状态,无法用 ok 表示时必须返回)
+  "subStatusCode": "ok",                // 【可选】子状态码(字符串类型,ok 表示成功且无特殊状态,无法用 ok 表示时必须返回)
+  "errorCode": 1,                       // 【可选】错误码(当 statusCode ≠ 1 时返回,对应 subStatusCode)
+  "errorMsg": "ok"                      // 【可选】错误信息(当 statusCode ≠ 1 时必须返回,用于说明错误原因)
 }
-

+ 22 - 22
supervision-admin/resources/conf/acs/Face/FaceRecordTotalOutputParam.json

@@ -1,28 +1,28 @@
 {
-  "requestURL": "http://10.7.52.31:8080/kms/services/rest/dataInfoService/downloadFile",
-  "statusCode": 1,
-  "statusString": "ok",
-  "subStatusCode": "ok",
-  "errorCode": 1,
-  "errorMsg": "ok",
-  "FDRecordDataInfo": [
+  "requestURL": "${requestURL}",                 // 【可选】请求URL(字符串类型,占位符)
+  "statusCode": 1,                               // 【可选】状态码(1 表示成功且无特殊状态,无法用1表示时必须返回,占位符)
+  "statusString": "${statusString}",             // 【可选】状态描述(ok 表示成功且无特殊状态,无法用ok表示时必须返回,占位符)
+  "subStatusCode": "${subStatusCode}",           // 【可选】子状态码(ok 表示成功且无特殊状态,无法用ok表示时必须返回,占位符)
+  "errorCode": ${errorCode},                     // 【可选】错误码(当 statusCode ≠ 1 时返回,对应 subStatusCode,占位符)
+  "errorMsg": "${errorMsg}",                     // 【可选】错误信息(当 statusCode ≠ 1 时必须返回,用于说明错误原因,占位符)
+  "FDRecordDataInfo": [                          // 【可选】人脸库记录信息列表(数组,对象类型)
     {
-      "FDID": "test",
-      "faceLibType": "blackFD",
-      "name": "test",
-      "recordDataNumber": 123,
-      "libArmingType": "armingLib",
-      "libAttribute": "general",
-      "personnelFileEnabled": true
+    "FDID": "${FDID}",                            // 【必填】人脸库ID(字符串类型,占位符,最大长度63字节)
+    "faceLibType": "${faceLibType}",              // 【必填】人脸库类型 [blackFD 名单库, staticFD 静态库,占位符]
+    "name": "${name}",                            // 【可选】人脸库名称(字符串类型,占位符)
+    "recordDataNumber": ${recordDataNumber},      // 【可选】记录数量(整数类型,占位符,表示该库内人脸记录数)
+    "libArmingType": "${libArmingType}",          // 【可选】布防类型 [armingLib 布防库, unArmingLib 未布防库,占位符]
+    "libAttribute": "${libAttribute}",            // 【可选】库属性 [general 普通库, important 重点库, temporary 临时库,占位符]
+    "personnelFileEnabled": ${personnelFileEnabled}  // 【可选】是否启用人员档案(true 表示启用,占位符)
     }
   ],
-  "totalRecordDataNumber": 500000,
-  "FDCapacity": {
-    "total": 0,
-    "use": 0,
-    "remain": 0,
-    "maxRecordDataNumber": 0,
-    "useRecordDataNumber": 0,
-    "remainRecordDataNumber": 0
+  "totalRecordDataNumber": ${totalRecordDataNumber},   // 【可选】系统总记录数(整数类型,占位符,所有人脸库记录总量)
+  "FDCapacity": {                                 // 【可选】人脸库容量信息(对象类型)
+  "total": ${total},                              // 【可选】总容量(单位:条,占位符)
+  "use": ${use},                                  // 【可选】已使用容量(单位:条,占位符)
+  "remain": ${remain},                            // 【可选】剩余容量(单位:条,占位符)
+  "maxRecordDataNumber": ${maxRecordDataNumber},  // 【可选】最大支持人脸记录数量(单位:条,占位符)
+  "useRecordDataNumber": ${useRecordDataNumber},  // 【可选】当前已使用人脸记录数量(单位:条,占位符)
+  "remainRecordDataNumber": ${remainRecordDataNumber} // 【可选】剩余可用人脸记录数量(单位:条,占位符)
   }
 }

+ 43 - 48
supervision-admin/resources/conf/acs/Face/SearchFaceInfoInputParam.json

@@ -1,60 +1,55 @@
 {
-  "FDSearchDescription": {
-    "version": "2.0",
-    "searchID": "test",
-    "searchResultPosition": 0,
-    "maxResults": 30,
-    "FDID": "test",
-    "startTime": "1970-01-01+08:00",
-    "endTime": "1970-01-01+08:00",
-    "name": "test",
-    "sex": "male",
-    "province": "11",
-    "city": "11",
-    "certificateType": "ID",
-    "certificateNumber": "test",
-    "phoneNumber": "test",
-    "FaceModeList": [
+  "FDSearchDescription": {                        // 【必填】人脸搜索请求参数对象
+    "version": "2.0",                             // 【必填】接口版本号(固定值)
+    "searchID": "${searchID}",                    // 【必填】搜索任务ID(每次查询唯一)
+    "searchResultPosition": ${searchResultPosition}, // 【可选】查询起始位置(整数类型)
+    "maxResults": ${maxResults},                  // 【可选】最大返回数量
+    "FDID": "${FDID}",                            // 【可选】人脸库ID(指定查询目标库)
+    "startTime": "${startTime}",                  // 【可选】开始时间(YYYY-MM-DD+TZ)
+    "endTime": "${endTime}",                      // 【可选】结束时间(YYYY-MM-DD+TZ)
+    "name": "${name}",                            // 【可选】姓名
+    "sex": "${sex}",                              // 【可选】性别 [male, female, unknown]
+    "province": "${province}",                    // 【可选】省份代码
+    "city": "${city}",                            // 【可选】城市代码
+    "certificateType": "${certificateType}",      // 【可选】证件类型 [ID, passport, other]
+    "certificateNumber": "${certificateNumber}",  // 【可选】证件号码
+    "phoneNumber": "${phoneNumber}",              // 【可选】电话号码
+    "FaceModeList": [                             // 【可选】人脸模式列表
       {
-        "ModeInfo": {
-          "similarity": 0.0,
-          "modeData": "test"
+        "ModeInfo": {                             // 【必填】模式信息对象
+          "similarity": ${similarity},             // 【可选】相似度阈值 [0.0,1.0]
+          "modeData": "${modeData}"                // 【必填】人脸特征数据(Base64 编码)
         }
       }
     ],
-    "modelStatus": "modeling",
-    "modelingStatus": [
-      "success",
-      "failed",
-      "none"
-    ],
-    "customFaceLibID": "test",
-    "sortord": "time",
-    "order": "DESC",
-    "StrangerLibFaceAppendData": {
-      "PersonInfoExtendList": [
+    "modelStatus": "${modelStatus}",              // 【可选】建模状态 [modeling, success, failed]
+    "modelingStatus": ["success", "failed", "none"], // 【可选】固定枚举示例,不替换
+    "customFaceLibID": "${customFaceLibID}",      // 【可选】自定义人脸库ID
+    "sortord": "${sortord}",                      // 【可选】排序字段 [time, name, similarity]
+    "order": "${order}",                          // 【可选】排序方式 [ASC, DESC]
+    "StrangerLibFaceAppendData": {                // 【可选】陌生人库附加数据
+      "PersonInfoExtendList": [                   // 【可选】扩展信息列表
         {
-          "id": 1,
-          "enable": true,
-          "name": "test",
-          "value": "test"
+          "id": ${extendId},                      // 【可选】扩展字段编号
+          "enable": ${extendEnable},              // 【可选】是否启用该扩展字段
+          "name": "${extendName}",                // 【可选】扩展字段名称
+          "value": "${extendValue}"               // 【可选】扩展字段值
         }
       ]
     },
-    "OccurrencesInfo": {
-      "enabled": true,
-      "occurrences": 1,
-      "occurrencesSearchType": "greaterThanOrEqual"
+    "OccurrencesInfo": {                          // 【可选】出现次数筛选条件
+      "enabled": ${occurrencesEnabled},           // 【可选】是否启用出现次数条件
+      "occurrences": ${occurrences},              // 【可选】出现次数
+      "occurrencesSearchType": "${occurrencesSearchType}" // 【可选】筛选方式 [greaterThanOrEqual, lessThanOrEqual]
     },
-    "faceScore": 1,
-    "FDIDList": [
-      "test"
-    ],
-    "faceScoreMax": 0,
-    "pictureStatus": "normal",
-    "importStartTime": "1970-01-01T00:00:00+08:00",
-    "importEndTime": "1970-01-01T00:00:00+08:00",
-    "faceContrastSuccessStartTime": "1970-01-01T00:00:00+08:00",
-    "faceContrastSuccessEndTime": "1970-01-01T00:00:00+08:00"
+    "faceScore": ${faceScore},                    // 【可选】最低人脸评分 [0,100]
+    "FDIDList": ["${FDIDListItem}"],              // 【可选】人脸库ID列表
+    "faceScoreMax": ${faceScoreMax},              // 【可选】最高人脸评分 [0,100]
+    "pictureStatus": "${pictureStatus}",          // 【可选】图片状态 [normal, missing, corrupted]
+
+    "importStartTime": "${importStartTime}",      // 【可选】导入开始时间(ISO8601 格式)
+    "importEndTime": "${importEndTime}",          // 【可选】导入结束时间(ISO8601 格式)
+    "faceContrastSuccessStartTime": "${faceContrastSuccessStartTime}", // 【可选】比对成功起始时间
+    "faceContrastSuccessEndTime": "${faceContrastSuccessEndTime}"      // 【可选】比对成功结束时间
   }
 }

+ 41 - 47
supervision-admin/resources/conf/acs/Face/SearchFaceInfoOutputParam.json

@@ -1,60 +1,54 @@
 {
-  "FDSearchResult": {
-    "version": "2.0",
-    "searchID": "test",
-    "searchResultPosition": 0,
-    "maxResults": 30,
-    "FDID": "test",
-    "startTime": "1970-01-01+08:00",
-    "endTime": "1970-01-01+08:00",
-    "name": "test",
-    "sex": "male",
-    "province": "11",
-    "city": "11",
-    "certificateType": "ID",
-    "certificateNumber": "test",
-    "phoneNumber": "test",
-    "FaceModeList": [
+  "FDSearchResult": {                           // 【必填】人脸搜索结果对象
+    "version": "2.0",                           // 【必填】接口版本号(固定值)
+    "searchID": "${searchID}",                  // 【必填】搜索任务ID(每次搜索唯一)
+    "searchResultPosition": ${searchResultPosition},  // 【可选】搜索结果起始位置(整数)
+    "maxResults": ${maxResults},                // 【可选】最大返回数量
+    "FDID": "${FDID}",                          // 【可选】人脸库ID
+    "startTime": "${startTime}",                // 【可选】开始时间(字符串类型,格式 YYYY-MM-DD+TZ)
+    "endTime": "${endTime}",                    // 【可选】结束时间(字符串类型,格式 YYYY-MM-DD+TZ)
+    "name": "${name}",                          // 【可选】姓名
+    "sex": "${sex}",                            // 【可选】性别 [male, female, unknown]
+    "province": "${province}",                  // 【可选】省份代码
+    "city": "${city}",                          // 【可选】城市代码
+    "certificateType": "${certificateType}",    // 【可选】证件类型 [ID, passport, other]
+    "certificateNumber": "${certificateNumber}",// 【可选】证件号码
+    "phoneNumber": "${phoneNumber}",            // 【可选】电话号码
+    "FaceModeList": [                           // 【可选】人脸模式列表
       {
-        "ModeInfo": {
-          "similarity": 0.0,
-          "modeData": "test"
+        "ModeInfo": {                           // 【必填】模式信息对象
+          "similarity": ${similarity},           // 【可选】相似度(浮点数)
+          "modeData": "${modeData}"              // 【必填】人脸特征数据(Base64 编码)
         }
       }
     ],
-    "modelStatus": "modeling",
-    "modelingStatus": [
-      "success",
-      "failed",
-      "none"
-    ],
-    "customFaceLibID": "test",
-    "sortord": "time",
-    "order": "DESC",
-    "StrangerLibFaceAppendData": {
+    "modelStatus": "${modelStatus}",            // 【可选】建模状态 [modeling, success, failed]
+    "modelingStatus": ["success", "failed", "none"], // 【可选】固定可选值示例(无需替换)
+    "customFaceLibID": "${customFaceLibID}",    // 【可选】自定义人脸库ID
+    "sortord": "${sortord}",                    // 【可选】排序字段 [time, name, similarity]
+    "order": "${order}",                        // 【可选】排序方式 [ASC, DESC]
+    "StrangerLibFaceAppendData": {              // 【可选】陌生人库附加数据
       "PersonInfoExtendList": [
         {
-          "id": 1,
-          "enable": true,
-          "name": "test",
-          "value": "test"
+          "id": ${extendId},                    // 【可选】扩展字段编号
+          "enable": ${extendEnable},            // 【可选】是否启用
+          "name": "${extendName}",              // 【可选】扩展字段名称
+          "value": "${extendValue}"             // 【可选】扩展字段值
         }
       ]
     },
-    "OccurrencesInfo": {
-      "enabled": true,
-      "occurrences": 1,
-      "occurrencesSearchType": "greaterThanOrEqual"
+    "OccurrencesInfo": {                        // 【可选】出现次数筛选条件
+      "enabled": ${occurrencesEnabled},         // 【可选】是否启用
+      "occurrences": ${occurrences},            // 【可选】出现次数
+      "occurrencesSearchType": "${occurrencesSearchType}" // 【可选】筛选方式
     },
-    "faceScore": 1,
-    "FDIDList": [
-      "test"
-    ],
-    "faceScoreMax": 0,
-    "pictureStatus": "normal",
-    "importStartTime": "1970-01-01T00:00:00+08:00",
-    "importEndTime": "1970-01-01T00:00:00+08:00",
-    "faceContrastSuccessStartTime": "1970-01-01T00:00:00+08:00",
-    "faceContrastSuccessEndTime": "1970-01-01T00:00:00+08:00"
+    "faceScore": ${faceScore},                  // 【可选】最低人脸评分
+    "FDIDList": ["${FDIDListItem}"],            // 【可选】人脸库ID列表
+    "faceScoreMax": ${faceScoreMax},            // 【可选】最高人脸评分
+    "pictureStatus": "${pictureStatus}",        // 【可选】图片状态 [normal, missing, corrupted]
+    "importStartTime": "${importStartTime}",    // 【可选】导入开始时间(ISO8601 格式)
+    "importEndTime": "${importEndTime}",        // 【可选】导入结束时间(ISO8601 格式)
+    "faceContrastSuccessStartTime": "${faceContrastSuccessStartTime}", // 【可选】比对成功起始时间
+    "faceContrastSuccessEndTime": "${faceContrastSuccessEndTime}"      // 【可选】比对成功结束时间
   }
 }

+ 16 - 45
supervision-admin/resources/conf/acs/Face/SetUpFaceInfoInputParam.json

@@ -1,51 +1,22 @@
 {
-  "faceURL": "http",
-  /*opt, string, 图片url, range:[,]*/
-  "faceLibType": "blackFD",
-  /*req, enum, 人脸库类型, subType:string, [blackFD#名单库,staticFD#静态库], desc:必填, 人脸库类型: blackFD-名单库, staticFD-静态库, string类型, 最大长度为32*/
-  "FDID": "test",
-  /*req, string, 人脸库ID, range:[,], desc:最大长度为63字节,多个人脸库用逗号隔开*/
-  "FPID": " ",
-  /*opt, string, 人脸记录ID, range:[,], desc:可选, 人脸记录ID, string类型, 如果外部传入,最长63字节, 字母数字组合, 需要保证唯一性; 如果外部不传则由设备自动生成(与非视频工号(人员ID)字段一致)*/
-  "deleteFP": true,
-  /*opt, bool, 是否删除该人脸, desc:可选,boolean,是否删除该人脸,true-是(只有删除该人脸时,才填写该字段;新增或修改人脸时,不填写该字段)*/
-  "modelData": "test",
-  /*opt, string, 目标模型数据, range:[,], desc:可选,目标模型数据,字符串类型,传输过程中针对二进制非建模数据进行base64的加密处理*/
-  "PicFeaturePoints": [
-    /*opt, array, 特征图片坐标, subType:object, range:[,],
-    desc:图片特征点下发,若设备仅支持3种类型的特征点,平台下发3种以上特征点时,设备不能报错
-        背景:不同设备人脸评分算法不一致,导致平台评分通过的人脸下发至设备评分不通过,无法建模
-        解决方法:由上层平台采用统一的人脸评分以及特征点提取算法计算出图片的特征点并下发至设备,有了特征点可以保证设备建模成功,兼容不同设备人脸评分算法的差异性
-        特征点下发方式:特征点数据编码至人脸图片数据下发、特征点数据以json参数格式随人脸图片url下发
-        设备获取特征点优先级从高到低:1.图片内携带特征点 2.json格式特征点*/
+  "faceURL": "${faceURL}",  // 【可选】图片 URL(字符串类型,如 "http://example.com/face.jpg")
+  "faceLibType": "${faceLibType}",  // 【必填】人脸库类型 [blackFD#名单库, staticFD#静态库](字符串类型,最大长度32)
+  "FDID": "${FDID}",  // 【必填】人脸库ID(字符串类型,最大长度63字节;多个库用逗号分隔)
+  "FPID": "${FPID}",  // 【可选】人脸记录ID(字符串类型,最长63字节;外部传入需唯一,不传则设备自动生成,与人员ID一致)
+  "deleteFP": ${deleteFP},  // 【可选】是否删除该人脸(布尔类型,true 表示删除,仅在删除操作时填写)
+  "modelData": "${modelData}",  // 【可选】目标模型数据(字符串类型,Base64 编码的人脸模型内容)
+  "PicFeaturePoints": [  // 【可选】特征图片坐标数组(包含各类人脸特征点信息)
     {
-      "featurePointType": "face",
-      /*req, enum, 特征点类型, subType:string, [face#人脸,leftEye#左眼,rightEye#右眼,leftMouthCorner#左嘴角,rightMouthCorner#右嘴角,nose#鼻子], desc:必填,string,特征点类型:face-人脸,leftEye-左眼,rightEye-右眼,leftMouthCorner-左嘴角,rightMouthCorner-右嘴角,nose-鼻子*/
-      "coordinatePoint": {
-        /*opt, object, 点坐标*/
-        "x": 1,
-        /*req, int, x坐标, range:[0,1000], step:, unit:, unitType:, desc:坐标进行归一化处理*/
-        "y": 1,
-        /*req, int, y坐标, range:[0,1000], step:, unit:, unitType:, desc:坐标进行归一化处理*/
-        "width": 1,
-        /*opt, int, 宽度, range:[0,1000], step:, unit:, unitType:, desc:当featurePointType为face时必填*/
-        "height": 1
-        /*opt, int, 高度, range:[0,1000], step:, unit:, unitType:, desc:当featurePointType为face时必填*/
+      "featurePointType": "${featurePointType}",  // 【必填】特征点类型 [face#人脸, leftEye#左眼, rightEye#右眼, leftMouthCorner#左嘴角, rightMouthCorner#右嘴角, nose#鼻子]
+      "coordinatePoint": {  // 【可选】点坐标对象
+        "x": ${x},  // 【必填】X 坐标(整数类型,范围 [0,1000],坐标已归一化)
+        "y": ${y},  // 【必填】Y 坐标(整数类型,范围 [0,1000],坐标已归一化)
+        "width": ${width},  // 【可选】宽度(整数类型,范围 [0,1000],当 featurePointType 为 face 时必填)
+        "height": ${height}  // 【可选】高度(整数类型,范围 [0,1000],当 featurePointType 为 face 时必填)
       }
     }
   ],
-  "faceType": "normalFace",
-  /*opt, enum, 人脸类型, subType:string, [normalFace#普通人脸(默认),patrolFace#巡更人脸,hijackFace#胁迫人脸,superFace#超级人脸]*/
-  "saveFacePic": true,
-  /*opt, bool, 是否保存人脸底图*/
-  "leaderPermission": [
-    1,
-    2,
-    3,
-    4
-  ]
-  /*opt, array, 首次认证权限, subType:int, range:[1,4],
-  desc:数组为空表示清空人员首次认证权限
-  表示人员具有1,2,3,4门编号的首次认证权限*/
+  "faceType": "${faceType}",  // 【可选】人脸类型 [normalFace#普通人脸, patrolFace#巡更人脸, hijackFace#胁迫人脸, superFace#超级人脸]
+  "saveFacePic": ${saveFacePic},  // 【可选】是否保存人脸底图(布尔类型)
+  "leaderPermission": [${leaderPermission}]  // 【可选】首次认证权限(整数数组,范围 [1,4];为空数组表示清空首次认证权限,对应门编号)
 }
-

+ 5 - 5
supervision-admin/resources/conf/acs/Face/SetUpFaceInfoOutputParam.json

@@ -1,7 +1,7 @@
 {
-  "statusCode": 1,
-  "statusString": "ok",
-  "subStatusCode": "ok",
-  "errorCode": 1,
-  "errorMsg": "ok"
+  "statusCode": 1,  // 【可选】状态码,整数类型。1 表示成功且无特殊状态;当无法用 1 表示时必须返回。
+  "statusString": "ok", // 【可选】状态描述,字符串类型。ok 表示成功且无特殊状态;无法用 ok 表示时必须返回。
+  "subStatusCode": "ok", // 【可选】子状态码,字符串类型。ok 表示成功且无特殊状态;无法用 ok 表示时必须返回。
+  "errorCode": 1, // 【可选】错误码,整数类型。当 statusCode ≠ 1 时返回,对应 subStatusCode。
+  "errorMsg": "ok" // 【可选】错误信息,字符串类型。当 statusCode ≠ 1 时必须返回,用于说明错误原因。
 }

+ 25 - 63
supervision-admin/resources/conf/acs/Face/UpdateFaceInfoInputParam.json

@@ -1,69 +1,31 @@
 {
-  "faceURL": "test",
-  /*opt, string, 人脸图片URL方式上传时输入的图片存储URL, range:[0,256]*/
-  "name": "张三",
-  /*req, string, 人脸图片对应的人员姓名, range:[0,96]*/
-  "gender": "male",
-  /*opt, enum, 人脸图片对应的人员性别, subType:string, [male#男,female#女,unknown#未知]*/
-  "bornTime": "1970-01-01+08:00",
-  /*req, date, 人脸图片对应的人员出生日期*/
-  "city": "130100",
-  /*opt, string, 人脸图片对应的人员出生城市编号(详见全国各省份城市列表), range:[,]*/
-  "certificateType ": "ID",
-  /*opt, enum, 证件类型, subType:string, [ID#身份证]*/
-  "certificateNumber": "test",
-  /*opt, string, 证件号, range:[,]*/
-  "caseInfo": "test",
-  /*opt, string, 备注信息, range:[0,192], desc:dep if type == blackFD*/
-  "tag": "aa,bb,cc,dd",
-  /*opt, string, 自定义标签, range:[0,195], desc:单个标签最大48字节,(最多4个标签,  英文逗号隔开,  最大长度为195字节), dep if faceLibType == blackFD*/
-  "address": "test",
-  /*opt, string, 人员住址, range:[0,192], desc:dep if faceLibType == staticFD*/
-  "customInfo": "test",
-  /*opt, string, 自定义信息, range:[0,192], desc:dep if faceLibType == staticFD*/
-  "modelData": "test",
-  /*opt, string, 目标模型数据, range:[,], desc:传输过程中针对二进制非建模数据进行base64的加密处理*/
-  "rowKey ": "test",
-  /*opt, string, 人脸记录数据库主键, range:[0,64], desc:根据rowKey进行查询,能提高查找效率*/
-  "transfer": true,
-  /*opt, bool, 是否转存,
-  desc:PBG对接,需要设备开启微视云安全认证,为了兼容原有功能,对部分协议进行变更,
-      涉及到名单添加和名单修改2个接口,协议中增加是否转存的字段,不填默认不转存,如果是web操作,需要将此字段写成需要转存,智能应用服务器1.1.0增加*/
-  "PicFeaturePoints": [
-    /*opt, array, 图片特征点下发, subType:object, range:[,],
-    desc:若设备仅支持3种类型的特征点,平台下发3种以上特征点时,设备不能报错
-        背景:不同设备人脸评分算法不一致,导致平台评分通过的人脸下发至设备评分不通过,无法建模
-        解决方法:由上层平台采用统一的人脸评分以及特征点提取算法计算出图片的特征点并下发至设备,有了特征点可以保证设备建模成功,兼容不同设备人脸评分算法的差异性
-        特征点下发方式:特征点数据编码至人脸图片数据下发、特征点数据以json参数格式随人脸图片url下发
-        设备获取特征点优先级从高到低:1.图片内携带特征点 2.json格式特征点*/
+  "faceURL": "${faceURL}",  // 【可选】人脸图片URL方式上传时输入的图片存储URL(字符串类型,范围 [0,256])
+  "name": "${name}",  // 【必填】人脸图片对应的人员姓名(字符串类型,范围 [0,96])
+  "gender": "${gender}",  // 【可选】人员性别 [male#男, female#女, unknown#未知](枚举类型)
+  "bornTime": "${bornTime}",  // 【必填】出生日期(日期类型,格式如 "1970-01-01+08:00")
+  "city": "${city}",  // 【可选】人员出生城市编号(参考全国行政区划代码)
+  "certificateType": "${certificateType}",  // 【可选】证件类型 [ID#身份证](枚举类型)
+  "certificateNumber": "${certificateNumber}",  // 【可选】证件号(字符串类型)
+  "caseInfo": "${caseInfo}",  // 【可选】备注信息(字符串类型,范围 [0,192],名单库 blackFD 适用)
+  "tag": "${tag}",  // 【可选】自定义标签(多个标签用英文逗号分隔,最多4个标签,每个标签最长48字节,总长度 ≤195字节)
+  "address": "${address}",  // 【可选】人员住址(字符串类型,静态库 staticFD 适用)
+  "customInfo": "${customInfo}",  // 【可选】自定义信息(字符串类型,静态库 staticFD 适用)
+  "modelData": "${modelData}",  // 【可选】目标模型数据(base64 编码后的字符串,用于传输二进制非建模数据)
+  "rowKey": "${rowKey}",  // 【可选】人脸记录数据库主键(字符串类型,最大长度64字节,用于加速查询)
+  "transfer": ${transfer},  // 【可选】是否转存(布控网关 PBG 对接时使用,true 表示转存;布尔类型)
+  "PicFeaturePoints": [  // 【可选】图片特征点信息列表
     {
-      "featurePointType": "face",
-      /*req, enum, 特征点类型, subType:string, [face#人脸,leftEye#左眼,rightEye#右眼,leftMouthCorner#左嘴角,rightMouthCorner#右嘴角,nose#鼻子]*/
-      "coordinatePoint": {
-        /*opt, object, 区域, desc:坐标原点位于左上方*/
-        "x": 1,
-        /*req, int, x坐标, range:[0,1000], step:, unit:, unitType:, desc:坐标进行归一化处理,归至0-1000*/
-        "y": 1,
-        /*req, int, y坐标, range:[0,1000], step:, unit:, unitType:, desc:坐标进行归一化处理,归至0-1000*/
-        "width": 1,
-        /*opt, int, 宽度, range:[0,1000], step:, unit:, unitType:, desc:当featurePointType为face时必填*/
-        "height": 1
-        /*opt, int, 高度, range:[0,1000], step:, unit:, unitType:, desc:当featurePointType为face时必填*/
+      "featurePointType": "${featurePointType}",  // 【必填】特征点类型 [face#人脸, leftEye#左眼, rightEye#右眼, leftMouthCorner#左嘴角, rightMouthCorner#右嘴角, nose#鼻子]
+      "coordinatePoint": {  // 【可选】特征点区域坐标(原点位于左上角)
+        "x": ${x},  // 【必填】x 坐标(整数类型,范围 [0,1000],已归一化)
+        "y": ${y},  // 【必填】y 坐标(整数类型,范围 [0,1000],已归一化)
+        "width": ${width},  // 【可选】宽度(整数类型,范围 [0,1000],当类型为 face 时必填)
+        "height": ${height}  // 【可选】高度(整数类型,范围 [0,1000],当类型为 face 时必填)
       }
     }
   ],
-  "faceType": "normalFace",
-  /*opt, enum, 人脸类型, subType:string, [normalFace#普通人脸(默认),patrolFace#巡更人脸,hijackFace#胁迫人脸,superFace#超级人脸]*/
-  "saveFacePic": true,
-  /*opt, bool, 是否保存人脸底图*/
-  "leaderPermission": [
-    1,
-    2,
-    3,
-    4
-  ]
-  /*opt, array, 首次认证权限, subType:int, range:[1,4],
-  desc:数组为空表示清空人员首次认证权限
-  表示人员具有1,2,3,4门编号的首次认证权限*/
+  "faceType": "${faceType}",  // 【可选】人脸类型 [normalFace#普通人脸, patrolFace#巡更人脸, hijackFace#胁迫人脸, superFace#超级人脸]
+  "saveFacePic": ${saveFacePic},  // 【可选】是否保存人脸底图(布尔类型,true 表示保存)
+  "leaderPermission": [${leaderPermission}]  // 【可选】首次认证权限(整型数组,范围 [1,4];为空数组表示清空权限)
+  // 表示人员具有门编号 1、2、3、4 的首次认证权限
 }
-

+ 5 - 11
supervision-admin/resources/conf/acs/Face/UpdateFaceInfoOutputParam.json

@@ -1,13 +1,7 @@
 {
-  "statusCode": 1,
-  /*ro, opt, int, 状态码, range:[,], step:, unit:, unitType:, desc:无法用1表示时(1表示成功且无特殊状态)必须返回*/
-  "statusString": "ok",
-  /*ro, opt, string, 状态描述, range:[1,64], desc:无法用ok表示时(ok表示成功且无特殊状态)必须返回*/
-  "subStatusCode": "ok",
-  /*ro, opt, string, 子状态码, range:[1,64], desc:无法用ok表示(ok表示成功且无特殊状态)必须返回*/
-  "errorCode": 1,
-  /*ro, opt, int, 错误码, range:[,], step:, unit:, unitType:, desc:当statusCode不为1时,与subStatusCode对应*/
-  "errorMsg": "ok"
-  /*ro, opt, string, 错误信息, range:[,], desc:当statusCode不为1时,必须返回,解释信息在协议约束中,允许设备在后续的版本迭代中,进行优化丰富提升(不限制死)*/
+  "statusCode": 1, // 【可选】状态码,整数类型。1 表示成功且无特殊状态;无法用 1 表示时必须返回。
+  "statusString": "ok", // 【可选】状态描述,字符串类型(长度 1~64)。ok 表示成功且无特殊状态;无法用 ok 表示时必须返回。
+  "subStatusCode": "ok", // 【可选】子状态码,字符串类型(长度 1~64)。ok 表示成功且无特殊状态;无法用 ok 表示时必须返回。
+  "errorCode": 1, // 【可选】错误码,整数类型。当 statusCode ≠ 1 时返回,对应 subStatusCode。
+  "errorMsg": "ok"// 【可选】错误信息,字符串类型。当 statusCode ≠ 1 时必须返回。// 该字段用于解释错误原因,允许设备在后续版本中扩展或优化描述内容。
 }
-

+ 36 - 44
supervision-admin/resources/conf/acs/User/AddUserInfoInputParam.json

@@ -1,59 +1,51 @@
 {
-  "UserInfo": {                          // 人员信息对象
-    "employeeNo": "test",                // 【必填】工号(人员ID)
-    "name": "test",                      // 【可选】姓名
-    "userType": "normal",                // 【必填】人员类型 [normal 普通人, visitor 来宾, blackList 黑名单人员]
-    "closeDelayEnabled": true,           // 【可选】是否启用关门延迟
-
-    "Valid": {                           // 【可选】有效期设置
-      "enable": true,                    // 【必填】是否启用有效期
-      "beginTime": "2017-08-01T17:30:08+08:00",  // 【必填】有效期开始时间(本地或UTC)
-      "endTime": "2017-08-01T17:30:08+08:00",    // 【必填】有效期结束时间(本地或UTC)
-      "timeType": "local"                // 【可选】时间类型 [local 设备本地时间, UTC 标准时间]
+  "UserInfo": {  // 人员信息对象
+    "employeeNo": "${employeeNo}",  // 【必填】工号(人员ID)
+    "name": "${name}",  // 【可选】姓名
+    "userType": "${userType}",  // 【必填】人员类型 [normal 普通人, visitor 来宾, blackList 黑名单人员]
+    "closeDelayEnabled": ${closeDelayEnabled},  // 【可选】是否启用关门延迟(布尔类型)
+    "Valid": {  // 【可选】有效期设置
+      "enable": ${enable},  // 【必填】是否启用有效期(布尔类型)
+      "beginTime": "${beginTime}",  // 【必填】有效期开始时间(本地或UTC)
+      "endTime": "${endTime}",  // 【必填】有效期结束时间(本地或UTC)
+      "timeType": "${timeType}"  // 【可选】时间类型 [local 设备本地时间, UTC 标准时间]
     },
-
-    "belongGroup": "1,3,5",              // 【可选】所属群组
-    "password": "123456",                // 【可选】开门密码
-    "doorRight": "1,3",                  // 【可选】门权限(多个门用逗号分隔)
-
-    "RightPlan": [                       // 【可选】门权限计划(锁权限计划)
+    "belongGroup": "${belongGroup}",  // 【可选】所属群组(多个群组用逗号分隔)
+    "password": "${password}",  // 【可选】开门密码
+    "doorRight": "${doorRight}",  // 【可选】门权限(多个门用逗号分隔)
+    "RightPlan": [  // 【可选】门权限计划(锁权限计划)
       {
-        "doorNo": 1,                     // 门编号(锁ID)
-        "planTemplateNo": "1,3,5"        // 计划模板编号(多个模板编号取“或”关系)
+      "doorNo": ${doorNo},  // 门编号(锁ID)
+      "planTemplateNo": "${planTemplateNo}"  // 计划模板编号(多个模板编号取“或”关系)
       }
     ],
-
-    "maxOpenDoorTime": 0,                // 【可选】最大认证次数(0 表示无限制)
-    "openDoorTime": 1,                   // 【可选】已认证次数
-    "roomNumber": 123,                   // 【可选】房间号
-    "floorNumber": 1,                    // 【可选】楼层号
-    "doubleLockRight": true,             // 【可选】是否具备反锁开门权限
-    "localUIRight": true,                // 【可选】是否可使用设备本地UI操作
-
-    "userVerifyMode": "card",            // 【可选】验证方式(如 card 刷卡,fp 指纹,face 人脸等)
+    "maxOpenDoorTime": ${maxOpenDoorTime},  // 【可选】最大认证次数(0 表示无限制)
+    "openDoorTime": ${openDoorTime},  // 【可选】已认证次数
+    "roomNumber": ${roomNumber},  // 【可选】房间号
+    "floorNumber": ${floorNumber},  // 【可选】楼层号
+    "doubleLockRight": ${doubleLockRight},  // 【可选】是否具备反锁开门权限(布尔类型)
+    "localUIRight": ${localUIRight},  // 【可选】是否可使用设备本地UI操作(布尔类型)
+    "userVerifyMode": "${userVerifyMode}",  // 【可选】验证方式
     // 示例枚举:
     // [cardAndPw, card, cardOrPw, fp, fpAndPw, fpOrCard, fpAndCard, fpAndCardAndPw,
     //  faceOrFpOrCardOrPw, faceAndFp, faceAndPw, faceAndCard, face, employeeNoAndPw,
     //  fpOrPw, employeeNoAndFp, employeeNoAndFpAndPw, faceAndFpAndCard,
     //  faceAndPwAndFp, employeeNoAndFace, faceOrfaceAndCard, fpOrface, cardOrfaceOrPw]
-
-    "checkUser": true,                   // 【可选】是否校验重复添加人员(true 开启重复校验)
-    "numOfFace": 0,                      // 【可选】关联人脸数量(不支持可不返回)
-    "numOfFP": 0,                        // 【可选】关联指纹数量
-    "numOfCard": 0,                      // 【可选】关联卡数量
-    "gender": "male",                    // 【可选】性别 [male 男, female 女, unknown 未知]
-
-    "PersonInfoExtends": [               // 【可选】人员信息扩展
+    "checkUser": ${checkUser},  // 【可选】是否校验重复添加人员(true 开启重复校验)
+    "numOfFace": ${numOfFace},  // 【可选】关联人脸数量
+    "numOfFP": ${numOfFP},  // 【可选】关联指纹数量
+    "numOfCard": ${numOfCard},  // 【可选】关联卡数量
+    "gender": "${gender}",  // 【可选】性别 [male 男, female 女, unknown 未知]
+    "PersonInfoExtends": [  // 【可选】人员信息扩展
       {
-        "value": "test"                  // 扩展内容(可自定义)
+      "value": "${extendValue}"  // 扩展内容(可自定义)
       }
     ],
-
-    "operateType": "byTerminal",         // 【可选】操作类型,如 byTerminal 表示按终端操作
-    "terminalNoList": [1],               // 【可选】终端ID列表(type 为 byTerminal 时必填)
-    "dynamicCode": "123456",             // 【可选】动态权限码
-    "callNumbers": ["1-1-1-401"],        // 【可选】呼叫号码列表(如 1-1-1-401)
-    "floorNumbers": [1, 2],              // 【可选】楼层列表(可配置多层)
-    "groupName": "test"                  // 【可选】组织架构名称
+    "operateType": "${operateType}",  // 【可选】操作类型,如 byTerminal 表示按终端操作
+    "terminalNoList": [${terminalNoList}],  // 【可选】终端ID列表(type 为 byTerminal 时必填)
+    "dynamicCode": "${dynamicCode}",  // 【可选】动态权限码
+    "callNumbers": [${callNumbers}],  // 【可选】呼叫号码列表(如 "1-1-1-401")
+    "floorNumbers": [${floorNumbers}],  // 【可选】楼层列表(可配置多层)
+    "groupName": "${groupName}"  // 【可选】组织架构名称
   }
 }

+ 5 - 37
supervision-admin/resources/conf/acs/User/AddUserInfoOutputParam.json

@@ -1,39 +1,7 @@
 {
-  "statusCode": 1,
-  /* 只读 (ro),可选 (opt)
-     类型:int
-     含义:状态码。
-     当返回值为 1 时,表示操作成功且无特殊状态;
-     当无法用 1 表示时(如存在部分成功或异常情况),必须返回其他具体状态码。 */
-
-  "statusString": "ok",
-  /* 只读 (ro),可选 (opt)
-     类型:string
-     含义:状态描述。
-     当无法使用 "ok" 表示成功时("ok" 表示成功且无特殊状态),
-     必须返回其他描述信息。
-     范围:[1, 64] 个字符。 */
-
-  "subStatusCode": "ok",
-  /* 只读 (ro),可选 (opt)
-     类型:string
-     含义:子状态码。
-     当无法使用 "ok" 表示成功时("ok" 表示成功且无特殊状态),
-     必须返回具体的子状态码,用于进一步区分结果状态。
-     范围:[1, 64] 个字符。 */
-
-  "errorCode": 1,
-  /* 只读 (ro),可选 (opt)
-     类型:int
-     含义:错误码。
-     当 statusCode ≠ 1 时,表示操作失败,
-     此字段必须返回并与 subStatusCode 对应,用于辅助定位错误原因。 */
-
-  "errorMsg": "ok"
-  /* 只读 (ro),可选 (opt)
-     类型:string
-     含义:错误信息。
-     当 statusCode ≠ 1 时必须返回,说明具体的失败原因。
-     描述信息可在后续版本中优化或扩展,不固定。
-     示例:当失败时,可能返回 “参数错误”、“网络异常”、“用户已存在”等信息。 */
+  "statusCode": 1, // 【可选】状态码,整数类型。1 表示成功且无特殊状态;无法用 1 表示时必须返回。
+  "statusString": "ok", // 【可选】状态描述,字符串类型(长度 1~64)。ok 表示成功且无特殊状态;无法用 ok 表示时必须返回。
+  "subStatusCode": "ok", // 【可选】子状态码,字符串类型(长度 1~64)。ok 表示成功且无特殊状态;无法用 ok 表示时必须返回。
+  "errorCode": 1, // 【可选】错误码,整数类型。当 statusCode ≠ 1 时返回,对应 subStatusCode。
+  "errorMsg": "ok" // 【可选】错误信息,字符串类型。当 statusCode ≠ 1 时必须返回。该字段用于解释错误原因,允许设备在后续版本中扩展或优化描述内容。
 }

+ 8 - 28
supervision-admin/resources/conf/acs/User/DeleteUserInfoInputParam.json

@@ -1,34 +1,14 @@
 {
-  "UserInfoDetail": {
-    /*opt, object, 用户信息*/
-    "mode": "all",
-    /*req, enum, 删除模式, subType:string,
-      [all#删除所有, byEmployeeNo#按工号],
-      desc: all 表示删除设备上所有人员,byEmployeeNo 表示按人员ID列表删除指定人员 */
-
-    "EmployeeNoList": [
-      /*opt, array, 人员ID列表, subType:object, range:[,],
-        desc: 当 mode=byEmployeeNo 时需配置此字段 */
+  "UserInfoDetail": { // 【可选】用户信息对象
+    "mode": "all", // 【必填】删除模式(枚举类型:string)可选值:- all:删除设备上所有人员 - byEmployeeNo:按人员ID列表删除指定人员
+    "EmployeeNoList": [ // 【可选】人员ID列表(数组,元素类型为 object)当 mode = byEmployeeNo 时需填写此字段
       {
-        "employeeNo": "test"
-        /*opt, string, 工号(人员ID), range:[,]*/
+        "employeeNo": "${employeeNo}" // 【可选】工号(人员ID),字符串类型
       }
     ],
-
-    "operateType": "byTerminal",
-    /*opt, enum, 操作类型, subType:string,
-      [byTerminal#按终端操作, byOrg#按组织操作, byTerminalOrg#按终端组织操作],
-      desc: 指定删除操作的执行范围 */
-
-    "terminalNoList": [1, 2, 3, 4],
-    /*opt, array, 终端列表, subType:int, range:[,],
-      dep:and,{$.UserInfoDetail.operateType,eq,byTerminal},
-      desc: operateType=byTerminal 时需填写终端号 */
-
-    "orgNoList": [1, 2, 3, 4]
-    /*opt, array, 组织列表, subType:int, range:[,],
-      dep:or,{$.UserInfoDetail.operateType,eq,byOrg},{$.UserInfoDetail.operateType,eq,byTerminalOrg},
-      desc: operateType 为组织相关操作时需填写组织编号 */
+    "operateType": "${operateType}", // 【可选】操作类型(枚举类型:string)可选值:- byTerminal:按终端操作 - byOrg:按组织操作 - byTerminalOrg:按终端组织操作
+    // 描述:指定删除操作的执行范围
+    "terminalNoList": [${terminalNoList}], // 【可选】终端号列表(数组类型,元素为 int)// 当 operateType = byTerminal 时需填写该字段
+    "orgNoList": [${orgNoList}] // 【可选】组织编号列表(数组类型,元素为 int)// 当 operateType = byOrg 或 byTerminalOrg 时需填写该字段
   }
 }
-

+ 10 - 0
supervision-admin/resources/conf/acs/User/GetUserCountOutputParam.json

@@ -0,0 +1,10 @@
+{
+  "UserInfoCount": {         // 【只读 / 必填】用户数量对象
+    "userNumber": "${userNumber}"
+    // 【只读 / 必填】用户数量(int)
+    // range: 任意范围
+    // step: 无
+    // unit: 无
+    // unitType: 无
+  }
+}

+ 11 - 26
supervision-admin/resources/conf/acs/User/GetUserInfoInputParam.json

@@ -1,32 +1,17 @@
 {
-  "UserInfoSearchCond": {
-    /* 可选,对象类型,查询条件 */
-
-    "searchID": "123",
-    /* 必填,字符串类型,搜索记录唯一标识。
-       说明:用于确认上层客户端是否为同一次查询任务。
-       若为同一 searchID,设备会缓存上次查询结果,加快查询速度。*/
-
-    "searchResultPosition": 0,
-    /* 可选,整数类型,查询起始位置。
-       说明:当记录较多、一次查询无法返回全部结果时,可通过该字段指定从第几条开始继续查询。
-       例如上次查询了0~29条记录,下次可设为30继续查询后续结果。
-       合法范围:0 ~ (设备已存储总记录数 - 1)。*/
-
-    "maxResults": 30,
-    /* 可选,整数类型,本次调用最多返回的记录数。
-       说明:若超过设备支持的最大返回数量,设备会自动按上限返回,不报错。*/
-
-    "EmployeeNoList": [
-      /* 可选,数组类型,指定按人员ID(工号)精确查询 */
+  "UserInfoSearchCond": {                            // 【可选】用户查询条件对象
+    "searchID": "${searchID}",                       // 【必填】搜索记录唯一标识
+    // 用于确认客户端是否为同一次查询任务
+    "searchResultPosition": ${searchResultPosition}, // 【可选】查询起始位置(整数)
+    // 当记录较多时,可指定从第几条开始继续查询
+    "maxResults": ${maxResults},                     // 【可选】最大返回记录数(整数)
+    // 若超过设备上限,设备会自动按上限返回
+    "EmployeeNoList": [                              // 【可选】按人员ID精确查询列表
       {
-        "employeeNo": "test"
-        /* 可选,字符串类型,工号(人员ID) */
+      "employeeNo": "${employeeNo}"                  // 【可选】工号(人员ID)
       }
     ],
-
-    "fuzzySearch": "test"
-    /* 可选,字符串类型,模糊搜索关键字。
-       说明:可按姓名、工号等字段模糊匹配查询。*/
+    "fuzzySearch": "${fuzzySearch}"                  // 【可选】模糊搜索关键字(字符串)
+    // 可按姓名、工号等字段模糊匹配
   }
 }

+ 38 - 109
supervision-admin/resources/conf/acs/User/GetUserInfoOutputParam.json

@@ -1,121 +1,50 @@
 {
-  "UserInfoSearch": {
-    /* 只读(ro),可选(opt),object类型 —— 查询结果对象 */
-
-    "searchID": "test",
-    /* 只读(ro),必填(req),string类型 —— 搜索记录唯一标识ID */
-
-    "responseStatusStrg": "OK",
-    /* 只读(ro),必填(req),枚举类型(enum),查询状态:
-       - OK:查询结束
-       - MORE:还有数据待查询
-       - NO MATCH:没有匹配数据 */
-
-    "numOfMatches": 1,
-    /* 只读(ro),必填(req),int类型 —— 当前返回的记录条数 */
-
-    "totalMatches": 1,
-    /* 只读(ro),必填(req),int类型 —— 符合条件的记录总条数 */
-
-    "UserInfo": [
-      /* 只读(ro),可选(opt),array类型 —— 人员信息数组 */
+  "UserInfoSearch": {                            // 【只读,可选】查询结果对象
+    "searchID": "${searchID}",                   // 【只读,必填】搜索记录唯一标识ID
+    "responseStatusStrg": "${responseStatusStrg}", // 【只读,必填】查询状态 [OK 查询结束, MORE 还有数据待查询, NO MATCH 没有匹配数据]
+    "numOfMatches": ${numOfMatches},            // 【只读,必填】当前返回记录条数
+    "totalMatches": ${totalMatches},            // 【只读,必填】符合条件的记录总条数
+    "UserInfo": [                                // 【只读,可选】人员信息数组
       {
-        "employeeNo": "test",
-        /* 只读(ro),必填(req),string类型 —— 工号(人员ID) */
-
-        "name": "test",
-        /* 只读(ro),可选(opt),string类型 —— 姓名 */
-
-        "userType": "normal",
-        /* 只读(ro),必填(req),string类型 —— 人员类型 */
-
-        "closeDelayEnabled": true,
-        /* 只读(ro),可选(opt),bool类型 —— 是否启用关门延迟 */
-
-        "Valid": {
-          /* 只读(ro),可选(opt),object类型 —— 有效期参数 */
-          "enable": true,
-          /* 是否启用有效期 */
-          "beginTime": "2025-01-01T00:00:00",
-          /* 有效期起始时间 */
-          "endTime": "2025-12-31T23:59:59",
-          /* 有效期结束时间 */
-          "timeType": "local"
-          /* 时间类型(local/UTC) */
+        "employeeNo": "${employeeNo}",          // 【只读,必填】工号(人员ID)
+        "name": "${name}",                      // 【只读,可选】姓名
+        "userType": "${userType}",              // 【只读,必填】人员类型 [normal, visitor, blackList]
+        "closeDelayEnabled": ${closeDelayEnabled}, // 【只读,可选】是否启用关门延迟
+        "Valid": {                              // 【只读,可选】有效期参数
+        "enable": ${Valid_enable},            // 【必填】是否启用有效期
+        "beginTime": "${Valid_beginTime}",    // 【必填】有效期起始时间
+        "endTime": "${Valid_endTime}",        // 【必填】有效期结束时间
+        "timeType": "${Valid_timeType}"       // 【可选】时间类型 [local, UTC]
         },
-
-        "belongGroup": "1,3,5",
-        /* 所属群组,多个以逗号分隔 */
-
-        "password": "123456",
-        /* 登录/开门密码 */
-
-        "doorRight": "1,3",
-        /* 门权限(如“1,3”代表对门1、门3有开门权限) */
-
-        "RightPlan": [
-          /* 门权限计划 */
+        "belongGroup": "${belongGroup}",        // 【可选】所属群组
+        "password": "${password}",              // 【可选】登录/开门密码
+        "doorRight": "${doorRight}",            // 【可选】门权限
+        "RightPlan": [                          // 【可选】门权限计划
           {
-            "doorNo": 1,
-            /* 门编号 */
-            "planTemplateNo": "1,3,5"
-            /* 权限计划模板编号 */
+          "doorNo": ${RightPlan_doorNo},           // 【可选】门编号
+          "planTemplateNo": "${RightPlan_planTemplateNo}" // 【可选】权限计划模板编号
           }
         ],
-
-        "maxOpenDoorTime": 0,
-        /* 最大可认证开门次数 */
-
-        "openDoorTime": 0,
-        /* 已认证次数 */
-
-        "roomNumber": 123,
-        /* 房间号 */
-
-        "floorNumber": 1,
-        /* 层号 */
-
-        "doubleLockRight": true,
-        /* 是否具有反锁开门权限(true=有权限) */
-
-        "localUIRight": true,
-        /* 是否具有设备本地UI访问权限 */
-
-        "userVerifyMode": "card",
-        /* 人员验证方式(枚举):
-           可选值如:card, face, fp, faceAndPw 等 */
-
-        "dynamicCode": "123456",
-        /* 动态权限码 */
-
-        "callNumbers": ["1-1-1-401", "1-1-1-402", "1-1-1-403"],
-        /* 呼叫号码列表(可与房间号关联) */
-
-        "floorNumbers": [1, 2],
-        /* 层号列表(支持多层) */
-
-        "numOfFace": 0,
-        /* 关联人脸数量 */
-
-        "numOfFP": 0,
-        /* 关联指纹数量 */
-
-        "numOfCard": 0,
-        /* 关联卡数量 */
-
-        "gender": "male",
-        /* 性别(male=男, female=女, unknown=未知) */
-
-        "PersonInfoExtends": [
-          /* 人员信息扩展字段 */
+        "maxOpenDoorTime": ${maxOpenDoorTime}, // 【可选】最大认证开门次数
+        "openDoorTime": ${openDoorTime},       // 【可选】已认证次数
+        "roomNumber": ${roomNumber},           // 【可选】房间号
+        "floorNumber": ${floorNumber},         // 【可选】层号
+        "doubleLockRight": ${doubleLockRight}, // 【可选】是否具备反锁开门权限
+        "localUIRight": ${localUIRight},       // 【可选】是否可使用设备本地UI
+        "userVerifyMode": "${userVerifyMode}", // 【可选】验证方式
+        "dynamicCode": "${dynamicCode}",       // 【可选】动态权限码
+        "callNumbers": ${callNumbers},         // 【可选】呼叫号码列表(数组)
+        "floorNumbers": ${floorNumbers},       // 【可选】层号列表(数组)
+        "numOfFace": ${numOfFace},             // 【可选】关联人脸数量
+        "numOfFP": ${numOfFP},                 // 【可选】关联指纹数量
+        "numOfCard": ${numOfCard},             // 【可选】关联卡数量
+        "gender": "${gender}",                  // 【可选】性别
+        "PersonInfoExtends": [                  // 【可选】扩展人员信息
           {
-            "value": "test"
-            /* 扩展内容 */
+          "value": "${PersonInfoExtends_value}" // 【可选】扩展内容
           }
         ],
-
-        "groupName": "test"
-        /* 组织架构名称(如部门名) */
+        "groupName": "${groupName}"            // 【可选】组织架构名称
       }
     ]
   }

+ 33 - 174
supervision-admin/resources/conf/acs/User/ModifyUserInfoInputParam.json

@@ -1,184 +1,43 @@
 {
-  "UserInfo": {
-    /* 可选 (opt),对象类型
-       含义:人员信息,用于修改设备中已存在的人员信息。*/
-
-    "employeeNo": "test",
-    /* 必填 (req),字符串类型
-       含义:工号(人员ID),作为人员的唯一标识,用于匹配要修改的人员。*/
-
-    "name": "test",
-    /* 可选 (opt),字符串类型
-       含义:姓名,用于更新人员名称。*/
-
-    "userType": "normal",
-    /* 必填 (req),枚举类型
-       含义:人员类型。
-       可选值:
-       - normal:普通人(主人)
-       - visitor:来宾(访客)
-       - blackList:非授权名单人
-       注意:字段名中不能有空格(原文 userType 后面多了一个空格,应改为 userType)。*/
-
-    "closeDelayEnabled": true,
-    /* 可选 (opt),布尔类型
-       含义:是否启用关门延迟。true 表示启用,false 表示不启用。*/
-
-    "Valid": {
-      /* 可选 (opt),对象类型
-         含义:有效期设置。*/
-
-      "enable": true,
-      /* 必填 (req),布尔类型
-         含义:是否使能有效期。false 表示长期有效,true 表示启用时间限制。*/
-
-      "beginTime": "2017-08-01T17:30:08+08:00",
-      /* 必填 (req),字符串类型(日期时间)
-         含义:有效期起始时间。
-         若 timeType 为 local 或不存在,则为设备本地时间;
-         若 timeType 为 UTC,则需带时区信息,如 +08:00。*/
-
-      "endTime": "2017-08-01T17:30:08+08:00",
-      /* 必填 (req),字符串类型(日期时间)
-         含义:有效期结束时间。
-         格式说明同上。*/
-
-      "timeType": "local"
-      /* 可选 (opt),枚举类型
-         含义:时间类型。
-         可选值:
-         - local:设备本地时间
-         - UTC:协调世界时 */
+  "UserInfo": {                                  // 【可选】人员信息对象,用于修改设备中已存在的人员信息
+    "employeeNo": "${employeeNo}",              // 【必填】工号(人员ID),作为人员唯一标识
+    "name": "${name}",                          // 【可选】姓名,用于更新人员名称
+    "userType": "${userType}",                  // 【必填】人员类型 [normal, visitor, blackList]
+    "closeDelayEnabled": ${closeDelayEnabled},  // 【可选】是否启用关门延迟
+    "Valid": {                                  // 【可选】有效期设置
+      "enable": ${Valid_enable},                // 【必填】是否启用有效期
+      "beginTime": "${Valid_beginTime}",        // 【必填】有效期开始时间(本地或UTC)
+      "endTime": "${Valid_endTime}",            // 【必填】有效期结束时间
+      "timeType": "${Valid_timeType}"           // 【可选】时间类型 [local, UTC]
     },
-
-    "belongGroup": "1,3,5",
-    /* 可选 (opt),字符串类型
-       含义:所属群组,可配置多个群组 ID,用逗号分隔。*/
-
-    "password": "123456",
-    /* 可选 (opt),字符串类型
-       含义:密码,可为空。*/
-
-    "doorRight": "1,3",
-    /* 可选 (opt),字符串类型
-       含义:门权限,多个门号之间用逗号分隔。*/
-
-    "RightPlan": [
-      /* 可选 (opt),数组类型
-         含义:门权限计划(锁权限计划)。 */
+    "belongGroup": "${belongGroup}",            // 【可选】所属群组,可配置多个群组ID,用逗号分隔
+    "password": "${password}",                  // 【可选】开门密码
+    "doorRight": "${doorRight}",                // 【可选】门权限,多个门号用逗号分隔
+    "RightPlan": [                              // 【可选】门权限计划
       {
-        "doorNo": 1,
-        /* 可选 (opt),整数类型
-           含义:门编号(锁 ID)。*/
-
-        "planTemplateNo": "1,3,5"
-        /* 可选 (opt),字符串类型
-           含义:计划模板编号,可配置多个模板编号,用逗号分隔;
-           同一门号的多个模板以“权限或”的方式叠加。*/
+        "doorNo": ${RightPlan_doorNo},         // 【可选】门编号(锁ID)
+        "planTemplateNo": "${RightPlan_planTemplateNo}" // 【可选】计划模板编号
       }
     ],
-
-    "maxOpenDoorTime": 0,
-    /* 可选 (opt),整数类型
-       含义:最大认证次数。0 表示无次数限制。*/
-
-    "openDoorTime": 1,
-    /* 可选 (opt),整数类型
-       含义:已认证次数。*/
-
-    "roomNumber": 123,
-    /* 可选 (opt),整数类型
-       含义:房间号。*/
-
-    "floorNumber": 1,
-    /* 可选 (opt),整数类型
-       含义:层号。*/
-
-    "doubleLockRight": true,
-    /* 可选 (opt),布尔类型
-       含义:是否具备反锁开门权限。true 表示有权限。*/
-
-    "localUIRight": true,
-    /* 可选 (opt),布尔类型
-       含义:是否具有设备本地 UI 界面访问权限。*/
-
-    "userVerifyMode": "card",
-    /* 可选 (opt),枚举类型
-       含义:人员验证方式。
-       可选值:
-       cardAndPw#刷卡+密码,
-       card#刷卡,
-       cardOrPw#刷卡或密码,
-       fp#指纹,
-       fpAndPw#指纹+密码,
-       fpOrCard#指纹或刷卡,
-       fpAndCard#指纹+刷卡,
-       fpAndCardAndPw#指纹+刷卡+密码,
-       faceOrFpOrCardOrPw#人脸或指纹或刷卡或密码,
-       faceAndFp#人脸+指纹,
-       faceAndPw#人脸+密码,
-       faceAndCard#人脸+刷卡,
-       face#人脸,
-       employeeNoAndPw#工号+密码,
-       fpOrPw#指纹或密码,
-       employeeNoAndFp#工号+指纹,
-       employeeNoAndFpAndPw#工号+指纹+密码,
-       faceAndFpAndCard#人脸+指纹+刷卡,
-       faceAndPwAndFp#人脸+密码+指纹,
-       employeeNoAndFace#工号+人脸,
-       faceOrfaceAndCard#人脸或人脸+刷卡,
-       fpOrface#指纹或人脸,
-       cardOrfaceOrPw#刷卡或人脸或密码。
-       说明:为空时表示清空该人员的验证方式。*/
-
-    "checkUser": true,
-    /* 可选 (opt),布尔类型
-       含义:是否进行人员重复添加校验。
-       true:开启重复校验;
-       false:关闭(当确认设备内无人员时可关闭以提升下发速度)。*/
-
-    "gender": "male",
-    /* 可选 (opt),枚举类型
-       含义:性别。
-       可选值:male(男)、female(女)、unknown(未知)。*/
-
-    "PersonInfoExtends": [
-      /* 可选 (opt),数组类型
-         含义:扩展的人员信息,可根据业务自定义附加信息。 */
+    "maxOpenDoorTime": ${maxOpenDoorTime},     // 【可选】最大认证次数
+    "openDoorTime": ${openDoorTime},           // 【可选】已认证次数
+    "roomNumber": ${roomNumber},               // 【可选】房间号
+    "floorNumber": ${floorNumber},             // 【可选】楼层号
+    "doubleLockRight": ${doubleLockRight},     // 【可选】是否具备反锁开门权限
+    "localUIRight": ${localUIRight},           // 【可选】是否可使用设备本地UI操作
+    "userVerifyMode": "${userVerifyMode}",     // 【可选】验证方式
+    "checkUser": ${checkUser},                 // 【可选】是否校验重复添加人员
+    "gender": "${gender}",                      // 【可选】性别 [male, female, unknown]
+    "PersonInfoExtends": [                      // 【可选】人员信息扩展
       {
-        "value": "test"
-        /* 可选 (opt),字符串类型
-           含义:扩展信息内容。*/
+        "value": "${PersonInfoExtends_value}"  // 【可选】扩展信息内容
       }
     ],
-
-    "dynamicCode": "123456",
-    /* 可选 (opt),字符串类型
-       含义:动态权限码,用于动态授权场景。*/
-
-    "callNumbers": ["1-1-1-401"],
-    /* 可选 (opt),字符串数组
-       含义:呼叫号码列表。
-       默认格式为 X-X-X-X,如 “1-1-1-401”。*/
-
-    "floorNumbers": [1, 2],
-    /* 可选 (opt),整数数组
-       含义:层号列表,为 floorNumber 字段的扩展,支持配置多个层号。*/
-
-    "operateType": "byTerminal",
-    /* 可选 (opt),字符串类型
-       含义:操作类型。
-       可选值:
-       - byTerminal:按终端操作。*/
-
-    "terminalNoList": [1],
-    /* 可选 (opt),整数数组
-       含义:终端编号列表。
-       当 operateType 为 byTerminal 或 byTerminalOrg 时必填;
-       当前仅支持单个终端。*/
-
-    "groupName": "test"
-    /* 可选 (opt),字符串类型
-       含义:组织架构名称,长度范围:[1,64] 字符。*/
+    "dynamicCode": "${dynamicCode}",           // 【可选】动态权限码
+    "callNumbers": ${callNumbers},             // 【可选】呼叫号码列表
+    "floorNumbers": ${floorNumbers},           // 【可选】层号列表
+    "operateType": "${operateType}",           // 【可选】操作类型
+    "terminalNoList": ${terminalNoList},       // 【可选】终端ID列表,当 operateType 为 byTerminal 或 byTerminalOrg 时必填
+    "groupName": "${groupName}"                // 【可选】组织架构名称
   }
 }

+ 31 - 52
supervision-admin/resources/conf/acs/User/SetUserInfoInputParam.json

@@ -1,63 +1,42 @@
 {
   "UserInfo": {
-    "employeeNo": "test",                // 必填,工号(人员ID),作为人员唯一标识
-    "deleteUser": true,                  // 可选,是否删除该人员(true-删除,false-不删除)
-    "name": "test",                      // 可选,人员姓名
-    "userType": "normal",                // 必填,人员类型:normal=普通人,visitor=访客,blackList=黑名单
-    "closeDelayEnabled": true,           // 可选,是否启用关门延迟(true-是,false-否)
-
-    "Valid": {                           // 可选,有效期信息
-      "enable": true,                    // 是否启用有效期(true-启用,false-不启用表示长期有效)
-      "beginTime": "2025-01-01T08:00:00",// 有效期开始时间,本地时间格式:YYYY-MM-DDTHH:mm:ss
-      "endTime": "2030-12-31T23:59:59",  // 有效期结束时间
-      "timeType": "local"                // 时间类型:local=设备本地时间,UTC=协调世界时
+    "employeeNo": "${employeeNo}",           // 必填,工号(人员ID)
+    "deleteUser": ${deleteUser},             // 可选,是否删除该人员
+    "name": "${name}",                       // 可选,人员姓名
+    "userType": "${userType}",               // 必填,人员类型 [normal, visitor, blackList]
+    "closeDelayEnabled": ${closeDelayEnabled}, // 可选,是否启用关门延迟
+    "Valid": {                               // 可选,有效期信息
+      "enable": ${Valid_enable},             // 是否启用有效期
+      "beginTime": "${Valid_beginTime}",     // 有效期开始时间
+      "endTime": "${Valid_endTime}",         // 有效期结束时间
+      "timeType": "${Valid_timeType}"        // 时间类型 [local, UTC]
     },
-
-    "belongGroup": "1,3,5",              // 可选,所属群组编号(多个群组用逗号分隔)
-    "password": "123456",                // 可选,开门密码
-    "doorRight": "1,3",                  // 可选,门权限(代表对门1、门3有权限)
-
-    "RightPlan": [                       // 可选,门权限计划(数组)
+    "belongGroup": "${belongGroup}",         // 可选,所属群组编号
+    "password": "${password}",               // 可选,开门密码
+    "doorRight": "${doorRight}",             // 可选,门权限
+    "RightPlan": [                           // 可选,门权限计划
       {
-        "doorNo": 1,                     // 门编号
-        "planTemplateNo": "1,3,5"        // 权限计划模板编号(多个模板用逗号分隔)
+      "doorNo": ${RightPlan_doorNo},      // 门编号
+      "planTemplateNo": "${RightPlan_planTemplateNo}" // 权限计划模板编号
       }
     ],
-
-    "maxOpenDoorTime": 0,                // 可选,最大认证次数(0表示不限)
-    "openDoorTime": 0,                   // 可选,已认证次数
-    "roomNumber": 123,                   // 可选,房间号
-    "floorNumber": 1,                    // 可选,所在楼层号
-    "doubleLockRight": true,             // 可选,反锁开门权限(true-有权限)
-    "localUIRight": true,                // 可选,是否具有设备本地UI访问权限(true-有权限)
-
-    "userVerifyMode": "card",            // 可选,人员验证方式:
-    // cardAndPw#刷卡+密码
-    // card#刷卡
-    // cardOrPw#刷卡或密码
-    // fp#指纹
-    // face#人脸
-    // faceAndCard#人脸+刷卡
-    // faceAndPw#人脸+密码
-    // 等多种组合方式
-
-    "checkUser": true,                   // 可选,是否进行人员重复添加校验(true-校验,false-不校验)
-    "gender": "male",                    // 可选,性别(male#男,female#女,unknown#未知)
-
-    "PersonInfoExtends": [               // 可选,人员扩展信息(自定义字段)
+    "maxOpenDoorTime": ${maxOpenDoorTime},   // 可选,最大认证次数
+    "openDoorTime": ${openDoorTime},         // 可选,已认证次数
+    "roomNumber": ${roomNumber},             // 可选,房间号
+    "floorNumber": ${floorNumber},           // 可选,楼层号
+    "doubleLockRight": ${doubleLockRight},   // 可选,反锁开门权限
+    "localUIRight": ${localUIRight},         // 可选,设备本地UI访问权限
+    "userVerifyMode": "${userVerifyMode}",   // 可选,人员验证方式
+    "checkUser": ${checkUser},               // 可选,是否进行重复添加校验
+    "gender": "${gender}",                    // 可选,性别
+    "PersonInfoExtends": [                    // 可选,人员扩展信息
       {
-        "value": "test"                  // 扩展信息内容
+      "value": "${PersonInfoExtends_value}" // 扩展信息内容
       }
     ],
-
-    "dynamicCode": "123456",             // 可选,动态权限码(用于临时权限或访客权限)
-    "callNumbers": [                     // 可选,呼叫号码列表
-      "1-1-1-401",
-      "1-1-1-402",
-      "1-1-1-403"
-    ],
-
-    "floorNumbers": [1, 2],              // 可选,层号列表(多个楼层)
-    "groupName": "test"                  // 可选,组织架构名称
+    "dynamicCode": "${dynamicCode}",         // 可选,动态权限码
+    "callNumbers": ${callNumbers},           // 可选,呼叫号码列表
+    "floorNumbers": ${floorNumbers},         // 可选,层号列表
+    "groupName": "${groupName}"              // 可选,组织架构名称
   }
 }

+ 5 - 10
supervision-admin/resources/conf/acs/User/SetUserInfoOutputParam.json

@@ -1,12 +1,7 @@
 {
-  "statusCode":  1,
-  /*ro, opt, int, 状态码, range:[,], step:, unit:, unitType:, desc:无法用1表示时(1表示成功且无特殊状态)必须返回*/
-  "statusString":  "ok",
-  /*ro, opt, string, 状态描述, range:[1,64], desc:无法用ok表示时(ok表示成功且无特殊状态)必须返回*/
-  "subStatusCode":  "ok",
-  /*ro, opt, string, 子状态码, range:[1,64], desc:无法用ok表示(ok表示成功且无特殊状态)必须返回*/
-  "errorCode":  1,
-  /*ro, opt, int, 错误码, range:[,], step:, unit:, unitType:, desc:当statusCode不为1时,与subStatusCode对应*/
-  "errorMsg":  "ok"
-  /*ro, opt, string, 错误信息, range:[,], desc:当statusCode不为1时,必须返回,解释信息在协议约束中,允许设备在后续的版本迭代中,进行优化丰富提升(不限制死)*/
+  "statusCode": 1,              // 【只读,可选】状态码,int类型,1表示成功且无特殊状态
+  "statusString": "ok",         // 【只读,可选】状态描述,string类型,ok表示成功且无特殊状态
+  "subStatusCode": "ok",        // 【只读,可选】子状态码,string类型,ok表示成功且无特殊状态
+  "errorCode": 1,               // 【只读,可选】错误码,int类型,当statusCode不为1时,与subStatusCode对应
+  "errorMsg": "ok"              // 【只读,可选】错误信息,string类型,当statusCode不为1时必须返回,用于解释错误
 }

+ 43 - 44
supervision-admin/src/main/java/com/supervision/web/ConnectSDK/carCamera/alarm/CarCameraAlarmDataParse.java

@@ -7,8 +7,10 @@ import com.sun.jna.Pointer;
 import com.supervision.web.ConnectSDK.util.GetCarInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import java.io.*;
 import java.nio.ByteBuffer;
 import java.text.SimpleDateFormat;
@@ -21,6 +23,23 @@ public class CarCameraAlarmDataParse {
 
     private HCNetSDK hCNetSDK;
 
+    // 从 application.yml 注入路径
+    @Value("${carCameraPicPath}")
+    private String carPicSavePath;
+
+    // 静态变量用于 static 方法访问
+    private static String STATIC_CAR_PIC_SAVE_PATH;
+
+    // 初始化时把注入值复制到静态变量
+    @PostConstruct
+    public void init() {
+        STATIC_CAR_PIC_SAVE_PATH = carPicSavePath;
+    }
+
+    public static String getSavePath() {
+        return STATIC_CAR_PIC_SAVE_PATH;
+    }
+
     public static void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
         logger.info("报警事件类型: lCommand:" + Integer.toHexString(lCommand));
         String sTime;
@@ -32,7 +51,7 @@ public class CarCameraAlarmDataParse {
                 logger.info("COMM_UPLOAD_PLATE_RESULT(老报警信息)");
                 break;
             // COMM_ITS_PLATE_RESULT(新报警信息)
-            case HCNetSDK.COMM_ITS_PLATE_RESULT: // 交通抓拍结果(新报警信息)
+            case HCNetSDK.COMM_ITS_PLATE_RESULT: { // 交通抓拍结果(新报警信息)
                 logger.info("COMM_ITS_PLATE_RESULT(新报警信息)");
                 logger.info("【海康车牌摄像头回调】交通抓拍的终端图片上传");
                 HCNetSDK.NET_ITS_PLATE_RESULT result = new HCNetSDK.NET_ITS_PLATE_RESULT();
@@ -41,12 +60,11 @@ public class CarCameraAlarmDataParse {
                 pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, result.size()), 0, result.size());
                 result.read();
 
-                //                  // 获取车牌号
+                // 获取车牌号
 //                  String sLicense = new String(result.struPlateInfo.sLicense, "GBK");
 //                  byte VehicleType = result.byVehicleType;  //0-其他车辆,1-小型车,2-大型车,3- 行人触发,4- 二轮车触发,5- 三轮车触发,6- 机动车触发
 //                  MonitoringSiteID = new String(result.byMonitoringSiteID);
 //                  logger.info("车牌号:" + sLicense + ":车辆类型:" + VehicleType + ":布防点编号:" + MonitoringSiteID);
-//
 
                 // 车牌信息
                 HCNetSDK.NET_DVR_PLATE_INFO plateInfo = result.struPlateInfo;
@@ -60,51 +78,32 @@ public class CarCameraAlarmDataParse {
                 // 图片数量
                 for (int i = 0; i < result.dwPicNum; i++) {
                     HCNetSDK.NET_ITS_PICTURE_INFO picInfo = result.struPicInfo[i];
-                    if (picInfo.dwDataLen > 0) {
-                        try (FileOutputStream fos = new FileOutputStream(
-                                "plate_pic_" + System.currentTimeMillis() + ".jpg")) {
-                            fos.write(picInfo.pBuffer.getByteArray(0, picInfo.dwDataLen));
-                            logger.info("📸 图片保存成功");
-                        } catch (IOException e) {
-                            e.printStackTrace();
-                        }
-//                            // 0.车牌照片 1.场景照片
-//                            byte byType = pic.byType;
-//                            ByteBuffer buffers = pic.pBuffer.getByteBuffer(0, pic.dwDataLen);
-//                            byte[] bytes = new byte[pic.dwDataLen];
-//                            buffers.rewind();
-//                            buffers.get(bytes);
-//                            logger.info("【海康车牌摄像头回调】图片类型: {}", byType);
-//                            // 写到本地
-//                            String imgPath = this.writeFile(bytes, String.valueOf(byType));
-                    }
-                }
+                    if (picInfo.dwDataLen <= 0) continue;
 
-                /**
-                 * 报警图片保存,车牌,车辆图片
-                 */
-                for (int i = 0; i < result.dwPicNum; i++) {
-                    if (result.struPicInfo[i].dwDataLen > 0) {
-                        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
-                        String newName = sf.format(new Date());
-                        FileOutputStream fout;
-                        try {
-                            String filename = "./pic/" + newName + "_type[" + result.struPicInfo[i].byType + "]_ItsPlate.jpg";
-                            fout = new FileOutputStream(filename);
-                            //将字节写入文件
-                            long offset = 0;
-                            ByteBuffer buffers = result.struPicInfo[i].pBuffer.getByteBuffer(offset, result.struPicInfo[i].dwDataLen);
-                            byte[] bytes = new byte[result.struPicInfo[i].dwDataLen];
-                            buffers.rewind();
-                            buffers.get(bytes);
-                            fout.write(bytes);
-                            fout.close();
-                        } catch (IOException e) {
-                            e.printStackTrace();
-                        }
+                    // 从配置文件读取保存目录
+
+                    File dir = new File(CarCameraAlarmDataParse.getSavePath());
+                    if (!dir.exists()) dir.mkdirs();
+
+                    // 文件名:时间戳_序号_类型.jpg
+                    String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS").format(new Date());
+                    String filename = timestamp + "_pic" + i + "_type" + picInfo.byType + ".jpg";
+                    File file = new File(dir, filename);
+
+                    try (FileOutputStream fos = new FileOutputStream(file)) {
+                        ByteBuffer buffer = picInfo.pBuffer.getByteBuffer(0, picInfo.dwDataLen);
+                        byte[] bytes = new byte[picInfo.dwDataLen];
+                        buffer.rewind();
+                        buffer.get(bytes);
+                        fos.write(bytes);
+                        // 打印保存路径
+                        logger.info("📸 车辆图片保存成功:{}", file.getAbsolutePath());
+                    } catch (IOException e) {
+                        logger.error("❌ 保存车辆图片失败:picIndex={}, type={}", i, picInfo.byType, e);
                     }
                 }
                 break;
+            }
             case HCNetSDK.COMM_ALARM_TFS: //道路违章取证报警
                 HCNetSDK.NET_DVR_TFS_ALARM strTfsAlarm = new HCNetSDK.NET_DVR_TFS_ALARM();
                 strTfsAlarm.write();

+ 63 - 17
supervision-admin/src/main/java/com/supervision/web/ConnectSDK/peopleDoor/Acs/FaceManage.java

@@ -127,19 +127,24 @@ public class FaceManage {
      * 功能:按照二进制方式下发人脸图片
      *
      * @param userID     用户注册ID
-     * @param employeeNo 人员工号
+     * @param condition 人员信息
      * @throws JSONException
-     * @throws InterruptedException
      */
-    public void addFaceByBinary(int userID, String employeeNo)
-            throws JSONException, InterruptedException {
+    public void addFaceByBinary(int userID, Map<String, Object> condition) throws JSONException {
+        String FDID = (String) condition.get("FDID");
         HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); // 数组
         String strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json"; // 设置人脸信息(新增或修改)
         System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length()); // 字符串拷贝到数组中
         ptrByteArray.write();
 
-        int lHandler = hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_FACE_DATA_RECORD,
-                ptrByteArray.getPointer(), strInBuffer.length(), null, null);
+        int lHandler = hCNetSDK.NET_DVR_StartRemoteConfig(
+                userID,
+                HCNetSDK.NET_DVR_FACE_DATA_RECORD,
+                ptrByteArray.getPointer(),
+                strInBuffer.length(),
+                null,
+                null
+        );
         if (lHandler < 0) {
             int errorCode = hCNetSDK.NET_DVR_GetLastError();
             logger.info("Addface NET_DVR_StartRemoteConfig 失败,错误码:" + errorCode);
@@ -152,7 +157,7 @@ public class FaceManage {
 
             //输入参数,XML或者JSON数据,添加人脸图片json报文
             Map<String, Object> parameter = new HashMap<>();
-            parameter.put("employeeNo", employeeNo); // 员工ID号
+            parameter.put("FDID", FDID); // 员工ID号
             String strJsonData = ConfigFileUtil.getReqBodyFromTemplate("conf/acs/AddFaceInfoParam.json", parameter);
             logger.info("下个人员参数:" + strJsonData);
 
@@ -213,7 +218,7 @@ public class FaceManage {
                     break;
                 }
 
-                //读取返回的json并解析
+                // 读取返回的json并解析
                 ptrOutuff.read();
                 String strResult = new String(ptrOutuff.byValue).trim();
                 logger.info("dwState:" + dwState + ",strResult:" + strResult);
@@ -222,7 +227,6 @@ public class FaceManage {
                 int statusCode = jsonResult.getInt("statusCode");
                 String statusString = jsonResult.getString("statusString");
 
-
                 if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
                     logger.info("配置等待");
                     try {
@@ -362,7 +366,7 @@ public class FaceManage {
      * @param searchCondition 查询条件
      * @throws JSONException
      */
-    public void searchFaceInfo(int userID, Map<String, Object> searchCondition) {
+    public void getFaceInfo(int userID, Map<String, Object> searchCondition) {
         // 查询人脸信息
         HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    // 数组
         String strInBuffer = "POST /ISAPI/Intelligent/FDLib/FDSearch?format=json"; // 查询人脸信息
@@ -954,7 +958,7 @@ public class FaceManage {
      * @param userID 登录设备的句柄
      * @param condition 参数:包括 faceLibType, FDID, FPID, imagePath
      */
-    public void modifyFaceInfo(int userID, Map<String, Object> condition) {
+    public void updateFaceInfo(int userID, Map<String, Object> condition) {
         // 构造URL命令(PUT)
         HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);
         String strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSearch?format=json&FDID=1&FPID=&faceLibType=blackFD";
@@ -1072,6 +1076,9 @@ public class FaceManage {
      * @param condition
      */
     public void deleteFaceInfo(int userID, Map<String, Object> condition) {
+        // 读取基本参数(带默认值)
+        String faceLibType = (String) condition.getOrDefault("faceLibType", "blackFD");
+        String FDID = (String) condition.getOrDefault("FDID", "1");
 
         // 删除人脸库中的人脸数据
         String deleteFaceUrl = "PUT /ISAPI/Intelligent/FDLib/FDSearch/Delete?format=json&FDID=1&faceLibType=blackFD";
@@ -1079,14 +1086,53 @@ public class FaceManage {
         // 输入参数,XML或者JSON数据,删除人脸图片json报文
         Map<String, Object> parameter = new HashMap<>();
 
-        // 构造 FPID 列表
+        Object fpidParam = condition.get("FPID");
         List<Map<String, String>> fpidList = new ArrayList<>();
-        Map<String, String> fpidItem = new HashMap<>();
-        fpidItem.put("value", "test1");
-        // req, string, 人脸记录ID, range:[0,63]
-        fpidList.add(fpidItem);
+
+        if (fpidParam instanceof List) {
+            List<?> list = (List<?>) fpidParam;
+            for (Object obj : list) {
+                if (obj instanceof Map) {
+                    @SuppressWarnings("unchecked")
+                    Map<String, Object> map = (Map<String, Object>) obj;
+                    Map<String, String> fpidItem = new HashMap<>();
+                    fpidItem.put("value", String.valueOf(map.get("value")));
+                    if (map.containsKey("rowKey")) {
+                        fpidItem.put("rowKey", String.valueOf(map.get("rowKey")));
+                    }
+                    fpidList.add(fpidItem);
+                } else {
+                    Map<String, String> fpidItem = new HashMap<>();
+                    fpidItem.put("value", obj.toString());
+                    fpidList.add(fpidItem);
+                }
+            }
+        } else if (fpidParam instanceof String) {
+            Map<String, String> fpidItem = new HashMap<>();
+            fpidItem.put("value", (String) fpidParam);
+            fpidList.add(fpidItem);
+        } else {
+            throw new IllegalArgumentException("FPID 参数格式不正确,应为 String 或 List 类型");
+        }
+
         parameter.put("FPID", fpidList);
-        // opt, array, 人脸记录ID列表, subType:object, range:[,]
+
+        // 可选字段(判断 condition 里是否有该参数)
+        if (condition.containsKey("operateType")) {
+            parameter.put("operateType", condition.get("operateType"));
+        }
+        if (condition.containsKey("terminalNoList")) {
+            parameter.put("terminalNoList", condition.get("terminalNoList"));
+        }
+
+        // 构造 FPID 列表
+//        List<Map<String, String>> fpidList = new ArrayList<>();
+//        Map<String, String> fpidItem = new HashMap<>();
+//        fpidItem.put("value", "test1");
+//        // req, string, 人脸记录ID, range:[0,63]
+//        fpidList.add(fpidItem);
+//        parameter.put("FPID", fpidList);
+//        // opt, array, 人脸记录ID列表, subType:object, range:[,]
 
         // 使用模板生成 JSON
         String deleteFaceJson = ConfigFileUtil.getReqBodyFromTemplate("conf/acs/Face/DeleteFaceInfoInputParam.json", parameter);

+ 83 - 24
supervision-admin/src/main/java/com/supervision/web/ConnectSDK/peopleDoor/Acs/UserManage.java

@@ -17,6 +17,7 @@ import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * 功能:人脸下发、查询、删除、人员计划模板配置
@@ -217,7 +218,7 @@ public class UserManage {
      * @param condition
      */
     public void getUserInfo(int userID, Map<String, Object> condition) {
-        String jsonQueryCondition = generateQueryCondition(); // 生成查询条件 JSON
+        String jsonQueryCondition = generateQueryCondition(condition); // 生成查询条件 JSON
         HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(jsonQueryCondition.length());
         System.arraycopy(jsonQueryCondition.getBytes(), 0, ptrInbuff.byValue, 0, jsonQueryCondition.length());
         ptrInbuff.write();
@@ -255,7 +256,7 @@ public class UserManage {
             } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
                 ptrOutbuff.read();
                 String resultJson = new String(ptrOutbuff.byValue).trim();
-                processUserInfo(resultJson); // 处理人员信息
+                processUserInfo(userID, condition, resultJson); // 处理人员信息
                 break;
             } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                 logger.info("获取人员完成");
@@ -269,7 +270,7 @@ public class UserManage {
      *
      * @param resultJson 查询结果的 JSON 字符串
      */
-    private void processUserInfo(String resultJson) {
+    private void processUserInfo(int userID, Map<String, Object> condition, String resultJson) {
         try {
             JSONObject responseJson = new JSONObject(resultJson); // 解析 JSON
             JSONObject userInfoSearch = responseJson.getJSONObject("UserInfoSearch");
@@ -293,8 +294,8 @@ public class UserManage {
             if (numOfMatches < totalMatches) {
                 logger.info("继续分页查询...");
                 // 更新查询条件:根据返回的记录数更新起始位置
-                // 假设分页查询的起始位置使用 `searchResultPosition`
-                String updatedQueryCondition = updateQueryConditionForPagination();
+                int nextPosition = (int) condition.getOrDefault("searchResultPosition", 0) + numOfMatches;
+                String updatedQueryCondition = updateQueryConditionForPagination(condition, nextPosition);
 //                getUserInfo(userID, lHandler, updatedQueryCondition);
             }
         } catch (Exception e) {
@@ -307,10 +308,11 @@ public class UserManage {
      *
      * @return 更新后的查询条件 JSON 字符串
      */
-    private String updateQueryConditionForPagination() {
+    private String updateQueryConditionForPagination(Map<String, Object> condition, int nextPosition) {
         // 根据实际情况生成分页查询条件,假设每次获取 `maxResults` 为 30
         // 更新查询条件中的 `searchResultPosition`
-        return generateQueryCondition(); // 更新条件
+        condition.put("searchResultPosition", nextPosition);
+        return generateQueryCondition(condition); // 更新条件
     }
 
     /**
@@ -318,15 +320,22 @@ public class UserManage {
      *
      * @return 查询条件的 JSON 字符串
      */
-    private String generateQueryCondition() {
+    private String generateQueryCondition(Map<String, Object> condition) {
         // 根据实际需求生成查询条件的 JSON 字符串
         JSONObject queryCondition = new JSONObject();
         JSONObject userInfoSearchCond = new JSONObject();
 
-        userInfoSearchCond.put("searchID", "123");  // 生成一个搜索ID
-        userInfoSearchCond.put("searchResultPosition", 0);  // 初始位置
-        userInfoSearchCond.put("maxResults", 30);  // 每次查询的最大记录数
-        userInfoSearchCond.put("fuzzySearch", "test");  // 模糊查询
+        userInfoSearchCond.put("searchID", UUID.randomUUID().toString());  // 生成一个搜索ID
+        userInfoSearchCond.put("searchResultPosition", condition.getOrDefault("searchResultPosition", 0));  // 初始位置
+        userInfoSearchCond.put("maxResults", condition.getOrDefault("maxResults", 30));  // 每次查询的最大记录数
+        if (condition.containsKey("fuzzySearch")) {
+            userInfoSearchCond.put("fuzzySearch", condition.get("fuzzySearch"));
+        }  // 模糊查询
+
+        // 指定员工号
+        if (condition.containsKey("employeeNo")) {
+            userInfoSearchCond.put("employeeNo", condition.get("employeeNo"));
+        }
 
         // 可以根据需要加入员工编号等其他查询条件
         queryCondition.put("UserInfoSearchCond", userInfoSearchCond);
@@ -417,41 +426,41 @@ public class UserManage {
      * 新增人员
      *
      * @param lUserID    登录句柄
-     * @param employeeNo 员工ID
+     * @param userInfo 人员信息对象(包含所有字段,参考 SDK JSON)
      * @throws JSONException
      * @throws UnsupportedEncodingException
      * @throws InterruptedException
      */
-    public void addUserInfo(int lUserID, String employeeNo)
+    public void addUserInfo(int lUserID, JSONObject userInfo)
             throws JSONException, UnsupportedEncodingException, InterruptedException {
-        modifyOrAddUserInfo(lUserID, employeeNo, false);
+        modifyOrAddUserInfo(lUserID, userInfo, false);
     }
 
     /**
      * 修改人员信息
      *
      * @param lUserID    登录句柄
-     * @param employeeNo 员工ID
+     * @param userInfo 员工ID 人员信息对象(包含所有字段,参考 SDK JSON)
      * @throws JSONException
      * @throws UnsupportedEncodingException
      * @throws InterruptedException
      */
-    public void modifyUserInfo(int lUserID, String employeeNo)
+    public void updateUserInfo(int lUserID, JSONObject userInfo)
             throws JSONException, UnsupportedEncodingException, InterruptedException {
-        modifyOrAddUserInfo(lUserID, employeeNo, true);
+        modifyOrAddUserInfo(lUserID, userInfo, true);
     }
 
     /**
      * 新增或修改人员信息(统一方法)
      *
      * @param lUserID    登录句柄
-     * @param employeeNo 员工ID
+     * @param userInfo 员工信息
      * @param isUpdate   是否为修改操作
      * @throws JSONException
      * @throws UnsupportedEncodingException
      * @throws InterruptedException
      */
-    private void modifyOrAddUserInfo(int lUserID, String employeeNo, boolean isUpdate)
+    private void modifyOrAddUserInfo(int lUserID, JSONObject userInfo, boolean isUpdate)
             throws JSONException, UnsupportedEncodingException, InterruptedException {
         String strInBuffer = isUpdate
                 ? "PUT /ISAPI/AccessControl/UserInfo/Modify?format=json"  // 修改人员信息
@@ -473,10 +482,60 @@ public class UserManage {
 
         // 构造人员信息参数
         Map<String, Object> parameter = new HashMap<>();
-        parameter.put("employeeNo", employeeNo); // 员工ID
-        parameter.put("name", "测试人员"); // 员工名称
-        parameter.put("enable", true); // 是否启用
-        parameter.put("doorNo", 1); // 门编号
+
+        // ---- 基本信息 ----
+        parameter.put("employeeNo", userInfo.getString("employeeNo"));
+        parameter.put("name", userInfo.optString("name", ""));
+        parameter.put("userType", userInfo.optString("userType", "normal"));
+        parameter.put("closeDelayEnabled", userInfo.optBoolean("closeDelayEnabled", false));
+
+        // ---- 有效期 Valid ----
+        if (userInfo.has("Valid")) {
+            JSONObject valid = userInfo.getJSONObject("Valid");
+            Map<String, Object> validMap = new HashMap<>();
+            validMap.put("enable", valid.optBoolean("enable", true));
+            validMap.put("beginTime", valid.optString("beginTime", ""));
+            validMap.put("endTime", valid.optString("endTime", ""));
+            validMap.put("timeType", valid.optString("timeType", "local"));
+            parameter.put("Valid", validMap);
+        }
+
+        // ---- 其他基础字段 ----
+        parameter.put("belongGroup", userInfo.optString("belongGroup", ""));
+        parameter.put("password", userInfo.optString("password", ""));
+        parameter.put("doorRight", userInfo.optString("doorRight", ""));
+        parameter.put("maxOpenDoorTime", userInfo.optInt("maxOpenDoorTime", 0));
+        parameter.put("openDoorTime", userInfo.optInt("openDoorTime", 0));
+        parameter.put("roomNumber", userInfo.optInt("roomNumber", 0));
+        parameter.put("floorNumber", userInfo.optInt("floorNumber", 0));
+        parameter.put("doubleLockRight", userInfo.optBoolean("doubleLockRight", false));
+        parameter.put("localUIRight", userInfo.optBoolean("localUIRight", true));
+        parameter.put("userVerifyMode", userInfo.optString("userVerifyMode", ""));
+        parameter.put("checkUser", userInfo.optBoolean("checkUser", true));
+        parameter.put("numOfFace", userInfo.optInt("numOfFace", 0));
+        parameter.put("numOfFP", userInfo.optInt("numOfFP", 0));
+        parameter.put("numOfCard", userInfo.optInt("numOfCard", 0));
+        parameter.put("gender", userInfo.optString("gender", "unknown"));
+        parameter.put("operateType", userInfo.optString("operateType", ""));
+        parameter.put("dynamicCode", userInfo.optString("dynamicCode", ""));
+        parameter.put("groupName", userInfo.optString("groupName", ""));
+
+        // ---- 数组字段 ----
+        if (userInfo.has("RightPlan")) {
+            parameter.put("RightPlan", userInfo.getJSONArray("RightPlan").toList());
+        }
+        if (userInfo.has("PersonInfoExtends")) {
+            parameter.put("PersonInfoExtends", userInfo.getJSONArray("PersonInfoExtends").toList());
+        }
+        if (userInfo.has("terminalNoList")) {
+            parameter.put("terminalNoList", userInfo.getJSONArray("terminalNoList").toList());
+        }
+        if (userInfo.has("callNumbers")) {
+            parameter.put("callNumbers", userInfo.getJSONArray("callNumbers").toList());
+        }
+        if (userInfo.has("floorNumbers")) {
+            parameter.put("floorNumbers", userInfo.getJSONArray("floorNumbers").toList());
+        }
 
         // 使用模板文件生成 JSON 请求报文
         String input = ConfigFileUtil.getReqBodyFromTemplate("conf/acs/AddUserInfoInputParam.json", parameter);

+ 17 - 5
supervision-admin/src/main/java/com/supervision/web/ConnectSDK/peopleDoor/PeopleDoorDeviceManager.java

@@ -1,6 +1,8 @@
 package com.supervision.web.ConnectSDK.peopleDoor;
 
 
+import org.json.JSONArray;
+import org.json.JSONObject;
 import com.supervision.web.ConnectSDK.peopleDoor.alarm.PeopleDoorFMSGCallBack_V31;
 import com.supervision.web.ConnectSDK.peopleDoor.Acs.*;
 import com.supervision.web.ConnectSDK.util.DeviceSession;
@@ -15,6 +17,7 @@ import org.springframework.stereotype.Component;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import java.io.*;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -380,7 +383,12 @@ public class PeopleDoorDeviceManager {
             }
             case "21": {
                 logger.info("[Module]下发人员示例代码");
-                userManage.addUserInfo(userID, "12345");
+                JSONObject userInfo = new JSONObject();
+                userInfo.put("employeeNo", "10002");
+                userInfo.put("name", "李四");
+                userInfo.put("enable", true);
+                userInfo.put("doorRight", new JSONArray(Arrays.asList(1)));
+                userManage.addUserInfo(userID, userInfo);
                 break;
             }
             case "22": {
@@ -416,7 +424,11 @@ public class PeopleDoorDeviceManager {
             // 新加的
             case "27": {
                 logger.info("[Module]修改人员信息");
-                userManage.modifyUserInfo(userID,"12345");
+                JSONObject userInfo = new JSONObject();
+                userInfo.put("employeeNo", "10002");  // 修改同一个员工号
+                userInfo.put("name", "李四(修改)");
+                userInfo.put("enable", false);
+                userManage.updateUserInfo(userID, userInfo);
                 break;
             }
             // 新加的
@@ -468,7 +480,7 @@ public class PeopleDoorDeviceManager {
             case "41": {
                 // 先下发人员,人员工号上绑定人脸图片
                 logger.info("[Module]二进制方式下发人脸代码");
-                faceManage.addFaceByBinary(userID, "test001");
+                faceManage.addFaceByBinary(userID, request);
                 break;
             }
             case "42": {
@@ -480,7 +492,7 @@ public class PeopleDoorDeviceManager {
             case "43": {
                 // 根据人员工号查询人脸图片
                 logger.info("[Module]查询人脸代码");
-                faceManage.searchFaceInfo(userID, request);
+                faceManage.getFaceInfo(userID, request);
                 break;
             }
             case "44": {
@@ -517,7 +529,7 @@ public class PeopleDoorDeviceManager {
             // 新加的
             case "48": {
                 logger.info("[Module]修改单条人脸信息");
-                faceManage.modifyFaceInfo(userID, request);
+                faceManage.updateFaceInfo(userID, request);
             }
             // 新加的
             case "49": {

+ 3 - 0
supervision-admin/src/main/resources/application.yml

@@ -127,6 +127,9 @@ iclock:
 # 门禁图片路径
 faceImgPath: E:/sourceCode/faceImg
 
+# 车辆抓拍图片路径
+carCameraPicPath: E:/sourceCode/Camera/car_pics
+
 # 存储文件配置
 uploadDir: E:/sourceCode/faceImg/faces/