waybill.go 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388
  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.WaybillGetByWaybillNoReq, 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. First(waybillModel).Error
  176. if err != nil {
  177. e.Log.Errorf("db error: %s", err)
  178. if errors.Is(err, gorm.ErrRecordNotFound) {
  179. return global.GetNotFoundOrNoPermissionErr
  180. }
  181. return global.GetFailedErr
  182. }
  183. return nil
  184. }
  185. // Insert 创建Waybill对象
  186. func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
  187. var err error
  188. var data model.Waybill
  189. tx := e.Orm.Begin()
  190. defer func() {
  191. if err != nil {
  192. tx.Rollback()
  193. } else {
  194. tx.Commit()
  195. }
  196. }()
  197. var no string
  198. for {
  199. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  200. var j int64
  201. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  202. if err != nil {
  203. continue
  204. }
  205. if j == 0 {
  206. break
  207. }
  208. }
  209. // 添加运单
  210. data.WaybillNo = no
  211. c.Generate(&data)
  212. err = tx.Create(&data).Error
  213. if err != nil {
  214. e.Log.Errorf("db error: %s", err)
  215. return global.CreateFailedErr
  216. }
  217. c.Id = data.Id
  218. return nil
  219. }
  220. // AppletInsert 员工添加运单
  221. func (e *Waybill) AppletInsert(c *dto.WaybillInsertReq, p *actions.DataPermission) error {
  222. var err error
  223. var data model.Waybill
  224. tx := e.Orm.Begin()
  225. defer func() {
  226. if err != nil {
  227. tx.Rollback()
  228. } else {
  229. tx.Commit()
  230. }
  231. }()
  232. var userModel = model.SysUser{}
  233. // 查询运单是否存在
  234. err = tx.Scopes(actions.Permission(userModel.TableName(), p)).
  235. First(&userModel, p.UserId).Error
  236. if err != nil {
  237. e.Log.Errorf("db error: %s", err)
  238. if errors.Is(err, gorm.ErrRecordNotFound) {
  239. return global.GetNotFoundErr
  240. }
  241. return global.CreateFailedErr
  242. }
  243. if userModel.Type != model.SysUserTypeDriver && userModel.Type != model.SysUserTypeWarehouse {
  244. err = errors.New("无权添加!")
  245. return err
  246. }
  247. var status = model.WaybillStatusWaitDelivery
  248. var car = model.Car{}
  249. if userModel.Type == model.SysUserTypeDriver {
  250. status = model.WaybillStatusWaitTruck
  251. // 查询车辆库信息
  252. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  253. Where("user_id = ?", p.UserId).
  254. First(&car).Error
  255. if err != nil {
  256. e.Log.Errorf("db error: %s", err)
  257. return errors.New("获取车辆信息失败")
  258. }
  259. }
  260. var warehouse = model.Warehouse{}
  261. if userModel.Type == model.SysUserTypeWarehouse {
  262. status = model.WaybillStatusWaitStorage
  263. // 查询仓库信息
  264. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  265. Where("user_id = ?", p.UserId).
  266. First(&warehouse).Error
  267. if err != nil {
  268. e.Log.Errorf("db error: %s", err)
  269. return errors.New("获取仓库信息失败")
  270. }
  271. }
  272. data.PrintUserId = p.UserId
  273. var no string
  274. for {
  275. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  276. var j int64
  277. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  278. if err != nil {
  279. continue
  280. }
  281. if j == 0 {
  282. break
  283. }
  284. }
  285. // 添加运单
  286. data.DeptId = p.DeptId
  287. data.CreateBy = p.UserId
  288. data.WaybillNo = no
  289. c.Generate(&data)
  290. data.Status = status
  291. err = tx.Create(&data).Error
  292. if err != nil {
  293. e.Log.Errorf("db error: %s", err)
  294. return global.CreateFailedErr
  295. }
  296. c.Id = data.Id
  297. // 添加物流
  298. Logistics := model.WaybillLogistics{
  299. WaybillNo: data.WaybillNo,
  300. Status: data.Status,
  301. CarId: car.Id,
  302. WarehouseId: warehouse.Id,
  303. UserId: p.UserId,
  304. ControlBy: model2.ControlBy{
  305. CreateBy: p.UserId,
  306. },
  307. DeptBy: model2.DeptBy{
  308. DeptId: p.DeptId,
  309. },
  310. }
  311. err = tx.Create(&Logistics).Error
  312. if err != nil {
  313. e.Log.Errorf("db error: %s", err)
  314. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  315. }
  316. return nil
  317. }
  318. // Update 修改Waybill对象
  319. func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) error {
  320. var err error
  321. tx := e.Orm.Begin()
  322. defer func() {
  323. if err != nil {
  324. tx.Rollback()
  325. } else {
  326. tx.Commit()
  327. }
  328. }()
  329. var waybillModel = model.Waybill{}
  330. // 查询运单是否存在
  331. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  332. First(&waybillModel, c.GetId()).Error
  333. if err != nil {
  334. e.Log.Errorf("db error: %s", err)
  335. if errors.Is(err, gorm.ErrRecordNotFound) {
  336. return global.UpdateNotFoundOrNoPermissionErr
  337. }
  338. return global.UpdateFailedErr
  339. }
  340. c.Generate(&waybillModel)
  341. err = tx.Save(&waybillModel).Error
  342. if err != nil {
  343. e.Log.Errorf("db error: %s", err)
  344. return global.UpdateFailedErr
  345. }
  346. c.Id = waybillModel.Id
  347. return nil
  348. }
  349. func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
  350. var err error
  351. tx := e.Orm.Begin()
  352. defer func() {
  353. if err != nil {
  354. tx.Rollback()
  355. } else {
  356. tx.Commit()
  357. }
  358. }()
  359. for _, id := range c.WaybillIds {
  360. var waybillModel = model.Waybill{}
  361. // 查询运单是否存在
  362. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  363. First(&waybillModel, id).Error
  364. if err != nil {
  365. e.Log.Errorf("db error: %s", err)
  366. if errors.Is(err, gorm.ErrRecordNotFound) {
  367. return global.UpdateNotFoundOrNoPermissionErr
  368. }
  369. return global.UpdateFailedErr
  370. }
  371. if waybillModel.Status != model.WaybillStatusWaitDelivery &&
  372. waybillModel.Status != model.WaybillStatusWaitTruck &&
  373. waybillModel.Status != model.WaybillStatusWaitStorage {
  374. err = errors.New(fmt.Sprintf("运单状态为%s,禁止操作!", model.WaybillStatusMap[waybillModel.Status]))
  375. return err
  376. }
  377. var car = model.Car{}
  378. if c.Type == model.SysUserTypeDriver {
  379. waybillModel.Status = model.WaybillStatusWaitTruck
  380. // 查询车辆库信息
  381. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  382. Where("user_id = ?", c.PrintUserId).
  383. First(&car).Error
  384. if err != nil {
  385. e.Log.Errorf("db error: %s", err)
  386. return errors.New("获取车辆信息失败")
  387. }
  388. }
  389. var warehouse = model.Warehouse{}
  390. if c.Type == model.SysUserTypeWarehouse {
  391. waybillModel.Status = model.WaybillStatusWaitStorage
  392. // 查询仓库信息
  393. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  394. Where("user_id = ?", c.PrintUserId).
  395. First(&warehouse).Error
  396. if err != nil {
  397. e.Log.Errorf("db error: %s", err)
  398. return errors.New("获取仓库信息失败")
  399. }
  400. }
  401. waybillModel.PrintUserId = c.PrintUserId
  402. err = tx.Save(&waybillModel).Error
  403. if err != nil {
  404. e.Log.Errorf("db error: %s", err)
  405. return global.UpdateFailedErr
  406. }
  407. // 添加物流
  408. Logistics := model.WaybillLogistics{
  409. WaybillNo: waybillModel.WaybillNo,
  410. Status: waybillModel.Status,
  411. CarId: car.Id,
  412. WarehouseId: warehouse.Id,
  413. UserId: c.PrintUserId,
  414. ControlBy: model2.ControlBy{
  415. CreateBy: p.UserId,
  416. },
  417. DeptBy: model2.DeptBy{
  418. DeptId: p.DeptId,
  419. },
  420. }
  421. err = tx.Create(&Logistics).Error
  422. if err != nil {
  423. e.Log.Errorf("db error: %s", err)
  424. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  425. }
  426. }
  427. return nil
  428. }
  429. // Remove 删除Waybill
  430. func (e *Waybill) Remove(c *dto.WaybillDeleteReq, p *actions.DataPermission) error {
  431. var err error
  432. tx := e.Orm.Begin()
  433. defer func() {
  434. if err != nil {
  435. tx.Rollback()
  436. } else {
  437. tx.Commit()
  438. }
  439. }()
  440. var waybillModel model.Waybill
  441. // 查询运单是否存在
  442. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  443. First(&waybillModel, c.GetId()).Error
  444. if err != nil {
  445. e.Log.Errorf("db error: %s", err)
  446. if errors.Is(err, gorm.ErrRecordNotFound) {
  447. return global.DeleteNotFoundOrNoPermissionErr
  448. }
  449. return global.DeleteFailedErr
  450. }
  451. if waybillModel.Status != model.WaybillStatusWaitDelivery && waybillModel.Status != model.WaybillStatusWaitTruck && waybillModel.Status != model.WaybillStatusWaitStorage {
  452. return errors.New(fmt.Sprintf("运单状态为%s,禁止删除", model.WaybillStatusMap[waybillModel.Status]))
  453. }
  454. db := tx.Delete(&waybillModel)
  455. if err = db.Error; err != nil {
  456. e.Log.Errorf("db error: %s", err)
  457. return global.DeleteFailedErr
  458. }
  459. if db.RowsAffected == 0 {
  460. return global.DeleteNotFoundOrNoPermissionErr
  461. }
  462. return nil
  463. }
  464. func (e *Waybill) WarehouseIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  465. var err error
  466. tx := e.Orm.Begin()
  467. defer func() {
  468. if err != nil {
  469. tx.Rollback()
  470. } else {
  471. tx.Commit()
  472. }
  473. }()
  474. // 查询仓库信息
  475. var warehouse = model.Warehouse{}
  476. // 查询运单是否存在
  477. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  478. Where("user_id = ?", p.UserId).
  479. First(&warehouse).Error
  480. if err != nil {
  481. e.Log.Errorf("db error: %s", err)
  482. return errors.New("获取仓库信息失败")
  483. }
  484. for _, waybillNo := range c.WaybillNoList {
  485. var waybillModel = model.Waybill{}
  486. // 查询运单是否存在
  487. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  488. Where("waybill_no = ?", waybillNo).
  489. First(&waybillModel).Error
  490. if err != nil {
  491. e.Log.Errorf("db error: %s", err)
  492. if errors.Is(err, gorm.ErrRecordNotFound) {
  493. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  494. }
  495. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  496. }
  497. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  498. continue
  499. }
  500. if waybillModel.WarehouseId != warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  501. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  502. return err
  503. }
  504. if waybillModel.Status == model.WaybillStatusWaitTruck {
  505. // 待装车
  506. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  507. return err
  508. }
  509. // 验证时间
  510. var logistics model.WaybillLogistics
  511. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  512. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  513. e.Log.Errorf("获取运单日志失败: %s", err)
  514. return err
  515. }
  516. if time.Time(logistics.CreatedAt).After(time.Time(c.StartTime)) {
  517. err = errors.New(fmt.Sprintf("运单号%s装车时间[%s]与上一阶段时间[%s]冲突,无法入库!", waybillNo, c.StartTime.String(), logistics.CreatedAt.String()))
  518. return err
  519. }
  520. var lng, lat string
  521. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  522. if err != nil {
  523. e.Log.Errorf("获取定位信息失败: %s", err)
  524. return err
  525. }
  526. if waybillModel.Status == model.WaybillStatusTruck {
  527. // 已装车
  528. var car model.Car
  529. err = e.Orm.First(&car, waybillModel.CarId).Error
  530. if err != nil {
  531. e.Log.Errorf("db error: %s", err)
  532. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  533. }
  534. // 添加物流
  535. Logistics := model.WaybillLogistics{
  536. WaybillNo: waybillNo,
  537. Status: model.WaybillStatusTruckOut,
  538. CarId: waybillModel.CarId,
  539. UserId: car.UserId,
  540. Lng: lng,
  541. Lat: lat,
  542. ControlBy: model2.ControlBy{
  543. CreateBy: p.UserId,
  544. },
  545. DeptBy: model2.DeptBy{
  546. DeptId: car.DeptId,
  547. },
  548. ModelTime: model2.ModelTime{
  549. CreatedAt: c.StartTime,
  550. },
  551. }
  552. err = tx.Create(&Logistics).Error
  553. if err != nil {
  554. e.Log.Errorf("db error: %s", err)
  555. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  556. }
  557. // 查询任务
  558. var task model.WaybillTask
  559. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, waybillModel.CarId).
  560. Last(&task).Error
  561. if err != nil {
  562. e.Log.Errorf("db error: %s", err)
  563. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  564. }
  565. task.EndTime = c.StartTime
  566. task.UpdateBy = p.UserId
  567. err = tx.Save(&task).Error
  568. if err != nil {
  569. e.Log.Errorf("db error: %s", err)
  570. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  571. }
  572. }
  573. if waybillModel.Status == model.WaybillStatusWaitStorage {
  574. waybillModel.DeliveryTime = c.StartTime
  575. }
  576. waybillModel.Status = model.WaybillStatusStorage
  577. waybillModel.WarehouseId = warehouse.Id
  578. err = tx.Save(&waybillModel).Error
  579. if err != nil {
  580. e.Log.Errorf("db error: %s", err)
  581. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  582. }
  583. // 添加物流
  584. Logistics := model.WaybillLogistics{
  585. WaybillNo: waybillNo,
  586. Status: model.WaybillStatusStorage,
  587. WarehouseId: warehouse.Id,
  588. UserId: p.UserId,
  589. Lng: lng,
  590. Lat: lat,
  591. ControlBy: model2.ControlBy{
  592. CreateBy: p.UserId,
  593. },
  594. DeptBy: model2.DeptBy{
  595. DeptId: p.DeptId,
  596. },
  597. ModelTime: model2.ModelTime{
  598. CreatedAt: c.StartTime,
  599. },
  600. }
  601. err = tx.Create(&Logistics).Error
  602. if err != nil {
  603. e.Log.Errorf("db error: %s", err)
  604. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  605. }
  606. // 添加任务
  607. task := model.WaybillTask{
  608. WaybillNo: waybillNo,
  609. WarehouseId: warehouse.Id,
  610. UserId: p.UserId,
  611. Sn: warehouse.Sn,
  612. StartTime: c.StartTime,
  613. ControlBy: model2.ControlBy{
  614. CreateBy: p.UserId,
  615. },
  616. DeptBy: model2.DeptBy{
  617. DeptId: p.DeptId,
  618. },
  619. }
  620. err = tx.Create(&task).Error
  621. if err != nil {
  622. e.Log.Errorf("db error: %s", err)
  623. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  624. }
  625. }
  626. return nil
  627. }
  628. func (e *Waybill) WarehouseOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  629. var err error
  630. tx := e.Orm.Begin()
  631. defer func() {
  632. if err != nil {
  633. tx.Rollback()
  634. } else {
  635. tx.Commit()
  636. }
  637. }()
  638. // 查询仓库信息
  639. var warehouse = model.Warehouse{}
  640. // 查询运单是否存在
  641. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  642. Where("user_id = ?", p.UserId).
  643. First(&warehouse).Error
  644. if err != nil {
  645. e.Log.Errorf("db error: %s", err)
  646. return errors.New("获取仓库信息失败")
  647. }
  648. for _, waybillNo := range c.WaybillNoList {
  649. var waybillModel = model.Waybill{}
  650. // 查询运单是否存在
  651. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  652. Where("waybill_no = ?", waybillNo).
  653. First(&waybillModel).Error
  654. if err != nil {
  655. e.Log.Errorf("db error: %s", err)
  656. if errors.Is(err, gorm.ErrRecordNotFound) {
  657. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  658. }
  659. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  660. }
  661. if waybillModel.WarehouseId != warehouse.Id {
  662. return errors.New("请选择正确仓库出库!")
  663. }
  664. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorageOut {
  665. continue
  666. }
  667. if waybillModel.Status != model.WaybillStatusStorage {
  668. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法出库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  669. return err
  670. }
  671. waybillModel.Status = model.WaybillStatusStorageOut
  672. waybillModel.WarehouseId = warehouse.Id
  673. err = tx.Save(&waybillModel).Error
  674. if err != nil {
  675. e.Log.Errorf("db error: %s", err)
  676. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  677. }
  678. var lng, lat string
  679. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  680. if err != nil {
  681. e.Log.Errorf("获取定位信息失败: %s", err)
  682. return err
  683. }
  684. // 添加物流
  685. Logistics := model.WaybillLogistics{
  686. WaybillNo: waybillNo,
  687. Status: model.WaybillStatusStorageOut,
  688. WarehouseId: warehouse.Id,
  689. UserId: p.UserId,
  690. Lng: lng,
  691. Lat: lat,
  692. ControlBy: model2.ControlBy{
  693. CreateBy: p.UserId,
  694. },
  695. DeptBy: model2.DeptBy{
  696. DeptId: p.DeptId,
  697. },
  698. ModelTime: model2.ModelTime{
  699. CreatedAt: c.StartTime,
  700. },
  701. }
  702. err = tx.Create(&Logistics).Error
  703. if err != nil {
  704. e.Log.Errorf("db error: %s", err)
  705. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  706. }
  707. // 查询任务
  708. var task model.WaybillTask
  709. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, warehouse.Id).
  710. First(&task).Error
  711. if err != nil {
  712. e.Log.Errorf("db error: %s", err)
  713. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  714. }
  715. task.EndTime = c.StartTime
  716. task.UpdateBy = p.UserId
  717. err = tx.Save(&task).Error
  718. if err != nil {
  719. e.Log.Errorf("db error: %s", err)
  720. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  721. }
  722. }
  723. return nil
  724. }
  725. func (e *Waybill) CarIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  726. var err error
  727. tx := e.Orm.Begin()
  728. defer func() {
  729. if err != nil {
  730. tx.Rollback()
  731. } else {
  732. tx.Commit()
  733. }
  734. }()
  735. // 查询车辆信息
  736. var car = model.Car{}
  737. // 查询运单是否存在
  738. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  739. Where("user_id = ?", p.UserId).
  740. First(&car).Error
  741. if err != nil {
  742. e.Log.Errorf("db error: %s", err)
  743. return errors.New("获取车辆绑定信息失败")
  744. }
  745. for _, waybillNo := range c.WaybillNoList {
  746. var waybillModel = model.Waybill{}
  747. // 查询运单是否存在
  748. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  749. Where("waybill_no = ?", waybillNo).
  750. First(&waybillModel).Error
  751. if err != nil {
  752. e.Log.Errorf("db error: %s", err)
  753. if errors.Is(err, gorm.ErrRecordNotFound) {
  754. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  755. }
  756. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  757. }
  758. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruck {
  759. continue
  760. }
  761. if waybillModel.CarId != car.Id && waybillModel.Status == model.WaybillStatusTruck {
  762. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  763. return err
  764. }
  765. if waybillModel.Status == model.WaybillStatusWaitStorage {
  766. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  767. return err
  768. }
  769. // 验证时间
  770. var logistics model.WaybillLogistics
  771. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  772. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  773. e.Log.Errorf("获取运单日志失败: %s", err)
  774. return err
  775. }
  776. if time.Time(logistics.CreatedAt).After(time.Time(c.StartTime)) {
  777. err = errors.New(fmt.Sprintf("运单号%s入库时间[%s]与上一阶段时间[%s]冲突,无法入库!", waybillNo, c.StartTime.String(), logistics.CreatedAt.String()))
  778. return err
  779. }
  780. if waybillModel.Status == model.WaybillStatusWaitTruck {
  781. waybillModel.DeliveryTime = c.StartTime
  782. }
  783. var lng, lat string
  784. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  785. if err != nil {
  786. e.Log.Errorf("获取定位信息失败: %s", err)
  787. return err
  788. }
  789. // 如果上一个状态为入库,则自动出库
  790. if waybillModel.Status == model.WaybillStatusStorage {
  791. var warehouse model.Warehouse
  792. err = e.Orm.First(&warehouse, waybillModel.WarehouseId).Error
  793. if err != nil {
  794. e.Log.Errorf("db error: %s", err)
  795. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  796. }
  797. // 添加物流
  798. Logistics := model.WaybillLogistics{
  799. WaybillNo: waybillNo,
  800. Status: model.WaybillStatusStorageOut,
  801. WarehouseId: waybillModel.WarehouseId,
  802. UserId: warehouse.UserId,
  803. Lng: lng,
  804. Lat: lat,
  805. ControlBy: model2.ControlBy{
  806. CreateBy: p.UserId,
  807. },
  808. DeptBy: model2.DeptBy{
  809. DeptId: warehouse.DeptId,
  810. },
  811. ModelTime: model2.ModelTime{
  812. CreatedAt: c.StartTime,
  813. },
  814. }
  815. err = tx.Create(&Logistics).Error
  816. if err != nil {
  817. e.Log.Errorf("db error: %s", err)
  818. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  819. }
  820. // 查询任务
  821. var task model.WaybillTask
  822. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, waybillModel.WarehouseId).
  823. Last(&task).Error
  824. if err != nil {
  825. e.Log.Errorf("db error: %s", err)
  826. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  827. }
  828. task.EndTime = c.StartTime
  829. task.UpdateBy = p.UserId
  830. err = tx.Save(&task).Error
  831. if err != nil {
  832. e.Log.Errorf("db error: %s", err)
  833. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  834. }
  835. }
  836. waybillModel.Status = model.WaybillStatusTruck
  837. waybillModel.CarId = car.Id
  838. err = tx.Save(&waybillModel).Error
  839. if err != nil {
  840. e.Log.Errorf("db error: %s", err)
  841. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  842. }
  843. // 添加物流
  844. Logistics := model.WaybillLogistics{
  845. WaybillNo: waybillNo,
  846. Status: model.WaybillStatusTruck,
  847. CarId: car.Id,
  848. UserId: p.UserId,
  849. Lng: lng,
  850. Lat: lat,
  851. ControlBy: model2.ControlBy{
  852. CreateBy: p.UserId,
  853. },
  854. DeptBy: model2.DeptBy{
  855. DeptId: p.DeptId,
  856. },
  857. ModelTime: model2.ModelTime{
  858. CreatedAt: c.StartTime,
  859. },
  860. }
  861. err = tx.Create(&Logistics).Error
  862. if err != nil {
  863. e.Log.Errorf("db error: %s", err)
  864. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  865. }
  866. // 添加任务
  867. task := model.WaybillTask{
  868. WaybillNo: waybillNo,
  869. CarId: car.Id,
  870. UserId: p.UserId,
  871. Sn: car.Sn,
  872. StartTime: c.StartTime,
  873. ControlBy: model2.ControlBy{
  874. CreateBy: p.UserId,
  875. },
  876. DeptBy: model2.DeptBy{
  877. DeptId: p.DeptId,
  878. },
  879. }
  880. err = tx.Create(&task).Error
  881. if err != nil {
  882. e.Log.Errorf("db error: %s", err)
  883. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  884. }
  885. }
  886. return nil
  887. }
  888. func (e *Waybill) CarOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  889. var err error
  890. tx := e.Orm.Begin()
  891. defer func() {
  892. if err != nil {
  893. tx.Rollback()
  894. } else {
  895. tx.Commit()
  896. }
  897. }()
  898. // 查询仓库信息
  899. var car = model.Car{}
  900. // 查询运单是否存在
  901. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  902. Where("user_id = ?", p.UserId).
  903. First(&car).Error
  904. if err != nil {
  905. e.Log.Errorf("db error: %s", err)
  906. return errors.New("获取车辆绑定信息失败")
  907. }
  908. for _, waybillNo := range c.WaybillNoList {
  909. var waybillModel = model.Waybill{}
  910. // 查询运单是否存在
  911. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  912. Where("waybill_no = ?", waybillNo).
  913. First(&waybillModel).Error
  914. if err != nil {
  915. e.Log.Errorf("db error: %s", err)
  916. if errors.Is(err, gorm.ErrRecordNotFound) {
  917. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  918. }
  919. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  920. }
  921. if waybillModel.CarId != car.Id {
  922. return errors.New("请选择正确车辆下车!")
  923. }
  924. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruckOut {
  925. continue
  926. }
  927. if waybillModel.Status != model.WaybillStatusTruck {
  928. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法下车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  929. return err
  930. }
  931. waybillModel.Status = model.WaybillStatusTruckOut
  932. waybillModel.CarId = car.Id
  933. err = tx.Save(&waybillModel).Error
  934. if err != nil {
  935. e.Log.Errorf("db error: %s", err)
  936. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  937. }
  938. var lng, lat string
  939. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  940. if err != nil {
  941. e.Log.Errorf("获取定位信息失败: %s", err)
  942. return err
  943. }
  944. // 添加物流
  945. Logistics := model.WaybillLogistics{
  946. WaybillNo: waybillNo,
  947. Status: model.WaybillStatusTruckOut,
  948. CarId: car.Id,
  949. UserId: p.UserId,
  950. Lng: lng,
  951. Lat: lat,
  952. ControlBy: model2.ControlBy{
  953. CreateBy: p.UserId,
  954. },
  955. DeptBy: model2.DeptBy{
  956. DeptId: p.DeptId,
  957. },
  958. ModelTime: model2.ModelTime{
  959. CreatedAt: c.StartTime,
  960. },
  961. }
  962. err = tx.Create(&Logistics).Error
  963. if err != nil {
  964. e.Log.Errorf("db error: %s", err)
  965. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  966. }
  967. // 查询任务
  968. var task model.WaybillTask
  969. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, car.Id).
  970. First(&task).Error
  971. if err != nil {
  972. e.Log.Errorf("db error: %s", err)
  973. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  974. }
  975. task.EndTime = c.StartTime
  976. task.UpdateBy = p.UserId
  977. err = tx.Save(&task).Error
  978. if err != nil {
  979. e.Log.Errorf("db error: %s", err)
  980. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  981. }
  982. }
  983. return nil
  984. }
  985. func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) error {
  986. var err error
  987. tx := e.Orm.Begin()
  988. defer func() {
  989. if err != nil {
  990. tx.Rollback()
  991. } else {
  992. tx.Commit()
  993. }
  994. }()
  995. // 查询仓库信息
  996. var car = model.Car{}
  997. // 查询运单是否存在
  998. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  999. Where("user_id = ?", p.UserId).
  1000. First(&car).Error
  1001. if err != nil {
  1002. e.Log.Errorf("db error: %s", err)
  1003. return errors.New("获取车辆信息失败")
  1004. }
  1005. var waybillModel = model.Waybill{}
  1006. // 查询运单是否存在
  1007. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1008. Where("waybill_no = ?", c.WaybillNo).
  1009. First(&waybillModel).Error
  1010. if err != nil {
  1011. e.Log.Errorf("db error: %s", err)
  1012. if errors.Is(err, gorm.ErrRecordNotFound) {
  1013. return errors.New(fmt.Sprintf("运单号%s不存在", c.WaybillNo))
  1014. }
  1015. return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
  1016. }
  1017. if waybillModel.Status == model.WaybillStatusReceipt {
  1018. return nil
  1019. }
  1020. waybillModel.Status = model.WaybillStatusReceipt
  1021. waybillModel.CarId = car.Id
  1022. waybillModel.ReceiptTime = c.StartTime
  1023. waybillModel.ReceiptImg = c.ReceiptImg
  1024. err = tx.Save(&waybillModel).Error
  1025. if err != nil {
  1026. e.Log.Errorf("db error: %s", err)
  1027. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1028. }
  1029. var lng, lat string
  1030. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  1031. if err != nil {
  1032. e.Log.Errorf("获取定位信息失败: %s", err)
  1033. return err
  1034. }
  1035. // 查询任务
  1036. var task model.WaybillTask
  1037. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", c.WaybillNo, car.Id).
  1038. Last(&task).Error
  1039. if err != nil {
  1040. e.Log.Errorf("db error: %s", err)
  1041. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1042. }
  1043. // 未下车 直接点签收
  1044. if time.Time(task.EndTime).IsZero() {
  1045. task.EndTime = model2.Time(time.Now())
  1046. task.UpdateBy = p.UserId
  1047. err = tx.Save(&task).Error
  1048. if err != nil {
  1049. e.Log.Errorf("db error: %s", err)
  1050. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1051. }
  1052. // 添加下车物流记录
  1053. Logistics := model.WaybillLogistics{
  1054. WaybillNo: c.WaybillNo,
  1055. Status: model.WaybillStatusTruckOut,
  1056. CarId: car.Id,
  1057. UserId: p.UserId,
  1058. Lng: lng,
  1059. Lat: lat,
  1060. ControlBy: model2.ControlBy{
  1061. CreateBy: p.UserId,
  1062. },
  1063. DeptBy: model2.DeptBy{
  1064. DeptId: p.DeptId,
  1065. },
  1066. ModelTime: model2.ModelTime{
  1067. CreatedAt: c.StartTime,
  1068. },
  1069. }
  1070. err = tx.Create(&Logistics).Error
  1071. if err != nil {
  1072. e.Log.Errorf("db error: %s", err)
  1073. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1074. }
  1075. }
  1076. // 添加签收记录
  1077. Logistics := model.WaybillLogistics{
  1078. WaybillNo: c.WaybillNo,
  1079. Status: model.WaybillStatusReceipt,
  1080. CarId: car.Id,
  1081. UserId: p.UserId,
  1082. Lng: lng,
  1083. Lat: lat,
  1084. ControlBy: model2.ControlBy{
  1085. CreateBy: p.UserId,
  1086. },
  1087. DeptBy: model2.DeptBy{
  1088. DeptId: p.DeptId,
  1089. },
  1090. ModelTime: model2.ModelTime{
  1091. CreatedAt: c.StartTime,
  1092. },
  1093. }
  1094. err = tx.Create(&Logistics).Error
  1095. if err != nil {
  1096. e.Log.Errorf("db error: %s", err)
  1097. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1098. }
  1099. return nil
  1100. }
  1101. // 获取入库 出库 上车 下车 定位信息
  1102. func (e *Waybill) GetSite(companyId int, sn string, time string) (lng, lat string, err error) {
  1103. // 获取公司秘钥
  1104. var company model.SysDept
  1105. company, err = model.GetCompanyById(companyId)
  1106. if err != nil {
  1107. e.Log.Errorf("db error: %s", err)
  1108. return lng, lat, model.GetCompanyKeyErr
  1109. }
  1110. // 获取传感器信息
  1111. var deviceSensorList = []nats_server.DeviceSensor_R{}
  1112. var count int64
  1113. deviceSensorList, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(sn, company.ColdKey)
  1114. if err != nil || count == 0 {
  1115. err = errors.New("查询设备定位信息失败")
  1116. return lng, lat, err
  1117. }
  1118. var deviceData nats_server.DeviceData_
  1119. deviceData, err = nats_server.Cold_ReadDeviceDataBy_T_snid_T_time(deviceSensorList[0].T_sn, deviceSensorList[0].T_id, time)
  1120. if err != nil {
  1121. err = errors.New("查询设备定位信息失败")
  1122. return lng, lat, err
  1123. }
  1124. if len(deviceData.T_site) > 0 {
  1125. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  1126. if len(site) == 2 {
  1127. lng = site[0]
  1128. lat = site[1]
  1129. }
  1130. }
  1131. return lng, lat, nil
  1132. }
  1133. // 获取今日运单数 未派单 未装车 未入库 运送中
  1134. // 本月运单总数 上月运单总数 本年运单总数 上年运单总数
  1135. func (e *Waybill) GetBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission) dto.WaybillStatsRes {
  1136. var res dto.WaybillStatsRes
  1137. var data model.Waybill
  1138. type DateCount struct {
  1139. Date string
  1140. Count int64
  1141. }
  1142. yearCount := make([]DateCount, 0)
  1143. monthCount := make([]DateCount, 0)
  1144. now := time.Now()
  1145. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  1146. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  1147. // 获取上个月第一天
  1148. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  1149. // 获取去年的第一天
  1150. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  1151. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  1152. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  1153. // 今日总运单数
  1154. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  1155. // 待派单
  1156. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  1157. // 未装车
  1158. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitTruck).Count(&res.WaitTruckNum)
  1159. // 未入库
  1160. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitStorage).Count(&res.WaitStorageNum)
  1161. // 配送中
  1162. 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)
  1163. // 获取本月,上月数据
  1164. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  1165. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  1166. for _, month := range monthCount {
  1167. if month.Date == now.Format("200601") {
  1168. res.ThisMonthNum = month.Count
  1169. }
  1170. if month.Date == firstDayOfLastMonth.Format("200601") {
  1171. res.LastMonthNum = month.Count
  1172. }
  1173. }
  1174. // 获取本年,上年数据
  1175. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  1176. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  1177. for _, month := range yearCount {
  1178. if month.Date == now.Format("2006") {
  1179. res.ThisYearNum = month.Count
  1180. }
  1181. if month.Date == firstDayOfLastYear.Format("2006") {
  1182. res.LastYearNum = month.Count
  1183. }
  1184. }
  1185. if c.Type == "year" {
  1186. // 获取上个月第一天
  1187. year, _ := strconv.Atoi(c.Date)
  1188. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1189. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1190. // 年度数据统计
  1191. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1192. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1193. }
  1194. if c.Type == "month" {
  1195. // 获取上个月第一天
  1196. month, _ := time.Parse("2006-01", c.Date)
  1197. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1198. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1199. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1200. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1201. }
  1202. return res
  1203. }
  1204. // 获取运单所有温湿度素具
  1205. func (e *Waybill) GetAllData(c *dto.WaybillGetByWaybillNoReq) ([]nats_server.DeviceData_R, []WaybillPDF, error) {
  1206. var err error
  1207. var data model.WaybillTask
  1208. var waybill model.Waybill
  1209. var taskList []model.WaybillTask
  1210. var waybillPDF []WaybillPDF
  1211. dataList := make([]nats_server.DeviceData_R, 0)
  1212. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  1213. if err != nil {
  1214. e.Log.Errorf("db error: %s", err)
  1215. return dataList, waybillPDF, errors.New("获取运单信息失败")
  1216. }
  1217. // 未签收,不返回数据
  1218. if waybill.Status != model.WaybillStatusReceipt {
  1219. return dataList, waybillPDF, nil
  1220. }
  1221. // 获取公司秘钥
  1222. var company model.SysDept
  1223. company, err = model.GetCompanyById(waybill.DeptId)
  1224. if err != nil {
  1225. e.Log.Errorf("db error: %s", err)
  1226. return dataList, waybillPDF, model.GetCompanyKeyErr
  1227. }
  1228. err = e.Orm.Model(&data).
  1229. Where("waybill_no = ?", c.WaybillNo).
  1230. Order("id desc").
  1231. Find(&taskList).Error
  1232. if err != nil {
  1233. e.Log.Errorf("db error: %s", err)
  1234. return dataList, waybillPDF, global.GetFailedErr
  1235. }
  1236. for i := 0; i < len(taskList); i++ {
  1237. // 获取传感器信息
  1238. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  1239. var T_snid string
  1240. var list []nats_server.DeviceData_R
  1241. for _, r := range deviceSensorList {
  1242. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  1243. }
  1244. list, _, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  1245. if err != nil {
  1246. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  1247. return dataList, waybillPDF, global.GetFailedErr
  1248. }
  1249. dataList = append(dataList, list...)
  1250. waybillPDF = append(waybillPDF, WaybillPDF{
  1251. Data: list,
  1252. DeviceSensorList: deviceSensorList,
  1253. Task: taskList[i],
  1254. })
  1255. }
  1256. // 创建名称到权重的映射
  1257. orderMap := make(map[string]int)
  1258. for i, v := range taskList {
  1259. orderMap[v.Sn] = i
  1260. }
  1261. sort.Slice(dataList, func(i, j int) bool {
  1262. if dataList[i].T_time == dataList[j].T_time {
  1263. // 如果时间相同,则按预设顺序排序
  1264. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  1265. }
  1266. return dataList[i].T_time < dataList[j].T_time
  1267. })
  1268. return dataList, waybillPDF, nil
  1269. }
  1270. type WaybillPDF struct {
  1271. Data []nats_server.DeviceData_R `json:"data"`
  1272. DeviceSensorList []nats_server.DeviceSensor_R `json:"deviceSensorList"`
  1273. Task model.WaybillTask `json:"task"`
  1274. }