waybill.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119
  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. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. type Waybill struct {
  20. service.Service
  21. }
  22. func WaybillCustomerStatusScopes(status int) func(db *gorm.DB) *gorm.DB {
  23. return func(db *gorm.DB) *gorm.DB {
  24. // 未发货
  25. if status == 1 {
  26. statusList := []int{
  27. model.WaybillStatusWaitDelivery,
  28. model.WaybillStatusTruck,
  29. model.WaybillStatusWaitStorage,
  30. }
  31. return db.Where("status in (?)", statusList)
  32. }
  33. // 已发货
  34. if status == 2 {
  35. statusList := []int{
  36. model.WaybillStatusTruck,
  37. model.WaybillStatusStorage,
  38. model.WaybillStatusTruckOut,
  39. model.WaybillStatusStorageOut,
  40. }
  41. return db.Where("status in (?)", statusList)
  42. }
  43. // 已签收
  44. if status == 3 {
  45. statusList := []int{
  46. model.WaybillStatusReceipt,
  47. }
  48. return db.Where("status in (?)", statusList)
  49. }
  50. return db
  51. }
  52. }
  53. // GetPage 获取Waybill列表
  54. func (e *Waybill) GetPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  55. var err error
  56. var data model.Waybill
  57. err = e.Orm.Model(&data).
  58. Scopes(
  59. cDto.MakeCondition(c.GetNeedSearch()),
  60. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  61. actions.Permission(data.TableName(), p),
  62. ).
  63. Preload("PrintUser").
  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. func (e *Waybill) GetAppletPage(c *dto.WaybillGetAppletPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  73. var err error
  74. //var data model.Waybill
  75. var logistics model.WaybillLogistics
  76. err = e.Orm.Table("waybill").
  77. Select("waybill.*,waybill_logistics.status as status").
  78. Scopes(
  79. cDto.MakeCondition(c.GetNeedSearch()),
  80. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  81. actions.Permission(logistics.TableName(), p)).
  82. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  83. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  84. Find(&list).Limit(-1).Offset(-1).Count(count).Error
  85. //err = e.Orm.Model(&data).
  86. // Scopes(
  87. // cDto.MakeCondition(c.GetNeedSearch()),
  88. // cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  89. // actions.Permission(data.TableName(), p),
  90. // ).
  91. // Find(list).Limit(-1).Offset(-1).
  92. // Count(count).Error
  93. if err != nil {
  94. e.Log.Errorf("db error: %s", err)
  95. return global.GetFailedErr
  96. }
  97. return nil
  98. }
  99. func (e *Waybill) GetCustomerPage(c *dto.WaybillGetCustomerPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  100. var err error
  101. var data model.Waybill
  102. err = e.Orm.Model(&data).
  103. Scopes(
  104. WaybillCustomerStatusScopes(c.Status),
  105. cDto.MakeCondition(c.GetNeedSearch()),
  106. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  107. actions.Permission(data.TableName(), p),
  108. ).
  109. Find(list).Limit(-1).Offset(-1).
  110. Count(count).Error
  111. if err != nil {
  112. e.Log.Errorf("db error: %s", err)
  113. return global.GetFailedErr
  114. }
  115. return nil
  116. }
  117. // Get 获取Waybill对象
  118. func (e *Waybill) Get(d *dto.WaybillGetReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  119. err := e.Orm.
  120. Scopes(actions.Permission(waybillModel.TableName(), p)).
  121. Preload("User").
  122. First(waybillModel, d.GetId()).Error
  123. if err != nil {
  124. e.Log.Errorf("db error: %s", err)
  125. if errors.Is(err, gorm.ErrRecordNotFound) {
  126. return global.GetNotFoundOrNoPermissionErr
  127. }
  128. return global.GetFailedErr
  129. }
  130. return nil
  131. }
  132. // Insert 创建Waybill对象
  133. func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
  134. var err error
  135. var data model.Waybill
  136. tx := e.Orm.Begin()
  137. defer func() {
  138. if err != nil {
  139. tx.Rollback()
  140. } else {
  141. tx.Commit()
  142. }
  143. }()
  144. var no string
  145. for {
  146. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  147. var j int64
  148. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  149. if err != nil {
  150. continue
  151. }
  152. if j == 0 {
  153. break
  154. }
  155. }
  156. // 添加运单
  157. data.WaybillNo = no
  158. c.Generate(&data)
  159. err = tx.Create(&data).Error
  160. if err != nil {
  161. e.Log.Errorf("db error: %s", err)
  162. return global.CreateFailedErr
  163. }
  164. c.Id = data.Id
  165. return nil
  166. }
  167. // AppletInsert 员工添加运单
  168. func (e *Waybill) AppletInsert(c *dto.WaybillInsertReq, p *actions.DataPermission) error {
  169. var err error
  170. var data model.Waybill
  171. tx := e.Orm.Begin()
  172. defer func() {
  173. if err != nil {
  174. tx.Rollback()
  175. } else {
  176. tx.Commit()
  177. }
  178. }()
  179. var userModel = model.SysUser{}
  180. // 查询运单是否存在
  181. err = tx.Scopes(actions.Permission(userModel.TableName(), p)).
  182. First(&userModel, p.UserId).Error
  183. if err != nil {
  184. e.Log.Errorf("db error: %s", err)
  185. if errors.Is(err, gorm.ErrRecordNotFound) {
  186. return global.GetNotFoundErr
  187. }
  188. return global.CreateFailedErr
  189. }
  190. if userModel.Type != model.SysUserTypeDriver && userModel.Type != model.SysUserTypeWarehouse {
  191. err = errors.New("无权添加!")
  192. return err
  193. }
  194. var status = model.WaybillStatusWaitDelivery
  195. var car = model.Car{}
  196. if userModel.Type == model.SysUserTypeDriver {
  197. status = model.WaybillStatusWaitTruck
  198. // 查询车辆库信息
  199. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  200. Where("user_id = ?", p.UserId).
  201. First(&car).Error
  202. if err != nil {
  203. e.Log.Errorf("db error: %s", err)
  204. return errors.New("获取车辆信息失败")
  205. }
  206. }
  207. var warehouse = model.Warehouse{}
  208. if userModel.Type == model.SysUserTypeWarehouse {
  209. status = model.WaybillStatusWaitStorage
  210. // 查询仓库信息
  211. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  212. Where("user_id = ?", p.UserId).
  213. First(&warehouse).Error
  214. if err != nil {
  215. e.Log.Errorf("db error: %s", err)
  216. return errors.New("获取仓库信息失败")
  217. }
  218. }
  219. data.PrintUserId = p.UserId
  220. var no string
  221. for {
  222. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  223. var j int64
  224. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  225. if err != nil {
  226. continue
  227. }
  228. if j == 0 {
  229. break
  230. }
  231. }
  232. // 添加运单
  233. data.DeptId = p.DeptId
  234. data.CreateBy = p.UserId
  235. data.WaybillNo = no
  236. c.Generate(&data)
  237. data.Status = status
  238. err = tx.Create(&data).Error
  239. if err != nil {
  240. e.Log.Errorf("db error: %s", err)
  241. return global.CreateFailedErr
  242. }
  243. c.Id = data.Id
  244. // 添加物流
  245. Logistics := model.WaybillLogistics{
  246. WaybillNo: data.WaybillNo,
  247. Status: data.Status,
  248. CarId: car.Id,
  249. WarehouseId: warehouse.Id,
  250. UserId: p.UserId,
  251. ControlBy: model2.ControlBy{
  252. CreateBy: p.UserId,
  253. },
  254. DeptBy: model2.DeptBy{
  255. DeptId: p.DeptId,
  256. },
  257. }
  258. err = tx.Create(&Logistics).Error
  259. if err != nil {
  260. e.Log.Errorf("db error: %s", err)
  261. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  262. }
  263. return nil
  264. }
  265. // Update 修改Waybill对象
  266. func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) error {
  267. var err error
  268. tx := e.Orm.Begin()
  269. defer func() {
  270. if err != nil {
  271. tx.Rollback()
  272. } else {
  273. tx.Commit()
  274. }
  275. }()
  276. var waybillModel = model.Waybill{}
  277. // 查询运单是否存在
  278. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  279. First(&waybillModel, c.GetId()).Error
  280. if err != nil {
  281. e.Log.Errorf("db error: %s", err)
  282. if errors.Is(err, gorm.ErrRecordNotFound) {
  283. return global.UpdateNotFoundOrNoPermissionErr
  284. }
  285. return global.UpdateFailedErr
  286. }
  287. c.Generate(&waybillModel)
  288. err = tx.Save(&waybillModel).Error
  289. if err != nil {
  290. e.Log.Errorf("db error: %s", err)
  291. return global.UpdateFailedErr
  292. }
  293. c.Id = waybillModel.Id
  294. return nil
  295. }
  296. func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
  297. var err error
  298. tx := e.Orm.Begin()
  299. defer func() {
  300. if err != nil {
  301. tx.Rollback()
  302. } else {
  303. tx.Commit()
  304. }
  305. }()
  306. for _, id := range c.WaybillIds {
  307. var waybillModel = model.Waybill{}
  308. // 查询运单是否存在
  309. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  310. First(&waybillModel, id).Error
  311. if err != nil {
  312. e.Log.Errorf("db error: %s", err)
  313. if errors.Is(err, gorm.ErrRecordNotFound) {
  314. return global.UpdateNotFoundOrNoPermissionErr
  315. }
  316. return global.UpdateFailedErr
  317. }
  318. if waybillModel.Status != model.WaybillStatusWaitDelivery &&
  319. waybillModel.Status != model.WaybillStatusWaitTruck &&
  320. waybillModel.Status != model.WaybillStatusWaitStorage {
  321. err = errors.New(fmt.Sprintf("运单状态为%s,禁止操作!", model.WaybillStatusMap[waybillModel.Status]))
  322. return err
  323. }
  324. var car = model.Car{}
  325. if c.Type == model.SysUserTypeDriver {
  326. waybillModel.Status = model.WaybillStatusWaitTruck
  327. // 查询车辆库信息
  328. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  329. Where("user_id = ?", c.PrintUserId).
  330. First(&car).Error
  331. if err != nil {
  332. e.Log.Errorf("db error: %s", err)
  333. return errors.New("获取车辆信息失败")
  334. }
  335. }
  336. var warehouse = model.Warehouse{}
  337. if c.Type == model.SysUserTypeWarehouse {
  338. waybillModel.Status = model.WaybillStatusWaitStorage
  339. // 查询仓库信息
  340. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  341. Where("user_id = ?", c.PrintUserId).
  342. First(&warehouse).Error
  343. if err != nil {
  344. e.Log.Errorf("db error: %s", err)
  345. return errors.New("获取仓库信息失败")
  346. }
  347. }
  348. waybillModel.PrintUserId = c.PrintUserId
  349. err = tx.Save(&waybillModel).Error
  350. if err != nil {
  351. e.Log.Errorf("db error: %s", err)
  352. return global.UpdateFailedErr
  353. }
  354. // 添加物流
  355. Logistics := model.WaybillLogistics{
  356. WaybillNo: waybillModel.WaybillNo,
  357. Status: waybillModel.Status,
  358. CarId: car.Id,
  359. WarehouseId: warehouse.Id,
  360. UserId: c.PrintUserId,
  361. ControlBy: model2.ControlBy{
  362. CreateBy: p.UserId,
  363. },
  364. DeptBy: model2.DeptBy{
  365. DeptId: p.DeptId,
  366. },
  367. }
  368. err = tx.Create(&Logistics).Error
  369. if err != nil {
  370. e.Log.Errorf("db error: %s", err)
  371. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  372. }
  373. }
  374. return nil
  375. }
  376. // Remove 删除Waybill
  377. func (e *Waybill) Remove(c *dto.WaybillDeleteReq, p *actions.DataPermission) error {
  378. var err error
  379. tx := e.Orm.Begin()
  380. defer func() {
  381. if err != nil {
  382. tx.Rollback()
  383. } else {
  384. tx.Commit()
  385. }
  386. }()
  387. var waybillModel model.Waybill
  388. // 查询运单是否存在
  389. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  390. First(&waybillModel, c.GetId()).Error
  391. if err != nil {
  392. e.Log.Errorf("db error: %s", err)
  393. if errors.Is(err, gorm.ErrRecordNotFound) {
  394. return global.DeleteNotFoundOrNoPermissionErr
  395. }
  396. return global.DeleteFailedErr
  397. }
  398. if waybillModel.Status != model.WaybillStatusWaitDelivery && waybillModel.Status != model.WaybillStatusWaitTruck && waybillModel.Status != model.WaybillStatusWaitStorage {
  399. return errors.New(fmt.Sprintf("运单状态为%s,禁止删除", model.WaybillStatusMap[waybillModel.Status]))
  400. }
  401. db := tx.Delete(&waybillModel)
  402. if err = db.Error; err != nil {
  403. e.Log.Errorf("db error: %s", err)
  404. return global.DeleteFailedErr
  405. }
  406. if db.RowsAffected == 0 {
  407. return global.DeleteNotFoundOrNoPermissionErr
  408. }
  409. return nil
  410. }
  411. func (e *Waybill) WarehouseIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  412. var err error
  413. tx := e.Orm.Begin()
  414. defer func() {
  415. if err != nil {
  416. tx.Rollback()
  417. } else {
  418. tx.Commit()
  419. }
  420. }()
  421. // 查询仓库信息
  422. var warehouse = model.Warehouse{}
  423. // 查询运单是否存在
  424. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  425. Where("user_id = ?", p.UserId).
  426. First(&warehouse).Error
  427. if err != nil {
  428. e.Log.Errorf("db error: %s", err)
  429. return errors.New("获取仓库信息失败")
  430. }
  431. for _, waybillNo := range c.WaybillNoList {
  432. var waybillModel = model.Waybill{}
  433. // 查询运单是否存在
  434. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  435. Where("waybill_no = ?", waybillNo).
  436. First(&waybillModel).Error
  437. if err != nil {
  438. e.Log.Errorf("db error: %s", err)
  439. if errors.Is(err, gorm.ErrRecordNotFound) {
  440. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  441. }
  442. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  443. }
  444. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  445. continue
  446. }
  447. if waybillModel.Status == model.WaybillStatusTruck || (waybillModel.WarehouseId != warehouse.Id && waybillModel.Status == model.WaybillStatusStorage) {
  448. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  449. return err
  450. }
  451. waybillModel.Status = model.WaybillStatusStorage
  452. waybillModel.WarehouseId = warehouse.Id
  453. err = tx.Save(&waybillModel).Error
  454. if err != nil {
  455. e.Log.Errorf("db error: %s", err)
  456. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  457. }
  458. var lng, lat string
  459. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  460. if err != nil {
  461. e.Log.Errorf("获取定位信息失败: %s", err)
  462. return err
  463. }
  464. // 添加物流
  465. Logistics := model.WaybillLogistics{
  466. WaybillNo: waybillNo,
  467. Status: model.WaybillStatusStorage,
  468. WarehouseId: warehouse.Id,
  469. UserId: p.UserId,
  470. Lng: lng,
  471. Lat: lat,
  472. ControlBy: model2.ControlBy{
  473. CreateBy: p.UserId,
  474. },
  475. DeptBy: model2.DeptBy{
  476. DeptId: p.DeptId,
  477. },
  478. ModelTime: model2.ModelTime{
  479. CreatedAt: c.StartTime,
  480. },
  481. }
  482. err = tx.Create(&Logistics).Error
  483. if err != nil {
  484. e.Log.Errorf("db error: %s", err)
  485. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  486. }
  487. // 添加任务
  488. task := model.WaybillTask{
  489. WaybillNo: waybillNo,
  490. WarehouseId: warehouse.Id,
  491. UserId: p.UserId,
  492. Sn: warehouse.Sn,
  493. StartTime: c.StartTime,
  494. ControlBy: model2.ControlBy{
  495. CreateBy: p.UserId,
  496. },
  497. DeptBy: model2.DeptBy{
  498. DeptId: p.DeptId,
  499. },
  500. }
  501. err = tx.Create(&task).Error
  502. if err != nil {
  503. e.Log.Errorf("db error: %s", err)
  504. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  505. }
  506. }
  507. return nil
  508. }
  509. func (e *Waybill) WarehouseOut(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 {
  543. return errors.New("请选择正确仓库出库!")
  544. }
  545. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorageOut {
  546. continue
  547. }
  548. if waybillModel.Status != model.WaybillStatusStorage {
  549. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法出库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  550. return err
  551. }
  552. if waybillModel.Status == model.WaybillStatusWaitStorage {
  553. waybillModel.DeliveryTime = c.StartTime
  554. }
  555. waybillModel.Status = model.WaybillStatusStorageOut
  556. waybillModel.WarehouseId = warehouse.Id
  557. err = tx.Save(&waybillModel).Error
  558. if err != nil {
  559. e.Log.Errorf("db error: %s", err)
  560. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  561. }
  562. var lng, lat string
  563. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  564. if err != nil {
  565. e.Log.Errorf("获取定位信息失败: %s", err)
  566. return err
  567. }
  568. // 添加物流
  569. Logistics := model.WaybillLogistics{
  570. WaybillNo: waybillNo,
  571. Status: model.WaybillStatusStorageOut,
  572. WarehouseId: warehouse.Id,
  573. UserId: p.UserId,
  574. Lng: lng,
  575. Lat: lat,
  576. ControlBy: model2.ControlBy{
  577. CreateBy: p.UserId,
  578. },
  579. DeptBy: model2.DeptBy{
  580. DeptId: p.DeptId,
  581. },
  582. ModelTime: model2.ModelTime{
  583. CreatedAt: c.StartTime,
  584. },
  585. }
  586. err = tx.Create(&Logistics).Error
  587. if err != nil {
  588. e.Log.Errorf("db error: %s", err)
  589. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  590. }
  591. // 查询任务
  592. var task model.WaybillTask
  593. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, warehouse.Id).
  594. First(&task).Error
  595. if err != nil {
  596. e.Log.Errorf("db error: %s", err)
  597. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  598. }
  599. task.EndTime = c.StartTime
  600. task.UpdateBy = p.UserId
  601. err = tx.Save(&task).Error
  602. if err != nil {
  603. e.Log.Errorf("db error: %s", err)
  604. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  605. }
  606. }
  607. return nil
  608. }
  609. func (e *Waybill) CarIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  610. var err error
  611. tx := e.Orm.Begin()
  612. defer func() {
  613. if err != nil {
  614. tx.Rollback()
  615. } else {
  616. tx.Commit()
  617. }
  618. }()
  619. // 查询车辆信息
  620. var car = model.Car{}
  621. // 查询运单是否存在
  622. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  623. Where("user_id = ?", p.UserId).
  624. First(&car).Error
  625. if err != nil {
  626. e.Log.Errorf("db error: %s", err)
  627. return errors.New("获取车辆绑定信息失败")
  628. }
  629. for _, waybillNo := range c.WaybillNoList {
  630. var waybillModel = model.Waybill{}
  631. // 查询运单是否存在
  632. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  633. Where("waybill_no = ?", waybillNo).
  634. First(&waybillModel).Error
  635. if err != nil {
  636. e.Log.Errorf("db error: %s", err)
  637. if errors.Is(err, gorm.ErrRecordNotFound) {
  638. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  639. }
  640. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  641. }
  642. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruck {
  643. continue
  644. }
  645. if waybillModel.Status == model.WaybillStatusStorage || (waybillModel.CarId != car.Id && waybillModel.Status == model.WaybillStatusTruck) {
  646. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  647. return err
  648. }
  649. if waybillModel.Status == model.WaybillStatusWaitTruck {
  650. waybillModel.DeliveryTime = c.StartTime
  651. }
  652. waybillModel.Status = model.WaybillStatusTruck
  653. waybillModel.CarId = car.Id
  654. err = tx.Save(&waybillModel).Error
  655. if err != nil {
  656. e.Log.Errorf("db error: %s", err)
  657. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  658. }
  659. var lng, lat string
  660. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  661. if err != nil {
  662. e.Log.Errorf("获取定位信息失败: %s", err)
  663. return err
  664. }
  665. // 添加物流
  666. Logistics := model.WaybillLogistics{
  667. WaybillNo: waybillNo,
  668. Status: model.WaybillStatusTruck,
  669. CarId: car.Id,
  670. UserId: p.UserId,
  671. Lng: lng,
  672. Lat: lat,
  673. ControlBy: model2.ControlBy{
  674. CreateBy: p.UserId,
  675. },
  676. DeptBy: model2.DeptBy{
  677. DeptId: p.DeptId,
  678. },
  679. ModelTime: model2.ModelTime{
  680. CreatedAt: c.StartTime,
  681. },
  682. }
  683. err = tx.Create(&Logistics).Error
  684. if err != nil {
  685. e.Log.Errorf("db error: %s", err)
  686. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  687. }
  688. // 添加任务
  689. task := model.WaybillTask{
  690. WaybillNo: waybillNo,
  691. CarId: car.Id,
  692. UserId: p.UserId,
  693. Sn: car.Sn,
  694. StartTime: c.StartTime,
  695. ControlBy: model2.ControlBy{
  696. CreateBy: p.UserId,
  697. },
  698. DeptBy: model2.DeptBy{
  699. DeptId: p.DeptId,
  700. },
  701. }
  702. err = tx.Create(&task).Error
  703. if err != nil {
  704. e.Log.Errorf("db error: %s", err)
  705. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  706. }
  707. }
  708. return nil
  709. }
  710. func (e *Waybill) CarOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  711. var err error
  712. tx := e.Orm.Begin()
  713. defer func() {
  714. if err != nil {
  715. tx.Rollback()
  716. } else {
  717. tx.Commit()
  718. }
  719. }()
  720. // 查询仓库信息
  721. var car = model.Car{}
  722. // 查询运单是否存在
  723. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  724. Where("user_id = ?", p.UserId).
  725. First(&car).Error
  726. if err != nil {
  727. e.Log.Errorf("db error: %s", err)
  728. return errors.New("获取车辆绑定信息失败")
  729. }
  730. for _, waybillNo := range c.WaybillNoList {
  731. var waybillModel = model.Waybill{}
  732. // 查询运单是否存在
  733. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  734. Where("waybill_no = ?", waybillNo).
  735. First(&waybillModel).Error
  736. if err != nil {
  737. e.Log.Errorf("db error: %s", err)
  738. if errors.Is(err, gorm.ErrRecordNotFound) {
  739. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  740. }
  741. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  742. }
  743. if waybillModel.CarId != car.Id {
  744. return errors.New("请选择正确车辆下车!")
  745. }
  746. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruckOut {
  747. continue
  748. }
  749. if waybillModel.Status != model.WaybillStatusTruck {
  750. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法下车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  751. return err
  752. }
  753. waybillModel.Status = model.WaybillStatusTruckOut
  754. waybillModel.CarId = car.Id
  755. err = tx.Save(&waybillModel).Error
  756. if err != nil {
  757. e.Log.Errorf("db error: %s", err)
  758. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  759. }
  760. var lng, lat string
  761. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  762. if err != nil {
  763. e.Log.Errorf("获取定位信息失败: %s", err)
  764. return err
  765. }
  766. // 添加物流
  767. Logistics := model.WaybillLogistics{
  768. WaybillNo: waybillNo,
  769. Status: model.WaybillStatusTruckOut,
  770. CarId: car.Id,
  771. UserId: p.UserId,
  772. Lng: lng,
  773. Lat: lat,
  774. ControlBy: model2.ControlBy{
  775. CreateBy: p.UserId,
  776. },
  777. DeptBy: model2.DeptBy{
  778. DeptId: p.DeptId,
  779. },
  780. ModelTime: model2.ModelTime{
  781. CreatedAt: c.StartTime,
  782. },
  783. }
  784. err = tx.Create(&Logistics).Error
  785. if err != nil {
  786. e.Log.Errorf("db error: %s", err)
  787. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  788. }
  789. // 查询任务
  790. var task model.WaybillTask
  791. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, car.Id).
  792. First(&task).Error
  793. if err != nil {
  794. e.Log.Errorf("db error: %s", err)
  795. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  796. }
  797. task.EndTime = c.StartTime
  798. task.UpdateBy = p.UserId
  799. err = tx.Save(&task).Error
  800. if err != nil {
  801. e.Log.Errorf("db error: %s", err)
  802. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  803. }
  804. }
  805. return nil
  806. }
  807. func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) error {
  808. var err error
  809. tx := e.Orm.Begin()
  810. defer func() {
  811. if err != nil {
  812. tx.Rollback()
  813. } else {
  814. tx.Commit()
  815. }
  816. }()
  817. // 查询仓库信息
  818. var car = model.Car{}
  819. // 查询运单是否存在
  820. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  821. Where("user_id = ?", p.UserId).
  822. First(&car).Error
  823. if err != nil {
  824. e.Log.Errorf("db error: %s", err)
  825. return errors.New("获取车辆信息失败")
  826. }
  827. var waybillModel = model.Waybill{}
  828. // 查询运单是否存在
  829. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  830. Where("waybill_no = ?", c.WaybillNo).
  831. First(&waybillModel).Error
  832. if err != nil {
  833. e.Log.Errorf("db error: %s", err)
  834. if errors.Is(err, gorm.ErrRecordNotFound) {
  835. return errors.New(fmt.Sprintf("运单号%s不存在", c.WaybillNo))
  836. }
  837. return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
  838. }
  839. if waybillModel.Status == model.WaybillStatusReceipt {
  840. return nil
  841. }
  842. waybillModel.Status = model.WaybillStatusReceipt
  843. waybillModel.CarId = car.Id
  844. waybillModel.ReceiptTime = c.StartTime
  845. waybillModel.ReceiptImg = c.ReceiptImg
  846. err = tx.Save(&waybillModel).Error
  847. if err != nil {
  848. e.Log.Errorf("db error: %s", err)
  849. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  850. }
  851. var lng, lat string
  852. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  853. if err != nil {
  854. e.Log.Errorf("获取定位信息失败: %s", err)
  855. return err
  856. }
  857. // 查询任务
  858. var task model.WaybillTask
  859. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", c.WaybillNo, car.Id).
  860. Last(&task).Error
  861. if err != nil {
  862. e.Log.Errorf("db error: %s", err)
  863. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  864. }
  865. // 未下车 直接点签收
  866. if time.Time(task.EndTime).IsZero() {
  867. task.EndTime = model2.Time(time.Now())
  868. task.UpdateBy = p.UserId
  869. err = tx.Save(&task).Error
  870. if err != nil {
  871. e.Log.Errorf("db error: %s", err)
  872. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  873. }
  874. // 添加下车物流记录
  875. Logistics := model.WaybillLogistics{
  876. WaybillNo: c.WaybillNo,
  877. Status: model.WaybillStatusTruckOut,
  878. CarId: car.Id,
  879. UserId: p.UserId,
  880. Lng: lng,
  881. Lat: lat,
  882. ControlBy: model2.ControlBy{
  883. CreateBy: p.UserId,
  884. },
  885. DeptBy: model2.DeptBy{
  886. DeptId: p.DeptId,
  887. },
  888. ModelTime: model2.ModelTime{
  889. CreatedAt: c.StartTime,
  890. },
  891. }
  892. err = tx.Create(&Logistics).Error
  893. if err != nil {
  894. e.Log.Errorf("db error: %s", err)
  895. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  896. }
  897. }
  898. // 添加签收记录
  899. Logistics := model.WaybillLogistics{
  900. WaybillNo: c.WaybillNo,
  901. Status: model.WaybillStatusReceipt,
  902. CarId: car.Id,
  903. UserId: p.UserId,
  904. Lng: lng,
  905. Lat: lat,
  906. ControlBy: model2.ControlBy{
  907. CreateBy: p.UserId,
  908. },
  909. DeptBy: model2.DeptBy{
  910. DeptId: p.DeptId,
  911. },
  912. ModelTime: model2.ModelTime{
  913. CreatedAt: c.StartTime,
  914. },
  915. }
  916. err = tx.Create(&Logistics).Error
  917. if err != nil {
  918. e.Log.Errorf("db error: %s", err)
  919. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  920. }
  921. return nil
  922. }
  923. // 获取入库 出库 上车 下车 定位信息
  924. func (e *Waybill) GetSite(companyId int, sn string, time string) (lng, lat string, err error) {
  925. // 获取公司秘钥
  926. var company model.SysDept
  927. company, err = model.GetCompanyById(companyId)
  928. if err != nil {
  929. e.Log.Errorf("db error: %s", err)
  930. return lng, lat, model.GetCompanyKeyErr
  931. }
  932. // 获取传感器信息
  933. var deviceSensorList = []nats_server.DeviceSensor_R{}
  934. var count int64
  935. deviceSensorList, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(sn, company.ColdKey)
  936. if err != nil || count == 0 {
  937. err = errors.New("查询设备定位信息失败")
  938. return lng, lat, err
  939. }
  940. var deviceData nats_server.DeviceData_
  941. deviceData, err = nats_server.Cold_ReadDeviceDataBy_T_snid_T_time(deviceSensorList[0].T_sn, deviceSensorList[0].T_id, time)
  942. if err != nil {
  943. err = errors.New("查询设备定位信息失败")
  944. return lng, lat, err
  945. }
  946. if len(deviceData.T_site) > 0 {
  947. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  948. if len(site) == 2 {
  949. lng = site[0]
  950. lat = site[1]
  951. }
  952. }
  953. return lng, lat, nil
  954. }
  955. // 获取今日运单数 未派单 未装车 未入库 运送中
  956. // 本月运单总数 上月运单总数 本年运单总数 上年运单总数
  957. func (e *Waybill) GetBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission) dto.WaybillStatsRes {
  958. var res dto.WaybillStatsRes
  959. var data model.Waybill
  960. type DateCount struct {
  961. Date string
  962. Count int64
  963. }
  964. yearCount := make([]DateCount, 0)
  965. monthCount := make([]DateCount, 0)
  966. now := time.Now()
  967. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  968. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  969. // 获取上个月第一天
  970. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  971. // 获取去年的第一天
  972. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  973. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  974. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  975. // 今日总运单数
  976. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  977. // 待派单
  978. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  979. // 未装车
  980. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitTruck).Count(&res.WaitTruckNum)
  981. // 未入库
  982. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitStorage).Count(&res.WaitStorageNum)
  983. // 配送中
  984. 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)
  985. // 获取本月,上月数据
  986. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  987. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  988. for _, month := range monthCount {
  989. if month.Date == now.Format("200601") {
  990. res.ThisMonthNum = month.Count
  991. }
  992. if month.Date == firstDayOfLastMonth.Format("200601") {
  993. res.LastMonthNum = month.Count
  994. }
  995. }
  996. // 获取本年,上年数据
  997. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  998. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  999. for _, month := range yearCount {
  1000. if month.Date == now.Format("2006") {
  1001. res.ThisYearNum = month.Count
  1002. }
  1003. if month.Date == firstDayOfLastYear.Format("2006") {
  1004. res.LastYearNum = month.Count
  1005. }
  1006. }
  1007. if c.Type == "year" {
  1008. // 获取上个月第一天
  1009. year, _ := strconv.Atoi(c.Date)
  1010. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1011. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1012. // 年度数据统计
  1013. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1014. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1015. }
  1016. if c.Type == "month" {
  1017. // 获取上个月第一天
  1018. month, _ := time.Parse("2006-01", c.Date)
  1019. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1020. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1021. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1022. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1023. }
  1024. return res
  1025. }