hikvision.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. package service
  2. import (
  3. "city_chips/internal/model"
  4. "city_chips/internal/repository"
  5. "encoding/json"
  6. "errors"
  7. "strings"
  8. "github.com/spf13/viper"
  9. "github.com/zxbit2011/hikvisionOpenAPIGo"
  10. )
  11. type HikvisionService interface {
  12. Hikvision(url string, body map[string]string, timeout int) (hikvisionOpenAPIGo.Result, error)
  13. DeviceResource(Device string) (error, model.DeviceResource)
  14. GetRegionsRoot() (error, model.RegionsRoot)
  15. GetRegionsSubRegions(pageNo, pageSize string) (error, model.RegionsSubRegions)
  16. GetVqdByIndexCodes(pageNo, pageSize string, indexCodes []string) (error, model.VqdList)
  17. GetCameraOnline(regionId, includeSubNode, status, pageNo, pageSize string, indexCodes []string) (error, model.CameraOnline)
  18. GetRecordList(beginTime, endTime, pageNo, pageSize string, indexCodes []string) (error, model.RecordList)
  19. GetCamerasList(pageNo, pageSize string) (error, model.Cameras)
  20. GetVisitingRecords(receptionistId, receptionistName, visitorName, pageNo, pageSize string) (error, model.VisitingRecords)
  21. GetVisitorTypeInfo(pageNo, pageSize string) (error, model.VisitorTypeInfo)
  22. GetAppointmentRecords(receptionistId, visitorName, phoneNo, pageNo, pageSize string) (error, model.VisitorTypeInfo)
  23. GetVisitorTypeList() (error, model.VisitorTypeList)
  24. GetTurnoverSearch(pageNo, pageSize string) (error, model.TurnoverSearch)
  25. }
  26. func NewHikvisionService(service *Service, hikvisionRepository repository.HikvisionRepository, conf *viper.Viper) HikvisionService {
  27. return &hikvisionService{
  28. Service: service,
  29. hikvisionRepository: hikvisionRepository,
  30. conf: conf,
  31. }
  32. }
  33. type hikvisionService struct {
  34. *Service
  35. hikvisionRepository repository.HikvisionRepository
  36. conf *viper.Viper
  37. }
  38. // Hikvision 海康威视对接
  39. func (s *hikvisionService) Hikvision(url string, body map[string]string, timeout int) (hikvisionOpenAPIGo.Result, error) {
  40. config := hikvisionOpenAPIGo.HKConfig{
  41. Ip: s.conf.GetString("hikvision.Ip"),
  42. Port: s.conf.GetInt("hikvision.Port"),
  43. AppKey: s.conf.GetString("hikvision.AppKey"),
  44. Secret: s.conf.GetString("hikvision.Secret"),
  45. IsHttps: s.conf.GetBool("hikvision.IsHttps"),
  46. }
  47. result, err := config.HttpPost(url, body, timeout)
  48. return result, err
  49. }
  50. // DeviceResource 根据设备类型获取设备资源
  51. func (s *hikvisionService) DeviceResource(Device string) (error, model.DeviceResource) {
  52. var deviceResource model.DeviceResource
  53. m := make(map[string]string)
  54. m["pageNo"] = "1"
  55. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  56. m["resourceType"] = Device
  57. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.deviceResource"), m, 15)
  58. if err != nil {
  59. return errors.New("获取设备资源失败"), deviceResource
  60. }
  61. if hikvision.Code != "0" {
  62. return errors.New("获取设备资源失败"), deviceResource
  63. }
  64. marshalString, err := json.Marshal(hikvision)
  65. if err != nil {
  66. return errors.New("json序列化失败"), deviceResource
  67. }
  68. err = json.Unmarshal(marshalString, &deviceResource)
  69. if err != nil {
  70. return errors.New("json反序列化失败"), deviceResource
  71. }
  72. return nil, deviceResource
  73. }
  74. // GetRegionsRoot 获取根目录资源信息
  75. func (s *hikvisionService) GetRegionsRoot() (error, model.RegionsRoot) {
  76. var regionsRoot model.RegionsRoot
  77. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.regionsRoot"), nil, 15)
  78. if err != nil {
  79. return errors.New("获取根目录资源失败"), regionsRoot
  80. }
  81. if hikvision.Code != "0" {
  82. return errors.New("获取根目录资源失败"), regionsRoot
  83. }
  84. marshalString, err := json.Marshal(hikvision)
  85. if err != nil {
  86. return errors.New("json序列化失败"), regionsRoot
  87. }
  88. err = json.Unmarshal(marshalString, &regionsRoot)
  89. if err != nil {
  90. return errors.New("json反序列化失败"), regionsRoot
  91. }
  92. return nil, regionsRoot
  93. }
  94. // GetRegionsSubRegions 获取子目录资源信息
  95. func (s *hikvisionService) GetRegionsSubRegions(pageNo, pageSize string) (error, model.RegionsSubRegions) {
  96. var regionsSubRegions model.RegionsSubRegions
  97. m := make(map[string]string)
  98. if pageNo != "" {
  99. m["pageNo"] = pageNo
  100. } else {
  101. m["pageNo"] = "1"
  102. }
  103. if pageSize != "" {
  104. m["pageSize"] = pageSize
  105. } else {
  106. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  107. }
  108. m["parentIndexCode"] = "0"
  109. m["resourceType"] = "0"
  110. m["cascadeFlag"] = "0"
  111. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.regionsSubRegions"), m, 15)
  112. if err != nil {
  113. return errors.New("获取子目录资源信息失败"), regionsSubRegions
  114. }
  115. if hikvision.Code != "0" {
  116. return errors.New("获取子目录资源信息失败"), regionsSubRegions
  117. }
  118. marshalString, err := json.Marshal(hikvision)
  119. if err != nil {
  120. return errors.New("json序列化失败"), regionsSubRegions
  121. }
  122. err = json.Unmarshal(marshalString, &regionsSubRegions)
  123. if err != nil {
  124. return errors.New("json反序列化失败"), regionsSubRegions
  125. }
  126. return nil, regionsSubRegions
  127. }
  128. // GetVqdByIndexCodes 根据监控点列表查询视频质量诊断结果
  129. func (s *hikvisionService) GetVqdByIndexCodes(pageNo, pageSize string, indexCodes []string) (error, model.VqdList) {
  130. var vqdlist model.VqdList
  131. // 获取门禁状态
  132. m := make(map[string]string)
  133. if pageNo != "" {
  134. m["pageNo"] = pageNo
  135. } else {
  136. m["pageNo"] = "1"
  137. }
  138. if pageSize != "" {
  139. m["pageSize"] = pageSize
  140. } else {
  141. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  142. }
  143. m["indexCodes"] = strings.Join(indexCodes, ",")
  144. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.vqdList"), m, 15)
  145. if err != nil {
  146. return errors.New("获取视频质量诊断信息失败"), vqdlist
  147. }
  148. if hikvision.Code != "0" {
  149. return errors.New("获取视频质量诊断失败"), vqdlist
  150. }
  151. marshalString, err := json.Marshal(hikvision)
  152. if err != nil {
  153. return errors.New("json序列化失败"), vqdlist
  154. }
  155. err = json.Unmarshal(marshalString, &vqdlist)
  156. if err != nil {
  157. return errors.New("json反序列化失败"), vqdlist
  158. }
  159. return nil, vqdlist
  160. }
  161. // GetCameraOnline 获取监控点在线状态
  162. //
  163. // regionId string false 区域编号,可从查询区域列表v2接口获取返回参数indexCode
  164. // includeSubNode string false 是否包含下级,1包含,0不包含(若regionId为空,则该参数不起作用)
  165. // indexCodes string[] false 监控点编码集,最大500,查询监控点列表接口获取返回参数cameraIndexCode
  166. // status string false 状态,1-在线,0-离线,-1-未检测
  167. func (s *hikvisionService) GetCameraOnline(regionId, includeSubNode, status, pageNo, pageSize string, indexCodes []string) (error, model.CameraOnline) {
  168. var cameraOnline model.CameraOnline
  169. // 获取门禁状态
  170. m := make(map[string]string)
  171. if pageNo != "" {
  172. m["pageNo"] = pageNo
  173. } else {
  174. m["pageNo"] = "1"
  175. }
  176. if pageSize != "" {
  177. m["pageSize"] = pageSize
  178. } else {
  179. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  180. }
  181. if regionId != "" {
  182. m["regionId"] = regionId
  183. }
  184. if includeSubNode != "" {
  185. m["includeSubNode"] = includeSubNode
  186. }
  187. if status != "" {
  188. m["status"] = status
  189. }
  190. if len(indexCodes) > 0 {
  191. m["indexCodes"] = strings.Join(indexCodes, ",")
  192. }
  193. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.getCameraOnline"), m, 15)
  194. if err != nil {
  195. return errors.New("获取监控点在线状态信息失败"), cameraOnline
  196. }
  197. if hikvision.Code != "0" {
  198. return errors.New("获取监控点在线状态失败"), cameraOnline
  199. }
  200. marshalString, err := json.Marshal(hikvision)
  201. if err != nil {
  202. return errors.New("json序列化失败"), cameraOnline
  203. }
  204. err = json.Unmarshal(marshalString, &cameraOnline)
  205. if err != nil {
  206. return errors.New("json反序列化失败"), cameraOnline
  207. }
  208. return nil, cameraOnline
  209. }
  210. // GetRecordList 根据监控点列表查询录像完整性结果
  211. // pageNo integer true 当前页码,0 < pageNo
  212. // pageSize integer true 分页大小,0<pageSize≤1000
  213. // beginTime string true 录像开始日期,IOS8601格式
  214. // endTime string true 录像结束日期,IOS8601格式
  215. // indexCodes string[] true 监控点编号集,
  216. // 查询监控点列表接口获取返回参数cameraIndexCode
  217. func (s *hikvisionService) GetRecordList(beginTime, endTime, pageNo, pageSize string, indexCodes []string) (error, model.RecordList) {
  218. var recordList model.RecordList
  219. // 获取门禁状态
  220. m := make(map[string]string)
  221. if pageNo != "" {
  222. m["pageNo"] = pageNo
  223. } else {
  224. m["pageNo"] = "1"
  225. }
  226. if pageSize != "" {
  227. m["pageSize"] = pageSize
  228. } else {
  229. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  230. }
  231. m["beginTime"] = beginTime
  232. m["endTime"] = endTime
  233. if len(indexCodes) > 0 {
  234. m["indexCodes"] = strings.Join(indexCodes, ",")
  235. }
  236. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.recordList"), m, 15)
  237. if err != nil {
  238. return errors.New("获取监控点列表查询录像完整性失败"), recordList
  239. }
  240. if hikvision.Code != "0" {
  241. return errors.New("获取监控点列表查询录像完整性失败"), recordList
  242. }
  243. marshalString, err := json.Marshal(hikvision)
  244. if err != nil {
  245. return errors.New("json序列化失败"), recordList
  246. }
  247. err = json.Unmarshal(marshalString, &recordList)
  248. if err != nil {
  249. return errors.New("json反序列化失败"), recordList
  250. }
  251. return nil, recordList
  252. }
  253. // GetCamerasList 分页获取监控点资源
  254. func (s *hikvisionService) GetCamerasList(pageNo, pageSize string) (error, model.Cameras) {
  255. var cameras model.Cameras
  256. // 获取门禁状态
  257. m := make(map[string]string)
  258. if pageNo != "" {
  259. m["pageNo"] = pageNo
  260. } else {
  261. m["pageNo"] = "1"
  262. }
  263. if pageSize != "" {
  264. m["pageSize"] = pageSize
  265. } else {
  266. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  267. }
  268. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.cameras"), m, 15)
  269. if err != nil {
  270. return errors.New("获取监控点列表查询录像完整性失败"), cameras
  271. }
  272. if hikvision.Code != "0" {
  273. return errors.New("获取监控点列表查询录像完整性失败"), cameras
  274. }
  275. marshalString, err := json.Marshal(hikvision)
  276. if err != nil {
  277. return errors.New("json序列化失败"), cameras
  278. }
  279. err = json.Unmarshal(marshalString, &cameras)
  280. if err != nil {
  281. return errors.New("json反序列化失败"), cameras
  282. }
  283. return nil, cameras
  284. }
  285. // GetVisitingRecords 查询访客来访记录v2
  286. // receptionistId 被访人唯一标识
  287. // receptionistName 被访人姓名
  288. // visitorName 访客名称
  289. func (s *hikvisionService) GetVisitingRecords(receptionistId, receptionistName, visitorName, pageNo, pageSize string) (error, model.VisitingRecords) {
  290. var visitingRecords model.VisitingRecords
  291. // 获取门禁状态
  292. m := make(map[string]string)
  293. if pageNo != "" {
  294. m["pageNo"] = pageNo
  295. } else {
  296. m["pageNo"] = "1"
  297. }
  298. if pageSize != "" {
  299. m["pageSize"] = pageSize
  300. } else {
  301. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  302. }
  303. if receptionistId != "" {
  304. m["receptionistId"] = receptionistId
  305. }
  306. if receptionistName != "" {
  307. m["receptionistName"] = receptionistName
  308. }
  309. if visitorName != "" {
  310. m["visitorName"] = visitorName
  311. }
  312. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitingRecords"), m, 15)
  313. if err != nil {
  314. return errors.New("获取查询访客来访记录失败"), visitingRecords
  315. }
  316. if hikvision.Code != "0" {
  317. return errors.New("获取查询访客来访记录失败"), visitingRecords
  318. }
  319. marshalString, err := json.Marshal(hikvision)
  320. if err != nil {
  321. return errors.New("json序列化失败"), visitingRecords
  322. }
  323. err = json.Unmarshal(marshalString, &visitingRecords)
  324. if err != nil {
  325. return errors.New("json反序列化失败"), visitingRecords
  326. }
  327. return nil, visitingRecords
  328. }
  329. // GetVisitorTypeInfo 查询访客类型
  330. func (s *hikvisionService) GetVisitorTypeInfo(pageNo, pageSize string) (error, model.VisitorTypeInfo) {
  331. var visitorTypeInfo model.VisitorTypeInfo
  332. // 获取门禁状态
  333. m := make(map[string]string)
  334. if pageNo != "" {
  335. m["pageNo"] = pageNo
  336. } else {
  337. m["pageNo"] = "1"
  338. }
  339. if pageSize != "" {
  340. m["pageSize"] = pageSize
  341. } else {
  342. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  343. }
  344. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitorTypeInfo"), m, 15)
  345. if err != nil {
  346. return errors.New("获取查询访客类型失败"), visitorTypeInfo
  347. }
  348. if hikvision.Code != "0" {
  349. return errors.New("获取查询访客类型失败"), visitorTypeInfo
  350. }
  351. marshalString, err := json.Marshal(hikvision)
  352. if err != nil {
  353. return errors.New("json序列化失败"), visitorTypeInfo
  354. }
  355. err = json.Unmarshal(marshalString, &visitorTypeInfo)
  356. if err != nil {
  357. return errors.New("json反序列化失败"), visitorTypeInfo
  358. }
  359. return nil, visitorTypeInfo
  360. }
  361. // GetAppointmentRecords 查询预约记录v2
  362. // receptionistId 被访人唯一标识
  363. // visitorName 访客名称
  364. // phoneNo 手机号码
  365. func (s *hikvisionService) GetAppointmentRecords(receptionistId, visitorName, phoneNo, pageNo, pageSize string) (error, model.VisitorTypeInfo) {
  366. var visitorTypeInfo model.VisitorTypeInfo
  367. // 获取门禁状态
  368. m := make(map[string]string)
  369. if pageNo != "" {
  370. m["pageNo"] = pageNo
  371. } else {
  372. m["pageNo"] = "1"
  373. }
  374. if pageSize != "" {
  375. m["pageSize"] = pageSize
  376. } else {
  377. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  378. }
  379. if receptionistId != "" {
  380. m["receptionistId"] = receptionistId
  381. }
  382. if visitorName != "" {
  383. m["visitorName"] = visitorName
  384. }
  385. if phoneNo != "" {
  386. m["phoneNo"] = phoneNo
  387. }
  388. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitorTypeInfo"), m, 15)
  389. if err != nil {
  390. return errors.New("获取查询预约记录失败"), visitorTypeInfo
  391. }
  392. if hikvision.Code != "0" {
  393. return errors.New("获取查询预约记录失败"), visitorTypeInfo
  394. }
  395. marshalString, err := json.Marshal(hikvision)
  396. if err != nil {
  397. return errors.New("json序列化失败"), visitorTypeInfo
  398. }
  399. err = json.Unmarshal(marshalString, &visitorTypeInfo)
  400. if err != nil {
  401. return errors.New("json反序列化失败"), visitorTypeInfo
  402. }
  403. return nil, visitorTypeInfo
  404. }
  405. // GetVisitorTypeList 查询全部访客类型
  406. func (s *hikvisionService) GetVisitorTypeList() (error, model.VisitorTypeList) {
  407. var visitorTypeList model.VisitorTypeList
  408. // 获取门禁状态
  409. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitorTypeInfo"), nil, 15)
  410. if err != nil {
  411. return errors.New("获取访客类型失败"), visitorTypeList
  412. }
  413. if hikvision.Code != "0" {
  414. return errors.New("获取访客类型失败"), visitorTypeList
  415. }
  416. marshalString, err := json.Marshal(hikvision)
  417. if err != nil {
  418. return errors.New("json序列化失败"), visitorTypeList
  419. }
  420. err = json.Unmarshal(marshalString, &visitorTypeList)
  421. if err != nil {
  422. return errors.New("json反序列化失败"), visitorTypeList
  423. }
  424. return nil, visitorTypeList
  425. }
  426. // GetTurnoverSearch 查询访客出入事件
  427. func (s *hikvisionService) GetTurnoverSearch(pageNo, pageSize string) (error, model.TurnoverSearch) {
  428. var turnoverSearch model.TurnoverSearch
  429. m := make(map[string]string)
  430. if pageNo != "" {
  431. m["pageNo"] = pageNo
  432. } else {
  433. m["pageNo"] = "1"
  434. }
  435. if pageSize != "" {
  436. m["pageSize"] = pageSize
  437. } else {
  438. m["pageSize"] = s.conf.GetString("hikvision.pageSize")
  439. }
  440. // 获取门禁状态
  441. hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.turnoverSearch"), m, 15)
  442. if err != nil {
  443. return errors.New("获取访客出入事件失败"), turnoverSearch
  444. }
  445. if hikvision.Code != "0" {
  446. return errors.New("获取访客出入事件失败"), turnoverSearch
  447. }
  448. marshalString, err := json.Marshal(hikvision)
  449. if err != nil {
  450. return errors.New("json序列化失败"), turnoverSearch
  451. }
  452. err = json.Unmarshal(marshalString, &turnoverSearch)
  453. if err != nil {
  454. return errors.New("json反序列化失败"), turnoverSearch
  455. }
  456. return nil, turnoverSearch
  457. }