Nats.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. package Nats
  2. import (
  3. "ColdVerify_server/conf"
  4. "ColdVerify_server/lib"
  5. "ColdVerify_server/logs"
  6. "ColdVerify_server/models/Account"
  7. "ColdVerify_server/models/Certificate"
  8. "ColdVerify_server/models/Device"
  9. "ColdVerify_server/models/System"
  10. "ColdVerify_server/models/Task"
  11. "fmt"
  12. "github.com/nats-io/nats.go"
  13. "github.com/vmihailenco/msgpack/v5"
  14. "strings"
  15. "sync"
  16. )
  17. func init() {
  18. logs.Println("============Nats init============")
  19. var err error
  20. // 连接Nats服务器
  21. lib.Nats, err = nats.Connect("nats://" + conf.NatsServer_Url)
  22. if err != nil {
  23. logs.Error("nats 连接失败!")
  24. panic(any(err))
  25. }
  26. logs.Println("nats OK!")
  27. // 本地测试,屏蔽本地nats
  28. if !conf.NatsForbidden {
  29. go NatsInit()
  30. }
  31. }
  32. type Extract_TaskData_Back struct {
  33. T_uuid string `xml:"T_uuid"` // 任务主键id
  34. Time_start string `xml:"Time_start"`
  35. Time_end string `xml:"Time_end"`
  36. DeviceClassList []Device.DeviceClassList `xml:"DeviceClassList"` // 泛型
  37. Task Task.Task `xml:"Task"` // 泛型
  38. }
  39. func NatsInit() {
  40. // 发布-订阅 模式,打包数据
  41. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Extract_TaskData_Back", "Extract_TaskData", func(m *nats.Msg) {
  42. logs.Debug("Extract_TaskData_Back message: \n", string(m.Data))
  43. var resp Extract_TaskData_Back
  44. err := msgpack.Unmarshal(m.Data, &resp)
  45. if err != nil {
  46. System.Add_Logs("Nats", "msgpack Unmarshal err", string(m.Data))
  47. return
  48. }
  49. Task_r := resp.Task
  50. // 清空表
  51. Task.Truncate_TaskData(Task_r.T_task_id)
  52. //失败重试5次
  53. DeviceClassList := new(sync.Map)
  54. var count int
  55. for _, v := range resp.DeviceClassList {
  56. if strings.Contains(v.T_sn, "-") || len(v.T_sn) == 0 {
  57. // 从3.0平台导入
  58. continue
  59. }
  60. DeviceClassList.Store(fmt.Sprintf("%s|%s", v.T_sn, v.T_id), 5)
  61. //err = Task.Import_TaskData_Back(v.T_sn, v.T_id, resp.Task.T_task_id, resp.Time_start, resp.Time_end)
  62. //count++
  63. //time.Sleep(5 * time.Second)
  64. }
  65. DeviceClassList.Range(func(k, v interface{}) bool {
  66. count++
  67. return true
  68. })
  69. for count > 0 {
  70. DeviceClassList.Range(func(k, v any) bool {
  71. T_snid := strings.Split(k.(string), "|")
  72. T_sn := T_snid[0]
  73. T_id := T_snid[1]
  74. temp := v.(int)
  75. temp--
  76. DeviceClassList.Store(k, temp)
  77. err = Task.Import_TaskData_Back(T_sn, T_id, resp.Task.T_task_id, resp.Time_start, resp.Time_end)
  78. if err == nil || strings.Contains(err.Error(), "doesn't exist") {
  79. DeviceClassList.Delete(k)
  80. count--
  81. } else {
  82. logs.Error("设备数据同步到任务数据失败", err)
  83. DeviceClassList.Delete(k)
  84. count--
  85. }
  86. return true
  87. })
  88. }
  89. //TaskData_Num := Task.Read_TaskData_Count(Task_r.T_task_id)
  90. //if TaskData_Num == 0 {
  91. // Task_r.T_collection_num = 0
  92. // if !Task.Update_Task(Task_r, "T_collection_state") {
  93. // logs.Error(lib.FuncName(), "后台执行修改任务数据失败")
  94. // }
  95. // return
  96. //}
  97. // 导入到本地数据---
  98. //NatsServer.Import_TaskData(resp.T_uuid, Task_r.T_task_id, TaskData_Num)
  99. System.Add_UserLogs_T(resp.T_uuid, "任务", "修改", Task_r)
  100. System.Add_UserLogs(resp.T_uuid, "提取数据", "提取数据"+Task_r.T_name, Task_r.T_task_id+"|"+resp.Time_start+"|"+resp.Time_end)
  101. })
  102. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Update_Task", "Update_Task", func(m *nats.Msg) {
  103. var t_Req Task.Task
  104. var t_R lib.JSONS
  105. err := msgpack.Unmarshal(m.Data, &t_Req)
  106. if err != nil {
  107. logs.Error("Mats", lib.FuncName(), err)
  108. t_R.Code = 202
  109. t_R.Msg = err.Error()
  110. b, _ := msgpack.Marshal(&t_R)
  111. _ = lib.Nats.Publish(m.Reply, b)
  112. return
  113. }
  114. logs.Debug(fmt.Sprintf("ColdVerify_Server_Update_Task message: %+v\n", t_Req))
  115. col := []string{}
  116. if t_Req.T_delivery_state > 0 {
  117. col = append(col, "T_delivery_state")
  118. }
  119. if t_Req.T_collection_state > 0 {
  120. col = append(col, "T_collection_state")
  121. }
  122. if !Task.Update_Task(t_Req, col...) {
  123. logs.Error("Nats", lib.FuncName(), err)
  124. t_R.Code = 202
  125. t_R.Msg = err.Error()
  126. b, _ := msgpack.Marshal(&t_R)
  127. _ = lib.Nats.Publish(m.Reply, b)
  128. return
  129. }
  130. t_R.Code = 200
  131. t_R.Msg = "ok"
  132. b, _ := msgpack.Marshal(&t_R)
  133. _ = lib.Nats.Publish(m.Reply, b)
  134. Task.Add_TaskLogs_T("nats", t_Req.T_task_id, "任务管理", "修改状态", t_Req)
  135. System.Add_UserLogs_T("nats", "任务管理", "修改状态", t_Req)
  136. })
  137. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Read_Task", "Read_Task", func(m *nats.Msg) {
  138. logs.Println("ColdVerify_Server_Read_Task message: %+v\n", string(m.Data))
  139. var t_R lib.JSONS
  140. task, is := Task.Read_Task(string(m.Data))
  141. if !is {
  142. logs.Error("Mats", lib.FuncName())
  143. t_R.Code = 202
  144. t_R.Msg = "查询失败"
  145. b, _ := msgpack.Marshal(&t_R)
  146. _ = lib.Nats.Publish(m.Reply, b)
  147. return
  148. }
  149. t_R.Code = 200
  150. t_R.Msg = "ok"
  151. t_R.Data = task
  152. b, _ := msgpack.Marshal(&t_R)
  153. _ = lib.Nats.Publish(m.Reply, b)
  154. })
  155. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Device_Class_List", "Device_Class_List", func(m *nats.Msg) {
  156. logs.Println("ColdVerify_Server_Device_Class_List message: %+v\n", string(m.Data))
  157. var t_R lib.JSONS
  158. task, is := Task.Read_Task(string(m.Data))
  159. if !is {
  160. logs.Error("Mats", lib.FuncName())
  161. t_R.Code = 202
  162. t_R.Msg = "查询失败"
  163. b, _ := msgpack.Marshal(&t_R)
  164. _ = lib.Nats.Publish(m.Reply, b)
  165. return
  166. }
  167. List, _ := Device.Read_DeviceClassList_OrderList(task.T_class, "", "", "", 0, 9999)
  168. t_R.Code = 200
  169. t_R.Msg = "ok"
  170. t_R.Data = List
  171. b, _ := msgpack.Marshal(&t_R)
  172. _ = lib.Nats.Publish(m.Reply, b)
  173. })
  174. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Read_User", "Read_User", func(m *nats.Msg) {
  175. logs.Println("ColdVerify_Server_Read_User message: %+v\n", string(m.Data))
  176. var t_R lib.JSONS
  177. err, user := Account.Read_User_ByT_uuid(string(m.Data))
  178. if err != nil {
  179. logs.Error("Mats", lib.FuncName())
  180. t_R.Code = 202
  181. t_R.Msg = "查询失败"
  182. b, _ := msgpack.Marshal(&t_R)
  183. _ = lib.Nats.Publish(m.Reply, b)
  184. return
  185. }
  186. t_R.Code = 200
  187. t_R.Msg = "ok"
  188. t_R.Data = user
  189. b, _ := msgpack.Marshal(&t_R)
  190. _ = lib.Nats.Publish(m.Reply, b)
  191. })
  192. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Read_Admin", "Read_Admin", func(m *nats.Msg) {
  193. logs.Println("ColdVerify_Server_Read_User message: %+v\n", string(m.Data))
  194. var t_R lib.JSONS
  195. err, admin := Account.Read_Admin_ByT_uuid(string(m.Data))
  196. if err != nil {
  197. logs.Error("Mats", lib.FuncName())
  198. t_R.Code = 202
  199. t_R.Msg = "查询失败"
  200. b, _ := msgpack.Marshal(&t_R)
  201. _ = lib.Nats.Publish(m.Reply, b)
  202. return
  203. }
  204. t_R.Code = 200
  205. t_R.Msg = "ok"
  206. t_R.Data = admin
  207. b, _ := msgpack.Marshal(&t_R)
  208. _ = lib.Nats.Publish(m.Reply, b)
  209. })
  210. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Add_DeviceClassList", "Add_DeviceClassList", func(m *nats.Msg) {
  211. type T_Req struct {
  212. T_task_id string `xml:"T_task_id"` // 任务主键id
  213. T_sn string `xml:"T_sn"`
  214. T_id string `xml:"T_id"`
  215. }
  216. var t_Req T_Req
  217. var t_R lib.JSONS
  218. err := msgpack.Unmarshal(m.Data, &t_Req)
  219. if err != nil {
  220. logs.Error("Mats", lib.FuncName(), err)
  221. t_R.Code = 202
  222. t_R.Msg = err.Error()
  223. b, _ := msgpack.Marshal(&t_R)
  224. _ = lib.Nats.Publish(m.Reply, b)
  225. return
  226. }
  227. logs.Debug(fmt.Sprintf("ColdVerify_Server_Add_DeviceClassList message: %+v\n", t_Req))
  228. Task_r, is := Task.Read_Task(t_Req.T_task_id)
  229. if !is {
  230. logs.Error("Mats", lib.FuncName())
  231. t_R.Code = 202
  232. t_R.Msg = "T_task_id 错误!"
  233. b, _ := msgpack.Marshal(&t_R)
  234. _ = lib.Nats.Publish(m.Reply, b)
  235. return
  236. }
  237. // 判断是否已存在sn
  238. dc, is := Device.Read_DeviceClassList_T_class_T_sn(Task_r.T_class, t_Req.T_sn)
  239. // 添加的id和数据库已存在id相同
  240. if is && dc.T_id == t_Req.T_id {
  241. t_R.Code = 200
  242. t_R.Msg = "ok"
  243. b, _ := msgpack.Marshal(&t_R)
  244. _ = lib.Nats.Publish(m.Reply, b)
  245. return
  246. }
  247. var pdf Certificate.CertificatePdf
  248. //pdfList, _ := Certificate.Read_CertificatePdf_Newest(T_sn)
  249. pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(t_Req.T_id, "")
  250. if len(pdfList) > 0 {
  251. pdf = pdfList[0]
  252. }
  253. // 相同sn 添加的id和数据库已存在id不同
  254. if is && dc.T_id != t_Req.T_id {
  255. dc2, is := Device.Read_DeviceClassList_T_class_T_id(Task_r.T_class, t_Req.T_id)
  256. if is {
  257. logs.Error("Mats", lib.FuncName())
  258. t_R.Code = 202
  259. t_R.Msg = fmt.Sprintf("编号[%s]已被[%s]关联,请重试", t_Req.T_id, dc2.T_sn)
  260. b, _ := msgpack.Marshal(&t_R)
  261. _ = lib.Nats.Publish(m.Reply, b)
  262. return
  263. }
  264. dc.T_id = t_Req.T_id
  265. dc.T_failure_time = pdf.T_failure_time
  266. dc.T_pdf = pdf.T_pdf
  267. dc.T_Certificate_sn = pdf.T_Certificate_sn
  268. if !Device.Update_DeviceClassList(dc, "T_id", "T_failure_time", "T_pdf", "T_Certificate_sn") {
  269. logs.Error("Mats", lib.FuncName())
  270. t_R.Code = 202
  271. t_R.Msg = "修改编号失败!"
  272. b, _ := msgpack.Marshal(&t_R)
  273. _ = lib.Nats.Publish(m.Reply, b)
  274. return
  275. } else {
  276. t_R.Code = 200
  277. t_R.Msg = "ok"
  278. b, _ := msgpack.Marshal(&t_R)
  279. _ = lib.Nats.Publish(m.Reply, b)
  280. Task.Add_TaskLogs_T("nats", t_Req.T_task_id, "任务管理", "添加设备列表", t_Req)
  281. System.Add_UserLogs_T("nats", "任务管理", "添加设备列表", t_Req)
  282. return
  283. }
  284. }
  285. var_ := Device.DeviceClassList{
  286. T_class: Task_r.T_class,
  287. T_id: t_Req.T_id,
  288. T_sn: t_Req.T_sn,
  289. T_failure_time: pdf.T_failure_time,
  290. T_pdf: pdf.T_pdf,
  291. T_Certificate_sn: pdf.T_Certificate_sn,
  292. T_remark: "",
  293. T_State: 1,
  294. }
  295. _, is = Device.Add_DeviceClassList(var_)
  296. if !is {
  297. logs.Error("Mats", lib.FuncName(), err)
  298. t_R.Code = 202
  299. t_R.Msg = err.Error()
  300. b, _ := msgpack.Marshal(&t_R)
  301. _ = lib.Nats.Publish(m.Reply, b)
  302. return
  303. }
  304. t_R.Code = 200
  305. t_R.Msg = "ok"
  306. b, _ := msgpack.Marshal(&t_R)
  307. _ = lib.Nats.Publish(m.Reply, b)
  308. Task.Add_TaskLogs_T("nats", t_Req.T_task_id, "任务管理", "添加设备编号", t_Req)
  309. System.Add_UserLogs_T("nats", "任务管理", "添加设备编号", t_Req)
  310. })
  311. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Edit_DeviceClassList", "Edit_DeviceClassList", func(m *nats.Msg) {
  312. type T_Req struct {
  313. T_task_id string `xml:"T_task_id"` // 任务主键id
  314. T_sn string `xml:"T_sn"`
  315. T_id string `xml:"T_id"`
  316. }
  317. var t_Req T_Req
  318. var t_R lib.JSONS
  319. err := msgpack.Unmarshal(m.Data, &t_Req)
  320. if err != nil {
  321. logs.Error("Mats", lib.FuncName(), err)
  322. t_R.Code = 202
  323. t_R.Msg = err.Error()
  324. b, _ := msgpack.Marshal(&t_R)
  325. _ = lib.Nats.Publish(m.Reply, b)
  326. return
  327. }
  328. logs.Debug(fmt.Sprintf("ColdVerify_Server_Edit_DeviceClassList message: %+v\n", t_Req))
  329. Task_r, is := Task.Read_Task(t_Req.T_task_id)
  330. if !is {
  331. logs.Error("Mats", lib.FuncName())
  332. t_R.Code = 202
  333. t_R.Msg = "T_task_id 错误!"
  334. b, _ := msgpack.Marshal(&t_R)
  335. _ = lib.Nats.Publish(m.Reply, b)
  336. return
  337. }
  338. // 判断是否已存在sn
  339. dc, is := Device.Read_DeviceClassList_T_class_T_sn(Task_r.T_class, t_Req.T_sn)
  340. // 添加的id和数据库已存在id相同
  341. if is && dc.T_id == t_Req.T_id {
  342. t_R.Code = 200
  343. t_R.Msg = "ok"
  344. b, _ := msgpack.Marshal(&t_R)
  345. _ = lib.Nats.Publish(m.Reply, b)
  346. return
  347. }
  348. // 相同sn 添加的id和数据库已存在id不同
  349. if is && dc.T_id != t_Req.T_id {
  350. dc2, is := Device.Read_DeviceClassList_T_class_T_id(Task_r.T_class, t_Req.T_id)
  351. if is {
  352. logs.Error("Mats", lib.FuncName())
  353. t_R.Code = 202
  354. t_R.Msg = fmt.Sprintf("编号[%s]已被[%s]关联,请重试", t_Req.T_id, dc2.T_sn)
  355. b, _ := msgpack.Marshal(&t_R)
  356. _ = lib.Nats.Publish(m.Reply, b)
  357. return
  358. }
  359. var pdf Certificate.CertificatePdf
  360. pdfList, _ := Certificate.Read_CertificatePdf_T_layout_no(t_Req.T_id, "")
  361. if len(pdfList) > 0 {
  362. pdf = pdfList[0]
  363. }
  364. dc.T_id = t_Req.T_id
  365. dc.T_failure_time = pdf.T_failure_time
  366. dc.T_pdf = pdf.T_pdf
  367. dc.T_Certificate_sn = pdf.T_Certificate_sn
  368. if !Device.Update_DeviceClassList(dc, "T_id", "T_failure_time", "T_pdf", "T_Certificate_sn") {
  369. logs.Error("Mats", lib.FuncName())
  370. t_R.Code = 202
  371. t_R.Msg = "修改编号失败!"
  372. b, _ := msgpack.Marshal(&t_R)
  373. _ = lib.Nats.Publish(m.Reply, b)
  374. return
  375. }
  376. }
  377. t_R.Code = 200
  378. t_R.Msg = "ok"
  379. b, _ := msgpack.Marshal(&t_R)
  380. _ = lib.Nats.Publish(m.Reply, b)
  381. Task.Add_TaskLogs_T("nats", t_Req.T_task_id, "任务管理", "修改设备列表", t_Req)
  382. System.Add_UserLogs_T("nats", "任务管理", "修改设备列表", t_Req)
  383. })
  384. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Del_TaskData_ByT_BindDeviceDataTime", "Del_TaskData_ByT_BindDeviceDataTime", func(m *nats.Msg) {
  385. var t_R lib.JSONS
  386. task, is := Task.Read_Task(string(m.Data))
  387. if !is {
  388. logs.Error("Mats", lib.FuncName())
  389. t_R.Code = 202
  390. t_R.Msg = "查询失败"
  391. b, _ := msgpack.Marshal(&t_R)
  392. _ = lib.Nats.Publish(m.Reply, b)
  393. return
  394. }
  395. dcList, _ := Device.Read_DeviceClassList_OrderList(task.T_class, "", "", "", 0, 9999)
  396. for _, v := range dcList {
  397. if !lib.IsNumeric(v.T_id) {
  398. // 删除任务表指定时间数据
  399. Task.Del_TaskData_t_idByT_BindDeviceDataTime(task.T_task_id, v.T_id, task.T_BindDeviceDataStartTime, task.T_BindDeviceDataEndTime)
  400. } else {
  401. Task.Del_TaskData_t_idByT_BindDeviceDataTime(task.T_task_id, v.T_id, task.T_VerifyDeviceDataStartTime, task.T_VerifyDeviceDataEndTime)
  402. }
  403. }
  404. })
  405. _, _ = lib.Nats.QueueSubscribe("ColdVerify_Server_Update_Task_BySN", "Update_Task_BySN", func(m *nats.Msg) {
  406. type T_Req struct {
  407. T_sn string `xml:"T_sn"`
  408. T_CalibrationTime string `xml:"T_CalibrationTime"`
  409. }
  410. var t_Req T_Req
  411. var t_R lib.JSONS
  412. err := msgpack.Unmarshal(m.Data, &t_Req)
  413. if err != nil {
  414. logs.Error("Mats", lib.FuncName(), err)
  415. t_R.Code = 202
  416. t_R.Msg = err.Error()
  417. b, _ := msgpack.Marshal(&t_R)
  418. _ = lib.Nats.Publish(m.Reply, b)
  419. return
  420. }
  421. logs.Debug(fmt.Sprintf("ColdVerify_Server_Update_Task_BySN message: %+v\n", t_Req))
  422. task, err := Task.Read_Task_BySN(t_Req.T_sn)
  423. if err != nil && err.Error() != "record not found" {
  424. logs.Error("Mats", lib.FuncName())
  425. t_R.Code = 202
  426. t_R.Msg = "查询失败"
  427. b, _ := msgpack.Marshal(&t_R)
  428. _ = lib.Nats.Publish(m.Reply, b)
  429. return
  430. }
  431. col := []string{}
  432. if len(t_Req.T_CalibrationTime) > 0 {
  433. task.T_CalibrationExpirationTime = t_Req.T_CalibrationTime[0:10]
  434. col = append(col, "T_CalibrationExpirationTime")
  435. }
  436. if !Task.Update_Task(task, col...) {
  437. logs.Error("Mats", lib.FuncName(), err)
  438. t_R.Code = 202
  439. t_R.Msg = err.Error()
  440. b, _ := msgpack.Marshal(&t_R)
  441. _ = lib.Nats.Publish(m.Reply, b)
  442. return
  443. }
  444. t_R.Code = 200
  445. t_R.Msg = "ok"
  446. b, _ := msgpack.Marshal(&t_R)
  447. _ = lib.Nats.Publish(m.Reply, b)
  448. Task.Add_TaskLogs_T("nats", task.T_task_id, "任务管理", "修改校准时间", t_Req)
  449. System.Add_UserLogs_T("nats", "任务管理", "修改校准时间", t_Req)
  450. })
  451. }