waybill_task.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. package service
  2. import (
  3. "cold-logistics/app/admin/model"
  4. "cold-logistics/app/admin/service/dto"
  5. cDto "cold-logistics/common/dto"
  6. "cold-logistics/common/global"
  7. model2 "cold-logistics/common/model"
  8. "cold-logistics/common/nats/nats_server"
  9. "errors"
  10. "fmt"
  11. "gogs.baozhida.cn/zoie/OAuth-core/service"
  12. "gorm.io/gorm"
  13. "sort"
  14. "time"
  15. )
  16. type WaybillTask struct {
  17. service.Service
  18. }
  19. func WaybillTaskTimeScopes(startTime, endTime string) func(db *gorm.DB) *gorm.DB {
  20. return func(db *gorm.DB) *gorm.DB {
  21. if len(startTime) == 0 && len(endTime) == 0 {
  22. return db
  23. }
  24. return db.Where("(start_time between ? and ?) or (end_time between ? and ?)",
  25. startTime, endTime, startTime, endTime)
  26. }
  27. }
  28. // GetPage 获取WaybillTask列表
  29. func (e *WaybillTask) GetPage(c *dto.WaybillTaskGetPageReq, list *[]model.WaybillTask, count *int64) error {
  30. var err error
  31. var data model.WaybillTask
  32. var waybill model.Waybill
  33. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  34. if err != nil {
  35. e.Log.Errorf("db error: %s", err)
  36. return errors.New("获取运单信息失败")
  37. }
  38. err = e.Orm.Model(&data).
  39. Scopes(
  40. cDto.MakeCondition(c.GetNeedSearch()),
  41. ).
  42. Preload("Warehouse").Preload("Car").Preload("CoolerBox").
  43. Find(list).Limit(-1).Offset(-1).
  44. Count(count).Error
  45. if err != nil {
  46. e.Log.Errorf("db error: %s", err)
  47. return global.GetFailedErr
  48. }
  49. // 获取公司秘钥
  50. var company model.SysDept
  51. company, err = model.GetCompanyById(waybill.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. // 获取传感器信息
  58. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey((*list)[i].Sn, company.ColdKey)
  59. (*list)[i].DeviceSensorList = deviceSensorList
  60. }
  61. return nil
  62. }
  63. // GetPage 获取WaybillTask列表
  64. func (e *WaybillTask) GetDataPage(c *dto.WaybillTaskGetDataPageReq) (list []nats_server.DeviceData_R, count int64, err error) {
  65. var waybill model.Waybill
  66. err = e.Orm.Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  67. if err != nil {
  68. e.Log.Errorf("db error: %s", err)
  69. err = errors.New("获取运单信息错误!")
  70. return
  71. }
  72. var task model.WaybillTask
  73. err = e.Orm.Where("id = ? and waybill_no = ?", c.TaskId, c.WaybillNo).First(&task).Error
  74. if err != nil {
  75. e.Log.Errorf("db error: %s", err)
  76. err = errors.New("获取运单信息错误!")
  77. return
  78. }
  79. // 获取最后一个任务id
  80. var lastWaybillTask model.WaybillTask
  81. err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", c.WaybillNo).Last(&lastWaybillTask).Error
  82. if err != nil {
  83. e.Log.Errorf("db error: %s", err)
  84. err = errors.New("获取运单信息错误!")
  85. return
  86. }
  87. var afterStartTime bool
  88. var beforeEndTime bool
  89. if len(c.StartTime) > 0 {
  90. var st time.Time
  91. st, err = time.ParseInLocation("2006-01-02 15:04:05", c.StartTime, time.Local)
  92. if err != nil {
  93. err = errors.New("解析时间字符串出错!")
  94. return
  95. }
  96. fmt.Println("st", st)
  97. fmt.Println("task.StartTime", task.StartTime.Local())
  98. if task.StartTime.Local().After(st) || st.Truncate(time.Second).Equal(task.StartTime.Local().Truncate(time.Second)) {
  99. c.StartTime = task.StartTime.String()
  100. } else {
  101. afterStartTime = true
  102. }
  103. } else {
  104. c.StartTime = task.StartTime.String()
  105. }
  106. if len(c.EndTime) > 0 {
  107. var et time.Time
  108. et, err = time.ParseInLocation("2006-01-02 15:04:05", c.EndTime, time.Local)
  109. if err != nil {
  110. err = errors.New("解析时间字符串出错!")
  111. return
  112. }
  113. fmt.Println("et", et)
  114. fmt.Println("task.EndTime", task.EndTime.Local())
  115. if et.After(task.EndTime.Local()) || et.Truncate(time.Second).Equal(task.EndTime.Local().Truncate(time.Second)) {
  116. c.EndTime = task.EndTime.String()
  117. } else {
  118. beforeEndTime = true
  119. }
  120. } else {
  121. c.EndTime = task.EndTime.String()
  122. }
  123. T_snid := ""
  124. for _, id := range c.T_ids {
  125. T_snid += fmt.Sprintf("%s,%d|", task.Sn, id)
  126. }
  127. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, c.StartTime, c.EndTime, 0, 9999)
  128. firstMap := map[int]nats_server.DeviceData_R{}
  129. lastMap := map[int]nats_server.DeviceData_R{}
  130. if count > 0 {
  131. for _, v := range c.T_ids {
  132. for i := 0; i < len(list); i++ {
  133. if afterStartTime {
  134. break
  135. }
  136. if v == list[i].T_id {
  137. if list[i].T_time != task.StartTime.String() {
  138. data := list[len(list)-1-i]
  139. data.T_time = task.StartTime.String()
  140. firstMap[v] = data
  141. count += 1
  142. }
  143. break
  144. }
  145. }
  146. for i := len(list) - 1; i >= 0; i-- {
  147. if beforeEndTime {
  148. break
  149. }
  150. if v == list[i].T_id {
  151. if list[i].T_time != task.EndTime.String() && !task.EndTime.Local().IsZero() {
  152. data := list[len(list)-1-i]
  153. data.T_time = task.EndTime.String()
  154. lastMap[v] = data
  155. count += 1
  156. }
  157. break
  158. }
  159. }
  160. }
  161. }
  162. for _, data := range firstMap {
  163. list = append(list, data)
  164. }
  165. for _, data := range lastMap {
  166. list = append(list, data)
  167. }
  168. sort.Slice(list, func(i, j int) bool {
  169. // 先按 T_time 字段排序,如果 T_time 相同则按 T_name 字段排序
  170. if list[i].T_time == list[j].T_time {
  171. return list[i].T_name < list[j].T_name
  172. }
  173. return list[i].T_time > list[j].T_time
  174. })
  175. // 计算总页数
  176. totalPages := (int(count) + c.PageSize - 1) / c.PageSize
  177. // 如果n超出范围,返回错误
  178. if c.Page > totalPages {
  179. return []nats_server.DeviceData_R{}, count, err
  180. }
  181. if c.Page < 1 {
  182. c.Page = 1
  183. }
  184. // 计算当前页的数据
  185. start := (c.Page - 1) * c.PageSize
  186. end := start + c.PageSize
  187. if end > int(count) {
  188. end = int(count)
  189. }
  190. currentPage := list[start:end]
  191. return currentPage, count, err
  192. }
  193. func (e *WaybillTask) GetPrintDataPage(c *dto.WaybillTaskGetDataPageReq) (list []nats_server.DeviceData_R, count int64, err error) {
  194. var waybill model.Waybill
  195. err = e.Orm.Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  196. if err != nil {
  197. e.Log.Errorf("db error: %s", err)
  198. err = errors.New("获取运单信息错误!")
  199. return
  200. }
  201. var task model.WaybillTask
  202. err = e.Orm.Where("id = ? and waybill_no = ?", c.TaskId, c.WaybillNo).First(&task).Error
  203. if err != nil {
  204. e.Log.Errorf("db error: %s", err)
  205. err = errors.New("获取运单信息错误!")
  206. return
  207. }
  208. // 获取最后一个任务id
  209. var lastWaybillTask model.WaybillTask
  210. err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", c.WaybillNo).Last(&lastWaybillTask).Error
  211. if err != nil {
  212. e.Log.Errorf("db error: %s", err)
  213. err = errors.New("获取运单信息错误!")
  214. return
  215. }
  216. var afterStartTime bool
  217. var beforeEndTime bool
  218. if len(c.StartTime) > 0 {
  219. var st time.Time
  220. st, err = time.ParseInLocation("2006-01-02 15:04:05", c.StartTime, time.Local)
  221. if err != nil {
  222. err = errors.New("解析时间字符串出错!")
  223. return
  224. }
  225. fmt.Println("st", st)
  226. fmt.Println("task.StartTime", task.StartTime.Local())
  227. if task.StartTime.Local().After(st) || st.Truncate(time.Second).Equal(task.StartTime.Local().Truncate(time.Second)) {
  228. c.StartTime = task.StartTime.String()
  229. } else {
  230. afterStartTime = true
  231. }
  232. } else {
  233. c.StartTime = task.StartTime.String()
  234. }
  235. if len(c.EndTime) > 0 {
  236. var et time.Time
  237. et, err = time.ParseInLocation("2006-01-02 15:04:05", c.EndTime, time.Local)
  238. if err != nil {
  239. err = errors.New("解析时间字符串出错!")
  240. return
  241. }
  242. fmt.Println("et", et)
  243. fmt.Println("task.EndTime", task.EndTime.Local())
  244. if et.After(task.EndTime.Local()) || et.Truncate(time.Second).Equal(task.EndTime.Local().Truncate(time.Second)) {
  245. c.EndTime = task.EndTime.String()
  246. } else {
  247. beforeEndTime = true
  248. }
  249. } else {
  250. c.EndTime = task.EndTime.String()
  251. }
  252. T_snid := ""
  253. for _, id := range c.T_ids {
  254. T_snid += fmt.Sprintf("%s,%d|", task.Sn, id)
  255. }
  256. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, c.StartTime, c.EndTime, 0, 9999)
  257. firstMap := map[int]nats_server.DeviceData_R{}
  258. lastMap := map[int]nats_server.DeviceData_R{}
  259. if count > 0 {
  260. for _, v := range c.T_ids {
  261. for i := 0; i < len(list); i++ {
  262. if afterStartTime {
  263. break
  264. }
  265. if v == list[i].T_id {
  266. if list[i].T_time != task.StartTime.String() {
  267. data := list[len(list)-1-i]
  268. data.T_time = task.StartTime.String()
  269. firstMap[v] = data
  270. count += 1
  271. }
  272. break
  273. }
  274. }
  275. for i := len(list) - 1; i >= 0; i-- {
  276. if beforeEndTime {
  277. break
  278. }
  279. if v == list[i].T_id {
  280. if list[i].T_time != task.EndTime.String() && !task.EndTime.Local().IsZero() {
  281. data := list[len(list)-1-i]
  282. data.T_time = task.EndTime.String()
  283. lastMap[v] = data
  284. count += 1
  285. }
  286. break
  287. }
  288. }
  289. }
  290. }
  291. for _, data := range firstMap {
  292. list = append(list, data)
  293. }
  294. for _, data := range lastMap {
  295. list = append(list, data)
  296. }
  297. sort.Slice(list, func(i, j int) bool {
  298. // 先按 T_time 字段排序,如果 T_time 相同则按 T_name 字段排序
  299. if list[i].T_time == list[j].T_time {
  300. return list[i].T_name < list[j].T_name
  301. }
  302. return list[i].T_time > list[j].T_time
  303. })
  304. // 计算总页数
  305. totalPages := (int(count) + c.PageSize - 1) / c.PageSize
  306. // 如果n超出范围,返回错误
  307. if c.Page > totalPages {
  308. return []nats_server.DeviceData_R{}, count, err
  309. }
  310. if c.Page < 1 {
  311. c.Page = 1
  312. }
  313. // 计算当前页的数据
  314. start := (c.Page - 1) * c.PageSize
  315. end := start + c.PageSize
  316. if end > int(count) {
  317. end = int(count)
  318. }
  319. currentPage := list[start:end]
  320. return currentPage, count, err
  321. }
  322. func (e *WaybillTask) GetNewestDataPage(c *dto.WaybillTaskGetNewestDataPageReq) (data nats_server.DeviceData_R, err error) {
  323. var waybill model.Waybill
  324. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  325. if err != nil {
  326. e.Log.Errorf("db error: %s", err)
  327. err = errors.New("获取运单信息错误!")
  328. return
  329. }
  330. // 获取公司秘钥
  331. var company model.SysDept
  332. company, err = model.GetCompanyById(waybill.DeptId)
  333. if err != nil {
  334. e.Log.Errorf("db error: %s", err)
  335. err = model.GetCompanyKeyErr
  336. return
  337. }
  338. var taskList []model.WaybillTask
  339. err = e.Orm.Where("waybill_no = ?", c.WaybillNo).Order("id desc").Find(&taskList).Error
  340. if err != nil {
  341. e.Log.Errorf("db error: %s", err)
  342. err = errors.New("获取运单信息任务失败!")
  343. return
  344. }
  345. if len(taskList) == 0 {
  346. err = errors.New("暂无温湿度记录信息!")
  347. return
  348. }
  349. var listAll []nats_server.DeviceData_R
  350. for _, task := range taskList {
  351. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(task.Sn, company.ColdKey)
  352. if len(deviceSensorList) == 0 {
  353. continue
  354. }
  355. T_snid := fmt.Sprintf("%s,%d|", deviceSensorList[0].T_sn, deviceSensorList[0].T_id)
  356. if len(task.EndTime.String()) == 0 {
  357. task.EndTime = model2.Time(time.Now())
  358. }
  359. // 获取传感器信息
  360. list, _, _ := nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, task.StartTime.String(), task.EndTime.String(), 0, 9999)
  361. if len(list) > 0 {
  362. listAll = append(listAll, list...)
  363. break
  364. }
  365. }
  366. if len(listAll) > 0 {
  367. sort.Slice(listAll, func(i, j int) bool {
  368. return listAll[i].T_time > listAll[j].T_time
  369. })
  370. data = listAll[0]
  371. return
  372. }
  373. err = errors.New("暂无温湿度记录信息!")
  374. return
  375. }
  376. func (e *WaybillTask) GetLocus(c *dto.WaybillGetLocusReq) ([]nats_server.DeviceData_R2, error) {
  377. var err error
  378. var data model.WaybillTask
  379. var waybill model.Waybill
  380. var taskList []model.WaybillTask
  381. locusList := make([]nats_server.DeviceData_R2, 0)
  382. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  383. if err != nil {
  384. e.Log.Errorf("db error: %s", err)
  385. return locusList, errors.New("获取运单信息失败")
  386. }
  387. // 获取公司秘钥
  388. var company model.SysDept
  389. company, err = model.GetCompanyById(waybill.DeptId)
  390. if err != nil {
  391. e.Log.Errorf("db error: %s", err)
  392. return locusList, model.GetCompanyKeyErr
  393. }
  394. err = e.Orm.Model(&data).
  395. Scopes(
  396. cDto.MakeCondition(c.GetNeedSearch()),
  397. ).Where("car_id > 0 or cooler_box_id > 0 ").
  398. Find(&taskList).Error
  399. if err != nil {
  400. e.Log.Errorf("db error: %s", err)
  401. return locusList, global.GetFailedErr
  402. }
  403. for i := 0; i < len(taskList); i++ {
  404. // 获取传感器信息
  405. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  406. if len(deviceSensorList) > 0 {
  407. T_snid := fmt.Sprintf("%s,%d|", taskList[i].Sn, deviceSensorList[0].T_id)
  408. dataList, _, err := nats_server.Cold_ReadDeviceDataListBy_T_snidForLocus(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  409. if err != nil {
  410. e.Log.Errorf("nats 获取轨迹信息失败: %s", err)
  411. return locusList, global.GetFailedErr
  412. }
  413. // 倒序
  414. sort.Slice(dataList, func(i, j int) bool {
  415. if dataList[i].T_time < dataList[j].T_time {
  416. return true
  417. }
  418. return false
  419. })
  420. locusList = append(locusList, dataList...)
  421. }
  422. }
  423. return locusList, nil
  424. }