waybill.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. package service
  2. import (
  3. "cold-logistics/app/admin/model"
  4. "cold-logistics/app/admin/service/dto"
  5. "cold-logistics/common/actions"
  6. cDto "cold-logistics/common/dto"
  7. "cold-logistics/common/global"
  8. model2 "cold-logistics/common/model"
  9. "cold-logistics/common/nats/nats_server"
  10. "errors"
  11. "fmt"
  12. "gogs.baozhida.cn/zoie/OAuth-core/pkg/utils"
  13. "gogs.baozhida.cn/zoie/OAuth-core/service"
  14. "gorm.io/gorm"
  15. "strings"
  16. "time"
  17. )
  18. type Waybill struct {
  19. service.Service
  20. }
  21. // GetPage 获取Waybill列表
  22. func (e *Waybill) GetPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  23. var err error
  24. var data model.Waybill
  25. err = e.Orm.Model(&data).
  26. Scopes(
  27. cDto.MakeCondition(c.GetNeedSearch()),
  28. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  29. actions.Permission(data.TableName(), p),
  30. ).
  31. Find(list).Limit(-1).Offset(-1).
  32. Count(count).Error
  33. if err != nil {
  34. e.Log.Errorf("db error: %s", err)
  35. return global.GetFailedErr
  36. }
  37. return nil
  38. }
  39. // Get 获取Waybill对象
  40. func (e *Waybill) Get(d *dto.WaybillGetReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  41. err := e.Orm.
  42. Scopes(actions.Permission(waybillModel.TableName(), p)).
  43. Preload("User").
  44. First(waybillModel, d.GetId()).Error
  45. if err != nil {
  46. e.Log.Errorf("db error: %s", err)
  47. if errors.Is(err, gorm.ErrRecordNotFound) {
  48. return global.GetNotFoundOrNoPermissionErr
  49. }
  50. return global.GetFailedErr
  51. }
  52. return nil
  53. }
  54. // Insert 创建Waybill对象
  55. func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
  56. var err error
  57. var data model.Waybill
  58. tx := e.Orm.Begin()
  59. defer func() {
  60. if err != nil {
  61. tx.Rollback()
  62. } else {
  63. tx.Commit()
  64. }
  65. }()
  66. var no string
  67. for {
  68. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  69. var j int64
  70. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  71. if err != nil {
  72. continue
  73. }
  74. if j == 0 {
  75. break
  76. }
  77. }
  78. // 添加运单
  79. data.WaybillNo = no
  80. c.Generate(&data)
  81. err = tx.Create(&data).Error
  82. if err != nil {
  83. e.Log.Errorf("db error: %s", err)
  84. return global.CreateFailedErr
  85. }
  86. c.Id = data.Id
  87. return nil
  88. }
  89. // Update 修改Waybill对象
  90. func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) error {
  91. var err error
  92. tx := e.Orm.Begin()
  93. defer func() {
  94. if err != nil {
  95. tx.Rollback()
  96. } else {
  97. tx.Commit()
  98. }
  99. }()
  100. var waybillModel = model.Waybill{}
  101. // 查询运单是否存在
  102. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  103. First(&waybillModel, c.GetId()).Error
  104. if err != nil {
  105. e.Log.Errorf("db error: %s", err)
  106. if errors.Is(err, gorm.ErrRecordNotFound) {
  107. return global.UpdateNotFoundOrNoPermissionErr
  108. }
  109. return global.UpdateFailedErr
  110. }
  111. c.Generate(&waybillModel)
  112. err = tx.Save(&waybillModel).Error
  113. if err != nil {
  114. e.Log.Errorf("db error: %s", err)
  115. return global.UpdateFailedErr
  116. }
  117. c.Id = waybillModel.Id
  118. return nil
  119. }
  120. func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
  121. var err error
  122. tx := e.Orm.Begin()
  123. defer func() {
  124. if err != nil {
  125. tx.Rollback()
  126. } else {
  127. tx.Commit()
  128. }
  129. }()
  130. for _, id := range c.WaybillIds {
  131. var waybillModel = model.Waybill{}
  132. // 查询运单是否存在
  133. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  134. First(&waybillModel, id).Error
  135. if err != nil {
  136. e.Log.Errorf("db error: %s", err)
  137. if errors.Is(err, gorm.ErrRecordNotFound) {
  138. return global.UpdateNotFoundOrNoPermissionErr
  139. }
  140. return global.UpdateFailedErr
  141. }
  142. if waybillModel.Status != model.WaybillStatusWaitDelivery {
  143. return errors.New(fmt.Sprintf("运单状态为%s,禁止操作!", model.WaybillStatusMap[waybillModel.Status]))
  144. }
  145. if c.Type == model.SysUserTypeDriver {
  146. waybillModel.Status = model.WaybillStatusWaitTruck
  147. }
  148. if c.Type == model.SysUserTypeWarehouse {
  149. waybillModel.Status = model.WaybillStatusWaitStorage
  150. }
  151. waybillModel.PrintUserId = c.PrintUserId
  152. err = tx.Save(&waybillModel).Error
  153. if err != nil {
  154. e.Log.Errorf("db error: %s", err)
  155. return global.UpdateFailedErr
  156. }
  157. }
  158. return nil
  159. }
  160. // Remove 删除Waybill
  161. func (e *Waybill) Remove(c *dto.WaybillDeleteReq, p *actions.DataPermission) error {
  162. var err error
  163. tx := e.Orm.Begin()
  164. defer func() {
  165. if err != nil {
  166. tx.Rollback()
  167. } else {
  168. tx.Commit()
  169. }
  170. }()
  171. var waybillModel model.Waybill
  172. // 查询运单是否存在
  173. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  174. First(&waybillModel, c.GetId()).Error
  175. if err != nil {
  176. e.Log.Errorf("db error: %s", err)
  177. if errors.Is(err, gorm.ErrRecordNotFound) {
  178. return global.DeleteNotFoundOrNoPermissionErr
  179. }
  180. return global.DeleteFailedErr
  181. }
  182. if waybillModel.Status != model.WaybillStatusWaitDelivery && waybillModel.Status != model.WaybillStatusWaitTruck && waybillModel.Status != model.WaybillStatusWaitStorage {
  183. return errors.New(fmt.Sprintf("运单状态为%s,禁止删除", model.WaybillStatusMap[waybillModel.Status]))
  184. }
  185. db := tx.Delete(&waybillModel)
  186. if err = db.Error; err != nil {
  187. e.Log.Errorf("db error: %s", err)
  188. return global.DeleteFailedErr
  189. }
  190. if db.RowsAffected == 0 {
  191. return global.DeleteNotFoundOrNoPermissionErr
  192. }
  193. return nil
  194. }
  195. func (e *Waybill) WarehouseIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  196. var err error
  197. tx := e.Orm.Begin()
  198. defer func() {
  199. if err != nil {
  200. tx.Rollback()
  201. } else {
  202. tx.Commit()
  203. }
  204. }()
  205. // 查询仓库信息
  206. var warehouse = model.Warehouse{}
  207. // 查询运单是否存在
  208. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  209. Where("user_id = ?", p.UserId).
  210. First(&warehouse).Error
  211. if err != nil {
  212. e.Log.Errorf("db error: %s", err)
  213. return errors.New("获取仓库信息失败")
  214. }
  215. for _, waybillNo := range c.WaybillNoList {
  216. var waybillModel = model.Waybill{}
  217. // 查询运单是否存在
  218. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  219. Where("waybill_no = ?", waybillNo).
  220. First(&waybillModel).Error
  221. if err != nil {
  222. e.Log.Errorf("db error: %s", err)
  223. if errors.Is(err, gorm.ErrRecordNotFound) {
  224. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  225. }
  226. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  227. }
  228. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  229. continue
  230. }
  231. waybillModel.Status = model.WaybillStatusStorage
  232. waybillModel.WarehouseId = warehouse.Id
  233. err = tx.Save(waybillModel).Error
  234. if err != nil {
  235. e.Log.Errorf("db error: %s", err)
  236. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  237. }
  238. // 获取传感器信息
  239. deviceSensorList, count, err := nats_server.Cold_CompanyDeviceSensor_List_ByKey(warehouse.Sn)
  240. if err != nil || count == 0 {
  241. return errors.New(fmt.Sprintf("查询设备定位信息失败:%s", err.Error()))
  242. }
  243. var lng, Lat string
  244. if len(deviceSensorList[0].T_DeviceSensorData.T_site) > 0 {
  245. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  246. if len(site) == 2 {
  247. lng = site[0]
  248. Lat = site[1]
  249. }
  250. }
  251. // 添加物流
  252. Logistics := model.WaybillLogistics{
  253. WaybillNo: waybillNo,
  254. Status: model.WaybillStatusStorage,
  255. WarehouseId: warehouse.Id,
  256. UserId: p.UserId,
  257. Lng: lng,
  258. Lat: Lat,
  259. ControlBy: model2.ControlBy{
  260. CreateBy: p.UserId,
  261. },
  262. DeptBy: model2.DeptBy{
  263. DeptId: p.DeptId,
  264. },
  265. }
  266. err = tx.Create(&Logistics).Error
  267. if err != nil {
  268. e.Log.Errorf("db error: %s", err)
  269. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  270. }
  271. // 添加任务
  272. task := model.WaybillTask{
  273. WaybillNo: waybillNo,
  274. WarehouseId: warehouse.Id,
  275. UserId: p.UserId,
  276. Sn: warehouse.Sn,
  277. StartTime: model2.Time(time.Now()),
  278. ControlBy: model2.ControlBy{
  279. CreateBy: p.UserId,
  280. },
  281. DeptBy: model2.DeptBy{
  282. DeptId: p.DeptId,
  283. },
  284. }
  285. err = tx.Create(&task).Error
  286. if err != nil {
  287. e.Log.Errorf("db error: %s", err)
  288. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  289. }
  290. }
  291. return nil
  292. }
  293. func (e *Waybill) WarehouseOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  294. var err error
  295. tx := e.Orm.Begin()
  296. defer func() {
  297. if err != nil {
  298. tx.Rollback()
  299. } else {
  300. tx.Commit()
  301. }
  302. }()
  303. // 查询仓库信息
  304. var warehouse = model.Warehouse{}
  305. // 查询运单是否存在
  306. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  307. Where("user_id = ?", p.UserId).
  308. First(&warehouse).Error
  309. if err != nil {
  310. e.Log.Errorf("db error: %s", err)
  311. return errors.New("获取仓库信息失败")
  312. }
  313. for _, waybillNo := range c.WaybillNoList {
  314. var waybillModel = model.Waybill{}
  315. // 查询运单是否存在
  316. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  317. Where("waybill_no = ?", waybillNo).
  318. First(&waybillModel).Error
  319. if err != nil {
  320. e.Log.Errorf("db error: %s", err)
  321. if errors.Is(err, gorm.ErrRecordNotFound) {
  322. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  323. }
  324. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  325. }
  326. if waybillModel.WarehouseId != warehouse.Id {
  327. return errors.New("请选择正确仓库出库!")
  328. }
  329. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorageOut {
  330. continue
  331. }
  332. waybillModel.Status = model.WaybillStatusStorageOut
  333. waybillModel.WarehouseId = warehouse.Id
  334. err = tx.Save(waybillModel).Error
  335. if err != nil {
  336. e.Log.Errorf("db error: %s", err)
  337. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  338. }
  339. // 获取传感器信息
  340. deviceSensorList, count, err := nats_server.Cold_CompanyDeviceSensor_List_ByKey(warehouse.Sn)
  341. if err != nil || count == 0 {
  342. return errors.New(fmt.Sprintf("查询设备定位信息失败:%s", err.Error()))
  343. }
  344. var lng, Lat string
  345. if len(deviceSensorList[0].T_DeviceSensorData.T_site) > 0 {
  346. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  347. if len(site) == 2 {
  348. lng = site[0]
  349. Lat = site[1]
  350. }
  351. }
  352. // 添加物流
  353. Logistics := model.WaybillLogistics{
  354. WaybillNo: waybillNo,
  355. Status: model.WaybillStatusStorageOut,
  356. WarehouseId: warehouse.Id,
  357. UserId: p.UserId,
  358. Lng: lng,
  359. Lat: Lat,
  360. ControlBy: model2.ControlBy{
  361. CreateBy: p.UserId,
  362. },
  363. DeptBy: model2.DeptBy{
  364. DeptId: p.DeptId,
  365. },
  366. }
  367. err = tx.Create(&Logistics).Error
  368. if err != nil {
  369. e.Log.Errorf("db error: %s", err)
  370. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  371. }
  372. // 查询任务
  373. var task model.WaybillTask
  374. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, warehouse.Id).
  375. First(&task).Error
  376. if err != nil {
  377. e.Log.Errorf("db error: %s", err)
  378. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  379. }
  380. task.EndTime = model2.Time(time.Now())
  381. task.UpdateBy = p.UserId
  382. err = tx.Save(&task).Error
  383. if err != nil {
  384. e.Log.Errorf("db error: %s", err)
  385. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  386. }
  387. }
  388. return nil
  389. }
  390. func (e *Waybill) CarIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  391. var err error
  392. tx := e.Orm.Begin()
  393. defer func() {
  394. if err != nil {
  395. tx.Rollback()
  396. } else {
  397. tx.Commit()
  398. }
  399. }()
  400. // 查询仓库信息
  401. var car = model.Car{}
  402. // 查询运单是否存在
  403. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  404. Where("user_id = ?", p.UserId).
  405. First(&car).Error
  406. if err != nil {
  407. e.Log.Errorf("db error: %s", err)
  408. return errors.New("获取仓库信息失败")
  409. }
  410. for _, waybillNo := range c.WaybillNoList {
  411. var waybillModel = model.Waybill{}
  412. // 查询运单是否存在
  413. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  414. Where("waybill_no = ?", waybillNo).
  415. First(&waybillModel).Error
  416. if err != nil {
  417. e.Log.Errorf("db error: %s", err)
  418. if errors.Is(err, gorm.ErrRecordNotFound) {
  419. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  420. }
  421. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  422. }
  423. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruck {
  424. continue
  425. }
  426. waybillModel.Status = model.WaybillStatusTruck
  427. waybillModel.CarId = car.Id
  428. err = tx.Save(waybillModel).Error
  429. if err != nil {
  430. e.Log.Errorf("db error: %s", err)
  431. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  432. }
  433. // 获取传感器信息
  434. deviceSensorList, count, err := nats_server.Cold_CompanyDeviceSensor_List_ByKey(car.Sn)
  435. if err != nil || count == 0 {
  436. return errors.New(fmt.Sprintf("查询设备定位信息失败:%s", err.Error()))
  437. }
  438. var lng, Lat string
  439. if len(deviceSensorList[0].T_DeviceSensorData.T_site) > 0 {
  440. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  441. if len(site) == 2 {
  442. lng = site[0]
  443. Lat = site[1]
  444. }
  445. }
  446. // 添加物流
  447. Logistics := model.WaybillLogistics{
  448. WaybillNo: waybillNo,
  449. Status: model.WaybillStatusTruck,
  450. CarId: car.Id,
  451. UserId: p.UserId,
  452. Lng: lng,
  453. Lat: Lat,
  454. ControlBy: model2.ControlBy{
  455. CreateBy: p.UserId,
  456. },
  457. DeptBy: model2.DeptBy{
  458. DeptId: p.DeptId,
  459. },
  460. }
  461. err = tx.Create(&Logistics).Error
  462. if err != nil {
  463. e.Log.Errorf("db error: %s", err)
  464. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  465. }
  466. // 添加任务
  467. task := model.WaybillTask{
  468. WaybillNo: waybillNo,
  469. CarId: car.Id,
  470. UserId: p.UserId,
  471. Sn: car.Sn,
  472. StartTime: model2.Time(time.Now()),
  473. ControlBy: model2.ControlBy{
  474. CreateBy: p.UserId,
  475. },
  476. DeptBy: model2.DeptBy{
  477. DeptId: p.DeptId,
  478. },
  479. }
  480. err = tx.Create(&task).Error
  481. if err != nil {
  482. e.Log.Errorf("db error: %s", err)
  483. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  484. }
  485. }
  486. return nil
  487. }
  488. func (e *Waybill) CarOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  489. var err error
  490. tx := e.Orm.Begin()
  491. defer func() {
  492. if err != nil {
  493. tx.Rollback()
  494. } else {
  495. tx.Commit()
  496. }
  497. }()
  498. // 查询仓库信息
  499. var car = model.Car{}
  500. // 查询运单是否存在
  501. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  502. Where("user_id = ?", p.UserId).
  503. First(&car).Error
  504. if err != nil {
  505. e.Log.Errorf("db error: %s", err)
  506. return errors.New("获取仓库信息失败")
  507. }
  508. for _, waybillNo := range c.WaybillNoList {
  509. var waybillModel = model.Waybill{}
  510. // 查询运单是否存在
  511. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  512. Where("waybill_no = ?", waybillNo).
  513. First(&waybillModel).Error
  514. if err != nil {
  515. e.Log.Errorf("db error: %s", err)
  516. if errors.Is(err, gorm.ErrRecordNotFound) {
  517. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  518. }
  519. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  520. }
  521. if waybillModel.CarId != car.Id {
  522. return errors.New("请选择正确仓库出库!")
  523. }
  524. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruckOut {
  525. continue
  526. }
  527. waybillModel.Status = model.WaybillStatusTruckOut
  528. waybillModel.CarId = car.Id
  529. err = tx.Save(waybillModel).Error
  530. if err != nil {
  531. e.Log.Errorf("db error: %s", err)
  532. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  533. }
  534. // 获取传感器信息
  535. deviceSensorList, count, err := nats_server.Cold_CompanyDeviceSensor_List_ByKey(car.Sn)
  536. if err != nil || count == 0 {
  537. return errors.New(fmt.Sprintf("查询设备定位信息失败:%s", err.Error()))
  538. }
  539. var lng, Lat string
  540. if len(deviceSensorList[0].T_DeviceSensorData.T_site) > 0 {
  541. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  542. if len(site) == 2 {
  543. lng = site[0]
  544. Lat = site[1]
  545. }
  546. }
  547. // 添加物流
  548. Logistics := model.WaybillLogistics{
  549. WaybillNo: waybillNo,
  550. Status: model.WaybillStatusTruckOut,
  551. CarId: car.Id,
  552. UserId: p.UserId,
  553. Lng: lng,
  554. Lat: Lat,
  555. ControlBy: model2.ControlBy{
  556. CreateBy: p.UserId,
  557. },
  558. DeptBy: model2.DeptBy{
  559. DeptId: p.DeptId,
  560. },
  561. }
  562. err = tx.Create(&Logistics).Error
  563. if err != nil {
  564. e.Log.Errorf("db error: %s", err)
  565. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  566. }
  567. // 查询任务
  568. var task model.WaybillTask
  569. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, car.Id).
  570. First(&task).Error
  571. if err != nil {
  572. e.Log.Errorf("db error: %s", err)
  573. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  574. }
  575. task.EndTime = model2.Time(time.Now())
  576. task.UpdateBy = p.UserId
  577. err = tx.Save(&task).Error
  578. if err != nil {
  579. e.Log.Errorf("db error: %s", err)
  580. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  581. }
  582. }
  583. return nil
  584. }