waybill.go 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887
  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. "sort"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. type Waybill struct {
  21. service.Service
  22. }
  23. func WaybillCustomerStatusScopes(status int) func(db *gorm.DB) *gorm.DB {
  24. return func(db *gorm.DB) *gorm.DB {
  25. // 未发货
  26. if status == 1 {
  27. statusList := []int{
  28. model.WaybillStatusWaitDelivery,
  29. model.WaybillStatusTruck,
  30. model.WaybillStatusWaitStorage,
  31. }
  32. return db.Where("status in (?)", statusList)
  33. }
  34. // 已发货
  35. if status == 2 {
  36. statusList := []int{
  37. model.WaybillStatusTruck,
  38. model.WaybillStatusStorage,
  39. model.WaybillStatusTruckOut,
  40. model.WaybillStatusStorageOut,
  41. }
  42. return db.Where("status in (?)", statusList)
  43. }
  44. // 已签收
  45. if status == 3 {
  46. statusList := []int{
  47. model.WaybillStatusReceipt,
  48. }
  49. return db.Where("status in (?)", statusList)
  50. }
  51. return db
  52. }
  53. }
  54. // GetPage 获取Waybill列表
  55. func (e *Waybill) GetPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  56. var err error
  57. var data model.Waybill
  58. if c.PageSize == 9999 {
  59. err = e.Orm.Model(&data).
  60. Scopes(
  61. cDto.MakeCondition(c.GetNeedSearch()),
  62. actions.Permission(data.TableName(), p),
  63. ).
  64. Find(list).Limit(-1).Offset(-1).
  65. Count(count).Error
  66. if err != nil {
  67. e.Log.Errorf("db error: %s", err)
  68. return global.GetFailedErr
  69. }
  70. return nil
  71. }
  72. err = e.Orm.Model(&data).
  73. Scopes(
  74. cDto.MakeCondition(c.GetNeedSearch()),
  75. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  76. actions.Permission(data.TableName(), p),
  77. ).
  78. Preload("PrintUser").
  79. Find(list).Limit(-1).Offset(-1).
  80. Count(count).Error
  81. if err != nil {
  82. e.Log.Errorf("db error: %s", err)
  83. return global.GetFailedErr
  84. }
  85. return nil
  86. }
  87. func (e *Waybill) GetAppletPage(c *dto.WaybillGetAppletPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  88. var err error
  89. //var data model.Waybill
  90. var logistics model.WaybillLogistics
  91. err = e.Orm.Table("waybill").
  92. Select("waybill.*,waybill_logistics.status as status").
  93. Scopes(
  94. cDto.MakeCondition(c.GetNeedSearch()),
  95. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  96. actions.Permission(logistics.TableName(), p)).
  97. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  98. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  99. Find(&list).Limit(-1).Offset(-1).Count(count).Error
  100. if err != nil {
  101. e.Log.Errorf("db error: %s", err)
  102. return global.GetFailedErr
  103. }
  104. return nil
  105. }
  106. func (e *Waybill) GetAppletCount(list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  107. var err error
  108. //var data model.Waybill
  109. var logistics model.WaybillLogistics
  110. err = e.Orm.Table("waybill").
  111. Select("waybill.*,waybill_logistics.status as status").
  112. Scopes(
  113. actions.Permission(logistics.TableName(), p)).
  114. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  115. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  116. Find(list).Count(count).Error
  117. if err != nil {
  118. e.Log.Errorf("db error: %s", err)
  119. return global.GetFailedErr
  120. }
  121. return nil
  122. }
  123. func (e *Waybill) GetCustomerPage(c *dto.WaybillGetCustomerPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  124. var err error
  125. var data model.Waybill
  126. if c.PageSize == 9999 {
  127. err = e.Orm.Model(&data).
  128. Scopes(
  129. WaybillCustomerStatusScopes(c.Status),
  130. cDto.MakeCondition(c.GetNeedSearch()),
  131. actions.Permission(data.TableName(), p),
  132. ).
  133. Find(list).Limit(-1).Offset(-1).
  134. Count(count).Error
  135. if err != nil {
  136. e.Log.Errorf("db error: %s", err)
  137. return global.GetFailedErr
  138. }
  139. return nil
  140. }
  141. err = e.Orm.Model(&data).
  142. Scopes(
  143. WaybillCustomerStatusScopes(c.Status),
  144. cDto.MakeCondition(c.GetNeedSearch()),
  145. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  146. actions.Permission(data.TableName(), p),
  147. ).
  148. Find(list).Limit(-1).Offset(-1).
  149. Count(count).Error
  150. if err != nil {
  151. e.Log.Errorf("db error: %s", err)
  152. return global.GetFailedErr
  153. }
  154. return nil
  155. }
  156. // Get 获取Waybill对象
  157. func (e *Waybill) Get(d *dto.WaybillGetReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  158. err := e.Orm.
  159. Scopes(actions.Permission(waybillModel.TableName(), p)).
  160. Preload("User").
  161. First(waybillModel, d.GetId()).Error
  162. if err != nil {
  163. e.Log.Errorf("db error: %s", err)
  164. if errors.Is(err, gorm.ErrRecordNotFound) {
  165. return global.GetNotFoundOrNoPermissionErr
  166. }
  167. return global.GetFailedErr
  168. }
  169. return nil
  170. }
  171. func (e *Waybill) GetByWaybillNo(d *dto.WaybillGetByWaybillPdfReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  172. err := e.Orm.
  173. Scopes(actions.Permission(waybillModel.TableName(), p)).
  174. Where("waybill_no = ?", d.WaybillNo).
  175. Preload("Dept").
  176. First(waybillModel).Error
  177. if err != nil {
  178. e.Log.Errorf("db error: %s", err)
  179. if errors.Is(err, gorm.ErrRecordNotFound) {
  180. return global.GetNotFoundOrNoPermissionErr
  181. }
  182. return global.GetFailedErr
  183. }
  184. return nil
  185. }
  186. // Insert 创建Waybill对象
  187. func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
  188. var err error
  189. var data model.Waybill
  190. tx := e.Orm.Begin()
  191. defer func() {
  192. if err != nil {
  193. tx.Rollback()
  194. } else {
  195. tx.Commit()
  196. }
  197. }()
  198. var no string
  199. for {
  200. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  201. var j int64
  202. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  203. if err != nil {
  204. continue
  205. }
  206. if j == 0 {
  207. break
  208. }
  209. }
  210. // 添加运单
  211. data.WaybillNo = no
  212. c.Generate(&data)
  213. err = tx.Create(&data).Error
  214. if err != nil {
  215. e.Log.Errorf("db error: %s", err)
  216. return global.CreateFailedErr
  217. }
  218. c.Id = data.Id
  219. return nil
  220. }
  221. // AppletInsert 员工添加运单
  222. func (e *Waybill) AppletInsert(c *dto.WaybillInsertReq, p *actions.DataPermission) error {
  223. var err error
  224. var data model.Waybill
  225. tx := e.Orm.Begin()
  226. defer func() {
  227. if err != nil {
  228. tx.Rollback()
  229. } else {
  230. tx.Commit()
  231. }
  232. }()
  233. var userModel = model.SysUser{}
  234. // 查询运单是否存在
  235. err = tx.Scopes(actions.Permission(userModel.TableName(), p)).
  236. First(&userModel, p.UserId).Error
  237. if err != nil {
  238. e.Log.Errorf("db error: %s", err)
  239. if errors.Is(err, gorm.ErrRecordNotFound) {
  240. return global.GetNotFoundErr
  241. }
  242. return global.CreateFailedErr
  243. }
  244. if (userModel.Type != model.SysUserTypeDriver && userModel.Type != model.SysUserTypeWarehouse) && userModel.UserType != "customer" {
  245. err = errors.New("无权添加!")
  246. return err
  247. }
  248. var status = model.WaybillStatusWaitDelivery
  249. var car = model.Car{}
  250. if userModel.Type == model.SysUserTypeDriver {
  251. status = model.WaybillStatusWaitTruck
  252. // 查询车辆库信息
  253. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  254. Where("user_id = ?", p.UserId).
  255. First(&car).Error
  256. if err != nil {
  257. e.Log.Errorf("db error: %s", err)
  258. return errors.New("获取车辆信息失败")
  259. }
  260. }
  261. var warehouse = model.Warehouse{}
  262. if userModel.Type == model.SysUserTypeWarehouse {
  263. status = model.WaybillStatusWaitStorage
  264. // 查询仓库信息
  265. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  266. Where("user_id = ?", p.UserId).
  267. First(&warehouse).Error
  268. if err != nil {
  269. e.Log.Errorf("db error: %s", err)
  270. return errors.New("获取仓库信息失败")
  271. }
  272. }
  273. var coolerBox = model.CoolerBox{}
  274. if c.DeliveryCondition == "保温箱" {
  275. status = model.WaybillStatusWaitVanning
  276. // 查询仓库信息
  277. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  278. Where("id = ?", c.CoolerBoxId).
  279. First(&coolerBox).Error
  280. if err != nil {
  281. e.Log.Errorf("db error: %s", err)
  282. return errors.New("获取保温箱信息失败")
  283. }
  284. }
  285. data.PrintUserId = p.UserId
  286. var no string
  287. for {
  288. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  289. var j int64
  290. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  291. if err != nil {
  292. continue
  293. }
  294. if j == 0 {
  295. break
  296. }
  297. }
  298. // 添加运单
  299. data.DeptId = p.DeptId
  300. data.CreateBy = p.UserId
  301. data.WaybillNo = no
  302. c.Generate(&data)
  303. data.Status = status
  304. err = tx.Create(&data).Error
  305. if err != nil {
  306. e.Log.Errorf("db error: %s", err)
  307. return global.CreateFailedErr
  308. }
  309. c.Id = data.Id
  310. // 添加物流
  311. Logistics := model.WaybillLogistics{
  312. WaybillNo: data.WaybillNo,
  313. Status: data.Status,
  314. CarId: car.Id,
  315. WarehouseId: warehouse.Id,
  316. CoolerBoxId: coolerBox.Id,
  317. UserId: p.UserId,
  318. ControlBy: model2.ControlBy{
  319. CreateBy: p.UserId,
  320. },
  321. DeptBy: model2.DeptBy{
  322. DeptId: p.DeptId,
  323. },
  324. }
  325. err = tx.Create(&Logistics).Error
  326. if err != nil {
  327. e.Log.Errorf("db error: %s", err)
  328. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  329. }
  330. return nil
  331. }
  332. // Update 修改Waybill对象
  333. func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) error {
  334. var err error
  335. tx := e.Orm.Begin()
  336. defer func() {
  337. if err != nil {
  338. tx.Rollback()
  339. } else {
  340. tx.Commit()
  341. }
  342. }()
  343. var waybillModel = model.Waybill{}
  344. // 查询运单是否存在
  345. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  346. First(&waybillModel, c.GetId()).Error
  347. if err != nil {
  348. e.Log.Errorf("db error: %s", err)
  349. if errors.Is(err, gorm.ErrRecordNotFound) {
  350. return global.UpdateNotFoundOrNoPermissionErr
  351. }
  352. return global.UpdateFailedErr
  353. }
  354. c.Generate(&waybillModel)
  355. err = tx.Save(&waybillModel).Error
  356. if err != nil {
  357. e.Log.Errorf("db error: %s", err)
  358. return global.UpdateFailedErr
  359. }
  360. c.Id = waybillModel.Id
  361. return nil
  362. }
  363. func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
  364. var err error
  365. tx := e.Orm.Begin()
  366. defer func() {
  367. if err != nil {
  368. tx.Rollback()
  369. } else {
  370. tx.Commit()
  371. }
  372. }()
  373. var car = model.Car{}
  374. if c.Type == model.SysUserTypeDriver {
  375. // 查询车辆库信息
  376. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  377. Where("user_id = ?", c.PrintUserId).
  378. First(&car).Error
  379. if err != nil {
  380. e.Log.Errorf("db error: %s", err)
  381. return errors.New("获取车辆信息失败")
  382. }
  383. }
  384. var warehouse = model.Warehouse{}
  385. if c.Type == model.SysUserTypeWarehouse {
  386. // 查询仓库信息
  387. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  388. Where("user_id = ?", c.PrintUserId).
  389. First(&warehouse).Error
  390. if err != nil {
  391. e.Log.Errorf("db error: %s", err)
  392. return errors.New("获取仓库信息失败")
  393. }
  394. }
  395. var coolerBox = model.CoolerBox{}
  396. if c.Type == model.TypeCoolerBox {
  397. // 查询保温箱信息
  398. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  399. Where("id = ?", c.CoolerBoxId).
  400. First(&coolerBox).Error
  401. if err != nil {
  402. e.Log.Errorf("db error: %s", err)
  403. return errors.New("获取保温箱信息失败")
  404. }
  405. var user = model.SysUser{}
  406. // 查询保温箱信息
  407. err = tx.Scopes(actions.Permission(user.TableName(), p)).
  408. Where("id = ?", c.PrintUserId).
  409. First(&user).Error
  410. if err != nil {
  411. e.Log.Errorf("db error: %s", err)
  412. return errors.New("获取保温箱配送人失败")
  413. }
  414. }
  415. for _, id := range c.WaybillIds {
  416. var waybillModel = model.Waybill{}
  417. // 查询运单是否存在
  418. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  419. First(&waybillModel, id).Error
  420. if err != nil {
  421. e.Log.Errorf("db error: %s", err)
  422. if errors.Is(err, gorm.ErrRecordNotFound) {
  423. return global.UpdateNotFoundOrNoPermissionErr
  424. }
  425. return global.UpdateFailedErr
  426. }
  427. // 待派单 待装车 待入库 待装箱
  428. if waybillModel.Status != model.WaybillStatusWaitDelivery &&
  429. waybillModel.Status != model.WaybillStatusWaitTruck &&
  430. waybillModel.Status != model.WaybillStatusWaitStorage &&
  431. waybillModel.Status != model.WaybillStatusWaitVanning {
  432. //err = errors.New(fmt.Sprintf("运单状态为%s,禁止操作!", model.WaybillStatusMap[waybillModel.Status]))
  433. //return err
  434. continue
  435. }
  436. if c.Type == model.SysUserTypeDriver {
  437. waybillModel.Status = model.WaybillStatusWaitTruck
  438. }
  439. if c.Type == model.SysUserTypeWarehouse {
  440. waybillModel.Status = model.WaybillStatusWaitStorage
  441. }
  442. if c.Type == model.TypeCoolerBox {
  443. waybillModel.Status = model.WaybillStatusWaitVanning
  444. }
  445. waybillModel.PrintUserId = c.PrintUserId
  446. err = tx.Save(&waybillModel).Error
  447. if err != nil {
  448. e.Log.Errorf("db error: %s", err)
  449. return global.UpdateFailedErr
  450. }
  451. // 添加物流
  452. Logistics := model.WaybillLogistics{
  453. WaybillNo: waybillModel.WaybillNo,
  454. Status: waybillModel.Status,
  455. CarId: car.Id,
  456. WarehouseId: warehouse.Id,
  457. CoolerBoxId: coolerBox.Id,
  458. UserId: c.PrintUserId,
  459. ControlBy: model2.ControlBy{
  460. CreateBy: p.UserId,
  461. },
  462. DeptBy: model2.DeptBy{
  463. DeptId: p.DeptId,
  464. },
  465. }
  466. err = tx.Create(&Logistics).Error
  467. if err != nil {
  468. e.Log.Errorf("db error: %s", err)
  469. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  470. }
  471. }
  472. return nil
  473. }
  474. // Remove 删除Waybill
  475. func (e *Waybill) Remove(c *dto.WaybillDeleteReq, p *actions.DataPermission) error {
  476. var err error
  477. tx := e.Orm.Begin()
  478. defer func() {
  479. if err != nil {
  480. tx.Rollback()
  481. } else {
  482. tx.Commit()
  483. }
  484. }()
  485. var waybillModel model.Waybill
  486. // 查询运单是否存在
  487. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  488. First(&waybillModel, c.GetId()).Error
  489. if err != nil {
  490. e.Log.Errorf("db error: %s", err)
  491. if errors.Is(err, gorm.ErrRecordNotFound) {
  492. return global.DeleteNotFoundOrNoPermissionErr
  493. }
  494. return global.DeleteFailedErr
  495. }
  496. if waybillModel.Status != model.WaybillStatusWaitDelivery && waybillModel.Status != model.WaybillStatusWaitTruck && waybillModel.Status != model.WaybillStatusWaitStorage {
  497. return errors.New(fmt.Sprintf("运单状态为%s,禁止删除", model.WaybillStatusMap[waybillModel.Status]))
  498. }
  499. db := tx.Delete(&waybillModel)
  500. if err = db.Error; err != nil {
  501. e.Log.Errorf("db error: %s", err)
  502. return global.DeleteFailedErr
  503. }
  504. if db.RowsAffected == 0 {
  505. return global.DeleteNotFoundOrNoPermissionErr
  506. }
  507. return nil
  508. }
  509. func (e *Waybill) WarehouseIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  510. var err error
  511. tx := e.Orm.Begin()
  512. defer func() {
  513. if err != nil {
  514. tx.Rollback()
  515. } else {
  516. tx.Commit()
  517. }
  518. }()
  519. // 查询仓库信息
  520. var warehouse = model.Warehouse{}
  521. // 查询运单是否存在
  522. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  523. Where("user_id = ?", p.UserId).
  524. First(&warehouse).Error
  525. if err != nil {
  526. e.Log.Errorf("db error: %s", err)
  527. return errors.New("获取仓库信息失败")
  528. }
  529. for _, waybillNo := range c.WaybillNoList {
  530. var waybillModel = model.Waybill{}
  531. // 查询运单是否存在
  532. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  533. Where("waybill_no = ?", waybillNo).
  534. First(&waybillModel).Error
  535. if err != nil {
  536. e.Log.Errorf("db error: %s", err)
  537. if errors.Is(err, gorm.ErrRecordNotFound) {
  538. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  539. }
  540. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  541. }
  542. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  543. continue
  544. }
  545. if waybillModel.WarehouseId != warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  546. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  547. return err
  548. }
  549. if waybillModel.Status == model.WaybillStatusWaitTruck {
  550. // 待装车
  551. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  552. return err
  553. }
  554. // 验证时间
  555. var logistics model.WaybillLogistics
  556. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  557. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  558. e.Log.Errorf("获取运单日志失败: %s", err)
  559. return err
  560. }
  561. if time.Time(logistics.CreatedAt).After(time.Time(c.StartTime)) {
  562. err = errors.New(fmt.Sprintf("运单号%s装车时间[%s]与上一阶段时间[%s]冲突,无法入库!", waybillNo, c.StartTime.String(), logistics.CreatedAt.String()))
  563. return err
  564. }
  565. var lng, lat string
  566. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  567. if err != nil {
  568. e.Log.Errorf("获取定位信息失败: %s", err)
  569. return err
  570. }
  571. if waybillModel.Status == model.WaybillStatusTruck {
  572. // 已装车
  573. var car model.Car
  574. err = e.Orm.First(&car, waybillModel.CarId).Error
  575. if err != nil {
  576. e.Log.Errorf("db error: %s", err)
  577. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  578. }
  579. // 添加物流
  580. Logistics := model.WaybillLogistics{
  581. WaybillNo: waybillNo,
  582. Status: model.WaybillStatusTruckOut,
  583. CarId: waybillModel.CarId,
  584. UserId: car.UserId,
  585. Lng: lng,
  586. Lat: lat,
  587. ControlBy: model2.ControlBy{
  588. CreateBy: p.UserId,
  589. },
  590. DeptBy: model2.DeptBy{
  591. DeptId: car.DeptId,
  592. },
  593. ModelTime: model2.ModelTime{
  594. CreatedAt: c.StartTime,
  595. },
  596. }
  597. err = tx.Create(&Logistics).Error
  598. if err != nil {
  599. e.Log.Errorf("db error: %s", err)
  600. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  601. }
  602. // 查询任务
  603. var task model.WaybillTask
  604. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, waybillModel.CarId).
  605. Last(&task).Error
  606. if err != nil {
  607. e.Log.Errorf("db error: %s", err)
  608. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  609. }
  610. task.EndTime = c.StartTime
  611. task.UpdateBy = p.UserId
  612. err = tx.Save(&task).Error
  613. if err != nil {
  614. e.Log.Errorf("db error: %s", err)
  615. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  616. }
  617. }
  618. if waybillModel.Status == model.WaybillStatusWaitStorage {
  619. waybillModel.DeliveryTime = c.StartTime
  620. }
  621. waybillModel.Status = model.WaybillStatusStorage
  622. waybillModel.WarehouseId = warehouse.Id
  623. err = tx.Save(&waybillModel).Error
  624. if err != nil {
  625. e.Log.Errorf("db error: %s", err)
  626. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  627. }
  628. // 添加物流
  629. Logistics := model.WaybillLogistics{
  630. WaybillNo: waybillNo,
  631. Status: model.WaybillStatusStorage,
  632. WarehouseId: warehouse.Id,
  633. UserId: p.UserId,
  634. Lng: lng,
  635. Lat: lat,
  636. ControlBy: model2.ControlBy{
  637. CreateBy: p.UserId,
  638. },
  639. DeptBy: model2.DeptBy{
  640. DeptId: p.DeptId,
  641. },
  642. ModelTime: model2.ModelTime{
  643. CreatedAt: c.StartTime,
  644. },
  645. }
  646. err = tx.Create(&Logistics).Error
  647. if err != nil {
  648. e.Log.Errorf("db error: %s", err)
  649. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  650. }
  651. // 添加任务
  652. task := model.WaybillTask{
  653. WaybillNo: waybillNo,
  654. WarehouseId: warehouse.Id,
  655. UserId: p.UserId,
  656. Sn: warehouse.Sn,
  657. StartTime: c.StartTime,
  658. ControlBy: model2.ControlBy{
  659. CreateBy: p.UserId,
  660. },
  661. DeptBy: model2.DeptBy{
  662. DeptId: p.DeptId,
  663. },
  664. }
  665. err = tx.Create(&task).Error
  666. if err != nil {
  667. e.Log.Errorf("db error: %s", err)
  668. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  669. }
  670. }
  671. return nil
  672. }
  673. func (e *Waybill) WarehouseOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  674. var err error
  675. tx := e.Orm.Begin()
  676. defer func() {
  677. if err != nil {
  678. tx.Rollback()
  679. } else {
  680. tx.Commit()
  681. }
  682. }()
  683. // 查询仓库信息
  684. var warehouse = model.Warehouse{}
  685. // 查询运单是否存在
  686. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  687. Where("user_id = ?", p.UserId).
  688. First(&warehouse).Error
  689. if err != nil {
  690. e.Log.Errorf("db error: %s", err)
  691. return errors.New("获取仓库信息失败")
  692. }
  693. for _, waybillNo := range c.WaybillNoList {
  694. var waybillModel = model.Waybill{}
  695. // 查询运单是否存在
  696. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  697. Where("waybill_no = ?", waybillNo).
  698. First(&waybillModel).Error
  699. if err != nil {
  700. e.Log.Errorf("db error: %s", err)
  701. if errors.Is(err, gorm.ErrRecordNotFound) {
  702. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  703. }
  704. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  705. }
  706. if waybillModel.WarehouseId != warehouse.Id {
  707. return errors.New("请选择正确仓库出库!")
  708. }
  709. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorageOut {
  710. continue
  711. }
  712. if waybillModel.Status != model.WaybillStatusStorage {
  713. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法出库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  714. return err
  715. }
  716. waybillModel.Status = model.WaybillStatusStorageOut
  717. waybillModel.WarehouseId = warehouse.Id
  718. err = tx.Save(&waybillModel).Error
  719. if err != nil {
  720. e.Log.Errorf("db error: %s", err)
  721. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  722. }
  723. var lng, lat string
  724. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  725. if err != nil {
  726. e.Log.Errorf("获取定位信息失败: %s", err)
  727. return err
  728. }
  729. // 添加物流
  730. Logistics := model.WaybillLogistics{
  731. WaybillNo: waybillNo,
  732. Status: model.WaybillStatusStorageOut,
  733. WarehouseId: warehouse.Id,
  734. UserId: p.UserId,
  735. Lng: lng,
  736. Lat: lat,
  737. ControlBy: model2.ControlBy{
  738. CreateBy: p.UserId,
  739. },
  740. DeptBy: model2.DeptBy{
  741. DeptId: p.DeptId,
  742. },
  743. ModelTime: model2.ModelTime{
  744. CreatedAt: c.StartTime,
  745. },
  746. }
  747. err = tx.Create(&Logistics).Error
  748. if err != nil {
  749. e.Log.Errorf("db error: %s", err)
  750. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  751. }
  752. // 查询任务
  753. var task model.WaybillTask
  754. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, warehouse.Id).
  755. First(&task).Error
  756. if err != nil {
  757. e.Log.Errorf("db error: %s", err)
  758. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  759. }
  760. task.EndTime = c.StartTime
  761. task.UpdateBy = p.UserId
  762. err = tx.Save(&task).Error
  763. if err != nil {
  764. e.Log.Errorf("db error: %s", err)
  765. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  766. }
  767. }
  768. return nil
  769. }
  770. func (e *Waybill) CarIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  771. var err error
  772. tx := e.Orm.Begin()
  773. defer func() {
  774. if err != nil {
  775. tx.Rollback()
  776. } else {
  777. tx.Commit()
  778. }
  779. }()
  780. // 查询车辆信息
  781. var car = model.Car{}
  782. // 查询运单是否存在
  783. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  784. Where("user_id = ?", p.UserId).
  785. First(&car).Error
  786. if err != nil {
  787. e.Log.Errorf("db error: %s", err)
  788. return errors.New("获取车辆绑定信息失败")
  789. }
  790. for _, waybillNo := range c.WaybillNoList {
  791. var waybillModel = model.Waybill{}
  792. // 查询运单是否存在
  793. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  794. Where("waybill_no = ?", waybillNo).
  795. First(&waybillModel).Error
  796. if err != nil {
  797. e.Log.Errorf("db error: %s", err)
  798. if errors.Is(err, gorm.ErrRecordNotFound) {
  799. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  800. }
  801. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  802. }
  803. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruck {
  804. continue
  805. }
  806. if waybillModel.CarId != car.Id && waybillModel.Status == model.WaybillStatusTruck {
  807. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  808. return err
  809. }
  810. if waybillModel.Status == model.WaybillStatusWaitStorage {
  811. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  812. return err
  813. }
  814. // 验证时间
  815. var logistics model.WaybillLogistics
  816. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  817. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  818. e.Log.Errorf("获取运单日志失败: %s", err)
  819. return err
  820. }
  821. if time.Time(logistics.CreatedAt).After(time.Time(c.StartTime)) {
  822. err = errors.New(fmt.Sprintf("运单号%s入库时间[%s]与上一阶段时间[%s]冲突,无法入库!", waybillNo, c.StartTime.String(), logistics.CreatedAt.String()))
  823. return err
  824. }
  825. if waybillModel.Status == model.WaybillStatusWaitTruck {
  826. waybillModel.DeliveryTime = c.StartTime
  827. }
  828. var lng, lat string
  829. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  830. if err != nil {
  831. e.Log.Errorf("获取定位信息失败: %s", err)
  832. return err
  833. }
  834. // 如果上一个状态为入库,则自动出库
  835. if waybillModel.Status == model.WaybillStatusStorage {
  836. var warehouse model.Warehouse
  837. err = e.Orm.First(&warehouse, waybillModel.WarehouseId).Error
  838. if err != nil {
  839. e.Log.Errorf("db error: %s", err)
  840. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  841. }
  842. // 添加物流
  843. Logistics := model.WaybillLogistics{
  844. WaybillNo: waybillNo,
  845. Status: model.WaybillStatusStorageOut,
  846. WarehouseId: waybillModel.WarehouseId,
  847. UserId: warehouse.UserId,
  848. Lng: lng,
  849. Lat: lat,
  850. ControlBy: model2.ControlBy{
  851. CreateBy: p.UserId,
  852. },
  853. DeptBy: model2.DeptBy{
  854. DeptId: warehouse.DeptId,
  855. },
  856. ModelTime: model2.ModelTime{
  857. CreatedAt: c.StartTime,
  858. },
  859. }
  860. err = tx.Create(&Logistics).Error
  861. if err != nil {
  862. e.Log.Errorf("db error: %s", err)
  863. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  864. }
  865. // 查询任务
  866. var task model.WaybillTask
  867. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, waybillModel.WarehouseId).
  868. Last(&task).Error
  869. if err != nil {
  870. e.Log.Errorf("db error: %s", err)
  871. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  872. }
  873. task.EndTime = c.StartTime
  874. task.UpdateBy = p.UserId
  875. err = tx.Save(&task).Error
  876. if err != nil {
  877. e.Log.Errorf("db error: %s", err)
  878. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  879. }
  880. }
  881. waybillModel.Status = model.WaybillStatusTruck
  882. waybillModel.CarId = car.Id
  883. err = tx.Save(&waybillModel).Error
  884. if err != nil {
  885. e.Log.Errorf("db error: %s", err)
  886. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  887. }
  888. // 添加物流
  889. Logistics := model.WaybillLogistics{
  890. WaybillNo: waybillNo,
  891. Status: model.WaybillStatusTruck,
  892. CarId: car.Id,
  893. UserId: p.UserId,
  894. Lng: lng,
  895. Lat: lat,
  896. ControlBy: model2.ControlBy{
  897. CreateBy: p.UserId,
  898. },
  899. DeptBy: model2.DeptBy{
  900. DeptId: p.DeptId,
  901. },
  902. ModelTime: model2.ModelTime{
  903. CreatedAt: c.StartTime,
  904. },
  905. }
  906. err = tx.Create(&Logistics).Error
  907. if err != nil {
  908. e.Log.Errorf("db error: %s", err)
  909. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  910. }
  911. // 添加任务
  912. task := model.WaybillTask{
  913. WaybillNo: waybillNo,
  914. CarId: car.Id,
  915. UserId: p.UserId,
  916. Sn: car.Sn,
  917. StartTime: c.StartTime,
  918. ControlBy: model2.ControlBy{
  919. CreateBy: p.UserId,
  920. },
  921. DeptBy: model2.DeptBy{
  922. DeptId: p.DeptId,
  923. },
  924. }
  925. err = tx.Create(&task).Error
  926. if err != nil {
  927. e.Log.Errorf("db error: %s", err)
  928. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  929. }
  930. }
  931. return nil
  932. }
  933. func (e *Waybill) CarOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  934. var err error
  935. tx := e.Orm.Begin()
  936. defer func() {
  937. if err != nil {
  938. tx.Rollback()
  939. } else {
  940. tx.Commit()
  941. }
  942. }()
  943. // 查询仓库信息
  944. var car = model.Car{}
  945. // 查询运单是否存在
  946. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  947. Where("user_id = ?", p.UserId).
  948. First(&car).Error
  949. if err != nil {
  950. e.Log.Errorf("db error: %s", err)
  951. return errors.New("获取车辆绑定信息失败")
  952. }
  953. for _, waybillNo := range c.WaybillNoList {
  954. var waybillModel = model.Waybill{}
  955. // 查询运单是否存在
  956. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  957. Where("waybill_no = ?", waybillNo).
  958. First(&waybillModel).Error
  959. if err != nil {
  960. e.Log.Errorf("db error: %s", err)
  961. if errors.Is(err, gorm.ErrRecordNotFound) {
  962. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  963. }
  964. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  965. }
  966. if waybillModel.CarId != car.Id {
  967. return errors.New("请选择正确车辆下车!")
  968. }
  969. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruckOut {
  970. continue
  971. }
  972. if waybillModel.Status != model.WaybillStatusTruck {
  973. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法下车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  974. return err
  975. }
  976. waybillModel.Status = model.WaybillStatusTruckOut
  977. waybillModel.CarId = car.Id
  978. err = tx.Save(&waybillModel).Error
  979. if err != nil {
  980. e.Log.Errorf("db error: %s", err)
  981. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  982. }
  983. var lng, lat string
  984. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  985. if err != nil {
  986. e.Log.Errorf("获取定位信息失败: %s", err)
  987. return err
  988. }
  989. // 添加物流
  990. Logistics := model.WaybillLogistics{
  991. WaybillNo: waybillNo,
  992. Status: model.WaybillStatusTruckOut,
  993. CarId: car.Id,
  994. UserId: p.UserId,
  995. Lng: lng,
  996. Lat: lat,
  997. ControlBy: model2.ControlBy{
  998. CreateBy: p.UserId,
  999. },
  1000. DeptBy: model2.DeptBy{
  1001. DeptId: p.DeptId,
  1002. },
  1003. ModelTime: model2.ModelTime{
  1004. CreatedAt: c.StartTime,
  1005. },
  1006. }
  1007. err = tx.Create(&Logistics).Error
  1008. if err != nil {
  1009. e.Log.Errorf("db error: %s", err)
  1010. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1011. }
  1012. // 查询任务
  1013. var task model.WaybillTask
  1014. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, car.Id).
  1015. First(&task).Error
  1016. if err != nil {
  1017. e.Log.Errorf("db error: %s", err)
  1018. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1019. }
  1020. task.EndTime = c.StartTime
  1021. task.UpdateBy = p.UserId
  1022. err = tx.Save(&task).Error
  1023. if err != nil {
  1024. e.Log.Errorf("db error: %s", err)
  1025. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1026. }
  1027. }
  1028. return nil
  1029. }
  1030. func (e *Waybill) CoolerBoxIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  1031. var err error
  1032. tx := e.Orm.Begin()
  1033. defer func() {
  1034. if err != nil {
  1035. tx.Rollback()
  1036. } else {
  1037. tx.Commit()
  1038. }
  1039. }()
  1040. for _, waybillNo := range c.WaybillNoList {
  1041. var waybillModel = model.Waybill{}
  1042. // 查询运单是否存在
  1043. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1044. Where("waybill_no = ?", waybillNo).
  1045. First(&waybillModel).Error
  1046. if err != nil {
  1047. e.Log.Errorf("db error: %s", err)
  1048. if errors.Is(err, gorm.ErrRecordNotFound) {
  1049. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  1050. }
  1051. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  1052. }
  1053. if waybillModel.Status != model.WaybillStatusWaitVanning {
  1054. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装箱!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  1055. return err
  1056. }
  1057. // 查询保温箱信息
  1058. var coolerBox = model.CoolerBox{}
  1059. // 查询运单是否存在
  1060. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  1061. Where("user_id = ?", p.UserId).
  1062. First(&coolerBox).Error
  1063. if err != nil {
  1064. e.Log.Errorf("db error: %s", err)
  1065. return errors.New("获取车辆绑定信息失败")
  1066. }
  1067. // 验证时间
  1068. var logistics model.WaybillLogistics
  1069. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  1070. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  1071. e.Log.Errorf("获取运单日志失败: %s", err)
  1072. return err
  1073. }
  1074. var lng, lat string
  1075. lng, lat, err = e.GetSite(p.DeptId, coolerBox.Sn, c.StartTime.String())
  1076. if err != nil {
  1077. e.Log.Errorf("获取定位信息失败: %s", err)
  1078. return err
  1079. }
  1080. waybillModel.Status = model.WaybillStatusVanning
  1081. waybillModel.CoolerBoxId = coolerBox.Id
  1082. waybillModel.DeliveryTime = c.StartTime
  1083. err = tx.Save(&waybillModel).Error
  1084. if err != nil {
  1085. e.Log.Errorf("db error: %s", err)
  1086. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1087. }
  1088. // 添加物流
  1089. Logistics := model.WaybillLogistics{
  1090. WaybillNo: waybillNo,
  1091. Status: model.WaybillStatusTruck,
  1092. CoolerBoxId: coolerBox.Id,
  1093. UserId: p.UserId,
  1094. Lng: lng,
  1095. Lat: lat,
  1096. ControlBy: model2.ControlBy{
  1097. CreateBy: p.UserId,
  1098. },
  1099. DeptBy: model2.DeptBy{
  1100. DeptId: p.DeptId,
  1101. },
  1102. ModelTime: model2.ModelTime{
  1103. CreatedAt: c.StartTime,
  1104. },
  1105. }
  1106. err = tx.Create(&Logistics).Error
  1107. if err != nil {
  1108. e.Log.Errorf("db error: %s", err)
  1109. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1110. }
  1111. // 添加任务
  1112. task := model.WaybillTask{
  1113. WaybillNo: waybillNo,
  1114. CoolerBoxId: coolerBox.Id,
  1115. UserId: p.UserId,
  1116. Sn: coolerBox.Sn,
  1117. StartTime: c.StartTime,
  1118. ControlBy: model2.ControlBy{
  1119. CreateBy: p.UserId,
  1120. },
  1121. DeptBy: model2.DeptBy{
  1122. DeptId: p.DeptId,
  1123. },
  1124. }
  1125. err = tx.Create(&task).Error
  1126. if err != nil {
  1127. e.Log.Errorf("db error: %s", err)
  1128. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1129. }
  1130. }
  1131. return nil
  1132. }
  1133. func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) error {
  1134. var err error
  1135. tx := e.Orm.Begin()
  1136. defer func() {
  1137. if err != nil {
  1138. tx.Rollback()
  1139. } else {
  1140. tx.Commit()
  1141. }
  1142. }()
  1143. var waybillModel = model.Waybill{}
  1144. // 查询运单是否存在
  1145. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1146. Where("waybill_no = ?", c.WaybillNo).
  1147. First(&waybillModel).Error
  1148. if err != nil {
  1149. e.Log.Errorf("db error: %s", err)
  1150. if errors.Is(err, gorm.ErrRecordNotFound) {
  1151. return errors.New(fmt.Sprintf("运单号%s不存在", c.WaybillNo))
  1152. }
  1153. return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
  1154. }
  1155. if waybillModel.Status == model.WaybillStatusReceipt {
  1156. return nil
  1157. }
  1158. // 保温箱配送 不需要中转
  1159. if waybillModel.CoolerBoxId > 0 {
  1160. // 查询车辆信息
  1161. var coolerBox = model.CoolerBox{}
  1162. // 查询运单是否存在
  1163. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  1164. Where("id = ?", waybillModel.CoolerBoxId).
  1165. First(&coolerBox).Error
  1166. if err != nil {
  1167. e.Log.Errorf("db error: %s", err)
  1168. return errors.New("获取保温箱信息失败")
  1169. }
  1170. waybillModel.Status = model.WaybillStatusReceipt
  1171. waybillModel.CoolerBoxId = coolerBox.Id
  1172. waybillModel.ReceiptTime = c.StartTime
  1173. waybillModel.ReceiptImg = c.ReceiptImg
  1174. err = tx.Save(&waybillModel).Error
  1175. if err != nil {
  1176. e.Log.Errorf("db error: %s", err)
  1177. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1178. }
  1179. var lng, lat string
  1180. lng, lat, err = e.GetSite(p.DeptId, coolerBox.Sn, c.StartTime.String())
  1181. if err != nil {
  1182. e.Log.Errorf("获取定位信息失败: %s", err)
  1183. return err
  1184. }
  1185. // 查询任务
  1186. var task model.WaybillTask
  1187. err = tx.Model(&task).Where("waybill_no = ? and cooler_box_id = ?", c.WaybillNo, coolerBox.Id).
  1188. Last(&task).Error
  1189. if err != nil {
  1190. e.Log.Errorf("db error: %s", err)
  1191. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1192. }
  1193. // 未出箱 直接点签收
  1194. if time.Time(task.EndTime).IsZero() {
  1195. task.EndTime = model2.Time(time.Now())
  1196. task.UpdateBy = p.UserId
  1197. err = tx.Save(&task).Error
  1198. if err != nil {
  1199. e.Log.Errorf("db error: %s", err)
  1200. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1201. }
  1202. // 添加下车物流记录
  1203. Logistics := model.WaybillLogistics{
  1204. WaybillNo: c.WaybillNo,
  1205. Status: model.WaybillStatusVanningOut,
  1206. CoolerBoxId: coolerBox.Id,
  1207. UserId: p.UserId,
  1208. Lng: lng,
  1209. Lat: lat,
  1210. ControlBy: model2.ControlBy{
  1211. CreateBy: p.UserId,
  1212. },
  1213. DeptBy: model2.DeptBy{
  1214. DeptId: p.DeptId,
  1215. },
  1216. ModelTime: model2.ModelTime{
  1217. CreatedAt: c.StartTime,
  1218. },
  1219. }
  1220. err = tx.Create(&Logistics).Error
  1221. if err != nil {
  1222. e.Log.Errorf("db error: %s", err)
  1223. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1224. }
  1225. }
  1226. // 添加签收记录
  1227. Logistics := model.WaybillLogistics{
  1228. WaybillNo: c.WaybillNo,
  1229. Status: model.WaybillStatusReceipt,
  1230. CoolerBoxId: coolerBox.Id,
  1231. UserId: p.UserId,
  1232. Lng: lng,
  1233. Lat: lat,
  1234. ControlBy: model2.ControlBy{
  1235. CreateBy: p.UserId,
  1236. },
  1237. DeptBy: model2.DeptBy{
  1238. DeptId: p.DeptId,
  1239. },
  1240. ModelTime: model2.ModelTime{
  1241. CreatedAt: c.StartTime,
  1242. },
  1243. }
  1244. err = tx.Create(&Logistics).Error
  1245. if err != nil {
  1246. e.Log.Errorf("db error: %s", err)
  1247. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1248. }
  1249. return nil
  1250. }
  1251. // 查询车辆信息
  1252. var car = model.Car{}
  1253. // 查询运单是否存在
  1254. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  1255. Where("user_id = ?", p.UserId).
  1256. First(&car).Error
  1257. if err != nil {
  1258. e.Log.Errorf("db error: %s", err)
  1259. return errors.New("获取车辆信息失败")
  1260. }
  1261. waybillModel.Status = model.WaybillStatusReceipt
  1262. waybillModel.CarId = car.Id
  1263. waybillModel.ReceiptTime = c.StartTime
  1264. waybillModel.ReceiptImg = c.ReceiptImg
  1265. err = tx.Save(&waybillModel).Error
  1266. if err != nil {
  1267. e.Log.Errorf("db error: %s", err)
  1268. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1269. }
  1270. var lng, lat string
  1271. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  1272. if err != nil {
  1273. e.Log.Errorf("获取定位信息失败: %s", err)
  1274. return err
  1275. }
  1276. // 查询任务
  1277. var task model.WaybillTask
  1278. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", c.WaybillNo, car.Id).
  1279. Last(&task).Error
  1280. if err != nil {
  1281. e.Log.Errorf("db error: %s", err)
  1282. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1283. }
  1284. // 未下车 直接点签收
  1285. if time.Time(task.EndTime).IsZero() {
  1286. task.EndTime = model2.Time(time.Now())
  1287. task.UpdateBy = p.UserId
  1288. err = tx.Save(&task).Error
  1289. if err != nil {
  1290. e.Log.Errorf("db error: %s", err)
  1291. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1292. }
  1293. // 添加下车物流记录
  1294. Logistics := model.WaybillLogistics{
  1295. WaybillNo: c.WaybillNo,
  1296. Status: model.WaybillStatusTruckOut,
  1297. CarId: car.Id,
  1298. UserId: p.UserId,
  1299. Lng: lng,
  1300. Lat: lat,
  1301. ControlBy: model2.ControlBy{
  1302. CreateBy: p.UserId,
  1303. },
  1304. DeptBy: model2.DeptBy{
  1305. DeptId: p.DeptId,
  1306. },
  1307. ModelTime: model2.ModelTime{
  1308. CreatedAt: c.StartTime,
  1309. },
  1310. }
  1311. err = tx.Create(&Logistics).Error
  1312. if err != nil {
  1313. e.Log.Errorf("db error: %s", err)
  1314. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1315. }
  1316. }
  1317. // 添加签收记录
  1318. Logistics := model.WaybillLogistics{
  1319. WaybillNo: c.WaybillNo,
  1320. Status: model.WaybillStatusReceipt,
  1321. CarId: car.Id,
  1322. UserId: p.UserId,
  1323. Lng: lng,
  1324. Lat: lat,
  1325. ControlBy: model2.ControlBy{
  1326. CreateBy: p.UserId,
  1327. },
  1328. DeptBy: model2.DeptBy{
  1329. DeptId: p.DeptId,
  1330. },
  1331. ModelTime: model2.ModelTime{
  1332. CreatedAt: c.StartTime,
  1333. },
  1334. }
  1335. err = tx.Create(&Logistics).Error
  1336. if err != nil {
  1337. e.Log.Errorf("db error: %s", err)
  1338. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1339. }
  1340. return nil
  1341. }
  1342. // 获取入库 出库 上车 下车 定位信息
  1343. func (e *Waybill) GetSite(companyId int, sn string, time string) (lng, lat string, err error) {
  1344. // 获取公司秘钥
  1345. var company model.SysDept
  1346. company, err = model.GetCompanyById(companyId)
  1347. if err != nil {
  1348. e.Log.Errorf("db error: %s", err)
  1349. return lng, lat, model.GetCompanyKeyErr
  1350. }
  1351. // 获取传感器信息
  1352. var deviceSensorList = []nats_server.DeviceSensor_R{}
  1353. var count int64
  1354. deviceSensorList, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(sn, company.ColdKey)
  1355. if err != nil || count == 0 {
  1356. err = errors.New("查询设备定位信息失败")
  1357. return lng, lat, err
  1358. }
  1359. var deviceData nats_server.DeviceData_
  1360. deviceData, err = nats_server.Cold_ReadDeviceDataBy_T_snid_T_time(deviceSensorList[0].T_sn, deviceSensorList[0].T_id, time)
  1361. if err != nil {
  1362. err = errors.New("查询设备定位信息失败")
  1363. return lng, lat, err
  1364. }
  1365. if len(deviceData.T_site) > 0 {
  1366. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  1367. if len(site) == 2 {
  1368. lng = site[0]
  1369. lat = site[1]
  1370. }
  1371. }
  1372. return lng, lat, nil
  1373. }
  1374. // 获取今日运单数 未派单 未装车 未入库 运送中
  1375. // 本月运单总数 上月运单总数 本年运单总数 上年运单总数
  1376. func (e *Waybill) GetBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission) dto.WaybillStatsRes {
  1377. var res dto.WaybillStatsRes
  1378. var data model.Waybill
  1379. type DateCount struct {
  1380. Date string
  1381. Count int64
  1382. }
  1383. yearCount := make([]DateCount, 0)
  1384. monthCount := make([]DateCount, 0)
  1385. now := time.Now()
  1386. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  1387. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  1388. // 获取上个月第一天
  1389. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  1390. // 获取去年的第一天
  1391. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  1392. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  1393. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  1394. // 今日总运单数
  1395. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  1396. // 待派单
  1397. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  1398. // 未装车
  1399. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitTruck).Count(&res.WaitTruckNum)
  1400. // 未入库
  1401. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitStorage).Count(&res.WaitStorageNum)
  1402. // 配送中
  1403. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status in (?)", []int{model.WaybillStatusTruck, model.WaybillStatusStorage, model.WaybillStatusTruckOut, model.WaybillStatusStorageOut}).Count(&res.InDeliveryNum)
  1404. // 获取本月,上月数据
  1405. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  1406. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  1407. for _, month := range monthCount {
  1408. if month.Date == now.Format("200601") {
  1409. res.ThisMonthNum = month.Count
  1410. }
  1411. if month.Date == firstDayOfLastMonth.Format("200601") {
  1412. res.LastMonthNum = month.Count
  1413. }
  1414. }
  1415. // 获取本年,上年数据
  1416. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  1417. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  1418. for _, month := range yearCount {
  1419. if month.Date == now.Format("2006") {
  1420. res.ThisYearNum = month.Count
  1421. }
  1422. if month.Date == firstDayOfLastYear.Format("2006") {
  1423. res.LastYearNum = month.Count
  1424. }
  1425. }
  1426. if c.Type == "year" {
  1427. // 获取上个月第一天
  1428. year, _ := strconv.Atoi(c.Date)
  1429. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1430. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1431. // 年度数据统计
  1432. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1433. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1434. }
  1435. if c.Type == "month" {
  1436. // 获取上个月第一天
  1437. month, _ := time.Parse("2006-01", c.Date)
  1438. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1439. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1440. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1441. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1442. }
  1443. return res
  1444. }
  1445. // 获取运单所有温湿度素具
  1446. func (e *Waybill) GetAllData(c *dto.WaybillGetByWaybillNoReq) ([]nats_server.DeviceData_R, []WaybillPDF, error) {
  1447. var err error
  1448. var data model.WaybillTask
  1449. var waybill model.Waybill
  1450. var taskList []model.WaybillTask
  1451. var waybillPDF []WaybillPDF
  1452. dataList := make([]nats_server.DeviceData_R, 0)
  1453. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  1454. if err != nil {
  1455. e.Log.Errorf("db error: %s", err)
  1456. return dataList, waybillPDF, errors.New("获取运单信息失败")
  1457. }
  1458. // 未签收,不返回数据
  1459. if waybill.Status != model.WaybillStatusReceipt {
  1460. return dataList, waybillPDF, nil
  1461. }
  1462. // 获取公司秘钥
  1463. var company model.SysDept
  1464. company, err = model.GetCompanyById(waybill.DeptId)
  1465. if err != nil {
  1466. e.Log.Errorf("db error: %s", err)
  1467. return dataList, waybillPDF, model.GetCompanyKeyErr
  1468. }
  1469. err = e.Orm.Model(&data).
  1470. Where("waybill_no = ?", c.WaybillNo).
  1471. Order("id desc").
  1472. Find(&taskList).Error
  1473. if err != nil {
  1474. e.Log.Errorf("db error: %s", err)
  1475. return dataList, waybillPDF, global.GetFailedErr
  1476. }
  1477. // 获取最后一个任务id
  1478. var lastWaybillTask model.WaybillTask
  1479. err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", c.WaybillNo).Last(&lastWaybillTask).Error
  1480. if err != nil {
  1481. e.Log.Errorf("db error: %s", err)
  1482. err = errors.New("获取运单信息错误!")
  1483. return dataList, waybillPDF, err
  1484. }
  1485. // 创建名称到权重的映射
  1486. orderMap := make(map[string]int)
  1487. for i, v := range taskList {
  1488. orderMap[v.Sn] = i
  1489. }
  1490. for i := 0; i < len(taskList); i++ {
  1491. // 获取传感器信息
  1492. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  1493. var T_snid string
  1494. var list []nats_server.DeviceData_R
  1495. for _, r := range deviceSensorList {
  1496. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  1497. }
  1498. var count int64
  1499. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  1500. if err != nil {
  1501. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  1502. return dataList, waybillPDF, global.GetFailedErr
  1503. }
  1504. firstMap := map[int]nats_server.DeviceData_R{}
  1505. lastMap := map[int]nats_server.DeviceData_R{}
  1506. if count > 0 {
  1507. for _, v := range deviceSensorList {
  1508. for j := 0; j < len(list); j++ {
  1509. if v.T_id == list[j].T_id {
  1510. if list[j].T_time != taskList[i].StartTime.String() {
  1511. firstData := list[j]
  1512. firstData.T_time = taskList[i].StartTime.String()
  1513. firstMap[v.T_id] = firstData
  1514. count += 1
  1515. }
  1516. break
  1517. }
  1518. }
  1519. if waybill.Status == model.WaybillStatusReceipt {
  1520. for k := len(list) - 1; k >= 0; k-- {
  1521. if v.T_id == list[k].T_id {
  1522. if taskList[i].Id == lastWaybillTask.Id && list[k].T_time != taskList[i].EndTime.String() && !time.Time(taskList[i].EndTime).IsZero() {
  1523. lastData := list[k]
  1524. lastData.T_time = taskList[i].EndTime.String()
  1525. lastMap[v.T_id] = lastData
  1526. count += 1
  1527. }
  1528. break
  1529. }
  1530. }
  1531. }
  1532. }
  1533. }
  1534. for _, v := range firstMap {
  1535. list = append(list, v)
  1536. }
  1537. for _, v := range lastMap {
  1538. list = append(list, v)
  1539. }
  1540. sort.Slice(list, func(x, y int) bool {
  1541. if list[x].T_time == list[y].T_time {
  1542. // 如果时间相同,则按预设顺序排序
  1543. return orderMap[list[x].T_sn] < orderMap[list[y].T_sn]
  1544. }
  1545. return list[x].T_time > list[y].T_time
  1546. })
  1547. dataList = append(dataList, list...)
  1548. waybillPDF = append(waybillPDF, WaybillPDF{
  1549. Data: list,
  1550. DeviceSensorList: deviceSensorList,
  1551. Task: taskList[i],
  1552. })
  1553. }
  1554. sort.Slice(dataList, func(i, j int) bool {
  1555. if dataList[i].T_time == dataList[j].T_time {
  1556. // 如果时间相同,则按预设顺序排序
  1557. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  1558. }
  1559. return dataList[i].T_time < dataList[j].T_time
  1560. })
  1561. return dataList, waybillPDF, nil
  1562. }
  1563. // 获取前两个探头数据
  1564. func (e *Waybill) GetTwoDeviceSensorData(c *dto.WaybillGetByWaybillNoReq) ([]nats_server.DeviceData_R, []DeviceDataPdf, []WaybillPDF, error) {
  1565. var err error
  1566. var data model.WaybillTask
  1567. var waybill model.Waybill
  1568. var taskList []model.WaybillTask
  1569. var deviceDataPdf []DeviceDataPdf
  1570. var waybillPDF []WaybillPDF
  1571. dataList := make([]nats_server.DeviceData_R, 0)
  1572. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  1573. if err != nil {
  1574. e.Log.Errorf("db error: %s", err)
  1575. return dataList, deviceDataPdf, waybillPDF, errors.New("获取运单信息失败")
  1576. }
  1577. // 未签收,不返回数据
  1578. if waybill.Status != model.WaybillStatusReceipt {
  1579. return dataList, deviceDataPdf, waybillPDF, nil
  1580. }
  1581. // 获取公司秘钥
  1582. var company model.SysDept
  1583. company, err = model.GetCompanyById(waybill.DeptId)
  1584. if err != nil {
  1585. e.Log.Errorf("db error: %s", err)
  1586. return dataList, deviceDataPdf, waybillPDF, model.GetCompanyKeyErr
  1587. }
  1588. err = e.Orm.Model(&data).
  1589. Where("waybill_no = ?", c.WaybillNo).
  1590. Order("id desc").
  1591. Find(&taskList).Error
  1592. if err != nil {
  1593. e.Log.Errorf("db error: %s", err)
  1594. return dataList, deviceDataPdf, waybillPDF, global.GetFailedErr
  1595. }
  1596. // 获取最后一个任务id
  1597. var lastWaybillTask model.WaybillTask
  1598. err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", c.WaybillNo).Last(&lastWaybillTask).Error
  1599. if err != nil {
  1600. e.Log.Errorf("db error: %s", err)
  1601. err = errors.New("获取运单信息错误!")
  1602. return dataList, deviceDataPdf, waybillPDF, err
  1603. }
  1604. // 创建名称到权重的映射
  1605. orderMap := make(map[string]int)
  1606. for i, v := range taskList {
  1607. orderMap[v.Sn] = i
  1608. }
  1609. for i := 0; i < len(taskList); i++ {
  1610. // 获取传感器信息
  1611. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  1612. var T_snid string
  1613. var list []nats_server.DeviceData_R
  1614. t_id_list := [2]int{-1, -2}
  1615. for j, r := range deviceSensorList {
  1616. if j >= 2 {
  1617. break
  1618. }
  1619. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  1620. t_id_list[j] = r.T_id
  1621. }
  1622. var count int64
  1623. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  1624. if err != nil {
  1625. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  1626. return dataList, deviceDataPdf, waybillPDF, global.GetFailedErr
  1627. }
  1628. firstMap := map[int]nats_server.DeviceData_R{}
  1629. lastMap := map[int]nats_server.DeviceData_R{}
  1630. if count > 0 {
  1631. for _, v := range deviceSensorList {
  1632. for j := 0; j < len(list); j++ {
  1633. if v.T_id == list[j].T_id {
  1634. if list[j].T_time != taskList[i].StartTime.String() {
  1635. if i < len(taskList)-2 && list[j].T_time != taskList[i+1].EndTime.String() {
  1636. firstData := list[j]
  1637. firstData.T_time = taskList[i].StartTime.String()
  1638. firstMap[v.T_id] = firstData
  1639. count += 1
  1640. }
  1641. }
  1642. break
  1643. }
  1644. }
  1645. if waybill.Status == model.WaybillStatusReceipt {
  1646. for k := len(list) - 1; k >= 0; k-- {
  1647. if v.T_id == list[k].T_id {
  1648. if taskList[i].Id == lastWaybillTask.Id && list[k].T_time != taskList[i].EndTime.String() && !time.Time(taskList[i].EndTime).IsZero() {
  1649. lastData := list[k]
  1650. lastData.T_time = taskList[i].EndTime.String()
  1651. lastMap[v.T_id] = lastData
  1652. count += 1
  1653. }
  1654. break
  1655. }
  1656. }
  1657. }
  1658. }
  1659. }
  1660. for _, v := range firstMap {
  1661. list = append(list, v)
  1662. }
  1663. for _, v := range lastMap {
  1664. list = append(list, v)
  1665. }
  1666. deviceDataPdfList := DeviceSensorDataListToDeviceDataPdfList(list, t_id_list[0], t_id_list[1])
  1667. deviceDataPdf = append(deviceDataPdf, deviceDataPdfList...)
  1668. dataList = append(dataList, list...)
  1669. waybillPDF = append(waybillPDF, WaybillPDF{
  1670. Data: list,
  1671. DeviceSensorList: deviceSensorList,
  1672. Task: taskList[i],
  1673. DeviceDataPdf: deviceDataPdfList,
  1674. })
  1675. }
  1676. sort.Slice(dataList, func(i, j int) bool {
  1677. if dataList[i].T_time == dataList[j].T_time {
  1678. // 如果时间相同,则按预设顺序排序
  1679. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  1680. }
  1681. return dataList[i].T_time < dataList[j].T_time
  1682. })
  1683. sort.Slice(deviceDataPdf, func(i, j int) bool {
  1684. return deviceDataPdf[i].T_time < deviceDataPdf[j].T_time
  1685. })
  1686. return dataList, deviceDataPdf, waybillPDF, nil
  1687. }
  1688. type WaybillPDF struct {
  1689. Data []nats_server.DeviceData_R
  1690. DeviceSensorList []nats_server.DeviceSensor_R
  1691. Task model.WaybillTask
  1692. DeviceDataPdf []DeviceDataPdf
  1693. }
  1694. type DeviceDataPdf struct {
  1695. T_time string // sn
  1696. T_id1 float32 // 传感器id1温度
  1697. T_id2 float32 // 传感器id2温度
  1698. }
  1699. func DeviceSensorDataListToDeviceDataPdfList(list []nats_server.DeviceData_R, T_id1 int, T_id2 int) []DeviceDataPdf {
  1700. // 创建一个 map 用于存储 DeviceData_Pdf 结果
  1701. resultMap := make(map[string]DeviceDataPdf)
  1702. // 遍历第一个列表,将数据存入 resultMap
  1703. for _, item := range list {
  1704. key := item.T_time
  1705. if _, ok := resultMap[key]; !ok {
  1706. resultMap[key] = DeviceDataPdf{T_time: item.T_time}
  1707. }
  1708. data := resultMap[key]
  1709. if item.T_id == T_id1 {
  1710. data.T_id1 = item.T_t
  1711. } else if item.T_id == T_id2 {
  1712. data.T_id2 = item.T_t
  1713. }
  1714. resultMap[key] = data
  1715. }
  1716. // 将 resultMap 转换为 DeviceData_Pdf 列表
  1717. var finalList []DeviceDataPdf
  1718. for _, v := range resultMap {
  1719. finalList = append(finalList, v)
  1720. }
  1721. return finalList
  1722. }