You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

669 lines
40 KiB

  1. package com.hkversion.Acs;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONException;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.hkversion.HCNetSDK;
  6. import com.sun.jna.Pointer;
  7. import com.sun.jna.ptr.IntByReference;
  8. import com.yzx.impl.CardTemplateInfo;
  9. import com.yzx.impl.HKVersion;
  10. import java.io.UnsupportedEncodingException;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.stream.Collectors;
  14. /**
  15. * 功能:人脸下发、查询、删除、人员计划模板配置
  16. */
  17. public class UserManage {
  18. /**
  19. * 添加人员
  20. *
  21. * @param lUserID 登录句柄
  22. * @param employeeNo 工号
  23. * @throws UnsupportedEncodingException
  24. * @throws InterruptedException
  25. * @throws JSONException
  26. */
  27. public static void addUserInfo(int lUserID, String employeeNo) throws UnsupportedEncodingException, InterruptedException, JSONException {
  28. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  29. //"POST /ISAPI/AccessControl/UserInfo/Record?format=json" 此URL也是下发人员
  30. String strInBuffer = "PUT /ISAPI/AccessControl/UserInfo/SetUp?format=json";
  31. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  32. ptrByteArray.write();
  33. int lHandler = HKVersion.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  34. if (lHandler < 0) {
  35. System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  36. return;
  37. } else {
  38. System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!");
  39. byte[] Name = "测试1".getBytes("utf-8"); //根据iCharEncodeType判断,如果iCharEncodeType返回6,则是UTF-8编码。
  40. //如果是0或者1或者2,则是GBK编码
  41. //将中文字符编码之后用数组拷贝的方式,避免因为编码导致的长度问题
  42. String strInBuffer1 = "{\n" +
  43. " \"UserInfo\":{\n" +
  44. " \"employeeNo\":\""+employeeNo+"\",\n" +
  45. " \"name\":\"";
  46. String strInBuffer2 = "\",\n" +
  47. " \"userType\":\"normal\",\n" +
  48. " \"Valid\":{\n" +
  49. " \"enable\":true,\n" +
  50. " \"beginTime\":\"2019-08-01T17:30:08\",\n" +
  51. " \"endTime\":\"2030-08-01T17:30:08\",\n" +
  52. " \"timeType\":\"local\"\n" +
  53. " },\n" +
  54. " \"belongGroup\":\"1\",\n" +
  55. " \"doorRight\":\"1\",\n" +
  56. " \"RightPlan\":[\n" +
  57. " {\n" +
  58. " \"doorNo\":1,\n" +
  59. " \"planTemplateNo\":\"1\"\n" +
  60. " }\n" +
  61. " ]\n" +
  62. " }\n" +
  63. "}";
  64. int iStringSize = Name.length + strInBuffer1.length() + strInBuffer2.length();
  65. HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize);
  66. System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length());
  67. System.arraycopy(Name, 0, ptrByte.byValue, strInBuffer1.length(), Name.length);
  68. System.arraycopy(strInBuffer2.getBytes(), 0, ptrByte.byValue, strInBuffer1.length() + Name.length, strInBuffer2.length());
  69. ptrByte.write();
  70. System.out.println(new String(ptrByte.byValue));
  71. HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
  72. IntByReference pInt = new IntByReference(0);
  73. while (true) {
  74. int dwState = HKVersion.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrByte.getPointer(), iStringSize, ptrOutuff.getPointer(), 1024, pInt);
  75. if (dwState == -1) {
  76. System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  77. break;
  78. }
  79. //读取返回的json并解析
  80. ptrOutuff.read();
  81. String strResult = new String(ptrOutuff.byValue).trim();
  82. System.out.println("dwState:" + dwState + ",strResult:" + strResult);
  83. JSONObject jsonResult = JSONObject.parseObject(strResult);
  84. int statusCode = jsonResult.getInteger("statusCode");
  85. String statusString = jsonResult.getString("statusString");
  86. if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
  87. System.out.println("配置等待");
  88. Thread.sleep(10);
  89. continue;
  90. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
  91. System.out.println("下发人员失败, json retun:" + jsonResult.toString());
  92. break;
  93. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  94. System.out.println("下发人员异常, json retun:" + jsonResult.toString());
  95. break;
  96. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文
  97. if (statusCode != 1) {
  98. System.out.println("下发人员成功,但是有异常情况:" + jsonResult.toString());
  99. } else {
  100. System.out.println("下发人员成功: json retun:" + jsonResult.toString());
  101. }
  102. break;
  103. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  104. //下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
  105. System.out.println("下发人员完成");
  106. break;
  107. }
  108. }
  109. if (!HKVersion.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
  110. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  111. } else {
  112. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  113. }
  114. }
  115. }
  116. public static int modifyUserInfo(int lUserID, String employeeNo,int planTemplateNo) throws InterruptedException, JSONException {
  117. int status = -1;
  118. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  119. //"POST /ISAPI/AccessControl/UserInfo/Record?format=json" 此URL也是下发人员
  120. String strInBuffer = "PUT /ISAPI/AccessControl/UserInfo/Modify?format=json";
  121. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  122. ptrByteArray.write();
  123. int lHandler = HKVersion.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  124. if (lHandler < 0) {
  125. System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  126. } else {
  127. System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!");
  128. //如果是0或者1或者2,则是GBK编码
  129. //将中文字符编码之后用数组拷贝的方式,避免因为编码导致的长度问题
  130. String strInBuffer1 = "{\n" +
  131. " \"UserInfo\":{\n" +
  132. " \"employeeNo\":\""+employeeNo+"\",\n" +
  133. " \"RightPlan\":[\n" +
  134. " {\n" +
  135. " \"doorNo\":1,\n" +
  136. " \"planTemplateNo\":\""+planTemplateNo+"\"\n" +
  137. " }\n" +
  138. " ]\n"+
  139. " }\n" +
  140. "}";
  141. int iStringSize = strInBuffer1.length();
  142. HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize);
  143. System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length());
  144. ptrByte.write();
  145. System.out.println(new String(ptrByte.byValue));
  146. HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
  147. IntByReference pInt = new IntByReference(0);
  148. while (true) {
  149. int dwState = HKVersion.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrByte.getPointer(), iStringSize, ptrOutuff.getPointer(), 1024, pInt);
  150. if (dwState == -1) {
  151. System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  152. break;
  153. }
  154. //读取返回的json并解析
  155. ptrOutuff.read();
  156. String strResult = new String(ptrOutuff.byValue).trim();
  157. System.out.println("dwState:" + dwState + ",strResult:" + strResult);
  158. JSONObject jsonResult = JSONObject.parseObject(strResult);
  159. int statusCode = jsonResult.getInteger("statusCode");
  160. String statusString = jsonResult.getString("statusString");
  161. if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
  162. System.out.println("配置等待");
  163. Thread.sleep(10);
  164. continue;
  165. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
  166. System.out.println("更新人员失败, json retun:" + jsonResult.toString());
  167. break;
  168. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  169. System.out.println("更新人员异常, json retun:" + jsonResult.toString());
  170. break;
  171. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文
  172. if (statusCode != 1) {
  173. System.out.println("更新人员成功,但是有异常情况:" + jsonResult.toString());
  174. } else {
  175. JSONObject userInfoJson = JSONObject.parseObject(jsonResult.toString());
  176. if(userInfoJson.containsKey("UserInfoSearch")){
  177. Integer numOfFace = userInfoJson.getJSONObject("UserInfoSearch").getJSONArray("UserInfo").getJSONObject(0).getInteger("numOfFace");
  178. if(numOfFace > 0){
  179. System.out.println("更新人员成功: json retun:" + jsonResult.toString());
  180. status = 1;
  181. }else{
  182. System.out.println("更新人员失败: json retun:" + jsonResult.toString());
  183. status = -1;
  184. }
  185. }else{
  186. status = 1;
  187. }
  188. }
  189. break;
  190. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  191. //下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
  192. System.out.println("更新人员完成");
  193. break;
  194. }
  195. }
  196. if (!HKVersion.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
  197. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  198. } else {
  199. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  200. }
  201. }
  202. return status;
  203. }
  204. /**
  205. * 查询人员信息
  206. * @param userID
  207. * @throws JSONException
  208. */
  209. public static String searchUserInfo(int userID,String...employeeNo) throws JSONException {
  210. String result = null;
  211. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  212. String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json";
  213. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  214. ptrByteArray.write();
  215. int lHandler = HKVersion.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  216. if (lHandler < 0) {
  217. System.out.println("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  218. return result;
  219. } else {
  220. //组装查询的JSON报文,这边查询的是所有的人员
  221. JSONObject jsonObject = new JSONObject();
  222. JSONObject jsonSearchCond = new JSONObject();
  223. //如果需要查询指定的工号人员信息,把下面注释的内容去除掉即可
  224. JSONArray EmployeeNoList = new JSONArray();
  225. JSONObject employeeNo1 = new JSONObject();
  226. employeeNo1.put("employeeNo", employeeNo[0]);
  227. // JSONObject employeeNo2 = new JSONObject();
  228. // employeeNo2.put("employeeNo", "u10");
  229. EmployeeNoList.add(employeeNo1);
  230. // EmployeeNoList.add(employeeNo2);
  231. jsonSearchCond.put("EmployeeNoList", EmployeeNoList);
  232. jsonSearchCond.put("searchID", "20230912");
  233. jsonSearchCond.put("searchResultPosition", 0);
  234. jsonSearchCond.put("maxResults", 50);
  235. jsonObject.put("UserInfoSearchCond", jsonSearchCond);
  236. String strInbuff = jsonObject.toString();
  237. System.out.println("查询的json报文:" + strInbuff);
  238. //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
  239. HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
  240. System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
  241. ptrInbuff.write();
  242. //定义接收结果的结构体
  243. HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024);
  244. IntByReference pInt = new IntByReference(0);
  245. while (true) {
  246. /*
  247. dwOutBuffSize是输出缓冲区大小,需要自定义指定大小,如果接口报错错误码43.说明接收设备数据的缓冲区或存放图片缓冲区不足,应扩大缓冲区大小
  248. */
  249. int dwState = HKVersion.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 20 * 1024, pInt);
  250. System.out.println(dwState);
  251. if (dwState == -1) {
  252. System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  253. break;
  254. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
  255. System.out.println("配置等待");
  256. try {
  257. Thread.sleep(10);
  258. } catch (InterruptedException e) {
  259. // TODO Auto-generated catch block
  260. e.printStackTrace();
  261. }
  262. continue;
  263. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
  264. System.out.println("查询人员失败");
  265. break;
  266. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  267. System.out.println("查询人员异常");
  268. break;
  269. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
  270. ptrOutuff.read();
  271. String trim = new String(ptrOutuff.byValue).trim();
  272. System.out.println("查询人员成功, json:" + trim);
  273. result = trim;
  274. break;
  275. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  276. System.out.println("获取人员完成");
  277. break;
  278. }
  279. }
  280. if (!HKVersion.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
  281. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  282. } else {
  283. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  284. lHandler = -1;
  285. }
  286. }
  287. return result;
  288. }
  289. public static void deleteUserInfo(int userID) throws JSONException {
  290. //删除单个人员
  291. // String deleteUserjson="{\n" +
  292. // "\t\"UserInfoDetail\": {\t\n" +
  293. // "\t\t\"mode\": \"byEmployeeNo\",\t\n" +
  294. // "\t\t\"EmployeeNoList\": [\t\n" +
  295. // "\t\t\t{\n" +
  296. // "\t\t\t\t\"employeeNo\": \"test\"\t\n" +
  297. // "\t\t\t}\n" +
  298. // "\t\t]\n" +
  299. // "\n" +
  300. // "\t}\n" +
  301. // "}";
  302. //删除所有人员
  303. String deleteUserjson = "{\n" +
  304. "\t\"UserInfoDetail\": {\t\n" +
  305. "\t\t\"mode\": \"all\",\t\n" +
  306. "\t\t\"EmployeeNoList\": [\t\n" +
  307. "\t\t]\n" +
  308. "\n" +
  309. "\t}\n" +
  310. "}";
  311. String deleteUserUrl = "PUT /ISAPI/AccessControl/UserInfoDetail/Delete?format=json";
  312. String result = TransIsapi.put_isapi(userID, deleteUserUrl, deleteUserjson);
  313. System.out.println(result);
  314. //获取删除进度
  315. while (true) {
  316. String getDeleteProcessUrl = "GET /ISAPI/AccessControl/UserInfoDetail/DeleteProcess?format=json";
  317. String deleteResult = TransIsapi.get_isapi(userID, getDeleteProcessUrl);
  318. JSONObject jsonObject = JSONObject.parseObject(deleteResult);
  319. JSONObject jsonObject1 = jsonObject.getJSONObject("UserInfoDetailDeleteProcess");
  320. String process = jsonObject1.getString("status");
  321. System.out.println("process ="+process);
  322. if (process.equals("processing")) {
  323. System.out.println("正在删除");
  324. continue;
  325. } else if (process.equals("success")) {
  326. System.out.println("删除成功");
  327. break;
  328. }else if(process.equals("failed")){
  329. System.out.println("删除失败");
  330. break;
  331. }
  332. }
  333. }
  334. /**
  335. * 人员计划模板配置
  336. *
  337. * @param userID 用户登录句柄
  338. * @param iPlanTemplateNumber 计划模板编号,从1开始,最大值从门禁能力集获取
  339. */
  340. public static void setCardTemplate(int userID, int iPlanTemplateNumber,int dwWeekPlanNumber) {
  341. //设置卡权限计划模板参数
  342. HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND struPlanCond = new HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND();
  343. struPlanCond.dwSize = struPlanCond.size();
  344. struPlanCond.dwPlanTemplateNumber = iPlanTemplateNumber;//计划模板编号,从1开始,最大值从门禁能力集获取
  345. struPlanCond.wLocalControllerID = 0;//就地控制器序号[1,64],0表示门禁主机
  346. struPlanCond.write();
  347. HCNetSDK.NET_DVR_PLAN_TEMPLATE struPlanTemCfg = new HCNetSDK.NET_DVR_PLAN_TEMPLATE();
  348. struPlanTemCfg.dwSize = struPlanTemCfg.size();
  349. struPlanTemCfg.byEnable = 1; //是否使能:0- 否,1- 是
  350. struPlanTemCfg.dwWeekPlanNo = 2;//周计划编号,0表示无效
  351. struPlanTemCfg.dwHolidayGroupNo[0] = 0;//假日组编号,按值表示,采用紧凑型排列,中间遇到0则后续无效
  352. byte[] byTemplateName;
  353. try {
  354. byTemplateName = "CardTemplatePlan_2".getBytes("GBK");
  355. //计划模板名称
  356. for (int i = 0; i < HCNetSDK.NAME_LEN; i++) {
  357. struPlanTemCfg.byTemplateName[i] = 0;
  358. }
  359. System.arraycopy(byTemplateName, 0, struPlanTemCfg.byTemplateName, 0, byTemplateName.length);
  360. } catch (UnsupportedEncodingException e) {
  361. // TODO Auto-generated catch block
  362. e.printStackTrace();
  363. }
  364. struPlanTemCfg.write();
  365. IntByReference pInt = new IntByReference(0);
  366. Pointer lpStatusList = pInt.getPointer();
  367. if (false == HKVersion.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50, 1, struPlanCond.getPointer(), struPlanCond.size(), lpStatusList, struPlanTemCfg.getPointer(), struPlanTemCfg.size())) {
  368. System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50失败,错误号:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  369. return;
  370. }
  371. System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50成功!");
  372. //获取卡权限周计划参数
  373. HCNetSDK.NET_DVR_WEEK_PLAN_COND struWeekPlanCond = new HCNetSDK.NET_DVR_WEEK_PLAN_COND();
  374. struWeekPlanCond.dwSize = struWeekPlanCond.size();
  375. struWeekPlanCond.dwWeekPlanNumber = dwWeekPlanNumber;
  376. struWeekPlanCond.wLocalControllerID = 0;
  377. HCNetSDK.NET_DVR_WEEK_PLAN_CFG struWeekPlanCfg = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG();
  378. struWeekPlanCond.write();
  379. struWeekPlanCfg.write();
  380. Pointer lpCond = struWeekPlanCond.getPointer();
  381. Pointer lpInbuferCfg = struWeekPlanCfg.getPointer();
  382. if (false == HKVersion.hCNetSDK.NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
  383. System.out.println("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  384. return;
  385. }
  386. struWeekPlanCfg.read();
  387. struWeekPlanCfg.byEnable = 1; //是否使能:0- 否,1- 是
  388. /**避免时间段交叉,先初始化, 七天八小时*/
  389. for (int i = 0; i < 7; i++) {
  390. for (int j = 0; j < 8; j++) {
  391. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].byEnable = 0;
  392. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour = 0;
  393. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute = 0;
  394. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond = 0;
  395. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour = 0;
  396. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute = 0;
  397. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond = 0;
  398. }
  399. }
  400. // /**一周7天,全天24小时*/
  401. // for (int i = 0; i < 7; i++) {
  402. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
  403. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 0;
  404. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
  405. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
  406. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 23;
  407. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 59;
  408. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 59;
  409. // }
  410. /**一周7天,每天设置2个时间段*/
  411. // for(int i=0;i<7;i++)
  412. // {
  413. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
  414. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 11;
  415. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 20;
  416. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
  417. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 12;
  418. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 0;
  419. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 0;
  420. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].byEnable = 1;
  421. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 12;
  422. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 1;
  423. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0;
  424. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 12;
  425. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 30;
  426. // struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 0;
  427. // }
  428. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].byEnable = 1;
  429. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 6;
  430. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 40;
  431. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
  432. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 8;
  433. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 10;
  434. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 0;
  435. //
  436. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].byEnable = 1;
  437. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 12;
  438. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 25;
  439. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0;
  440. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 14;
  441. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 20;
  442. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 0;
  443. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[2].byEnable = 1;
  444. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[2].struTimeSegment.struBeginTime.byHour = 12;
  445. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[2].struTimeSegment.struBeginTime.byMinute = 25;
  446. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[2].struTimeSegment.struBeginTime.bySecond = 0;
  447. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[2].struTimeSegment.struEndTime.byHour = 14;
  448. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[2].struTimeSegment.struEndTime.byMinute = 20;
  449. // struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[2].struTimeSegment.struEndTime.bySecond = 0;
  450. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].byEnable = 1;
  451. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 15;
  452. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 30;
  453. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 59;
  454. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 19;
  455. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 40;
  456. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 59;
  457. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].byEnable = 1;
  458. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 11;
  459. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 20;
  460. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 59;
  461. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 12;
  462. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 00;
  463. struWeekPlanCfg.struPlanCfg[4].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 0;
  464. struWeekPlanCfg.write();
  465. //设置卡权限周计划参数
  466. if (false == HKVersion.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
  467. System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  468. } else {
  469. System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50成功!");
  470. }
  471. }
  472. /**
  473. * 人员计划模板配置
  474. *
  475. * @param userID 用户登录句柄
  476. * @param dwWeekPlanNumber 计划模板编号,从1开始,1-2是系统默认的不要修改,最大值从门禁能力集获取
  477. */
  478. public static CardTemplateInfo getCardTemplate(int userID,int dwWeekPlanNumber) {
  479. IntByReference pInt = new IntByReference(0);
  480. Pointer lpStatusList = pInt.getPointer();
  481. //获取卡权限周计划参数
  482. HCNetSDK.NET_DVR_WEEK_PLAN_COND struWeekPlanCond = new HCNetSDK.NET_DVR_WEEK_PLAN_COND();
  483. struWeekPlanCond.dwSize = struWeekPlanCond.size();
  484. struWeekPlanCond.dwWeekPlanNumber = dwWeekPlanNumber;
  485. struWeekPlanCond.wLocalControllerID = 0;
  486. HCNetSDK.NET_DVR_WEEK_PLAN_CFG struWeekPlanCfg = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG();
  487. struWeekPlanCond.write();
  488. struWeekPlanCfg.write();
  489. Pointer lpCond = struWeekPlanCond.getPointer();
  490. Pointer lpInbuferCfg = struWeekPlanCfg.getPointer();
  491. if (false == HKVersion.hCNetSDK.NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
  492. System.out.println("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  493. return null;
  494. }
  495. struWeekPlanCfg.read();
  496. CardTemplateInfo cardTemplateInfo = new CardTemplateInfo();
  497. cardTemplateInfo.setTemplateId(dwWeekPlanNumber);
  498. List<CardTemplateInfo.TimeSegmentInfo> timeSegmentInfos = cardTemplateInfo.getTimeSegmentInfos();
  499. for (int i = 0; i < 7; i++) {
  500. int weekday = (i+1);
  501. System.out.println("星期:"+weekday);
  502. for (int j = 0; j < 8; j++) {
  503. CardTemplateInfo.TimeSegmentInfo timeSegmentInfo = new CardTemplateInfo.TimeSegmentInfo();
  504. byte enable = struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].byEnable;
  505. byte beginTimeHour = struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour;
  506. byte beginTimeMinute = struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute;
  507. byte beginTimeSecond = struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond;
  508. byte endTimeHour = struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour;
  509. byte endTimeMinute = struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute;
  510. byte endTimeSecond = struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond;
  511. timeSegmentInfo.setEnable(enable);
  512. timeSegmentInfo.setBeginTimeHour(beginTimeHour);
  513. timeSegmentInfo.setBeginTimeMinute(beginTimeMinute);
  514. timeSegmentInfo.setBeginTimeSecond(beginTimeSecond);
  515. timeSegmentInfo.setEndTimeHour(endTimeHour);
  516. timeSegmentInfo.setEndTimeMinute(endTimeMinute);
  517. timeSegmentInfo.setEndTimeSecond(endTimeSecond);
  518. timeSegmentInfo.setWeekday(weekday);
  519. timeSegmentInfo.setTimeSegment(j);
  520. if(enable == 1){
  521. timeSegmentInfos.add(timeSegmentInfo);
  522. }
  523. System.out.print("可用状态:"+ enable);
  524. System.out.println("\t时间段"+j+":"+ beginTimeHour
  525. + ":"
  526. + beginTimeMinute
  527. + ":"
  528. + beginTimeSecond + "--" + endTimeHour
  529. + ":"
  530. + endTimeMinute
  531. + ":"
  532. + endTimeSecond);
  533. }
  534. }
  535. return cardTemplateInfo;
  536. }
  537. /**
  538. * 人员计划模板配置
  539. *
  540. * @param userID 用户登录句柄
  541. * @param info 计划模板编号,从1开始,最大值从门禁能力集获取
  542. */
  543. public static int setCardTemplate(int userID, CardTemplateInfo info) {
  544. int iPlanTemplateNumber = info.getTemplateId();
  545. //设置卡权限计划模板参数
  546. HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND struPlanCond = new HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND();
  547. struPlanCond.dwSize = struPlanCond.size();
  548. struPlanCond.dwPlanTemplateNumber = iPlanTemplateNumber;//计划模板编号,从1开始,最大值从门禁能力集获取
  549. struPlanCond.wLocalControllerID = 0;//就地控制器序号[1,64],0表示门禁主机
  550. struPlanCond.write();
  551. HCNetSDK.NET_DVR_PLAN_TEMPLATE struPlanTemCfg = new HCNetSDK.NET_DVR_PLAN_TEMPLATE();
  552. struPlanTemCfg.dwSize = struPlanTemCfg.size();
  553. struPlanTemCfg.byEnable = info.getEnable(); //是否使能:0- 否,1- 是
  554. struPlanTemCfg.dwWeekPlanNo = iPlanTemplateNumber;//周计划编号,0表示无效
  555. struPlanTemCfg.dwHolidayGroupNo[0] = 0;//假日组编号,按值表示,采用紧凑型排列,中间遇到0则后续无效
  556. byte[] byTemplateName;
  557. try {
  558. byTemplateName = info.getTemplateName().getBytes("GBK");
  559. //计划模板名称
  560. for (int i = 0; i < HCNetSDK.NAME_LEN; i++) {
  561. struPlanTemCfg.byTemplateName[i] = 0;
  562. }
  563. System.arraycopy(byTemplateName, 0, struPlanTemCfg.byTemplateName, 0, byTemplateName.length);
  564. } catch (UnsupportedEncodingException e) {
  565. // TODO Auto-generated catch block
  566. e.printStackTrace();
  567. }
  568. struPlanTemCfg.write();
  569. IntByReference pInt = new IntByReference(0);
  570. Pointer lpStatusList = pInt.getPointer();
  571. if (false == HKVersion.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50, 1, struPlanCond.getPointer(), struPlanCond.size(), lpStatusList, struPlanTemCfg.getPointer(), struPlanTemCfg.size())) {
  572. System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50失败,错误号:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  573. return -1;
  574. }
  575. System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50成功!");
  576. //获取卡权限周计划参数
  577. HCNetSDK.NET_DVR_WEEK_PLAN_COND struWeekPlanCond = new HCNetSDK.NET_DVR_WEEK_PLAN_COND();
  578. struWeekPlanCond.dwSize = struWeekPlanCond.size();
  579. struWeekPlanCond.dwWeekPlanNumber = iPlanTemplateNumber;
  580. struWeekPlanCond.wLocalControllerID = 0;
  581. HCNetSDK.NET_DVR_WEEK_PLAN_CFG struWeekPlanCfg = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG();
  582. struWeekPlanCond.write();
  583. struWeekPlanCfg.write();
  584. Pointer lpCond = struWeekPlanCond.getPointer();
  585. Pointer lpInbuferCfg = struWeekPlanCfg.getPointer();
  586. if (false == HKVersion.hCNetSDK.NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
  587. System.out.println("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  588. return -1;
  589. }
  590. struWeekPlanCfg.read();
  591. struWeekPlanCfg.byEnable = info.getEnable(); //是否使能:0- 否,1- 是
  592. /**避免时间段交叉,先初始化, 七天八小时*/
  593. for (int i = 0; i < 7; i++) {
  594. for (int j = 0; j < 8; j++) {
  595. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].byEnable = 0;
  596. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour = 0;
  597. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute = 0;
  598. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond = 0;
  599. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour = 0;
  600. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute = 0;
  601. struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond = 0;
  602. }
  603. }
  604. List<CardTemplateInfo.TimeSegmentInfo> timeSegmentInfos = info.getTimeSegmentInfos();
  605. Map<Integer, List<CardTemplateInfo.TimeSegmentInfo>> timeSegmentInfoWeekDayMap = timeSegmentInfos.stream().collect(Collectors.groupingBy(i -> i.getWeekday()));
  606. timeSegmentInfoWeekDayMap.forEach((k,v) ->{
  607. for (CardTemplateInfo.TimeSegmentInfo timeSegmentInfo : v) {
  608. int timeSegment = timeSegmentInfo.getTimeSegment();
  609. struWeekPlanCfg.struPlanCfg[k].struPlanCfgDay[timeSegment].byEnable = timeSegmentInfo.getEnable();
  610. struWeekPlanCfg.struPlanCfg[k].struPlanCfgDay[timeSegment].struTimeSegment.struBeginTime.byHour = timeSegmentInfo.getBeginTimeHour();
  611. struWeekPlanCfg.struPlanCfg[k].struPlanCfgDay[timeSegment].struTimeSegment.struBeginTime.byMinute = timeSegmentInfo.getBeginTimeMinute();
  612. struWeekPlanCfg.struPlanCfg[k].struPlanCfgDay[timeSegment].struTimeSegment.struBeginTime.bySecond = timeSegmentInfo.getBeginTimeSecond();
  613. struWeekPlanCfg.struPlanCfg[k].struPlanCfgDay[timeSegment].struTimeSegment.struEndTime.byHour = timeSegmentInfo.getEndTimeHour();
  614. struWeekPlanCfg.struPlanCfg[k].struPlanCfgDay[timeSegment].struTimeSegment.struEndTime.byMinute = timeSegmentInfo.getEndTimeMinute();
  615. struWeekPlanCfg.struPlanCfg[k].struPlanCfgDay[timeSegment].struTimeSegment.struEndTime.bySecond = timeSegmentInfo.getEndTimeSecond();
  616. }
  617. });
  618. struWeekPlanCfg.write();
  619. //设置卡权限周计划参数
  620. if (false == HKVersion.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
  621. System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + HKVersion.hCNetSDK.NET_DVR_GetLastError());
  622. return -1;
  623. } else {
  624. System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50成功!");
  625. return 1;
  626. }
  627. }
  628. }