hikvision.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. package handler
  2. import (
  3. "city_chips/internal/model"
  4. "city_chips/internal/service"
  5. "city_chips/pkg/helper/resp"
  6. "city_chips/pkg/helper/uuid"
  7. "encoding/json"
  8. "fmt"
  9. "math/rand"
  10. "strconv"
  11. "time"
  12. "github.com/gin-gonic/gin"
  13. "github.com/spf13/viper"
  14. "github.com/tidwall/gjson"
  15. )
  16. type HikvisionHandler struct {
  17. *Handler
  18. hikvisionService service.HikvisionService
  19. conf *viper.Viper
  20. }
  21. func NewHikvisionHandler(handler *Handler, hikvisionService service.HikvisionService, conf *viper.Viper) *HikvisionHandler {
  22. return &HikvisionHandler{
  23. Handler: handler,
  24. hikvisionService: hikvisionService,
  25. conf: conf,
  26. }
  27. }
  28. // GetMonitor 获取视频监控
  29. func (h *HikvisionHandler) GetMonitor(ctx *gin.Context) {
  30. m := make(map[string]any)
  31. LicensePlateRecognition := make(map[string]any)
  32. Blacklist := make(map[string]any)
  33. var monitor []model.Monitor
  34. for i := 0; i < 7; i++ {
  35. name := fmt.Sprintf("周%v", i+1)
  36. LicensePlateRecognition[name] = rand.Intn(100)
  37. Blacklist[name] = rand.Intn(100)
  38. }
  39. for i := 0; i < 10; i++ {
  40. name := fmt.Sprintf("监控设备%v", i+1)
  41. m2 := model.Monitor{
  42. Id: i + 1,
  43. Name: name,
  44. }
  45. monitor = append(monitor, m2)
  46. }
  47. m["MonitorCount"] = rand.Intn(1000) //摄像头总数
  48. m["DeviceOnline"] = rand.Intn(1000) //设备在线
  49. m["DeviceOffline"] = rand.Intn(1000) //设备离线
  50. m["StorageCapacity"] = rand.Intn(1000) //存储容量
  51. m["StoreSurplus"] = rand.Intn(1000) //存储剩余
  52. m["IntrusionDetection"] = rand.Intn(1000) //入侵检测
  53. m["AbnormalBehavior"] = rand.Intn(1000) //异常行为
  54. m["LostAlarms"] = rand.Intn(1000) //丢失告警
  55. m["LicensePlateRecognition"] = LicensePlateRecognition //车牌识别
  56. m["Blacklist"] = Blacklist //黑名单
  57. m["CPU"] = rand.Intn(100) //Cpu
  58. m["RAM"] = rand.Intn(100) //RAM
  59. m["MonitorList"] = monitor //监控列表
  60. resp.HandleSuccess(ctx, m)
  61. }
  62. // GetInvade 获取入侵检测
  63. func (h *HikvisionHandler) GetInvade(ctx *gin.Context) {
  64. m := make(map[string]any)
  65. AlarmTrend24Hour := make(map[string]any)
  66. var realTime []model.Device
  67. for i := 0; i < 24; i++ {
  68. name := fmt.Sprintf("%v时", i+1)
  69. AlarmTrend24Hour[name] = rand.Intn(100)
  70. }
  71. for i := 0; i < 10; i++ {
  72. name := fmt.Sprintf("设备%v", i+1)
  73. inspection := model.Device{
  74. Id: i + 1,
  75. Name: name,
  76. State: rand.Intn(2),
  77. Date: time.Now().Format("2006-01-02 15:04:05"),
  78. }
  79. realTime = append(realTime, inspection)
  80. }
  81. m["DeviceAlerts"] = rand.Intn(100) //设备预警
  82. m["LowRiskWarning"] = rand.Intn(100) //低危预警
  83. m["MediumRiskWarning"] = rand.Intn(100) //中危预警
  84. m["HighRiskWarning"] = rand.Intn(1000) //高危预警
  85. m["HighRiskWarning"] = rand.Intn(1000) //高危预警
  86. m["OverHazardWarning"] = rand.Intn(1000) //超危预警
  87. m["EventRisk"] = rand.Intn(100) //事件风险
  88. m["AlarmRisk"] = rand.Intn(100) //告警风险
  89. m["trend"] = rand.Intn(100) //圆环中间百分比
  90. m["realTime"] = realTime //实时巡检
  91. m["AlarmTrend24Hour"] = AlarmTrend24Hour //24小时告警趋势
  92. resp.HandleSuccess(ctx, m)
  93. }
  94. // GetElectronicInspections 电子巡查
  95. func (h *HikvisionHandler) GetElectronicInspections(ctx *gin.Context) {
  96. m := make(map[string]any)
  97. Inspect := make(map[string]any)
  98. var device []model.Device
  99. var realTime []model.RealTimeInspection
  100. for i := 0; i < 24; i++ {
  101. name := fmt.Sprintf("%v时", i+1)
  102. Inspect[name] = rand.Intn(100)
  103. }
  104. for i := 0; i < 10; i++ {
  105. name := fmt.Sprintf("设备%v", i+1)
  106. m2 := model.Device{
  107. Id: i + 1,
  108. Name: name,
  109. State: rand.Intn(2),
  110. Date: time.Now().Format("2006-01-02 15:04:05"),
  111. }
  112. device = append(device, m2)
  113. }
  114. for i := 0; i < 10; i++ {
  115. name := fmt.Sprintf("巡检事件%v", i+1)
  116. Location := fmt.Sprintf("位置%v", i+1)
  117. inspection := model.RealTimeInspection{
  118. Id: i + 1,
  119. Name: name,
  120. Location: Location,
  121. Event: name,
  122. }
  123. realTime = append(realTime, inspection)
  124. }
  125. m["TodayTotal"] = rand.Intn(100) //今日总数
  126. m["InspectionPoints"] = rand.Intn(100) //巡检点数
  127. m["InspectionPlan"] = rand.Intn(100) //巡检计划
  128. m["InspectTheLine"] = rand.Intn(1000) //巡检线路
  129. m["Inspect"] = Inspect //巡检统计
  130. m["realTime"] = realTime //实时巡检
  131. m["DeviceList"] = device //设备列表
  132. resp.HandleSuccess(ctx, m)
  133. }
  134. // GetVisitor 访客系统
  135. func (h *HikvisionHandler) GetVisitor(ctx *gin.Context) {
  136. m := make(map[string]any)
  137. PrevailingTrends := make(map[string]any)
  138. var visitor []model.Visitor
  139. for i := 0; i < 24; i++ {
  140. name := fmt.Sprintf("人员%v", i+1)
  141. address := fmt.Sprintf("%v时", i+1)
  142. m2 := model.Visitor{
  143. Id: i + 1,
  144. Name: name,
  145. State: rand.Intn(2),
  146. Phone: strconv.Itoa(rand.Intn(1000000000)),
  147. Location: address,
  148. Date: time.Now().Format("2006-01-02 15:04:05"),
  149. }
  150. PrevailingTrends[address] = rand.Intn(100)
  151. visitor = append(visitor, m2)
  152. }
  153. m["VisitorCount"] = rand.Intn(1000) //访客总量
  154. m["SignInCount"] = rand.Intn(1000) //签到数量
  155. m["TransitCount"] = rand.Intn(1000) //通行数量
  156. m["Exit"] = rand.Intn(1000) //离场数量
  157. m["Client"] = rand.Intn(100) //客户
  158. m["Vendor"] = rand.Intn(100) //供应商
  159. m["Interviewees"] = rand.Intn(100) //面试者
  160. m["GovernmentPersonnel"] = rand.Intn(100) //政府人员
  161. m["Other"] = rand.Intn(100) //其他
  162. m["PrevailingTrends"] = PrevailingTrends //通行趋势
  163. m["VisitorRegistration"] = visitor //访客登记
  164. m["VisitorsSwipeCards"] = visitor //访客刷卡记录
  165. resp.HandleSuccess(ctx, m)
  166. }
  167. // 客流统计
  168. func (h *HikvisionHandler) GetPassenger(ctx *gin.Context) {
  169. m := make(map[string]any)
  170. Type1 := make(map[string]any)
  171. Type2 := make(map[string]any)
  172. Type3 := make(map[string]any)
  173. Type4 := make(map[string]any)
  174. rankings := make(map[string]any)
  175. customers := make(map[string]any)
  176. var event []model.RealTimeInspection
  177. for i := 0; i < 7; i++ {
  178. sprintf := fmt.Sprintf("2025-5-%v", i+1)
  179. ranking := fmt.Sprintf("类型-%v", i+1)
  180. rankings[ranking] = rand.Intn(100)
  181. Type1[sprintf] = rand.Intn(100)
  182. Type2[sprintf] = rand.Intn(100)
  183. Type3[sprintf] = rand.Intn(100)
  184. Type4[sprintf] = rand.Intn(100)
  185. }
  186. for i := 0; i < 3; i++ {
  187. sprintf := fmt.Sprintf("客群-%v", i+1)
  188. customers[sprintf] = rand.Intn(100)
  189. }
  190. for i := 0; i < 10; i++ {
  191. sprintf := fmt.Sprintf("安全事件-%v", i+1)
  192. location := fmt.Sprintf("位置-%v", i+1)
  193. inspection := model.RealTimeInspection{
  194. Id: i + 1,
  195. Name: sprintf,
  196. Location: location,
  197. Event: time.Now().Format("2006-01-02 15:04:05"),
  198. }
  199. event = append(event, inspection)
  200. }
  201. m["SecurityLevel"] = rand.Intn(500) //安全等级
  202. m["NetworkEquipment"] = rand.Intn(100) //网络设备
  203. m["Normal"] = rand.Intn(100) //正常
  204. m["Fault"] = rand.Intn(100) //故障
  205. m["Offline"] = rand.Intn(100) //离线
  206. m["Type1"] = Type1 //客流监控type1
  207. m["Type2"] = Type2 //客流监控type2
  208. m["Type3"] = Type3 //客流监控type3
  209. m["Type4"] = Type4 //客流监控type4
  210. m["Rankings"] = rankings //指标区排行榜
  211. m["Customers"] = customers //客群分析统计
  212. m["Customers"] = customers //客群分析统计
  213. m["Event"] = event //安全事件列表
  214. resp.HandleSuccess(ctx, m)
  215. }
  216. // 门禁系统
  217. func (h *HikvisionHandler) GetAccess(ctx *gin.Context) {
  218. m := make(map[string]any)
  219. invasio1 := make(map[string]any)
  220. invasio2 := make(map[string]any)
  221. DailyTotal := make(map[string]any)
  222. Cumulative := make(map[string]any)
  223. var devices []model.RealTimeInspection
  224. var alarmList []model.AlarmList
  225. for i := 0; i < 7; i++ {
  226. sprintf := fmt.Sprintf("2025-5-%v", i+1)
  227. invasio1[sprintf] = rand.Intn(100)
  228. invasio2[sprintf] = rand.Intn(100)
  229. }
  230. for i := 0; i < 24; i++ {
  231. sprintf := fmt.Sprintf("%v时", i+1)
  232. DailyTotal[sprintf] = rand.Intn(100)
  233. Cumulative[sprintf] = rand.Intn(100)
  234. }
  235. for i := 0; i < 10; i++ {
  236. sprintf := fmt.Sprintf("设备-%v", i+1)
  237. location := fmt.Sprintf("位置-%v", i+1)
  238. inspection := model.RealTimeInspection{
  239. Id: i + 1,
  240. Name: sprintf,
  241. Location: location,
  242. Event: time.Now().Format("2006-01-02 15:04:05"),
  243. }
  244. alarm := model.AlarmList{
  245. Id: i + 1,
  246. AlarmContent: fmt.Sprintf("设备-%v", i+1),
  247. Location: location,
  248. State: rand.Intn(2),
  249. Date: time.Now().Format("2006-01-02 15:04:05"),
  250. }
  251. devices = append(devices, inspection)
  252. alarmList = append(alarmList, alarm)
  253. }
  254. m["DeviceCount"] = rand.Intn(500) //设备总数
  255. m["Online"] = rand.Intn(100) //在线
  256. m["Abnormal"] = rand.Intn(100) //异常
  257. m["Fault"] = rand.Intn(100) //故障
  258. m["Offline"] = rand.Intn(100) //离线
  259. m["Attendance"] = rand.Intn(100) //出勤率
  260. m["Invasio1"] = invasio1 //入侵事件1
  261. m["Invasio2"] = invasio2 //入侵事件2
  262. m["DailyTotal"] = DailyTotal //每日统计
  263. m["Cumulative"] = Cumulative //累计统计
  264. m["AlarmList"] = alarmList //实时告警与通知
  265. m["devices"] = devices //设备列表
  266. resp.HandleSuccess(ctx, m)
  267. }
  268. // GetHikvisionMonitoring 获取视频监控流{
  269. // "cameraIndexCode": "748d84750e3a4a5bbad3cd4af9ed5101",
  270. // "streamType": 0,
  271. // "protocol": "rtsp",
  272. // "transmode": 1,
  273. // "expand": "transcode=0",
  274. // "streamform": "ps"
  275. // }
  276. func (h *HikvisionHandler) GetHikvisionMonitoring(ctx *gin.Context) {
  277. m := make(map[string]string)
  278. cameraIndexCode := ctx.Query("cameraIndexCode")
  279. m["cameraIndexCode"] = cameraIndexCode
  280. m["streamType"] = "0"
  281. m["protocol"] = "rtsp"
  282. m["transmode"] = "1"
  283. m["expand"] = "transcode=0"
  284. m["streamform"] = "ps"
  285. if len(cameraIndexCode) <= 0 || cameraIndexCode == "" {
  286. resp.HandleError(ctx, 1203, "设备编码不能为空", nil)
  287. return
  288. }
  289. fmt.Println(m)
  290. resp.HandleSuccess(ctx, "rtsp://10.2.145.66:655/EUrl/CLJ52BW")
  291. return
  292. hikvision, err := h.hikvisionService.Hikvision(h.conf.GetString("hikvision.api.cameras"), m, 15)
  293. //返回结果{
  294. // "code": "0",
  295. // "msg": "success",
  296. // "data": {
  297. // "url": "rtsp://10.2.145.66:655/EUrl/CLJ52BW"
  298. // }
  299. //}
  300. if err != nil {
  301. h.logger.Error("获取获取监控点资源失败")
  302. resp.HandleError(ctx, 1201, "获取获取监控点资源失败", err)
  303. return
  304. }
  305. if hikvision.Code != "0" {
  306. atoi, _ := strconv.Atoi(hikvision.Code)
  307. resp.HandleError(ctx, atoi, hikvision.Msg, nil)
  308. return
  309. }
  310. marshalString, err := json.Marshal(hikvision)
  311. if err != nil {
  312. resp.HandleError(ctx, 1202, "json序列化失败", nil)
  313. return
  314. }
  315. url := gjson.Get(string(marshalString), "data.url")
  316. resp.HandleSuccess(ctx, url)
  317. }
  318. // 视频监控云台控制{
  319. // "cameraIndexCode": "748d84750e3a4a5bbad3cd4af9ed5101",
  320. // "action": 1, 0-开始
  321. //1-停止
  322. //注:GOTO_PRESET命令下填任意值均可转到预置点,建议填0即可
  323. // "command": "GOTO_PRESET",
  324. // "speed": 4,
  325. // "presetIndex": 20
  326. //}
  327. func (h *HikvisionHandler) Gimbalcontrol(ctx *gin.Context) {
  328. m := make(map[string]string)
  329. cameraIndexCode := ctx.Query("cameraIndexCode")
  330. command := ctx.Query("command")
  331. action := ctx.Query("action")
  332. speed := ctx.Query("speed")
  333. presetIndex := ctx.Query("presetIndex")
  334. m["cameraIndexCode"] = cameraIndexCode
  335. m["action"] = action
  336. m["command"] = command
  337. m["speed"] = speed
  338. m["presetIndex"] = presetIndex
  339. if len(cameraIndexCode) <= 0 || len(command) <= 0 || len(action) <= 0 {
  340. resp.HandleError(ctx, 1203, "设备编码不能为空", nil)
  341. return
  342. }
  343. resp.HandleSuccess(ctx, m)
  344. return
  345. hikvision, err := h.hikvisionService.Hikvision(h.conf.GetString("hikvision.api.controlling"), m, 15)
  346. if err != nil {
  347. h.logger.Error("控制云台失败")
  348. resp.HandleError(ctx, 1201, "控制云台失败", err)
  349. return
  350. }
  351. if hikvision.Code != "0" {
  352. atoi, _ := strconv.Atoi(hikvision.Code)
  353. resp.HandleError(ctx, atoi, hikvision.Msg, nil)
  354. return
  355. }
  356. resp.HandleSuccess(ctx, hikvision.Msg)
  357. }
  358. // VisitorInfoCount 获取今日访客信息包含:今日来访总人数(已签离人数,未签离人数),预约人数
  359. func (h *HikvisionHandler) VisitorInfoCount(c *gin.Context) {
  360. m := make(map[string]string)
  361. parkId := c.Query("parkId")
  362. m["parkId"] = parkId
  363. resp.HandleSuccess(c, "appointmentTotal: 1, notSignOutTotal: 1, signOutTotal: 1, signTotal: 1, orderCount: 1, visitCount: 1, visitCountForTemp: 1, visitCountForOrder: 1, signOutCount: 1, notSignOutCount: 1")
  364. return
  365. hikvision, err := h.hikvisionService.Hikvision(h.conf.GetString("hikvision.api.visitorInfo"), m, 15)
  366. if err != nil {
  367. h.logger.Error("获取访客信息失败")
  368. resp.HandleError(c, 1201, "获取访客信息失败", err)
  369. return
  370. }
  371. if hikvision.Code != "0" {
  372. atoi, _ := strconv.Atoi(hikvision.Code)
  373. resp.HandleError(c, atoi, hikvision.Msg, nil)
  374. return
  375. }
  376. resp.HandleSuccess(c, hikvision.Data)
  377. }
  378. // GetDoorSearch 查询门禁点列表v2
  379. func (h *HikvisionHandler) GetDoorSearch(ctx *gin.Context) {
  380. // 设置响应头
  381. ctx.Header("Content-Type", "text/event-stream")
  382. ctx.Header("Cache-Control", "no-cache")
  383. ctx.Header("Connection", "keep-alive")
  384. // 监听客户端断开连接
  385. conn := true
  386. notify := ctx.Writer.CloseNotify()
  387. var response model.Response
  388. var doorlist []model.DoorList
  389. m := make(map[string]string)
  390. m["pageNo"] = "1"
  391. m["pageSize"] = "1"
  392. for conn {
  393. select {
  394. case <-notify:
  395. conn = false
  396. fmt.Println("断开连接")
  397. return
  398. default:
  399. //hikvision, err := h.hikvisionService.Hikvision(h.conf.GetString("hikvision.api.visitorInfo"), m, 15)
  400. //if err != nil {
  401. // h.logger.Error("获取门禁点列表失败")
  402. // response.Code = 1203
  403. // response.Msg = "获取门禁点列表失败"
  404. // response.Data = nil
  405. // res, _ := json.Marshal(&response)
  406. // fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  407. // ctx.Writer.Flush()
  408. // return
  409. //}
  410. //if hikvision.Code != "0" {
  411. // response.Code = 1203
  412. // response.Msg = "获取门禁点列表失败"
  413. // response.Data = nil
  414. // res, _ := json.Marshal(&response)
  415. // fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  416. // ctx.Writer.Flush()
  417. // conn = false
  418. // return
  419. //}
  420. for i := 0; i < 3; i++ {
  421. genUUID := uuid.GenUUID()
  422. name := fmt.Sprintf("资源:%v", i+1)
  423. list := model.DoorList{
  424. IndexCode: genUUID,
  425. ResourceType: "door",
  426. Name: name,
  427. DoorNo: genUUID,
  428. ChannelNo: genUUID,
  429. ParentIndexCode: genUUID,
  430. ControlOneId: genUUID,
  431. ControlTwoId: genUUID,
  432. ReaderInId: genUUID,
  433. ReaderOutId: genUUID,
  434. DoorSerial: i + 1,
  435. TreatyType: genUUID,
  436. RegionIndexCode: genUUID,
  437. RegionPath: genUUID,
  438. CreateTime: time.Now().Format("2006-01-02 15:04:05"),
  439. UpdateTime: time.Now().Format("2006-01-02 15:04:05"),
  440. Description: genUUID,
  441. ChannelType: genUUID,
  442. RegionName: genUUID,
  443. RegionPathName: genUUID,
  444. InstallLocation: genUUID,
  445. }
  446. doorlist = append(doorlist, list)
  447. }
  448. doorResp := model.DoorResp{
  449. Code: "0",
  450. Msg: "SUCCESS",
  451. Data: struct {
  452. Total int `json:"total"`
  453. PageNo int `json:"pageNo"`
  454. PageSize int `json:"pageSize"`
  455. List []model.DoorList `json:"list"`
  456. }{Total: 3, PageNo: 1, PageSize: 1, List: doorlist},
  457. }
  458. response.Code = 200
  459. response.Msg = "获取门禁点列表成功"
  460. response.Data = doorResp.Data
  461. res, _ := json.Marshal(&response)
  462. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  463. ctx.Writer.Flush()
  464. time.Sleep(10 * time.Second)
  465. }
  466. }
  467. }
  468. // DoControl 控制门禁
  469. func (h *HikvisionHandler) DoControl(ctx *gin.Context) {
  470. // 设置响应头
  471. ctx.Header("Content-Type", "text/event-stream")
  472. ctx.Header("Cache-Control", "no-cache")
  473. ctx.Header("Connection", "keep-alive")
  474. // 监听客户端断开连接
  475. conn := true
  476. notify := ctx.Writer.CloseNotify()
  477. doorIndexCodes := ctx.Query("doorIndexCodes")
  478. controlType := ctx.Query("controlType")
  479. if len(doorIndexCodes) <= 0 || len(controlType) <= 0 {
  480. resp.HandleError(ctx, 1203, "设备编码不能为空", nil)
  481. return
  482. }
  483. fmt.Println("doorIndexCodes:", doorIndexCodes)
  484. m := make(map[string]string)
  485. m["doorIndexCodes"] = doorIndexCodes
  486. m["controlType"] = controlType
  487. var response model.Response
  488. for conn {
  489. select {
  490. case <-notify:
  491. conn = false
  492. fmt.Println("断开连接")
  493. return
  494. default:
  495. //hikvision, err := h.hikvisionService.Hikvision(h.conf.GetString("hikvision.api.control"), m, 15)
  496. //if err != nil {
  497. // h.logger.Error("控制门禁失败")
  498. // response.Code = 1203
  499. // response.Msg = "控制门禁失败"
  500. // response.Data = nil
  501. // res, _ := json.Marshal(&response)
  502. // fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  503. // ctx.Writer.Flush()
  504. // conn = false
  505. // return
  506. //}
  507. //if hikvision.Code != "0" {
  508. // response.Code = 1203
  509. // response.Msg = "控制门禁失败"
  510. // response.Data = nil
  511. // res, _ := json.Marshal(&response)
  512. // fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  513. // ctx.Writer.Flush()
  514. // conn = false
  515. // return
  516. //}
  517. genUUID := uuid.GenUUID()
  518. doControl := model.DoControl{
  519. Code: "0",
  520. Msg: "SUCCESS",
  521. Data: []model.DoControlData{{
  522. DoorIndexCode: genUUID,
  523. ControlResultCode: 0,
  524. ControlResultDesc: "success",
  525. }},
  526. }
  527. response.Code = 200
  528. response.Msg = "控制门禁成功"
  529. response.Data = doControl.Data
  530. res, _ := json.Marshal(&response)
  531. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  532. ctx.Writer.Flush()
  533. time.Sleep(10 * time.Second)
  534. }
  535. }
  536. }