cooler_box.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. package service
  2. import (
  3. "cold-delivery/app/admin/model"
  4. "cold-delivery/app/admin/service/dto"
  5. "cold-delivery/common/actions"
  6. cDto "cold-delivery/common/dto"
  7. "cold-delivery/common/global"
  8. "cold-delivery/common/lib"
  9. "cold-delivery/common/nats/nats_server"
  10. "errors"
  11. "fmt"
  12. "gogs.baozhida.cn/zoie/OAuth-core/service"
  13. "gorm.io/gorm"
  14. "sort"
  15. "strconv"
  16. "strings"
  17. "sync"
  18. "time"
  19. )
  20. type CoolerBox struct {
  21. service.Service
  22. }
  23. // GetPage 获取CoolerBox列表
  24. func (e *CoolerBox) GetPage(c *dto.CoolerBoxGetPageReq, list *[]model.CoolerBox, count *int64, p *actions.DataPermission) error {
  25. var err error
  26. var data model.CoolerBox
  27. if c.PageSize == 9999 {
  28. err = e.Orm.Model(&data).
  29. Scopes(
  30. actions.Permission(data.TableName(), p),
  31. ).
  32. Find(list).Limit(-1).Offset(-1).
  33. Count(count).Error
  34. } else {
  35. err = e.Orm.Model(&data).
  36. Scopes(
  37. cDto.MakeCondition(c.GetNeedSearch()),
  38. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  39. actions.Permission(data.TableName(), p),
  40. ).
  41. Find(list).Limit(-1).Offset(-1).
  42. Count(count).Error
  43. }
  44. if err != nil {
  45. e.Log.Errorf("db error: %s", err)
  46. return global.GetFailedErr
  47. }
  48. if c.ShowTemp {
  49. // 获取公司秘钥
  50. var company model.SysDept
  51. company, err = model.GetCompanyById(p.DeptId)
  52. if err != nil {
  53. e.Log.Errorf("db error: %s", err)
  54. return model.GetCompanyKeyErr
  55. }
  56. for i := 0; i < len(*list); i++ {
  57. deviceData, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey((*list)[i].Sn, company.ColdKey)
  58. if len(deviceData) > 0 {
  59. (*list)[i].DeviceData = deviceData[0].T_DeviceSensorData
  60. }
  61. }
  62. }
  63. for i, _ := range *list {
  64. var dataIce model.IceRaft
  65. var dataIces []model.IceRaft
  66. err := e.Orm.Model(&dataIce).
  67. Scopes(
  68. actions.Permission(dataIce.TableName(), p),
  69. IceRaftNameRecordStatusScopes(model.IceRaftRecordStatusUsing),
  70. IceRaftNameRecordCoolerBoxIdScopes((*list)[i].Id),
  71. ).
  72. Joins("left join ice_raft_record on ice_raft.ice_raft_record_id = ice_raft_record.id").
  73. Preload("IceRaftRecord").
  74. Find(&dataIces).Error
  75. if err != nil {
  76. e.Log.Errorf("db error: %s", err)
  77. return global.GetFailedErr
  78. }
  79. (*list)[i].IceRaft = dataIces
  80. }
  81. return nil
  82. }
  83. // Get 获取CoolerBox对象
  84. func (e *CoolerBox) Get(d *dto.CoolerBoxGetReq, CoolerBoxModel *model.CoolerBox, p *actions.DataPermission) error {
  85. err := e.Orm.
  86. Scopes(actions.Permission(CoolerBoxModel.TableName(), p)).
  87. First(CoolerBoxModel, d.GetId()).Error
  88. if err != nil {
  89. e.Log.Errorf("db error: %s", err)
  90. if errors.Is(err, gorm.ErrRecordNotFound) {
  91. return global.GetNotFoundOrNoPermissionErr
  92. }
  93. return global.GetFailedErr
  94. }
  95. return nil
  96. }
  97. // Insert 创建CoolerBox对象
  98. func (e *CoolerBox) Insert(c *dto.CoolerBoxInsertReq, p *actions.DataPermission) error {
  99. var err error
  100. var data model.CoolerBox
  101. tx := e.Orm.Begin()
  102. defer func() {
  103. if err != nil {
  104. tx.Rollback()
  105. } else {
  106. tx.Commit()
  107. }
  108. }()
  109. var k int64
  110. err = tx.Model(&data).Where("sn = ?", c.Sn).Count(&k).Error
  111. if err != nil {
  112. e.Log.Errorf("db error: %s", err)
  113. return global.CreateFailedErr
  114. }
  115. if k > 0 {
  116. err = errors.New("该Sn已绑定!")
  117. e.Log.Errorf("db error: %s", err)
  118. return err
  119. }
  120. //var device nats_server.Device
  121. //var company model.SysDept
  122. //device, err = nats_server.Cold_ReadDeviceByT_sn(c.Sn)
  123. //if err != nil {
  124. // err = errors.New("获取SN信息失败,请检查SN是否正确!")
  125. // e.Log.Errorf("db error: %s", err)
  126. // return err
  127. //}
  128. //company, err = model.GetCompanyById(p.DeptId)
  129. //if err != nil {
  130. // e.Log.Errorf("db error: %s", err)
  131. // return err
  132. //}
  133. //if device.T_pid != company.Id {
  134. // err = errors.New("获取SN信息失败,请检查SN是否正确!")
  135. // e.Log.Errorf("获取SN信息失败,device.T_pid != company.Id")
  136. // return err
  137. //}
  138. // 添加保温箱
  139. c.Generate(&data)
  140. data.HistorySn = []string{data.Sn}
  141. err = tx.Create(&data).Error
  142. if err != nil {
  143. e.Log.Errorf("db error: %s", err)
  144. return global.CreateFailedErr
  145. }
  146. c.Id = data.Id
  147. return nil
  148. }
  149. func (e *CoolerBox) BatchInsert(c *dto.CoolerBoxBatchInsertReq) error {
  150. var err error
  151. tx := e.Orm.Begin()
  152. defer func() {
  153. if err != nil {
  154. tx.Rollback()
  155. } else {
  156. tx.Commit()
  157. }
  158. }()
  159. for _, coolerBox := range c.List {
  160. var data model.CoolerBox
  161. var k int64
  162. err = tx.Model(&data).Where("sn = ?", coolerBox.Sn).Count(&k).Error
  163. if err != nil {
  164. e.Log.Errorf("db error: %s", err)
  165. return global.CreateFailedErr
  166. }
  167. if k > 0 {
  168. //err = errors.New("该Sn已绑定!")
  169. continue
  170. }
  171. // 添加保温箱
  172. coolerBox.CreateBy = c.CreateBy
  173. coolerBox.DeptId = c.DeptId
  174. coolerBox.Status = c.Status
  175. coolerBox.Generate(&data)
  176. data.HistorySn = []string{data.Sn}
  177. err = tx.Create(&data).Error
  178. if err != nil {
  179. e.Log.Errorf("db error: %s", err)
  180. return global.CreateFailedErr
  181. }
  182. }
  183. return nil
  184. }
  185. // Update 修改CoolerBox对象
  186. func (e *CoolerBox) Update(c *dto.CoolerBoxUpdateReq, p *actions.DataPermission) error {
  187. var err error
  188. tx := e.Orm.Begin()
  189. defer func() {
  190. if err != nil {
  191. tx.Rollback()
  192. } else {
  193. tx.Commit()
  194. }
  195. }()
  196. var CoolerBoxModel = model.CoolerBox{}
  197. // 查询保温箱是否存在
  198. err = e.Orm.Scopes(actions.Permission(CoolerBoxModel.TableName(), p)).
  199. First(&CoolerBoxModel, c.GetId()).Error
  200. if err != nil {
  201. e.Log.Errorf("db error: %s", err)
  202. if errors.Is(err, gorm.ErrRecordNotFound) {
  203. return global.UpdateNotFoundOrNoPermissionErr
  204. }
  205. return global.UpdateFailedErr
  206. }
  207. if CoolerBoxModel.Sn != c.Sn && len(c.Sn) > 0 {
  208. var k int64
  209. var data = model.CoolerBox{}
  210. err = tx.Model(&data).Where("sn = ?", c.Sn).Count(&k).Error
  211. if err != nil {
  212. e.Log.Errorf("db error: %s", err)
  213. return global.CreateFailedErr
  214. }
  215. if k > 0 {
  216. err = errors.New("该Sn已绑定!")
  217. e.Log.Errorf("db error: %s", err)
  218. return err
  219. }
  220. //var device nats_server.Device
  221. //var company model.SysDept
  222. //device, err = nats_server.Cold_ReadDeviceByT_sn(c.Sn)
  223. //if err != nil {
  224. // err = errors.New("获取SN信息失败,请检查SN是否正确!")
  225. // e.Log.Errorf("db error: %s", err)
  226. // return err
  227. //}
  228. //company, err = model.GetCompanyById(p.DeptId)
  229. //if err != nil {
  230. // e.Log.Errorf("db error: %s", err)
  231. // return err
  232. //}
  233. //if device.T_pid != company.Id {
  234. // err = errors.New("获取SN信息失败,请检查SN是否正确!")
  235. // e.Log.Errorf("获取SN信息失败,device.T_pid != company.Id")
  236. // return err
  237. //}
  238. CoolerBoxModel.HistorySn = append(CoolerBoxModel.HistorySn, c.Sn)
  239. }
  240. c.Generate(&CoolerBoxModel)
  241. err = tx.Save(&CoolerBoxModel).Error
  242. if err != nil {
  243. e.Log.Errorf("db error: %s", err)
  244. return global.UpdateFailedErr
  245. }
  246. c.Id = CoolerBoxModel.Id
  247. return nil
  248. }
  249. // Remove 删除CoolerBox
  250. func (e *CoolerBox) Remove(c *dto.CoolerBoxDeleteReq, p *actions.DataPermission) error {
  251. var err error
  252. tx := e.Orm.Begin()
  253. defer func() {
  254. if err != nil {
  255. tx.Rollback()
  256. } else {
  257. tx.Commit()
  258. }
  259. }()
  260. var iceRaftModel model.IceRaft
  261. var count int64
  262. err = e.Orm.Model(&iceRaftModel).
  263. Scopes(
  264. actions.Permission(iceRaftModel.TableName(), p),
  265. IceRaftNameRecordStatusScopes(model.IceRaftRecordStatusUsing),
  266. IceRaftNameRecordCoolerBoxIdScopes(c.Id),
  267. ).
  268. Where("ice_raft.status = '2'").
  269. Joins("left join ice_raft_record on ice_raft.ice_raft_record_id = ice_raft_record.id").
  270. Count(&count).Error
  271. if err != nil {
  272. e.Log.Errorf("db error: %s", err)
  273. return global.DeleteFailedErr
  274. }
  275. if count > 0 {
  276. err = errors.New("该保温箱下有冰排正在使用中,无法删除!")
  277. return err
  278. }
  279. var CoolerBoxModel model.CoolerBox
  280. // 查询保温箱是否存在
  281. err = e.Orm.Scopes(actions.Permission(CoolerBoxModel.TableName(), p)).
  282. First(&CoolerBoxModel, c.GetId()).Error
  283. if err != nil {
  284. e.Log.Errorf("db error: %s", err)
  285. if errors.Is(err, gorm.ErrRecordNotFound) {
  286. return global.DeleteNotFoundOrNoPermissionErr
  287. }
  288. return global.DeleteFailedErr
  289. }
  290. db := tx.Delete(&CoolerBoxModel)
  291. if err = db.Error; err != nil {
  292. e.Log.Errorf("db error: %s", err)
  293. return global.DeleteFailedErr
  294. }
  295. if db.RowsAffected == 0 {
  296. return global.DeleteNotFoundOrNoPermissionErr
  297. }
  298. return nil
  299. }
  300. // GetHistory 获取保温箱历史信息
  301. func (e *CoolerBox) GetHistory(c *dto.CoolerBoxBatchReqSN, p *actions.DataPermission) ([]dto.HistoricalData, error) {
  302. var err error
  303. var taskList []model.WaybillTask
  304. var historical []dto.HistoricalData
  305. if c.Page == 0 {
  306. c.Page = 1
  307. }
  308. if c.PageZ == 0 {
  309. c.PageZ = 10
  310. }
  311. // 查询运单任务信息
  312. err = e.Orm.Model(&model.WaybillTask{}).
  313. Where("cooler_box_id = ?", c.Id).
  314. Find(&taskList).Error
  315. if err != nil {
  316. e.Log.Errorf("db error: %s", err)
  317. return nil, errors.New("获取运单任务信息失败")
  318. }
  319. // 获取公司秘钥
  320. var dataDept model.SysDept
  321. var Depts []model.SysDept
  322. err = e.Orm.Model(&dataDept).
  323. Scopes(
  324. CompanyIdScopesUser(p.DeptId),
  325. ).
  326. Find(&Depts).Limit(-1).Offset(-1).Error
  327. if err != nil {
  328. e.Log.Errorf("db error: %s", err)
  329. return nil, model.GetCompanyKeyErr
  330. }
  331. //company, err := model.GetCompanyById(p.DeptId)
  332. //if err != nil {
  333. // e.Log.Errorf("db error: %s", err)
  334. // return nil, model.GetCompanyKeyErr
  335. //}
  336. // 限制并发请求数量
  337. const maxConcurrentRequests = 10
  338. semaphore := make(chan struct{}, maxConcurrentRequests)
  339. var deviceSensorList []nats_server.DeviceSensor_R
  340. var wg sync.WaitGroup
  341. for _, task := range taskList {
  342. wg.Add(1)
  343. go func(task model.WaybillTask) {
  344. defer wg.Done()
  345. semaphore <- struct{}{}
  346. defer func() { <-semaphore }()
  347. for _, v := range Depts {
  348. deviceSensorList, _, _ = nats_server.Cold_CompanyDeviceSensor_List_ByKey(task.Sn, v.ColdKey)
  349. if len(deviceSensorList) > 0 {
  350. historical = append(historical, dto.HistoricalData{
  351. Sn: task.Sn,
  352. T_id: strconv.Itoa(deviceSensorList[0].T_id) + "|",
  353. StartTime: task.StartTime.String(),
  354. EndTime: task.EndTime.String(),
  355. CompanyName: v.Name,
  356. })
  357. break
  358. }
  359. }
  360. if len(deviceSensorList) == 0 {
  361. return
  362. }
  363. if err != nil {
  364. e.Log.Errorf("nats 获取轨迹信息失败: %s", err)
  365. return
  366. }
  367. }(task)
  368. }
  369. wg.Wait()
  370. sort.Slice(historical, func(i, j int) bool {
  371. if historical[i].StartTime < historical[j].StartTime {
  372. return true
  373. }
  374. return false
  375. })
  376. startIndex := (c.Page - 1) * c.PageZ
  377. endIndex := startIndex + c.PageZ
  378. if endIndex > len(historical) {
  379. endIndex = len(historical)
  380. }
  381. pageHistory := historical[startIndex:endIndex]
  382. return pageHistory, nil
  383. }
  384. // GetNewLocus 获取最新轨迹
  385. func (e *CoolerBox) GetNewLocus(c *dto.CoolerBoxReq, list *[]nats_server.DeviceData_) error {
  386. // 获取公司秘钥
  387. var dataDept model.SysDept
  388. var Depts []model.SysDept
  389. atoi, _ := strconv.Atoi(c.Id)
  390. err := e.Orm.Model(&dataDept).
  391. Scopes(
  392. CompanyIdScopesUser(atoi),
  393. ).
  394. Find(&Depts).Limit(-1).Offset(-1).Error
  395. if err != nil {
  396. e.Log.Errorf("db error: %s", err)
  397. return global.GetFailedErr
  398. }
  399. var deviceSensorList []nats_server.DeviceSensor_R
  400. for _, v := range Depts {
  401. deviceSensorList, _, _ = nats_server.Cold_CompanyDeviceSensor_List_ByKey(c.T_sn, v.ColdKey)
  402. if len(deviceSensorList) > 0 {
  403. break
  404. }
  405. }
  406. if len(deviceSensorList) == 0 {
  407. return errors.New("该设备不属于该公司")
  408. }
  409. data, err := nats_server.Read_DeviceTask_List_By_Condition(c.T_sn)
  410. if err != nil {
  411. e.Log.Errorf("设备未开启监控: %s", err)
  412. return errors.New("设备未开启监控")
  413. }
  414. // 当最新设备状态为1时,证明设备正在启动中,查询大于开始时间的所有轨迹,设备状态为2时,查询开始时间到结束时间的轨迹
  415. if data.T_State == 1 {
  416. deviceData, err := nats_server.Read_Start_Time_DeviceData(c.T_sn, deviceSensorList[0].T_id, data.T_Ut_start.Format("2006-01-02 15:04:05"), "")
  417. if err != nil {
  418. e.Log.Errorf("获取设备轨迹失败: %s", err)
  419. return errors.New("获取设备轨迹失败")
  420. }
  421. *list = appendUniqueDeviceData(*list, deviceData)
  422. } else if data.T_State == 2 {
  423. deviceData, err := nats_server.Read_Start_Time_DeviceData(c.T_sn, deviceSensorList[0].T_id, data.T_Ut_start.Format("2006-01-02 15:04:05"), data.T_Ut_end.Format("2006-01-02 15:04:05"))
  424. if err != nil {
  425. e.Log.Errorf("获取设备轨迹失败: %s", err)
  426. return errors.New("获取设备轨迹失败")
  427. }
  428. *list = appendUniqueDeviceData(*list, deviceData)
  429. }
  430. return nil
  431. }
  432. // 去重并追加设备数据
  433. func appendUniqueDeviceData(list []nats_server.DeviceData_, newData []nats_server.DeviceData_) []nats_server.DeviceData_ {
  434. uniqueMap := make(map[time.Time]bool)
  435. for _, d := range list {
  436. //split := strings.Split(list[i].T_site, ",")
  437. //defer func() {
  438. // if r := recover(); r != nil {
  439. // fmt.Println("数组下标越界:", r)
  440. // }
  441. //}()
  442. //Lng := split[0]
  443. //Lat := split[1]
  444. //Lngs, _ := strconv.ParseFloat(Lng, 64)
  445. //Lats, _ := strconv.ParseFloat(Lat, 64)
  446. //mLng, mLat := lib.Wgs84ToGcj02(Lngs, Lats)
  447. //list[i].T_site = fmt.Sprintf("%v,%v", mLng, mLat)
  448. uniqueMap[d.T_time] = true
  449. }
  450. for _, d := range newData {
  451. if !uniqueMap[d.T_time] {
  452. split := strings.Split(d.T_site, ",")
  453. defer func() {
  454. if r := recover(); r != nil {
  455. fmt.Println("数组下标越界:", r)
  456. }
  457. }()
  458. Lng := split[0]
  459. Lat := split[1]
  460. Lngs, _ := strconv.ParseFloat(Lng, 64)
  461. Lats, _ := strconv.ParseFloat(Lat, 64)
  462. mLng, mLat := lib.Wgs84ToGcj02(Lngs, Lats)
  463. d.T_site = fmt.Sprintf("%v,%v", mLng, mLat)
  464. list = append(list, d)
  465. }
  466. }
  467. //排序
  468. sort.Slice(list, func(i, j int) bool {
  469. return list[i].T_time.After(list[j].T_time)
  470. })
  471. return list
  472. }
  473. // GetCoolerBoxIce 获取保温箱下的所有历史冰排
  474. func (e *CoolerBox) GetCoolerBoxIce(c *dto.GetCoolerBoxIce, list *[]model.IceRaftRecord, p *actions.DataPermission, count *int64) error {
  475. var err error
  476. tx := e.Orm.Begin()
  477. defer func() {
  478. if err != nil {
  479. tx.Rollback()
  480. } else {
  481. tx.Commit()
  482. }
  483. }()
  484. //查询保温箱是否存在
  485. var icerecord model.IceRaftRecord
  486. err = e.Orm.Scopes(
  487. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  488. actions.Permission(icerecord.TableName(), p)).
  489. Where("cooler_box_id=?", c.CoolerBoxId).
  490. Preload("IceLocker").
  491. Preload("CoolerBox").
  492. Find(&list).Count(count).Error
  493. if err != nil {
  494. e.Log.Errorf("db error: %s", err)
  495. if errors.Is(err, gorm.ErrRecordNotFound) {
  496. return global.GetFailedErr
  497. }
  498. return global.GetFailedErr
  499. }
  500. return nil
  501. }
  502. // GetCoolerBoxIceAll 获取保温箱所有历史记录
  503. func (e *CoolerBox) GetCoolerBoxIceAll(c *dto.GetCoolerBoxIceAll, list *[]model.IceRaftRecord, p *actions.DataPermission, count *int64) error {
  504. var err error
  505. tx := e.Orm.Begin()
  506. defer func() {
  507. if err != nil {
  508. tx.Rollback()
  509. } else {
  510. tx.Commit()
  511. }
  512. }()
  513. //查询保温箱是否存在
  514. var icerecord model.IceRaftRecord
  515. err = e.Orm.Scopes(
  516. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  517. actions.Permission(icerecord.TableName(), p)).
  518. Not("cooler_box_id", 0).
  519. Preload("IceLocker").
  520. Preload("CoolerBox").
  521. Find(&list).Count(count).Error
  522. if err != nil {
  523. e.Log.Errorf("db error: %s", err)
  524. if errors.Is(err, gorm.ErrRecordNotFound) {
  525. return global.GetFailedErr
  526. }
  527. return global.GetFailedErr
  528. }
  529. return nil
  530. }