UserManage.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. package com.gzlh.device.face.hkutils;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.RandomUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.json.JSONArray;
  6. import cn.hutool.json.JSONException;
  7. import cn.hutool.json.JSONObject;
  8. import com.gzlh.config.hksdk.HCNetSDK;
  9. import com.gzlh.constans.AjaxError;
  10. import com.gzlh.entity.AddFaceBO;
  11. import com.sun.jna.Pointer;
  12. import com.sun.jna.ptr.IntByReference;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.springframework.stereotype.Service;
  15. import javax.annotation.Resource;
  16. import java.io.UnsupportedEncodingException;
  17. import java.nio.charset.StandardCharsets;
  18. import java.util.Date;
  19. /**
  20. * 功能:人脸下发、查询、删除、人员计划模板配置
  21. */
  22. @Service
  23. @Slf4j
  24. public class UserManage {
  25. @Resource
  26. private HCNetSDK hcNetSDK;
  27. /**
  28. * 添加人员
  29. *
  30. * @param lUserID 登录句柄
  31. * @param employeeNo 工号
  32. * @throws UnsupportedEncodingException
  33. * @throws InterruptedException
  34. * @throws JSONException
  35. */
  36. public void AddUserInfo(int lUserID, AddFaceBO addFaceBO) throws UnsupportedEncodingException, InterruptedException, JSONException {
  37. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  38. //"POST /ISAPI/AccessControl/UserInfo/Record?format=json" 此URL也是下发人员
  39. String strInBuffer = "PUT /ISAPI/AccessControl/UserInfo/SetUp?format=json";
  40. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  41. ptrByteArray.write();
  42. String name=addFaceBO.getName();
  43. String employeeNo=addFaceBO.getNo();
  44. int lHandler = hcNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  45. if (lHandler < 0) {
  46. log.error("AddUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + hcNetSDK.NET_DVR_GetLastError());
  47. throw new AjaxError("添加失败");
  48. } else {
  49. byte[] Name = name.getBytes(StandardCharsets.UTF_8); //根据iCharEncodeType判断,如果iCharEncodeType返回6,则是UTF-8编码。
  50. //如果是0或者1或者2,则是GBK编码
  51. //将中文字符编码之后用数组拷贝的方式,避免因为编码导致的长度问题
  52. Date now = new Date();
  53. String nowTime = DateUtil.formatDate(now) + "T" + DateUtil.formatTime(now);
  54. String expireTime = StrUtil.replace(addFaceBO.getExpireTime(), " ","T");
  55. String strInBuffer1 = "{\"UserInfo\":{\"Valid\":{\"beginTime\":\"" + nowTime + "\",\"enable\":true,\"endTime\":" +
  56. "\""+expireTime+"\"}," +
  57. "\"checkUser\":false,\"belongGroup \":\"1\",\"doorRight\":\"1\",\"RightPlan\":[{\"doorNo\": 1,\"planTemplateNo\": \"1,3,5\"}]," +
  58. "\"employeeNo\":\"" + employeeNo + "\",\"floorNumber\":2,\"maxOpenDoorTime\":0,\"name\":\"";
  59. String strInBuffer2 = "\",\"openDelayEnabled\":false,\"password\":\"\",\"roomNumber\":4,\"userType\":\"normal\"}}";
  60. int iStringSize = Name.length + strInBuffer1.length() + strInBuffer2.length();
  61. HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize);
  62. System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length());
  63. System.arraycopy(Name, 0, ptrByte.byValue, strInBuffer1.length(), Name.length);
  64. System.arraycopy(strInBuffer2.getBytes(), 0, ptrByte.byValue, strInBuffer1.length() + Name.length, strInBuffer2.length());
  65. ptrByte.write();
  66. log.info(new String(ptrByte.byValue));
  67. HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
  68. IntByReference pInt = new IntByReference(0);
  69. while (true) {
  70. int dwState = hcNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrByte.getPointer(), iStringSize, ptrOutuff.getPointer(), 1024, pInt);
  71. //读取返回的json并解析
  72. ptrOutuff.read();
  73. String strResult = new String(ptrOutuff.byValue).trim();
  74. log.info("dwState:" + dwState + ",strResult:" + strResult);
  75. JSONObject jsonResult = new JSONObject(strResult);
  76. int statusCode = jsonResult.getInt("statusCode");
  77. String statusString = jsonResult.getStr("statusString");
  78. if (statusString.equals("OK")) {
  79. break;
  80. }
  81. if (dwState == -1) {
  82. log.info("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());
  83. break;
  84. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
  85. log.info("配置等待");
  86. Thread.sleep(10);
  87. continue;
  88. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
  89. log.info("下发人员失败, json retun:" + jsonResult.toString());
  90. throw new AjaxError("下发人员" + employeeNo + "失败");
  91. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  92. log.info("下发人员异常, json retun:" + jsonResult.toString());
  93. throw new AjaxError("下发人员" + employeeNo + "失败");
  94. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文
  95. if (statusCode != 1) {
  96. log.info("下发人员成功,但是有异常情况:" + jsonResult.toString());
  97. throw new AjaxError("下发人员" + employeeNo + "失败");
  98. } else {
  99. log.info("下发人员成功: json retun:" + jsonResult.toString());
  100. }
  101. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  102. //下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
  103. log.info("下发人员完成");
  104. break;
  105. }
  106. }
  107. if (!hcNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
  108. log.info("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());
  109. } else {
  110. log.info("NET_DVR_StopRemoteConfig接口成功");
  111. }
  112. }
  113. }
  114. public void SearchUserInfo(int userID, String employeeNo) throws JSONException {
  115. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  116. String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json";
  117. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  118. ptrByteArray.write();
  119. int lHandler = hcNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  120. if (lHandler < 0) {
  121. log.info("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + hcNetSDK.NET_DVR_GetLastError());
  122. return;
  123. } else {
  124. //组装查询的JSON报文,这边查询的是所有的人员
  125. JSONObject jsonObject = new JSONObject();
  126. JSONObject jsonSearchCond = new JSONObject();
  127. //如果需要查询指定的工号人员信息,把下面注释的内容去除掉即可
  128. JSONArray EmployeeNoList = new JSONArray();
  129. JSONObject employeeNo1 = new JSONObject();
  130. employeeNo1.set("employeeNo", employeeNo);
  131. EmployeeNoList.put(employeeNo1);
  132. jsonSearchCond.set("EmployeeNoList", EmployeeNoList);
  133. jsonSearchCond.set("searchID", RandomUtil.randomNumbers(12));
  134. jsonSearchCond.set("searchResultPosition", 0);
  135. jsonSearchCond.set("maxResults", 50);
  136. jsonObject.set("UserInfoSearchCond", jsonSearchCond);
  137. String strInbuff = jsonObject.toString();
  138. log.info("查询的json报文:{},{}", employeeNo, strInbuff);
  139. //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
  140. HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
  141. System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
  142. ptrInbuff.write();
  143. //定义接收结果的结构体
  144. HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024);
  145. IntByReference pInt = new IntByReference(0);
  146. while (true) {
  147. int dwState = hcNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 10 * 1024, pInt);
  148. if (dwState == -1) {
  149. log.info("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());
  150. break;
  151. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
  152. log.info("配置等待");
  153. try {
  154. Thread.sleep(10);
  155. } catch (InterruptedException e) {
  156. // TODO Auto-generated catch block
  157. e.printStackTrace();
  158. }
  159. continue;
  160. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
  161. log.info("查询人员失败");
  162. break;
  163. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  164. log.info("查询人员异常");
  165. break;
  166. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
  167. ptrOutuff.read();
  168. log.info("查询人员成功, json:" + new String(ptrOutuff.byValue).trim());
  169. break;
  170. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  171. log.info("获取人员完成");
  172. break;
  173. }
  174. }
  175. if (!hcNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
  176. log.info("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());
  177. } else {
  178. log.info("NET_DVR_StopRemoteConfig接口成功");
  179. lHandler = -1;
  180. }
  181. }
  182. }
  183. public boolean deleteUserInfo(int userID, String employeeNo) throws JSONException {
  184. //删除单个人员
  185. String deleteUserjson = "{\n" +
  186. "\t\"UserInfoDetail\": {\t\n" +
  187. "\t\t\"mode\": \"byEmployeeNo\",\t\n" +
  188. "\t\t\"EmployeeNoList\": [\t\n" +
  189. "\t\t\t{\n" +
  190. "\t\t\t\t\"employeeNo\": \"" + employeeNo + "\"\t\n" +
  191. "\t\t\t}\n" +
  192. "\t\t]\n" +
  193. "\n" +
  194. "\t}\n" +
  195. "}";
  196. //删除所有人员
  197. // String deleteUserjson = "{\n" +
  198. // "\t\"UserInfoDetail\": {\t\n" +
  199. // "\t\t\"mode\": \"all\",\t\n" +
  200. // "\t\t\"EmployeeNoList\": [\t\n" +
  201. // "\t\t]\n" +
  202. // "\n" +
  203. // "\t}\n" +
  204. // "}";
  205. String deleteUserUrl = "PUT /ISAPI/AccessControl/UserInfoDetail/Delete?format=json";
  206. String result = transIsapi.put_isapi(userID, deleteUserUrl, deleteUserjson, hcNetSDK);
  207. log.info(result);
  208. //获取删除进度
  209. while (true) {
  210. String getDeleteProcessUrl = "GET /ISAPI/AccessControl/UserInfoDetail/DeleteProcess?format=json";
  211. String deleteResult = transIsapi.get_isapi(userID, getDeleteProcessUrl, hcNetSDK);
  212. JSONObject jsonObject = new JSONObject(deleteResult);
  213. JSONObject jsonObject1 = jsonObject.getJSONObject("UserInfoDetailDeleteProcess");
  214. String process = jsonObject1.getStr("status");
  215. log.info("process =" + process);
  216. if (process.equals("processing")) {
  217. log.info("正在删除");
  218. continue;
  219. } else if (process.equals("success")) {
  220. log.info("删除成功");
  221. break;
  222. } else if (process.equals("failed")) {
  223. throw new AjaxError("删除" + employeeNo + "失败");
  224. }
  225. }
  226. return false;
  227. }
  228. /**
  229. * 人员计划模板配置
  230. *
  231. * @param userID 用户登录句柄
  232. * @param iPlanTemplateNumber 计划模板编号,从1开始,最大值从门禁能力集获取
  233. */
  234. public void SetCardTemplate(int userID, int iPlanTemplateNumber) {
  235. //设置卡权限计划模板参数
  236. HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND struPlanCond = new HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND();
  237. struPlanCond.dwSize = struPlanCond.size();
  238. struPlanCond.dwPlanTemplateNumber = iPlanTemplateNumber;//计划模板编号,从1开始,最大值从门禁能力集获取
  239. struPlanCond.wLocalControllerID = 0;//就地控制器序号[1,64],0表示门禁主机
  240. struPlanCond.write();
  241. HCNetSDK.NET_DVR_PLAN_TEMPLATE struPlanTemCfg = new HCNetSDK.NET_DVR_PLAN_TEMPLATE();
  242. struPlanTemCfg.dwSize = struPlanTemCfg.size();
  243. struPlanTemCfg.byEnable = 1; //是否使能:0- 否,1- 是
  244. struPlanTemCfg.dwWeekPlanNo = 2;//周计划编号,0表示无效
  245. struPlanTemCfg.dwHolidayGroupNo[0] = 0;//假日组编号,按值表示,采用紧凑型排列,中间遇到0则后续无效
  246. byte[] byTemplateName;
  247. try {
  248. byTemplateName = "CardTemplatePlan_2".getBytes("GBK");
  249. //计划模板名称
  250. for (int i = 0; i < HCNetSDK.NAME_LEN; i++) {
  251. struPlanTemCfg.byTemplateName[i] = 0;
  252. }
  253. System.arraycopy(byTemplateName, 0, struPlanTemCfg.byTemplateName, 0, byTemplateName.length);
  254. } catch (UnsupportedEncodingException e) {
  255. // TODO Auto-generated catch block
  256. e.printStackTrace();
  257. }
  258. struPlanTemCfg.write();
  259. IntByReference pInt = new IntByReference(0);
  260. Pointer lpStatusList = pInt.getPointer();
  261. if (false == hcNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50, 1, struPlanCond.getPointer(), struPlanCond.size(), lpStatusList, struPlanTemCfg.getPointer(), struPlanTemCfg.size())) {
  262. log.info("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50失败,错误号:" + hcNetSDK.NET_DVR_GetLastError());
  263. return;
  264. }
  265. log.info("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50成功!");
  266. //获取卡权限周计划参数
  267. HCNetSDK.NET_DVR_WEEK_PLAN_COND struWeekPlanCond = new HCNetSDK.NET_DVR_WEEK_PLAN_COND();
  268. struWeekPlanCond.dwSize = struWeekPlanCond.size();
  269. struWeekPlanCond.dwWeekPlanNumber = 2;
  270. struWeekPlanCond.wLocalControllerID = 0;
  271. HCNetSDK.NET_DVR_WEEK_PLAN_CFG struWeekPlanCfg = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG();
  272. struWeekPlanCond.write();
  273. struWeekPlanCfg.write();
  274. Pointer lpCond = struWeekPlanCond.getPointer();
  275. Pointer lpInbuferCfg = struWeekPlanCfg.getPointer();
  276. if (false == hcNetSDK.NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
  277. log.info("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + hcNetSDK.NET_DVR_GetLastError());
  278. return;
  279. }
  280. struWeekPlanCfg.read();
  281. struWeekPlanCfg.byEnable = 1; //是否使能:0- 否,1- 是
  282. /**避免时间段交叉,先初始化, 七天八小时*/
  283. for (int i = 0; i < 7; i++) {
  284. for (int j = 0; j < 8; j++) {
  285. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].byEnable = 0;
  286. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour = 0;
  287. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute = 0;
  288. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond = 0;
  289. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour = 0;
  290. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute = 0;
  291. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond = 0;
  292. }
  293. }
  294. /**一周7天,全天24小时*/
  295. for (int i = 0; i < 7; i++) {
  296. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
  297. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 21;
  298. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
  299. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
  300. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 23;
  301. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 0;
  302. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 0;
  303. }
  304. /**一周7天,每天设置2个时间段*/
  305. /*for(int i=0;i<7;i++)
  306. {
  307. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
  308. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 0;
  309. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
  310. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
  311. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 11;
  312. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 59;
  313. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 59;
  314. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].byEnable = 1;
  315. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 13;
  316. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 30;
  317. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0;
  318. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 19;
  319. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 59;
  320. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 59;
  321. }*/
  322. struWeekPlanCfg.write();
  323. //设置卡权限周计划参数
  324. if (false == hcNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
  325. log.info("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + hcNetSDK.NET_DVR_GetLastError());
  326. } else {
  327. log.info("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50成功!");
  328. }
  329. }
  330. }