waybill.go 79 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719
  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.WaybillStatusTruck,
  29. }
  30. return db.Where("status in (?)", statusList)
  31. }
  32. // 已发货
  33. if status == 2 {
  34. statusList := []int{
  35. model.WaybillStatusTruck,
  36. model.WaybillStatusStorage,
  37. model.WaybillStatusTruckOut,
  38. model.WaybillStatusStorageOut,
  39. model.WaybillStatusVanning,
  40. model.WaybillStatusVanningOut,
  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. // 已处理
  52. if status == 4 {
  53. statusList := []int{
  54. model.WaybillStatusWaitDelivery,
  55. model.WaybillStatusWaitStorage,
  56. model.WaybillStatusWaitVanning,
  57. }
  58. return db.Where("status in (?)", statusList)
  59. }
  60. return db
  61. }
  62. }
  63. // GetPage 获取Waybill列表
  64. func (e *Waybill) GetPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  65. var err error
  66. var data model.Waybill
  67. if c.PageSize == 9999 {
  68. err = e.Orm.Model(&data).
  69. Scopes(
  70. cDto.MakeCondition(c.GetNeedSearch()),
  71. actions.Permission(data.TableName(), p),
  72. ).
  73. Find(list).Limit(-1).Offset(-1).
  74. Count(count).Error
  75. if err != nil {
  76. e.Log.Errorf("db error: %s", err)
  77. return global.GetFailedErr
  78. }
  79. return nil
  80. }
  81. err = e.Orm.Model(&data).
  82. Scopes(
  83. cDto.MakeCondition(c.GetNeedSearch()),
  84. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  85. actions.Permission(data.TableName(), p),
  86. ).
  87. Preload("PrintUser").
  88. Preload("CoolerBox").
  89. Find(list).Limit(-1).Offset(-1).
  90. Count(count).Error
  91. if err != nil {
  92. e.Log.Errorf("db error: %s", err)
  93. return global.GetFailedErr
  94. }
  95. return nil
  96. }
  97. func (e *Waybill) GetAppletPage(c *dto.WaybillGetAppletPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  98. var err error
  99. //var data model.Waybill
  100. var logistics model.WaybillLogistics
  101. err = e.Orm.Table("waybill").
  102. Select("waybill.*,waybill_logistics.status as status").
  103. Scopes(
  104. cDto.MakeCondition(c.GetNeedSearch()),
  105. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  106. actions.Permission(logistics.TableName(), p)).
  107. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  108. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  109. Find(&list).Limit(-1).Offset(-1).Count(count).Error
  110. if err != nil {
  111. e.Log.Errorf("db error: %s", err)
  112. return global.GetFailedErr
  113. }
  114. for i := 0; i < len(*list); i++ {
  115. if (*list)[i].CoolerBoxId == 0 {
  116. continue
  117. }
  118. var coolerBox model.CoolerBoxOmit
  119. err = e.Orm.First(&coolerBox, (*list)[i].CoolerBoxId).Error
  120. if err != nil {
  121. e.Log.Errorf("查询保温箱信息失败: %s", err)
  122. }
  123. (*list)[i].CoolerBox = coolerBox
  124. }
  125. return nil
  126. }
  127. func (e *Waybill) GetAppletCount(list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  128. var err error
  129. //var data model.Waybill
  130. var logistics model.WaybillLogistics
  131. err = e.Orm.Table("waybill").
  132. Select("waybill.*,waybill_logistics.status as status").
  133. Scopes(
  134. actions.Permission(logistics.TableName(), p)).
  135. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  136. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  137. Find(list).Count(count).Error
  138. if err != nil {
  139. e.Log.Errorf("db error: %s", err)
  140. return global.GetFailedErr
  141. }
  142. return nil
  143. }
  144. func (e *Waybill) GetCustomerPage(c *dto.WaybillGetCustomerPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  145. var err error
  146. var data model.Waybill
  147. if c.PageSize == 9999 {
  148. err = e.Orm.Model(&data).
  149. Scopes(
  150. WaybillCustomerStatusScopes(c.Status),
  151. cDto.MakeCondition(c.GetNeedSearch()),
  152. actions.Permission(data.TableName(), p),
  153. ).
  154. Find(list).Limit(-1).Offset(-1).
  155. Count(count).Error
  156. if err != nil {
  157. e.Log.Errorf("db error: %s", err)
  158. return global.GetFailedErr
  159. }
  160. return nil
  161. }
  162. err = e.Orm.Model(&data).
  163. Scopes(
  164. WaybillCustomerStatusScopes(c.Status),
  165. cDto.MakeCondition(c.GetNeedSearch()),
  166. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  167. actions.Permission(data.TableName(), p),
  168. ).
  169. Preload("CoolerBox").
  170. Find(list).Limit(-1).Offset(-1).
  171. Count(count).Error
  172. if err != nil {
  173. e.Log.Errorf("db error: %s", err)
  174. return global.GetFailedErr
  175. }
  176. return nil
  177. }
  178. // Get 获取Waybill对象
  179. func (e *Waybill) Get(d *dto.WaybillGetReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  180. err := e.Orm.
  181. Scopes(actions.Permission(waybillModel.TableName(), p)).
  182. Where("waybill_no = ?", d.WaybillNo).
  183. Preload("PrintUser").
  184. Preload("CoolerBox").
  185. Preload("Dept").
  186. First(waybillModel).Error
  187. if err != nil {
  188. e.Log.Errorf("db error: %s", err)
  189. if errors.Is(err, gorm.ErrRecordNotFound) {
  190. return global.GetNotFoundOrNoPermissionErr
  191. }
  192. return global.GetFailedErr
  193. }
  194. return nil
  195. }
  196. func (e *Waybill) GetByWaybillNo(d *dto.WaybillGetByWaybillPdfReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  197. err := e.Orm.
  198. Scopes(actions.Permission(waybillModel.TableName(), p)).
  199. Where("waybill_no = ?", d.WaybillNo).
  200. Preload("Dept").
  201. First(waybillModel).Error
  202. if err != nil {
  203. e.Log.Errorf("db error: %s", err)
  204. if errors.Is(err, gorm.ErrRecordNotFound) {
  205. return global.GetNotFoundOrNoPermissionErr
  206. }
  207. return global.GetFailedErr
  208. }
  209. return nil
  210. }
  211. // Insert 创建Waybill对象
  212. func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
  213. var err error
  214. var data model.Waybill
  215. tx := e.Orm.Begin()
  216. defer func() {
  217. if err != nil {
  218. tx.Rollback()
  219. } else {
  220. tx.Commit()
  221. }
  222. }()
  223. var no string
  224. for {
  225. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  226. var j int64
  227. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  228. if err != nil {
  229. continue
  230. }
  231. if j == 0 {
  232. break
  233. }
  234. }
  235. // 添加运单
  236. data.WaybillNo = no
  237. c.Generate(&data)
  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. return nil
  245. }
  246. // AppletInsert 员工添加运单
  247. func (e *Waybill) AppletInsert(c *dto.WaybillInsertReq, p *actions.DataPermission) error {
  248. var err error
  249. var data model.Waybill
  250. tx := e.Orm.Begin()
  251. defer func() {
  252. if err != nil {
  253. tx.Rollback()
  254. } else {
  255. tx.Commit()
  256. }
  257. }()
  258. var userModel = model.SysUser{}
  259. // 查询运单是否存在
  260. err = tx.Scopes(actions.Permission(userModel.TableName(), p)).
  261. First(&userModel, p.UserId).Error
  262. if err != nil {
  263. e.Log.Errorf("db error: %s", err)
  264. if errors.Is(err, gorm.ErrRecordNotFound) {
  265. return global.GetNotFoundErr
  266. }
  267. return global.CreateFailedErr
  268. }
  269. if c.CoolerBoxId == 0 && (userModel.Type != model.SysUserTypeDriver && userModel.Type != model.SysUserTypeWarehouse) && userModel.UserType != "customer" {
  270. err = errors.New("无权添加!")
  271. return err
  272. }
  273. var status = model.WaybillStatusWaitDelivery
  274. var car = model.Car{}
  275. if userModel.Type == model.SysUserTypeDriver {
  276. status = model.WaybillStatusWaitTruck
  277. // 查询车辆库信息
  278. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  279. Where("user_id = ?", p.UserId).
  280. First(&car).Error
  281. if err != nil {
  282. e.Log.Errorf("db error: %s", err)
  283. return errors.New("获取车辆信息失败")
  284. }
  285. }
  286. var warehouse = model.Warehouse{}
  287. if userModel.Type == model.SysUserTypeWarehouse {
  288. status = model.WaybillStatusWaitStorage
  289. // 查询仓库信息
  290. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  291. Where("user_id = ?", p.UserId).
  292. First(&warehouse).Error
  293. if err != nil {
  294. e.Log.Errorf("db error: %s", err)
  295. return errors.New("获取仓库信息失败")
  296. }
  297. }
  298. var coolerBox = model.CoolerBox{}
  299. if c.DeliveryCondition == "保温箱" {
  300. status = model.WaybillStatusWaitVanning
  301. // 查询保温箱信息
  302. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  303. Where("id = ?", c.CoolerBoxId).
  304. First(&coolerBox).Error
  305. if err != nil {
  306. e.Log.Errorf("db error: %s", err)
  307. return errors.New("获取保温箱信息失败")
  308. }
  309. }
  310. data.PrintUserId = p.UserId
  311. var no string
  312. for {
  313. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  314. var j int64
  315. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  316. if err != nil {
  317. continue
  318. }
  319. if j == 0 {
  320. break
  321. }
  322. }
  323. // 添加运单
  324. data.DeptId = p.DeptId
  325. data.CreateBy = p.UserId
  326. data.WaybillNo = no
  327. c.Generate(&data)
  328. data.Status = status
  329. err = tx.Create(&data).Error
  330. if err != nil {
  331. e.Log.Errorf("db error: %s", err)
  332. return global.CreateFailedErr
  333. }
  334. c.Id = data.Id
  335. // 添加物流
  336. Logistics := model.WaybillLogistics{
  337. WaybillNo: data.WaybillNo,
  338. Status: data.Status,
  339. CarId: car.Id,
  340. WarehouseId: warehouse.Id,
  341. CoolerBoxId: coolerBox.Id,
  342. UserId: p.UserId,
  343. ControlBy: model2.ControlBy{
  344. CreateBy: p.UserId,
  345. },
  346. DeptBy: model2.DeptBy{
  347. DeptId: p.DeptId,
  348. },
  349. }
  350. err = tx.Create(&Logistics).Error
  351. if err != nil {
  352. e.Log.Errorf("db error: %s", err)
  353. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  354. }
  355. return nil
  356. }
  357. // Update 修改Waybill对象
  358. func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) error {
  359. var err error
  360. tx := e.Orm.Begin()
  361. defer func() {
  362. if err != nil {
  363. tx.Rollback()
  364. } else {
  365. tx.Commit()
  366. }
  367. }()
  368. var waybillModel = model.Waybill{}
  369. // 查询运单是否存在
  370. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  371. First(&waybillModel, c.GetId()).Error
  372. if err != nil {
  373. e.Log.Errorf("db error: %s", err)
  374. if errors.Is(err, gorm.ErrRecordNotFound) {
  375. return global.UpdateNotFoundOrNoPermissionErr
  376. }
  377. return global.UpdateFailedErr
  378. }
  379. c.Generate(&waybillModel)
  380. err = tx.Save(&waybillModel).Error
  381. if err != nil {
  382. e.Log.Errorf("db error: %s", err)
  383. return global.UpdateFailedErr
  384. }
  385. c.Id = waybillModel.Id
  386. return nil
  387. }
  388. func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
  389. var err error
  390. tx := e.Orm.Begin()
  391. defer func() {
  392. if err != nil {
  393. tx.Rollback()
  394. } else {
  395. tx.Commit()
  396. }
  397. }()
  398. var car = model.Car{}
  399. if c.Type == model.SysUserTypeDriver {
  400. // 查询车辆库信息
  401. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  402. Where("user_id = ?", c.PrintUserId).
  403. First(&car).Error
  404. if err != nil {
  405. e.Log.Errorf("db error: %s", err)
  406. return errors.New("获取车辆信息失败")
  407. }
  408. }
  409. var warehouse = model.Warehouse{}
  410. if c.Type == model.SysUserTypeWarehouse {
  411. // 查询仓库信息
  412. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  413. Where("user_id = ?", c.PrintUserId).
  414. First(&warehouse).Error
  415. if err != nil {
  416. e.Log.Errorf("db error: %s", err)
  417. return errors.New("获取仓库信息失败")
  418. }
  419. }
  420. var coolerBox = model.CoolerBox{}
  421. if c.Type == model.TypeCoolerBox {
  422. // 查询保温箱信息
  423. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  424. Where("id = ?", c.CoolerBoxId).
  425. First(&coolerBox).Error
  426. if err != nil {
  427. e.Log.Errorf("db error: %s", err)
  428. return errors.New("获取保温箱信息失败")
  429. }
  430. var user = model.SysUser{}
  431. // 查询制单人信息
  432. err = tx.Scopes(actions.Permission(user.TableName(), p)).
  433. Where("id = ?", c.PrintUserId).
  434. First(&user).Error
  435. if err != nil {
  436. e.Log.Errorf("db error: %s", err)
  437. return errors.New("获取保温箱配送人失败")
  438. }
  439. }
  440. for _, id := range c.WaybillIds {
  441. var waybillModel = model.Waybill{}
  442. // 查询运单是否存在
  443. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  444. First(&waybillModel, id).Error
  445. if err != nil {
  446. e.Log.Errorf("db error: %s", err)
  447. if errors.Is(err, gorm.ErrRecordNotFound) {
  448. return global.UpdateNotFoundOrNoPermissionErr
  449. }
  450. return global.UpdateFailedErr
  451. }
  452. // 待派单 待装车 待入库 待装箱
  453. if waybillModel.Status != model.WaybillStatusWaitDelivery &&
  454. waybillModel.Status != model.WaybillStatusWaitTruck &&
  455. waybillModel.Status != model.WaybillStatusWaitStorage &&
  456. waybillModel.Status != model.WaybillStatusWaitVanning {
  457. //err = errors.New(fmt.Sprintf("运单状态为%s,禁止操作!", model.WaybillStatusMap[waybillModel.Status]))
  458. //return err
  459. continue
  460. }
  461. if c.Type == model.SysUserTypeDriver {
  462. waybillModel.Status = model.WaybillStatusWaitTruck
  463. }
  464. if c.Type == model.SysUserTypeWarehouse {
  465. waybillModel.Status = model.WaybillStatusWaitStorage
  466. }
  467. if c.Type == model.TypeCoolerBox {
  468. waybillModel.Status = model.WaybillStatusWaitVanning
  469. waybillModel.CoolerBoxId = coolerBox.Id
  470. }
  471. waybillModel.PrintUserId = c.PrintUserId
  472. err = tx.Save(&waybillModel).Error
  473. if err != nil {
  474. e.Log.Errorf("db error: %s", err)
  475. return global.UpdateFailedErr
  476. }
  477. // 添加物流
  478. Logistics := model.WaybillLogistics{
  479. WaybillNo: waybillModel.WaybillNo,
  480. Status: waybillModel.Status,
  481. CarId: car.Id,
  482. WarehouseId: warehouse.Id,
  483. CoolerBoxId: coolerBox.Id,
  484. UserId: c.PrintUserId,
  485. ControlBy: model2.ControlBy{
  486. CreateBy: p.UserId,
  487. },
  488. DeptBy: model2.DeptBy{
  489. DeptId: p.DeptId,
  490. },
  491. }
  492. err = tx.Create(&Logistics).Error
  493. if err != nil {
  494. e.Log.Errorf("db error: %s", err)
  495. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  496. }
  497. }
  498. return nil
  499. }
  500. // Remove 删除Waybill
  501. func (e *Waybill) Remove(c *dto.WaybillDeleteReq, p *actions.DataPermission) error {
  502. var err error
  503. tx := e.Orm.Begin()
  504. defer func() {
  505. if err != nil {
  506. tx.Rollback()
  507. } else {
  508. tx.Commit()
  509. }
  510. }()
  511. var waybillModel model.Waybill
  512. // 查询运单是否存在
  513. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  514. First(&waybillModel, c.GetId()).Error
  515. if err != nil {
  516. e.Log.Errorf("db error: %s", err)
  517. if errors.Is(err, gorm.ErrRecordNotFound) {
  518. return global.DeleteNotFoundOrNoPermissionErr
  519. }
  520. return global.DeleteFailedErr
  521. }
  522. if waybillModel.Status != model.WaybillStatusWaitDelivery && waybillModel.Status != model.WaybillStatusWaitTruck && waybillModel.Status != model.WaybillStatusWaitStorage {
  523. return errors.New(fmt.Sprintf("运单状态为%s,禁止删除", model.WaybillStatusMap[waybillModel.Status]))
  524. }
  525. db := tx.Delete(&waybillModel)
  526. if err = db.Error; err != nil {
  527. e.Log.Errorf("db error: %s", err)
  528. return global.DeleteFailedErr
  529. }
  530. if db.RowsAffected == 0 {
  531. return global.DeleteNotFoundOrNoPermissionErr
  532. }
  533. return nil
  534. }
  535. // TransferBox 运单转箱
  536. func (e *Waybill) TransferBox(c *dto.WaybillTransfer, p *actions.DataPermission) error {
  537. var err error
  538. tx := e.Orm.Begin()
  539. defer func() {
  540. if err != nil {
  541. tx.Rollback()
  542. } else {
  543. tx.Commit()
  544. }
  545. }()
  546. if c.OldCoolerBoxId == c.NewCoolerBoxId {
  547. return errors.New("转箱失败,新保温箱与旧保温箱相同")
  548. }
  549. //查询运单是否存在
  550. var waybillModel []model.Waybill
  551. err = tx.Scopes(actions.Permission(model.Waybill{}.TableName(), p)).Where("cooler_box_id = ?", c.OldCoolerBoxId).Where("status = ?", model.WaybillStatusVanning).Find(&waybillModel).Error
  552. if err != nil {
  553. e.Log.Errorf("该保温箱不存在订单%v %s", c.OldCoolerBoxId, err)
  554. return errors.New(fmt.Sprintf("该保温箱不存在订单%v", c.OldCoolerBoxId))
  555. }
  556. //查询coolerbox是否存在
  557. var coolerBox = model.CoolerBox{}
  558. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).Where("id = ?", c.NewCoolerBoxId).Where("status = ?", 2).First(&coolerBox).Error
  559. if err != nil {
  560. e.Log.Errorf("该保温箱不可使用: %s", err)
  561. return errors.New("该保温箱不可使用")
  562. }
  563. for i, _ := range waybillModel {
  564. waybillModel[i].CoolerBoxId = c.NewCoolerBoxId
  565. err = tx.Save(&waybillModel).Error
  566. if err != nil {
  567. e.Log.Errorf("转箱失败: %s", err)
  568. return errors.New("转箱失败")
  569. }
  570. //查询已装箱物流信息
  571. var logistics = model.WaybillLogistics{}
  572. var logis = model.WaybillLogistics{}
  573. err = tx.Scopes(actions.Permission(logistics.TableName(), p)).Where("waybill_no = ?", waybillModel[i].WaybillNo).Where("status = ?", model.WaybillStatusVanning).First(&logistics).Error
  574. if err != nil {
  575. e.Log.Errorf("db error: %s", err)
  576. return errors.New("获取物流信息失败")
  577. }
  578. //更新物流信息
  579. logis.CoolerBoxId = c.NewCoolerBoxId
  580. logis.Status = model.WaybillStatusVanning
  581. logis.WarehouseId = logistics.WarehouseId
  582. logis.CarId = logistics.CarId
  583. logis.UserId = logistics.UserId
  584. logis.Lng = logistics.Lng
  585. logis.Lat = logistics.Lat
  586. logis.Address = logistics.Address
  587. logis.CreateBy = logistics.CreateBy
  588. logis.UpdateBy = p.UserId
  589. logis.DeptId = logistics.DeptId
  590. logis.WaybillNo = logistics.WaybillNo
  591. err = tx.Create(&logis).Error
  592. if err != nil {
  593. e.Log.Errorf("db error: %s", err)
  594. return errors.New("更新物流信息失败")
  595. }
  596. var waybillTask = model.WaybillTask{}
  597. waybillTask.WaybillNo = logistics.WaybillNo
  598. waybillTask.UserId = logistics.UserId
  599. waybillTask.Sn = coolerBox.Sn
  600. waybillTask.StartTime = model2.Time(time.Now())
  601. waybillTask.DeptId = logistics.DeptId
  602. waybillTask.CoolerBoxId = c.NewCoolerBoxId
  603. err = tx.Create(&waybillTask).Error
  604. if err != nil {
  605. e.Log.Errorf("db error: %s", err)
  606. return errors.New("添加任务失败")
  607. }
  608. //更新旧保温箱结束时间
  609. err = tx.Model(model.WaybillTask{}).Where("waybill_no = ?", logistics.WaybillNo).Where("cooler_box_id = ?", c.OldCoolerBoxId).Update("end_time", model2.Time(time.Now())).Error
  610. if err != nil {
  611. e.Log.Errorf("db error: %s", err)
  612. return errors.New("更新运单任务失败")
  613. }
  614. }
  615. return nil
  616. }
  617. func (e *Waybill) WarehouseIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  618. var err error
  619. tx := e.Orm.Begin()
  620. defer func() {
  621. if err != nil {
  622. tx.Rollback()
  623. } else {
  624. tx.Commit()
  625. }
  626. }()
  627. // 查询仓库信息
  628. var warehouse = model.Warehouse{}
  629. // 查询运单是否存在
  630. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  631. Where("user_id = ?", p.UserId).
  632. First(&warehouse).Error
  633. if err != nil {
  634. e.Log.Errorf("db error: %s", err)
  635. return errors.New("获取仓库信息失败")
  636. }
  637. for _, waybillNo := range c.WaybillNoList {
  638. var waybillModel = model.Waybill{}
  639. // 查询运单是否存在
  640. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  641. Where("waybill_no = ?", waybillNo).
  642. First(&waybillModel).Error
  643. if err != nil {
  644. e.Log.Errorf("db error: %s", err)
  645. if errors.Is(err, gorm.ErrRecordNotFound) {
  646. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  647. }
  648. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  649. }
  650. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  651. continue
  652. }
  653. if waybillModel.WarehouseId != warehouse.Id && waybillModel.Status == model.WaybillStatusStorage {
  654. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  655. return err
  656. }
  657. if waybillModel.Status == model.WaybillStatusWaitTruck || waybillModel.Status == model.WaybillStatusWaitVanning {
  658. // 待装车
  659. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法入库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  660. return err
  661. }
  662. // 验证时间
  663. var logistics model.WaybillLogistics
  664. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  665. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  666. e.Log.Errorf("获取运单日志失败: %s", err)
  667. return err
  668. }
  669. if time.Time(logistics.CreatedAt).After(time.Time(c.StartTime)) {
  670. err = errors.New(fmt.Sprintf("运单号%s入库时间[%s]与上一阶段时间[%s]冲突,无法入库!", waybillNo, c.StartTime.String(), logistics.CreatedAt.String()))
  671. return err
  672. }
  673. var lng, lat string
  674. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  675. if err != nil {
  676. e.Log.Errorf("获取定位信息失败: %s", err)
  677. return err
  678. }
  679. // 如果上一个状态为装车,则自动下车
  680. if waybillModel.Status == model.WaybillStatusTruck {
  681. // 已装车
  682. var car model.Car
  683. err = e.Orm.First(&car, waybillModel.CarId).Error
  684. if err != nil {
  685. e.Log.Errorf("db error: %s", err)
  686. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  687. }
  688. // 添加物流
  689. Logistics := model.WaybillLogistics{
  690. WaybillNo: waybillNo,
  691. Status: model.WaybillStatusTruckOut,
  692. CarId: waybillModel.CarId,
  693. UserId: car.UserId,
  694. Lng: lng,
  695. Lat: lat,
  696. ControlBy: model2.ControlBy{
  697. CreateBy: p.UserId,
  698. },
  699. DeptBy: model2.DeptBy{
  700. DeptId: car.DeptId,
  701. },
  702. ModelTime: model2.ModelTime{
  703. CreatedAt: c.StartTime,
  704. },
  705. }
  706. err = tx.Create(&Logistics).Error
  707. if err != nil {
  708. e.Log.Errorf("db error: %s", err)
  709. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  710. }
  711. // 查询任务
  712. var task model.WaybillTask
  713. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, waybillModel.CarId).
  714. Last(&task).Error
  715. if err != nil {
  716. e.Log.Errorf("db error: %s", err)
  717. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  718. }
  719. task.EndTime = c.StartTime
  720. task.UpdateBy = p.UserId
  721. err = tx.Save(&task).Error
  722. if err != nil {
  723. e.Log.Errorf("db error: %s", err)
  724. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  725. }
  726. }
  727. // 如果上一个状态为装箱,则自动出箱
  728. if waybillModel.Status == model.WaybillStatusVanning {
  729. // 添加出箱物流记录
  730. Logistics := model.WaybillLogistics{
  731. WaybillNo: waybillNo,
  732. Status: model.WaybillStatusVanningOut,
  733. CoolerBoxId: waybillModel.CoolerBoxId,
  734. UserId: waybillModel.PrintUserId,
  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 cooler_box_id = ?", waybillNo, waybillModel.CoolerBoxId).
  755. Last(&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. if waybillModel.Status == model.WaybillStatusWaitStorage {
  769. waybillModel.DeliveryTime = c.StartTime
  770. }
  771. waybillModel.Status = model.WaybillStatusStorage
  772. waybillModel.WarehouseId = warehouse.Id
  773. err = tx.Save(&waybillModel).Error
  774. if err != nil {
  775. e.Log.Errorf("db error: %s", err)
  776. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  777. }
  778. // 添加物流
  779. Logistics := model.WaybillLogistics{
  780. WaybillNo: waybillNo,
  781. Status: model.WaybillStatusStorage,
  782. WarehouseId: warehouse.Id,
  783. UserId: p.UserId,
  784. Lng: lng,
  785. Lat: lat,
  786. ControlBy: model2.ControlBy{
  787. CreateBy: p.UserId,
  788. },
  789. DeptBy: model2.DeptBy{
  790. DeptId: p.DeptId,
  791. },
  792. ModelTime: model2.ModelTime{
  793. CreatedAt: c.StartTime,
  794. },
  795. }
  796. err = tx.Create(&Logistics).Error
  797. if err != nil {
  798. e.Log.Errorf("db error: %s", err)
  799. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  800. }
  801. // 添加任务
  802. task := model.WaybillTask{
  803. WaybillNo: waybillNo,
  804. WarehouseId: warehouse.Id,
  805. UserId: p.UserId,
  806. Sn: warehouse.Sn,
  807. StartTime: c.StartTime,
  808. ControlBy: model2.ControlBy{
  809. CreateBy: p.UserId,
  810. },
  811. DeptBy: model2.DeptBy{
  812. DeptId: p.DeptId,
  813. },
  814. }
  815. err = tx.Create(&task).Error
  816. if err != nil {
  817. e.Log.Errorf("db error: %s", err)
  818. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  819. }
  820. }
  821. return nil
  822. }
  823. func (e *Waybill) WarehouseOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  824. var err error
  825. tx := e.Orm.Begin()
  826. defer func() {
  827. if err != nil {
  828. tx.Rollback()
  829. } else {
  830. tx.Commit()
  831. }
  832. }()
  833. // 查询仓库信息
  834. var warehouse = model.Warehouse{}
  835. // 查询运单是否存在
  836. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  837. Where("user_id = ?", p.UserId).
  838. First(&warehouse).Error
  839. if err != nil {
  840. e.Log.Errorf("db error: %s", err)
  841. return errors.New("获取仓库信息失败")
  842. }
  843. for _, waybillNo := range c.WaybillNoList {
  844. var waybillModel = model.Waybill{}
  845. // 查询运单是否存在
  846. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  847. Where("waybill_no = ?", waybillNo).
  848. First(&waybillModel).Error
  849. if err != nil {
  850. e.Log.Errorf("db error: %s", err)
  851. if errors.Is(err, gorm.ErrRecordNotFound) {
  852. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  853. }
  854. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  855. }
  856. if waybillModel.WarehouseId != warehouse.Id {
  857. return errors.New("请选择正确仓库出库!")
  858. }
  859. if waybillModel.WarehouseId == warehouse.Id && waybillModel.Status == model.WaybillStatusStorageOut {
  860. continue
  861. }
  862. if waybillModel.Status != model.WaybillStatusStorage {
  863. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法出库!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  864. return err
  865. }
  866. waybillModel.Status = model.WaybillStatusStorageOut
  867. waybillModel.WarehouseId = warehouse.Id
  868. err = tx.Save(&waybillModel).Error
  869. if err != nil {
  870. e.Log.Errorf("db error: %s", err)
  871. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  872. }
  873. var lng, lat string
  874. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  875. if err != nil {
  876. e.Log.Errorf("获取定位信息失败: %s", err)
  877. return err
  878. }
  879. // 添加物流
  880. Logistics := model.WaybillLogistics{
  881. WaybillNo: waybillNo,
  882. Status: model.WaybillStatusStorageOut,
  883. WarehouseId: warehouse.Id,
  884. UserId: p.UserId,
  885. Lng: lng,
  886. Lat: lat,
  887. ControlBy: model2.ControlBy{
  888. CreateBy: p.UserId,
  889. },
  890. DeptBy: model2.DeptBy{
  891. DeptId: p.DeptId,
  892. },
  893. ModelTime: model2.ModelTime{
  894. CreatedAt: c.StartTime,
  895. },
  896. }
  897. err = tx.Create(&Logistics).Error
  898. if err != nil {
  899. e.Log.Errorf("db error: %s", err)
  900. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  901. }
  902. // 查询任务
  903. var task model.WaybillTask
  904. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, warehouse.Id).
  905. First(&task).Error
  906. if err != nil {
  907. e.Log.Errorf("db error: %s", err)
  908. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  909. }
  910. task.EndTime = c.StartTime
  911. task.UpdateBy = p.UserId
  912. err = tx.Save(&task).Error
  913. if err != nil {
  914. e.Log.Errorf("db error: %s", err)
  915. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  916. }
  917. }
  918. return nil
  919. }
  920. func (e *Waybill) CarIn(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  921. var err error
  922. tx := e.Orm.Begin()
  923. defer func() {
  924. if err != nil {
  925. tx.Rollback()
  926. } else {
  927. tx.Commit()
  928. }
  929. }()
  930. // 查询车辆信息
  931. var car = model.Car{}
  932. // 查询运单是否存在
  933. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  934. Where("user_id = ?", p.UserId).
  935. First(&car).Error
  936. if err != nil {
  937. e.Log.Errorf("获取车辆绑定信息失败: %s", err)
  938. return errors.New("获取车辆绑定信息失败")
  939. }
  940. for _, waybillNo := range c.WaybillNoList {
  941. var waybillModel = model.Waybill{}
  942. // 查询运单是否存在
  943. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  944. Where("waybill_no = ?", waybillNo).
  945. First(&waybillModel).Error
  946. if err != nil {
  947. e.Log.Errorf("运单号不存在: %s", err)
  948. if errors.Is(err, gorm.ErrRecordNotFound) {
  949. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  950. }
  951. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  952. }
  953. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruck {
  954. continue
  955. }
  956. if waybillModel.CarId != car.Id && waybillModel.Status == model.WaybillStatusTruck {
  957. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  958. return err
  959. }
  960. if waybillModel.Status == model.WaybillStatusWaitStorage || waybillModel.Status == model.WaybillStatusWaitVanning {
  961. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  962. return err
  963. }
  964. // 验证时间
  965. var logistics model.WaybillLogistics
  966. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  967. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  968. e.Log.Errorf("获取运单日志失败: %s", err)
  969. return err
  970. }
  971. if time.Time(logistics.CreatedAt).After(time.Time(c.StartTime)) {
  972. err = errors.New(fmt.Sprintf("运单号%s装车时间[%s]与上一阶段时间[%s]冲突,无法装车!", waybillNo, c.StartTime.String(), logistics.CreatedAt.String()))
  973. return err
  974. }
  975. if waybillModel.Status == model.WaybillStatusWaitTruck {
  976. waybillModel.DeliveryTime = c.StartTime
  977. }
  978. var lng, lat string
  979. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  980. if err != nil {
  981. e.Log.Errorf("获取定位信息失败: %s", err)
  982. return err
  983. }
  984. // 如果上一个状态为入库,则自动出库
  985. if waybillModel.Status == model.WaybillStatusStorage {
  986. var warehouse model.Warehouse
  987. err = e.Orm.First(&warehouse, waybillModel.WarehouseId).Error
  988. if err != nil {
  989. e.Log.Errorf("db error: %s", err)
  990. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  991. }
  992. // 添加物流
  993. Logistics := model.WaybillLogistics{
  994. WaybillNo: waybillNo,
  995. Status: model.WaybillStatusStorageOut,
  996. WarehouseId: waybillModel.WarehouseId,
  997. UserId: warehouse.UserId,
  998. Lng: lng,
  999. Lat: lat,
  1000. ControlBy: model2.ControlBy{
  1001. CreateBy: p.UserId,
  1002. },
  1003. DeptBy: model2.DeptBy{
  1004. DeptId: warehouse.DeptId,
  1005. },
  1006. ModelTime: model2.ModelTime{
  1007. CreatedAt: c.StartTime,
  1008. },
  1009. }
  1010. err = tx.Create(&Logistics).Error
  1011. if err != nil {
  1012. e.Log.Errorf("db error: %s", err)
  1013. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1014. }
  1015. // 查询任务
  1016. var task model.WaybillTask
  1017. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, waybillModel.WarehouseId).
  1018. Last(&task).Error
  1019. if err != nil {
  1020. e.Log.Errorf("db error: %s", err)
  1021. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1022. }
  1023. task.EndTime = c.StartTime
  1024. task.UpdateBy = p.UserId
  1025. err = tx.Save(&task).Error
  1026. if err != nil {
  1027. e.Log.Errorf("db error: %s", err)
  1028. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1029. }
  1030. }
  1031. // 如果上一个状态为装箱,则自动出箱
  1032. if waybillModel.Status == model.WaybillStatusVanning {
  1033. // 添加出箱物流记录
  1034. Logistics := model.WaybillLogistics{
  1035. WaybillNo: waybillNo,
  1036. Status: model.WaybillStatusVanningOut,
  1037. CoolerBoxId: waybillModel.CoolerBoxId,
  1038. UserId: waybillModel.PrintUserId,
  1039. Lng: lng,
  1040. Lat: lat,
  1041. ControlBy: model2.ControlBy{
  1042. CreateBy: p.UserId,
  1043. },
  1044. DeptBy: model2.DeptBy{
  1045. DeptId: p.DeptId,
  1046. },
  1047. ModelTime: model2.ModelTime{
  1048. CreatedAt: c.StartTime,
  1049. },
  1050. }
  1051. err = tx.Create(&Logistics).Error
  1052. if err != nil {
  1053. e.Log.Errorf("db error: %s", err)
  1054. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1055. }
  1056. // 查询任务
  1057. var task model.WaybillTask
  1058. err = tx.Model(&task).Where("waybill_no = ? and cooler_box_id = ?", waybillNo, waybillModel.CoolerBoxId).
  1059. Last(&task).Error
  1060. if err != nil {
  1061. e.Log.Errorf("db error: %s", err)
  1062. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1063. }
  1064. task.EndTime = c.StartTime
  1065. task.UpdateBy = p.UserId
  1066. err = tx.Save(&task).Error
  1067. if err != nil {
  1068. e.Log.Errorf("db error: %s", err)
  1069. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1070. }
  1071. }
  1072. waybillModel.Status = model.WaybillStatusTruck
  1073. waybillModel.CarId = car.Id
  1074. err = tx.Save(&waybillModel).Error
  1075. if err != nil {
  1076. e.Log.Errorf("db error: %s", err)
  1077. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1078. }
  1079. // 添加物流
  1080. Logistics := model.WaybillLogistics{
  1081. WaybillNo: waybillNo,
  1082. Status: model.WaybillStatusTruck,
  1083. CarId: car.Id,
  1084. UserId: p.UserId,
  1085. Lng: lng,
  1086. Lat: lat,
  1087. ControlBy: model2.ControlBy{
  1088. CreateBy: p.UserId,
  1089. },
  1090. DeptBy: model2.DeptBy{
  1091. DeptId: p.DeptId,
  1092. },
  1093. ModelTime: model2.ModelTime{
  1094. CreatedAt: c.StartTime,
  1095. },
  1096. }
  1097. err = tx.Create(&Logistics).Error
  1098. if err != nil {
  1099. e.Log.Errorf("db error: %s", err)
  1100. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1101. }
  1102. // 添加任务
  1103. task := model.WaybillTask{
  1104. WaybillNo: waybillNo,
  1105. CarId: car.Id,
  1106. UserId: p.UserId,
  1107. Sn: car.Sn,
  1108. StartTime: c.StartTime,
  1109. ControlBy: model2.ControlBy{
  1110. CreateBy: p.UserId,
  1111. },
  1112. DeptBy: model2.DeptBy{
  1113. DeptId: p.DeptId,
  1114. },
  1115. }
  1116. err = tx.Create(&task).Error
  1117. if err != nil {
  1118. e.Log.Errorf("db error: %s", err)
  1119. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1120. }
  1121. }
  1122. return nil
  1123. }
  1124. func (e *Waybill) CarOut(c *dto.WaybillInOutReq, p *actions.DataPermission) error {
  1125. var err error
  1126. tx := e.Orm.Begin()
  1127. defer func() {
  1128. if err != nil {
  1129. tx.Rollback()
  1130. } else {
  1131. tx.Commit()
  1132. }
  1133. }()
  1134. // 查询仓库信息
  1135. var car = model.Car{}
  1136. // 查询运单是否存在
  1137. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  1138. Where("user_id = ?", p.UserId).
  1139. First(&car).Error
  1140. if err != nil {
  1141. e.Log.Errorf("db error: %s", err)
  1142. return errors.New("获取车辆绑定信息失败")
  1143. }
  1144. for _, waybillNo := range c.WaybillNoList {
  1145. var waybillModel = model.Waybill{}
  1146. // 查询运单是否存在
  1147. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1148. Where("waybill_no = ?", waybillNo).
  1149. First(&waybillModel).Error
  1150. if err != nil {
  1151. e.Log.Errorf("db error: %s", err)
  1152. if errors.Is(err, gorm.ErrRecordNotFound) {
  1153. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  1154. }
  1155. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  1156. }
  1157. if waybillModel.CarId != car.Id {
  1158. return errors.New("请选择正确车辆下车!")
  1159. }
  1160. if waybillModel.CarId == car.Id && waybillModel.Status == model.WaybillStatusTruckOut {
  1161. continue
  1162. }
  1163. if waybillModel.Status != model.WaybillStatusTruck {
  1164. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法下车!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  1165. return err
  1166. }
  1167. waybillModel.Status = model.WaybillStatusTruckOut
  1168. waybillModel.CarId = car.Id
  1169. err = tx.Save(&waybillModel).Error
  1170. if err != nil {
  1171. e.Log.Errorf("db error: %s", err)
  1172. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1173. }
  1174. var lng, lat string
  1175. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  1176. if err != nil {
  1177. e.Log.Errorf("获取定位信息失败: %s", err)
  1178. return err
  1179. }
  1180. // 添加物流
  1181. Logistics := model.WaybillLogistics{
  1182. WaybillNo: waybillNo,
  1183. Status: model.WaybillStatusTruckOut,
  1184. CarId: car.Id,
  1185. UserId: p.UserId,
  1186. Lng: lng,
  1187. Lat: lat,
  1188. ControlBy: model2.ControlBy{
  1189. CreateBy: p.UserId,
  1190. },
  1191. DeptBy: model2.DeptBy{
  1192. DeptId: p.DeptId,
  1193. },
  1194. ModelTime: model2.ModelTime{
  1195. CreatedAt: c.StartTime,
  1196. },
  1197. }
  1198. err = tx.Create(&Logistics).Error
  1199. if err != nil {
  1200. e.Log.Errorf("db error: %s", err)
  1201. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1202. }
  1203. // 查询任务
  1204. var task model.WaybillTask
  1205. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, car.Id).
  1206. First(&task).Error
  1207. if err != nil {
  1208. e.Log.Errorf("db error: %s", err)
  1209. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1210. }
  1211. task.EndTime = c.StartTime
  1212. task.UpdateBy = p.UserId
  1213. err = tx.Save(&task).Error
  1214. if err != nil {
  1215. e.Log.Errorf("db error: %s", err)
  1216. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1217. }
  1218. }
  1219. return nil
  1220. }
  1221. func (e *Waybill) CoolerBoxIn(c *dto.WaybillCoolerBoxInReq, p *actions.DataPermission) error {
  1222. var err error
  1223. tx := e.Orm.Begin()
  1224. defer func() {
  1225. if err != nil {
  1226. tx.Rollback()
  1227. } else {
  1228. tx.Commit()
  1229. }
  1230. }()
  1231. for _, waybillNo := range c.WaybillNoList {
  1232. var waybillModel = model.Waybill{}
  1233. // 查询运单是否存在
  1234. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1235. Where("waybill_no = ?", waybillNo).
  1236. First(&waybillModel).Error
  1237. if err != nil {
  1238. e.Log.Errorf("db error: %s", err)
  1239. if errors.Is(err, gorm.ErrRecordNotFound) {
  1240. return errors.New(fmt.Sprintf("运单号%s不存在", waybillNo))
  1241. }
  1242. return errors.New(fmt.Sprintf("运单号%s查询失败", waybillNo))
  1243. }
  1244. if waybillModel.Status != model.WaybillStatusWaitVanning &&
  1245. waybillModel.Status != model.WaybillStatusStorage &&
  1246. waybillModel.Status != model.WaybillStatusTruck {
  1247. if !(waybillModel.Status == model.WaybillStatusVanning && waybillModel.PrintUserId != p.UserId) {
  1248. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法装箱!", waybillNo, model.WaybillStatusMap[waybillModel.Status]))
  1249. return err
  1250. }
  1251. }
  1252. // 查询保温箱信息 有可能先装车再装箱 所以需要选保温箱
  1253. var coolerBox = model.CoolerBox{}
  1254. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  1255. Where("id = ?", c.CoolerBoxId).
  1256. First(&coolerBox).Error
  1257. if err != nil {
  1258. e.Log.Errorf("db error: %s", err)
  1259. return errors.New("获取保温箱信息失败")
  1260. }
  1261. if waybillModel.CoolerBoxId > 0 && waybillModel.CoolerBoxId != c.CoolerBoxId {
  1262. // 扫码装箱 派单的保温箱与当前保温箱不一致
  1263. err = tx.Model(&waybillModel).Where("waybill_no = ?", waybillNo).
  1264. Updates(map[string]interface{}{
  1265. "cooler_box_id": c.CoolerBoxId,
  1266. "print_user_id": p.UserId,
  1267. }).Error
  1268. if err != nil {
  1269. e.Log.Errorf("db error: %s", err)
  1270. return errors.New("修改运单关联保温箱失败")
  1271. }
  1272. }
  1273. // 验证时间
  1274. var logistics model.WaybillLogistics
  1275. err = e.Orm.Where("waybill_no = ?", waybillNo).Last(&logistics).Error
  1276. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  1277. e.Log.Errorf("获取运单日志失败: %s", err)
  1278. return err
  1279. }
  1280. var lng, lat string
  1281. lng, lat, err = e.GetSite(p.DeptId, coolerBox.Sn, c.StartTime.String())
  1282. if err != nil {
  1283. e.Log.Errorf("获取定位信息失败: %s", err)
  1284. return err
  1285. }
  1286. // 如果上一个状态为已装车,则自动下车
  1287. if waybillModel.Status == model.WaybillStatusTruck {
  1288. // 已装车
  1289. var car model.Car
  1290. err = e.Orm.First(&car, waybillModel.CarId).Error
  1291. if err != nil {
  1292. e.Log.Errorf("db error: %s", err)
  1293. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  1294. }
  1295. // 添加物流
  1296. Logistics := model.WaybillLogistics{
  1297. WaybillNo: waybillNo,
  1298. Status: model.WaybillStatusTruckOut,
  1299. CarId: waybillModel.CarId,
  1300. UserId: car.UserId,
  1301. Lng: lng,
  1302. Lat: lat,
  1303. ControlBy: model2.ControlBy{
  1304. CreateBy: p.UserId,
  1305. },
  1306. DeptBy: model2.DeptBy{
  1307. DeptId: car.DeptId,
  1308. },
  1309. ModelTime: model2.ModelTime{
  1310. CreatedAt: c.StartTime,
  1311. },
  1312. }
  1313. err = tx.Create(&Logistics).Error
  1314. if err != nil {
  1315. e.Log.Errorf("db error: %s", err)
  1316. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1317. }
  1318. // 查询任务
  1319. var task model.WaybillTask
  1320. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", waybillNo, waybillModel.CarId).
  1321. Last(&task).Error
  1322. if err != nil {
  1323. e.Log.Errorf("db error: %s", err)
  1324. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1325. }
  1326. task.EndTime = c.StartTime
  1327. task.UpdateBy = p.UserId
  1328. err = tx.Save(&task).Error
  1329. if err != nil {
  1330. e.Log.Errorf("db error: %s", err)
  1331. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1332. }
  1333. }
  1334. // 如果上一个状态为入库,则自动出库
  1335. if waybillModel.Status == model.WaybillStatusStorage {
  1336. var warehouse model.Warehouse
  1337. err = e.Orm.First(&warehouse, waybillModel.WarehouseId).Error
  1338. if err != nil {
  1339. e.Log.Errorf("db error: %s", err)
  1340. return errors.New(fmt.Sprintf("查询仓库信息失败:%s", err))
  1341. }
  1342. // 添加物流
  1343. Logistics := model.WaybillLogistics{
  1344. WaybillNo: waybillNo,
  1345. Status: model.WaybillStatusStorageOut,
  1346. WarehouseId: waybillModel.WarehouseId,
  1347. UserId: warehouse.UserId,
  1348. Lng: lng,
  1349. Lat: lat,
  1350. ControlBy: model2.ControlBy{
  1351. CreateBy: p.UserId,
  1352. },
  1353. DeptBy: model2.DeptBy{
  1354. DeptId: warehouse.DeptId,
  1355. },
  1356. ModelTime: model2.ModelTime{
  1357. CreatedAt: c.StartTime,
  1358. },
  1359. }
  1360. err = tx.Create(&Logistics).Error
  1361. if err != nil {
  1362. e.Log.Errorf("db error: %s", err)
  1363. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1364. }
  1365. // 查询任务
  1366. var task model.WaybillTask
  1367. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", waybillNo, waybillModel.WarehouseId).
  1368. Last(&task).Error
  1369. if err != nil {
  1370. e.Log.Errorf("db error: %s", err)
  1371. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1372. }
  1373. task.EndTime = c.StartTime
  1374. task.UpdateBy = p.UserId
  1375. err = tx.Save(&task).Error
  1376. if err != nil {
  1377. e.Log.Errorf("db error: %s", err)
  1378. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1379. }
  1380. }
  1381. // 如果上一个状态为装箱,则自动出箱
  1382. if waybillModel.Status == model.WaybillStatusVanning {
  1383. // 添加出箱物流记录
  1384. Logistics := model.WaybillLogistics{
  1385. WaybillNo: waybillNo,
  1386. Status: model.WaybillStatusVanningOut,
  1387. CoolerBoxId: waybillModel.CoolerBoxId,
  1388. UserId: waybillModel.PrintUserId,
  1389. Lng: lng,
  1390. Lat: lat,
  1391. ControlBy: model2.ControlBy{
  1392. CreateBy: p.UserId,
  1393. },
  1394. DeptBy: model2.DeptBy{
  1395. DeptId: p.DeptId,
  1396. },
  1397. ModelTime: model2.ModelTime{
  1398. CreatedAt: c.StartTime,
  1399. },
  1400. }
  1401. err = tx.Create(&Logistics).Error
  1402. if err != nil {
  1403. e.Log.Errorf("db error: %s", err)
  1404. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1405. }
  1406. // 查询任务
  1407. var task model.WaybillTask
  1408. err = tx.Model(&task).Where("waybill_no = ? and cooler_box_id = ?", waybillNo, waybillModel.CoolerBoxId).
  1409. Last(&task).Error
  1410. if err != nil {
  1411. e.Log.Errorf("db error: %s", err)
  1412. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1413. }
  1414. task.EndTime = c.StartTime
  1415. task.UpdateBy = p.UserId
  1416. err = tx.Save(&task).Error
  1417. if err != nil {
  1418. e.Log.Errorf("db error: %s", err)
  1419. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1420. }
  1421. }
  1422. waybillModel.Status = model.WaybillStatusVanning
  1423. waybillModel.CoolerBoxId = coolerBox.Id
  1424. waybillModel.DeliveryTime = c.StartTime
  1425. err = tx.Save(&waybillModel).Error
  1426. if err != nil {
  1427. e.Log.Errorf("db error: %s", err)
  1428. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1429. }
  1430. // 添加物流
  1431. Logistics := model.WaybillLogistics{
  1432. WaybillNo: waybillNo,
  1433. Status: model.WaybillStatusVanning,
  1434. CoolerBoxId: coolerBox.Id,
  1435. UserId: p.UserId,
  1436. Lng: lng,
  1437. Lat: lat,
  1438. ControlBy: model2.ControlBy{
  1439. CreateBy: p.UserId,
  1440. },
  1441. DeptBy: model2.DeptBy{
  1442. DeptId: p.DeptId,
  1443. },
  1444. ModelTime: model2.ModelTime{
  1445. CreatedAt: c.StartTime,
  1446. },
  1447. }
  1448. err = tx.Create(&Logistics).Error
  1449. if err != nil {
  1450. e.Log.Errorf("db error: %s", err)
  1451. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1452. }
  1453. // 添加任务
  1454. task := model.WaybillTask{
  1455. WaybillNo: waybillNo,
  1456. CoolerBoxId: coolerBox.Id,
  1457. UserId: p.UserId,
  1458. Sn: coolerBox.Sn,
  1459. StartTime: c.StartTime,
  1460. ControlBy: model2.ControlBy{
  1461. CreateBy: p.UserId,
  1462. },
  1463. DeptBy: model2.DeptBy{
  1464. DeptId: p.DeptId,
  1465. },
  1466. }
  1467. err = tx.Create(&task).Error
  1468. if err != nil {
  1469. e.Log.Errorf("db error: %s", err)
  1470. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1471. }
  1472. }
  1473. return nil
  1474. }
  1475. func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) error {
  1476. var err error
  1477. tx := e.Orm.Begin()
  1478. defer func() {
  1479. if err != nil {
  1480. tx.Rollback()
  1481. } else {
  1482. tx.Commit()
  1483. }
  1484. }()
  1485. var waybillModel = model.Waybill{}
  1486. // 查询运单是否存在
  1487. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1488. Where("waybill_no = ?", c.WaybillNo).
  1489. First(&waybillModel).Error
  1490. if err != nil {
  1491. e.Log.Errorf("db error: %s", err)
  1492. if errors.Is(err, gorm.ErrRecordNotFound) {
  1493. return errors.New(fmt.Sprintf("运单号%s不存在", c.WaybillNo))
  1494. }
  1495. return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
  1496. }
  1497. if waybillModel.Status == model.WaybillStatusReceipt {
  1498. return nil
  1499. }
  1500. if waybillModel.Status == model.WaybillStatusWaitDelivery ||
  1501. waybillModel.Status == model.WaybillStatusWaitTruck ||
  1502. waybillModel.Status == model.WaybillStatusWaitStorage ||
  1503. waybillModel.Status == model.WaybillStatusWaitVanning {
  1504. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法签收!", c.WaybillNo, model.WaybillStatusMap[waybillModel.Status]))
  1505. return err
  1506. }
  1507. // 保温箱配送 不需要中转
  1508. if waybillModel.Status == model.WaybillStatusVanning || waybillModel.Status == model.WaybillStatusVanningOut {
  1509. // 查询保温箱信息
  1510. var coolerBox = model.CoolerBox{}
  1511. // 查询保温箱是否存在
  1512. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  1513. Where("id = ?", waybillModel.CoolerBoxId).
  1514. First(&coolerBox).Error
  1515. if err != nil {
  1516. e.Log.Errorf("db error: %s", err)
  1517. return errors.New("获取保温箱信息失败")
  1518. }
  1519. waybillModel.Status = model.WaybillStatusReceipt
  1520. waybillModel.CoolerBoxId = coolerBox.Id
  1521. waybillModel.ReceiptTime = c.StartTime
  1522. waybillModel.ReceiptImg = c.ReceiptImg
  1523. err = tx.Save(&waybillModel).Error
  1524. if err != nil {
  1525. e.Log.Errorf("db error: %s", err)
  1526. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1527. }
  1528. var lng, lat string
  1529. lng, lat, err = e.GetSite(p.DeptId, coolerBox.Sn, c.StartTime.String())
  1530. if err != nil {
  1531. e.Log.Errorf("获取定位信息失败: %s", err)
  1532. return err
  1533. }
  1534. // 查询任务
  1535. var task model.WaybillTask
  1536. err = tx.Model(&task).Where("waybill_no = ? and cooler_box_id = ?", c.WaybillNo, coolerBox.Id).
  1537. Last(&task).Error
  1538. if err != nil {
  1539. e.Log.Errorf("db error: %s", err)
  1540. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1541. }
  1542. // 未出箱 直接点签收
  1543. if time.Time(task.EndTime).IsZero() {
  1544. task.EndTime = c.StartTime
  1545. task.UpdateBy = p.UserId
  1546. err = tx.Save(&task).Error
  1547. if err != nil {
  1548. e.Log.Errorf("db error: %s", err)
  1549. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1550. }
  1551. // 添加下车物流记录
  1552. Logistics := model.WaybillLogistics{
  1553. WaybillNo: c.WaybillNo,
  1554. Status: model.WaybillStatusVanningOut,
  1555. CoolerBoxId: coolerBox.Id,
  1556. UserId: p.UserId,
  1557. Lng: lng,
  1558. Lat: lat,
  1559. ControlBy: model2.ControlBy{
  1560. CreateBy: p.UserId,
  1561. },
  1562. DeptBy: model2.DeptBy{
  1563. DeptId: p.DeptId,
  1564. },
  1565. ModelTime: model2.ModelTime{
  1566. CreatedAt: c.StartTime,
  1567. },
  1568. }
  1569. err = tx.Create(&Logistics).Error
  1570. if err != nil {
  1571. e.Log.Errorf("db error: %s", err)
  1572. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1573. }
  1574. }
  1575. // 添加签收记录
  1576. Logistics := model.WaybillLogistics{
  1577. WaybillNo: c.WaybillNo,
  1578. Status: model.WaybillStatusReceipt,
  1579. CoolerBoxId: coolerBox.Id,
  1580. UserId: waybillModel.PrintUserId,
  1581. Lng: lng,
  1582. Lat: lat,
  1583. ControlBy: model2.ControlBy{
  1584. CreateBy: p.UserId,
  1585. },
  1586. DeptBy: model2.DeptBy{
  1587. DeptId: p.DeptId,
  1588. },
  1589. ModelTime: model2.ModelTime{
  1590. CreatedAt: c.StartTime,
  1591. },
  1592. }
  1593. err = tx.Create(&Logistics).Error
  1594. if err != nil {
  1595. e.Log.Errorf("db error: %s", err)
  1596. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1597. }
  1598. return nil
  1599. }
  1600. if waybillModel.Status == model.WaybillStatusTruck || waybillModel.Status == model.WaybillStatusTruckOut {
  1601. // 查询车辆信息
  1602. var car = model.Car{}
  1603. // 查询运单是否存在
  1604. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  1605. Where("user_id = ?", p.UserId).
  1606. First(&car).Error
  1607. if err != nil {
  1608. e.Log.Errorf("db error: %s", err)
  1609. return errors.New("获取车辆信息失败")
  1610. }
  1611. waybillModel.Status = model.WaybillStatusReceipt
  1612. waybillModel.CarId = car.Id
  1613. waybillModel.ReceiptTime = c.StartTime
  1614. waybillModel.ReceiptImg = c.ReceiptImg
  1615. err = tx.Save(&waybillModel).Error
  1616. if err != nil {
  1617. e.Log.Errorf("db error: %s", err)
  1618. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1619. }
  1620. var lng, lat string
  1621. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  1622. if err != nil {
  1623. e.Log.Errorf("获取定位信息失败: %s", err)
  1624. return err
  1625. }
  1626. // 查询任务
  1627. var task model.WaybillTask
  1628. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", c.WaybillNo, car.Id).
  1629. Last(&task).Error
  1630. if err != nil {
  1631. e.Log.Errorf("db error: %s", err)
  1632. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1633. }
  1634. // 未下车 直接点签收
  1635. if time.Time(task.EndTime).IsZero() {
  1636. task.EndTime = c.StartTime
  1637. task.UpdateBy = p.UserId
  1638. err = tx.Save(&task).Error
  1639. if err != nil {
  1640. e.Log.Errorf("db error: %s", err)
  1641. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1642. }
  1643. // 添加下车物流记录
  1644. Logistics := model.WaybillLogistics{
  1645. WaybillNo: c.WaybillNo,
  1646. Status: model.WaybillStatusTruckOut,
  1647. CarId: car.Id,
  1648. UserId: p.UserId,
  1649. Lng: lng,
  1650. Lat: lat,
  1651. ControlBy: model2.ControlBy{
  1652. CreateBy: p.UserId,
  1653. },
  1654. DeptBy: model2.DeptBy{
  1655. DeptId: p.DeptId,
  1656. },
  1657. ModelTime: model2.ModelTime{
  1658. CreatedAt: c.StartTime,
  1659. },
  1660. }
  1661. err = tx.Create(&Logistics).Error
  1662. if err != nil {
  1663. e.Log.Errorf("db error: %s", err)
  1664. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1665. }
  1666. }
  1667. // 添加签收记录
  1668. Logistics := model.WaybillLogistics{
  1669. WaybillNo: c.WaybillNo,
  1670. Status: model.WaybillStatusReceipt,
  1671. CarId: car.Id,
  1672. UserId: p.UserId,
  1673. Lng: lng,
  1674. Lat: lat,
  1675. ControlBy: model2.ControlBy{
  1676. CreateBy: p.UserId,
  1677. },
  1678. DeptBy: model2.DeptBy{
  1679. DeptId: p.DeptId,
  1680. },
  1681. ModelTime: model2.ModelTime{
  1682. CreatedAt: c.StartTime,
  1683. },
  1684. }
  1685. err = tx.Create(&Logistics).Error
  1686. if err != nil {
  1687. e.Log.Errorf("db error: %s", err)
  1688. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1689. }
  1690. }
  1691. if waybillModel.Status == model.WaybillStatusStorage || waybillModel.Status == model.WaybillStatusStorageOut {
  1692. // 查询车辆信息
  1693. var warehouse model.Warehouse
  1694. // 查询运单是否存在
  1695. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  1696. Where("user_id = ?", p.UserId).
  1697. First(&warehouse).Error
  1698. if err != nil {
  1699. e.Log.Errorf("db error: %s", err)
  1700. return errors.New("获取仓库信息失败")
  1701. }
  1702. waybillModel.Status = model.WaybillStatusReceipt
  1703. waybillModel.WarehouseId = warehouse.Id
  1704. waybillModel.ReceiptTime = c.StartTime
  1705. waybillModel.ReceiptImg = c.ReceiptImg
  1706. err = tx.Save(&waybillModel).Error
  1707. if err != nil {
  1708. e.Log.Errorf("db error: %s", err)
  1709. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1710. }
  1711. var lng, lat string
  1712. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  1713. if err != nil {
  1714. e.Log.Errorf("获取定位信息失败: %s", err)
  1715. return err
  1716. }
  1717. // 查询任务
  1718. var task model.WaybillTask
  1719. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", c.WaybillNo, warehouse.Id).
  1720. Last(&task).Error
  1721. if err != nil {
  1722. e.Log.Errorf("db error: %s", err)
  1723. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1724. }
  1725. // 未出库 直接点签收
  1726. if time.Time(task.EndTime).IsZero() {
  1727. task.EndTime = c.StartTime
  1728. task.UpdateBy = p.UserId
  1729. err = tx.Save(&task).Error
  1730. if err != nil {
  1731. e.Log.Errorf("db error: %s", err)
  1732. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1733. }
  1734. // 添加下车物流记录
  1735. Logistics := model.WaybillLogistics{
  1736. WaybillNo: c.WaybillNo,
  1737. Status: model.WaybillStatusTruckOut,
  1738. WarehouseId: warehouse.Id,
  1739. UserId: p.UserId,
  1740. Lng: lng,
  1741. Lat: lat,
  1742. ControlBy: model2.ControlBy{
  1743. CreateBy: p.UserId,
  1744. },
  1745. DeptBy: model2.DeptBy{
  1746. DeptId: p.DeptId,
  1747. },
  1748. ModelTime: model2.ModelTime{
  1749. CreatedAt: c.StartTime,
  1750. },
  1751. }
  1752. err = tx.Create(&Logistics).Error
  1753. if err != nil {
  1754. e.Log.Errorf("db error: %s", err)
  1755. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1756. }
  1757. }
  1758. // 添加签收记录
  1759. Logistics := model.WaybillLogistics{
  1760. WaybillNo: c.WaybillNo,
  1761. Status: model.WaybillStatusReceipt,
  1762. WarehouseId: warehouse.Id,
  1763. UserId: p.UserId,
  1764. Lng: lng,
  1765. Lat: lat,
  1766. ControlBy: model2.ControlBy{
  1767. CreateBy: p.UserId,
  1768. },
  1769. DeptBy: model2.DeptBy{
  1770. DeptId: p.DeptId,
  1771. },
  1772. ModelTime: model2.ModelTime{
  1773. CreatedAt: c.StartTime,
  1774. },
  1775. }
  1776. err = tx.Create(&Logistics).Error
  1777. if err != nil {
  1778. e.Log.Errorf("db error: %s", err)
  1779. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1780. }
  1781. }
  1782. return nil
  1783. }
  1784. // 停止记录
  1785. func (e *Waybill) StopRecord(c *dto.WaybillStopRecordReq, p *actions.DataPermission) error {
  1786. var err error
  1787. tx := e.Orm.Begin()
  1788. defer func() {
  1789. if err != nil {
  1790. tx.Rollback()
  1791. } else {
  1792. tx.Commit()
  1793. }
  1794. }()
  1795. var waybillModel = model.Waybill{}
  1796. // 查询运单是否存在
  1797. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1798. Where("waybill_no = ?", c.WaybillNo).
  1799. First(&waybillModel).Error
  1800. if err != nil {
  1801. e.Log.Errorf("db error: %s", err)
  1802. if errors.Is(err, gorm.ErrRecordNotFound) {
  1803. return errors.New(fmt.Sprintf("运单号%s不存在", c.WaybillNo))
  1804. }
  1805. return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
  1806. }
  1807. if waybillModel.Status == model.WaybillStatusTruckOut ||
  1808. waybillModel.Status == model.WaybillStatusStorageOut ||
  1809. waybillModel.Status == model.WaybillStatusVanningOut {
  1810. return nil
  1811. }
  1812. if waybillModel.Status == model.WaybillStatusWaitDelivery ||
  1813. waybillModel.Status == model.WaybillStatusWaitTruck ||
  1814. waybillModel.Status == model.WaybillStatusWaitStorage ||
  1815. waybillModel.Status == model.WaybillStatusWaitVanning {
  1816. err = errors.New(fmt.Sprintf("运单号%s状态为%s,无法停止记录!", c.WaybillNo, model.WaybillStatusMap[waybillModel.Status]))
  1817. return err
  1818. }
  1819. if waybillModel.Status == model.WaybillStatusVanning {
  1820. // 查询保温箱信息
  1821. var coolerBox = model.CoolerBox{}
  1822. // 查询保温箱是否存在
  1823. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  1824. Where("id = ?", waybillModel.CoolerBoxId).
  1825. First(&coolerBox).Error
  1826. if err != nil {
  1827. e.Log.Errorf("db error: %s", err)
  1828. return errors.New("获取保温箱信息失败")
  1829. }
  1830. waybillModel.Status = model.WaybillStatusVanningOut
  1831. err = tx.Save(&waybillModel).Error
  1832. if err != nil {
  1833. e.Log.Errorf("db error: %s", err)
  1834. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1835. }
  1836. var lng, lat string
  1837. lng, lat, err = e.GetSite(p.DeptId, coolerBox.Sn, c.StartTime.String())
  1838. if err != nil {
  1839. e.Log.Errorf("获取定位信息失败: %s", err)
  1840. return err
  1841. }
  1842. // 查询任务
  1843. var task model.WaybillTask
  1844. err = tx.Model(&task).Where("waybill_no = ? and cooler_box_id = ?", c.WaybillNo, coolerBox.Id).
  1845. Last(&task).Error
  1846. if err != nil {
  1847. e.Log.Errorf("db error: %s", err)
  1848. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1849. }
  1850. if task.StartTime.Local().After(c.StartTime.Local()) {
  1851. return errors.New(fmt.Sprintf("停止时间不能早于任务开始时间%s", task.StartTime.String()))
  1852. }
  1853. // 未出箱 停止记录
  1854. if time.Time(task.EndTime).IsZero() {
  1855. task.EndTime = c.StartTime
  1856. task.UpdateBy = p.UserId
  1857. err = tx.Save(&task).Error
  1858. if err != nil {
  1859. e.Log.Errorf("db error: %s", err)
  1860. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1861. }
  1862. // 添加下车物流记录
  1863. Logistics := model.WaybillLogistics{
  1864. WaybillNo: c.WaybillNo,
  1865. Status: model.WaybillStatusVanningOut,
  1866. CoolerBoxId: coolerBox.Id,
  1867. UserId: p.UserId,
  1868. Lng: lng,
  1869. Lat: lat,
  1870. ControlBy: model2.ControlBy{
  1871. CreateBy: p.UserId,
  1872. },
  1873. DeptBy: model2.DeptBy{
  1874. DeptId: p.DeptId,
  1875. },
  1876. ModelTime: model2.ModelTime{
  1877. CreatedAt: c.StartTime,
  1878. },
  1879. }
  1880. err = tx.Create(&Logistics).Error
  1881. if err != nil {
  1882. e.Log.Errorf("db error: %s", err)
  1883. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1884. }
  1885. }
  1886. return nil
  1887. }
  1888. if waybillModel.Status == model.WaybillStatusTruck {
  1889. // 查询车辆信息
  1890. var car = model.Car{}
  1891. // 查询运单是否存在
  1892. err = tx.Scopes(actions.Permission(car.TableName(), p)).
  1893. Where("user_id = ?", p.UserId).
  1894. First(&car).Error
  1895. if err != nil {
  1896. e.Log.Errorf("db error: %s", err)
  1897. return errors.New("获取车辆信息失败")
  1898. }
  1899. waybillModel.Status = model.WaybillStatusTruckOut
  1900. err = tx.Save(&waybillModel).Error
  1901. if err != nil {
  1902. e.Log.Errorf("db error: %s", err)
  1903. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1904. }
  1905. var lng, lat string
  1906. lng, lat, err = e.GetSite(p.DeptId, car.Sn, c.StartTime.String())
  1907. if err != nil {
  1908. e.Log.Errorf("获取定位信息失败: %s", err)
  1909. return err
  1910. }
  1911. // 查询任务
  1912. var task model.WaybillTask
  1913. err = tx.Model(&task).Where("waybill_no = ? and car_id = ?", c.WaybillNo, car.Id).
  1914. Last(&task).Error
  1915. if err != nil {
  1916. e.Log.Errorf("db error: %s", err)
  1917. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1918. }
  1919. if task.StartTime.Local().After(c.StartTime.Local()) {
  1920. return errors.New(fmt.Sprintf("停止时间不能早于任务开始时间%s", task.StartTime.String()))
  1921. }
  1922. // 未下车 停止记录
  1923. if time.Time(task.EndTime).IsZero() {
  1924. task.EndTime = c.StartTime
  1925. task.UpdateBy = p.UserId
  1926. err = tx.Save(&task).Error
  1927. if err != nil {
  1928. e.Log.Errorf("db error: %s", err)
  1929. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1930. }
  1931. // 添加下车物流记录
  1932. Logistics := model.WaybillLogistics{
  1933. WaybillNo: c.WaybillNo,
  1934. Status: model.WaybillStatusTruckOut,
  1935. CarId: car.Id,
  1936. UserId: p.UserId,
  1937. Lng: lng,
  1938. Lat: lat,
  1939. ControlBy: model2.ControlBy{
  1940. CreateBy: p.UserId,
  1941. },
  1942. DeptBy: model2.DeptBy{
  1943. DeptId: p.DeptId,
  1944. },
  1945. ModelTime: model2.ModelTime{
  1946. CreatedAt: c.StartTime,
  1947. },
  1948. }
  1949. err = tx.Create(&Logistics).Error
  1950. if err != nil {
  1951. e.Log.Errorf("db error: %s", err)
  1952. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1953. }
  1954. }
  1955. }
  1956. if waybillModel.Status == model.WaybillStatusStorage {
  1957. // 查询车辆信息
  1958. var warehouse model.Warehouse
  1959. // 查询运单是否存在
  1960. err = tx.Scopes(actions.Permission(warehouse.TableName(), p)).
  1961. Where("user_id = ?", p.UserId).
  1962. First(&warehouse).Error
  1963. if err != nil {
  1964. e.Log.Errorf("db error: %s", err)
  1965. return errors.New("获取仓库信息失败")
  1966. }
  1967. waybillModel.Status = model.WaybillStatusStorageOut
  1968. err = tx.Save(&waybillModel).Error
  1969. if err != nil {
  1970. e.Log.Errorf("db error: %s", err)
  1971. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  1972. }
  1973. var lng, lat string
  1974. lng, lat, err = e.GetSite(p.DeptId, warehouse.Sn, c.StartTime.String())
  1975. if err != nil {
  1976. e.Log.Errorf("获取定位信息失败: %s", err)
  1977. return err
  1978. }
  1979. // 查询任务
  1980. var task model.WaybillTask
  1981. err = tx.Model(&task).Where("waybill_no = ? and warehouse_id = ?", c.WaybillNo, warehouse.Id).
  1982. Last(&task).Error
  1983. if err != nil {
  1984. e.Log.Errorf("db error: %s", err)
  1985. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1986. }
  1987. if task.StartTime.Local().After(c.StartTime.Local()) {
  1988. return errors.New(fmt.Sprintf("停止时间不能早于任务开始时间%s", task.StartTime.String()))
  1989. }
  1990. // 未出库 停止记录
  1991. if time.Time(task.EndTime).IsZero() {
  1992. task.EndTime = c.StartTime
  1993. task.UpdateBy = p.UserId
  1994. err = tx.Save(&task).Error
  1995. if err != nil {
  1996. e.Log.Errorf("db error: %s", err)
  1997. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1998. }
  1999. // 添加下车物流记录
  2000. Logistics := model.WaybillLogistics{
  2001. WaybillNo: c.WaybillNo,
  2002. Status: model.WaybillStatusTruckOut,
  2003. WarehouseId: warehouse.Id,
  2004. UserId: p.UserId,
  2005. Lng: lng,
  2006. Lat: lat,
  2007. ControlBy: model2.ControlBy{
  2008. CreateBy: p.UserId,
  2009. },
  2010. DeptBy: model2.DeptBy{
  2011. DeptId: p.DeptId,
  2012. },
  2013. ModelTime: model2.ModelTime{
  2014. CreatedAt: c.StartTime,
  2015. },
  2016. }
  2017. err = tx.Create(&Logistics).Error
  2018. if err != nil {
  2019. e.Log.Errorf("db error: %s", err)
  2020. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  2021. }
  2022. }
  2023. }
  2024. return nil
  2025. }
  2026. // 获取入库 出库 上车 下车 定位信息
  2027. func (e *Waybill) GetSite(companyId int, sn string, time string) (lng, lat string, err error) {
  2028. // 获取公司秘钥
  2029. var company model.SysDept
  2030. company, err = model.GetCompanyById(companyId)
  2031. if err != nil {
  2032. e.Log.Errorf("db error: %s", err)
  2033. return lng, lat, model.GetCompanyKeyErr
  2034. }
  2035. // 获取传感器信息
  2036. var deviceSensorList = []nats_server.DeviceSensor_R{}
  2037. var count int64
  2038. deviceSensorList, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(sn, company.ColdKey)
  2039. if err != nil || count == 0 {
  2040. err = errors.New("查询设备定位信息失败")
  2041. return lng, lat, err
  2042. }
  2043. var deviceData nats_server.DeviceData_
  2044. deviceData, err = nats_server.Cold_ReadDeviceDataBy_T_snid_T_time(deviceSensorList[0].T_sn, deviceSensorList[0].T_id, time)
  2045. if err != nil {
  2046. err = errors.New("查询设备定位信息失败")
  2047. return lng, lat, err
  2048. }
  2049. if len(deviceData.T_site) > 0 {
  2050. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  2051. if len(site) == 2 {
  2052. lng = site[0]
  2053. lat = site[1]
  2054. }
  2055. }
  2056. return lng, lat, nil
  2057. }
  2058. // 获取今日运单数 未派单 未装车 未入库 运送中
  2059. // 本月运单总数 上月运单总数 本年运单总数 上年运单总数
  2060. func (e *Waybill) GetBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission) dto.WaybillStatsRes {
  2061. var res dto.WaybillStatsRes
  2062. var data model.Waybill
  2063. type DateCount struct {
  2064. Date string
  2065. Count int64
  2066. }
  2067. yearCount := make([]DateCount, 0)
  2068. monthCount := make([]DateCount, 0)
  2069. now := time.Now()
  2070. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  2071. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  2072. // 获取上个月第一天
  2073. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  2074. // 获取去年的第一天
  2075. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  2076. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  2077. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  2078. // 今日总运单数
  2079. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  2080. // 待派单
  2081. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  2082. // 未装车
  2083. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitTruck).Count(&res.WaitTruckNum)
  2084. // 未入库
  2085. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitStorage).Count(&res.WaitStorageNum)
  2086. // 未装箱
  2087. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitVanning).Count(&res.WaitVanningNum)
  2088. // 配送中
  2089. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status in (?)",
  2090. []int{model.WaybillStatusTruck, model.WaybillStatusStorage,
  2091. model.WaybillStatusTruckOut, model.WaybillStatusStorageOut,
  2092. model.WaybillStatusVanning, model.WaybillStatusVanningOut,
  2093. }).Count(&res.InDeliveryNum)
  2094. // 获取本月,上月数据
  2095. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  2096. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  2097. for _, month := range monthCount {
  2098. if month.Date == now.Format("200601") {
  2099. res.ThisMonthNum = month.Count
  2100. }
  2101. if month.Date == firstDayOfLastMonth.Format("200601") {
  2102. res.LastMonthNum = month.Count
  2103. }
  2104. }
  2105. // 获取本年,上年数据
  2106. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  2107. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  2108. for _, month := range yearCount {
  2109. if month.Date == now.Format("2006") {
  2110. res.ThisYearNum = month.Count
  2111. }
  2112. if month.Date == firstDayOfLastYear.Format("2006") {
  2113. res.LastYearNum = month.Count
  2114. }
  2115. }
  2116. if c.Type == "year" {
  2117. // 获取上个月第一天
  2118. year, _ := strconv.Atoi(c.Date)
  2119. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  2120. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  2121. // 年度数据统计
  2122. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  2123. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  2124. }
  2125. if c.Type == "month" {
  2126. // 获取上个月第一天
  2127. month, _ := time.ParseInLocation("2006-01", c.Date, time.Local)
  2128. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  2129. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  2130. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  2131. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  2132. }
  2133. return res
  2134. }
  2135. // 获取运单所有温湿度数据
  2136. func (e *Waybill) GetAllData(c *dto.WaybillGetByWaybillNoReq) ([]nats_server.DeviceData_R, []WaybillPDF, error) {
  2137. var err error
  2138. var data model.WaybillTask
  2139. var waybill model.Waybill
  2140. var taskList []model.WaybillTask
  2141. var waybillPDF []WaybillPDF
  2142. dataList := make([]nats_server.DeviceData_R, 0)
  2143. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  2144. if err != nil {
  2145. e.Log.Errorf("db error: %s", err)
  2146. return dataList, waybillPDF, errors.New("获取运单信息失败")
  2147. }
  2148. // 未签收,不返回数据
  2149. if waybill.Status != model.WaybillStatusReceipt {
  2150. return dataList, waybillPDF, nil
  2151. }
  2152. // 获取公司秘钥
  2153. var company model.SysDept
  2154. company, err = model.GetCompanyById(waybill.DeptId)
  2155. if err != nil {
  2156. e.Log.Errorf("db error: %s", err)
  2157. return dataList, waybillPDF, model.GetCompanyKeyErr
  2158. }
  2159. err = e.Orm.Model(&data).
  2160. Where("waybill_no = ?", c.WaybillNo).
  2161. Order("id desc").
  2162. Find(&taskList).Error
  2163. if err != nil {
  2164. e.Log.Errorf("db error: %s", err)
  2165. return dataList, waybillPDF, global.GetFailedErr
  2166. }
  2167. // 获取最后一个任务id
  2168. var lastWaybillTask model.WaybillTask
  2169. err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", c.WaybillNo).Last(&lastWaybillTask).Error
  2170. if err != nil {
  2171. e.Log.Errorf("db error: %s", err)
  2172. err = errors.New("获取运单信息错误!")
  2173. return dataList, waybillPDF, err
  2174. }
  2175. // 创建名称到权重的映射
  2176. orderMap := make(map[string]int)
  2177. for i, v := range taskList {
  2178. orderMap[v.Sn] = i
  2179. }
  2180. for i := 0; i < len(taskList); i++ {
  2181. // 获取传感器信息
  2182. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  2183. var T_snid string
  2184. var list []nats_server.DeviceData_R
  2185. for _, r := range deviceSensorList {
  2186. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  2187. }
  2188. var count int64
  2189. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  2190. if err != nil {
  2191. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  2192. return dataList, waybillPDF, global.GetFailedErr
  2193. }
  2194. firstMap := map[int]nats_server.DeviceData_R{}
  2195. lastMap := map[int]nats_server.DeviceData_R{}
  2196. if count > 0 {
  2197. for _, v := range deviceSensorList {
  2198. for j := 0; j < len(list); j++ {
  2199. if v.T_id == list[j].T_id {
  2200. if list[j].T_time != taskList[i].StartTime.String() {
  2201. firstData := list[len(list)-1-j]
  2202. firstData.T_time = taskList[i].StartTime.String()
  2203. firstMap[v.T_id] = firstData
  2204. count += 1
  2205. }
  2206. break
  2207. }
  2208. }
  2209. if waybill.Status == model.WaybillStatusReceipt {
  2210. for k := len(list) - 1; k >= 0; k-- {
  2211. if v.T_id == list[k].T_id {
  2212. if taskList[i].Id == lastWaybillTask.Id && list[k].T_time != taskList[i].EndTime.String() && !time.Time(taskList[i].EndTime).IsZero() {
  2213. lastData := list[len(list)-1-k]
  2214. lastData.T_time = taskList[i].EndTime.String()
  2215. lastMap[v.T_id] = lastData
  2216. count += 1
  2217. }
  2218. break
  2219. }
  2220. }
  2221. }
  2222. }
  2223. }
  2224. for _, v := range firstMap {
  2225. list = append(list, v)
  2226. }
  2227. for _, v := range lastMap {
  2228. list = append(list, v)
  2229. }
  2230. sort.Slice(list, func(x, y int) bool {
  2231. if list[x].T_time == list[y].T_time {
  2232. // 如果时间相同,则按预设顺序排序
  2233. return orderMap[list[x].T_sn] < orderMap[list[y].T_sn]
  2234. }
  2235. return list[x].T_time > list[y].T_time
  2236. })
  2237. dataList = append(dataList, list...)
  2238. waybillPDF = append(waybillPDF, WaybillPDF{
  2239. Data: list,
  2240. DeviceSensorList: deviceSensorList,
  2241. Task: taskList[i],
  2242. })
  2243. }
  2244. sort.Slice(dataList, func(i, j int) bool {
  2245. if dataList[i].T_time == dataList[j].T_time {
  2246. // 如果时间相同,则按预设顺序排序
  2247. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  2248. }
  2249. return dataList[i].T_time < dataList[j].T_time
  2250. })
  2251. return dataList, waybillPDF, nil
  2252. }
  2253. // 获取前两个探头数据
  2254. func (e *Waybill) GetTwoDeviceSensorData(c *dto.WaybillPdfReq) ([]nats_server.DeviceData_R, []DeviceDataPdf, []WaybillPDF, error) {
  2255. var err error
  2256. var data model.WaybillTask
  2257. var waybill model.Waybill
  2258. var taskList []model.WaybillTask
  2259. var deviceDataPdf []DeviceDataPdf
  2260. var waybillPDF []WaybillPDF
  2261. dataList := make([]nats_server.DeviceData_R, 0)
  2262. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  2263. if err != nil {
  2264. e.Log.Errorf("db error: %s", err)
  2265. return dataList, deviceDataPdf, waybillPDF, errors.New("获取运单信息失败")
  2266. }
  2267. // 未签收,不返回数据
  2268. if waybill.Status != model.WaybillStatusReceipt &&
  2269. waybill.Status != model.WaybillStatusTruckOut &&
  2270. waybill.Status != model.WaybillStatusStorageOut &&
  2271. waybill.Status != model.WaybillStatusVanningOut {
  2272. return dataList, deviceDataPdf, waybillPDF, nil
  2273. }
  2274. // 获取公司秘钥
  2275. var company model.SysDept
  2276. company, err = model.GetCompanyById(waybill.DeptId)
  2277. if err != nil {
  2278. e.Log.Errorf("db error: %s", err)
  2279. return dataList, deviceDataPdf, waybillPDF, model.GetCompanyKeyErr
  2280. }
  2281. err = e.Orm.Model(&data).Scopes(WaybillTaskIdsScopes(c.WaybillTaskIds)).
  2282. Where("waybill_no = ?", c.WaybillNo).
  2283. Preload("Warehouse").Preload("Car").Preload("CoolerBox").
  2284. Find(&taskList).Error
  2285. if err != nil {
  2286. e.Log.Errorf("db error: %s", err)
  2287. return dataList, deviceDataPdf, waybillPDF, global.GetFailedErr
  2288. }
  2289. // 创建名称到权重的映射
  2290. orderMap := make(map[string]int)
  2291. for i, v := range taskList {
  2292. orderMap[v.Sn] = i
  2293. }
  2294. for i := 0; i < len(taskList); i++ {
  2295. // 获取传感器信息
  2296. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  2297. var T_snid string
  2298. var list []nats_server.DeviceData_R
  2299. t_id_list := [2]int{-1, -2}
  2300. for j, r := range deviceSensorList {
  2301. if j >= 2 {
  2302. break
  2303. }
  2304. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  2305. t_id_list[j] = r.T_id
  2306. }
  2307. var count int64
  2308. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  2309. if err != nil {
  2310. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  2311. return dataList, deviceDataPdf, waybillPDF, global.GetFailedErr
  2312. }
  2313. firstMap := map[int]nats_server.DeviceData_R{}
  2314. lastMap := map[int]nats_server.DeviceData_R{}
  2315. if count > 0 {
  2316. for _, v := range deviceSensorList {
  2317. for j := 0; j < len(list); j++ {
  2318. if v.T_id == list[j].T_id {
  2319. if list[j].T_time != taskList[i].StartTime.String() {
  2320. firstData := list[len(list)-1-j]
  2321. firstData.T_time = taskList[i].StartTime.String()
  2322. firstMap[v.T_id] = firstData
  2323. count += 1
  2324. }
  2325. break
  2326. }
  2327. }
  2328. for k := len(list) - 1; k >= 0; k-- {
  2329. if v.T_id == list[k].T_id {
  2330. if list[k].T_time != taskList[i].EndTime.String() && !time.Time(taskList[i].EndTime).IsZero() {
  2331. lastData := list[len(list)-1-k]
  2332. lastData.T_time = taskList[i].EndTime.String()
  2333. lastMap[v.T_id] = lastData
  2334. count += 1
  2335. }
  2336. break
  2337. }
  2338. }
  2339. }
  2340. }
  2341. for _, v := range firstMap {
  2342. list = append(list, v)
  2343. }
  2344. for _, v := range lastMap {
  2345. list = append(list, v)
  2346. }
  2347. name := ""
  2348. sn := ""
  2349. if taskList[i].WarehouseId > 0 {
  2350. name = taskList[i].Warehouse.Name
  2351. sn = taskList[i].Warehouse.Sn
  2352. }
  2353. if taskList[i].CarId > 0 {
  2354. name = taskList[i].Car.CarNo
  2355. sn = taskList[i].Car.Sn
  2356. }
  2357. if taskList[i].CoolerBoxId > 0 {
  2358. name = taskList[i].CoolerBox.Name
  2359. sn = taskList[i].CoolerBox.Sn
  2360. }
  2361. deviceDataPdfList := DeviceSensorDataListToDeviceDataPdfList(name, sn, list, t_id_list[0], t_id_list[1])
  2362. deviceDataPdf = append(deviceDataPdf, deviceDataPdfList...)
  2363. dataList = append(dataList, list...)
  2364. waybillPDF = append(waybillPDF, WaybillPDF{
  2365. Data: list,
  2366. DeviceSensorList: deviceSensorList,
  2367. Task: taskList[i],
  2368. DeviceDataPdf: deviceDataPdfList,
  2369. })
  2370. }
  2371. sort.Slice(dataList, func(i, j int) bool {
  2372. if dataList[i].T_time == dataList[j].T_time {
  2373. // 如果时间相同,则按预设顺序排序
  2374. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  2375. }
  2376. return dataList[i].T_time < dataList[j].T_time
  2377. })
  2378. sort.Slice(deviceDataPdf, func(i, j int) bool {
  2379. if deviceDataPdf[i].T_time == deviceDataPdf[j].T_time {
  2380. // 如果时间相同,则按预设顺序排序
  2381. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  2382. }
  2383. return deviceDataPdf[i].T_time < deviceDataPdf[j].T_time
  2384. })
  2385. return dataList, deviceDataPdf, waybillPDF, nil
  2386. }
  2387. type WaybillPDF struct {
  2388. Data []nats_server.DeviceData_R
  2389. DeviceSensorList []nats_server.DeviceSensor_R
  2390. Task model.WaybillTask
  2391. DeviceDataPdf []DeviceDataPdf
  2392. }
  2393. type DeviceDataPdf struct {
  2394. T_sn string // 设备名称
  2395. T_name string // 设备名称
  2396. T_time string // 时间
  2397. T_id1 *float32 // 传感器id1温度
  2398. T_id2 *float32 // 传感器id2温度
  2399. }
  2400. func DeviceSensorDataListToDeviceDataPdfList(T_name, T_sn string, list []nats_server.DeviceData_R, T_id1 int, T_id2 int) []DeviceDataPdf {
  2401. // 创建一个 map 用于存储 DeviceData_Pdf 结果
  2402. resultMap := make(map[string]DeviceDataPdf)
  2403. // 遍历第一个列表,将数据存入 resultMap
  2404. for _, item := range list {
  2405. var pdf DeviceDataPdf
  2406. key := item.T_time
  2407. if _, ok := resultMap[key]; !ok {
  2408. pdf.T_time = item.T_time
  2409. T_name_s := []rune(T_name)
  2410. if len(T_name_s) > 8 {
  2411. pdf.T_name = string(T_name_s[:8]) + "..."
  2412. } else {
  2413. pdf.T_name = T_name
  2414. }
  2415. pdf.T_sn = T_sn
  2416. resultMap[key] = pdf
  2417. }
  2418. data := resultMap[key]
  2419. if item.T_id == T_id1 {
  2420. t1 := item.T_t
  2421. data.T_id1 = &t1
  2422. } else if item.T_id == T_id2 {
  2423. t2 := item.T_t
  2424. data.T_id2 = &t2
  2425. }
  2426. resultMap[key] = data
  2427. }
  2428. // 将 resultMap 转换为 DeviceData_Pdf 列表
  2429. var finalList []DeviceDataPdf
  2430. for _, v := range resultMap {
  2431. finalList = append(finalList, v)
  2432. }
  2433. return finalList
  2434. }
  2435. // 获取运单所有温湿度数据
  2436. func (e *Waybill) VerifyDataQualified(waybillNo string) (qualified bool, err error) {
  2437. var data model.WaybillTask
  2438. var waybill model.Waybill
  2439. var taskList []model.WaybillTask
  2440. err = e.Orm.Model(&waybill).Where("waybill_no = ?", waybillNo).First(&waybill).Error
  2441. if err != nil {
  2442. e.Log.Errorf("db error: %s", err)
  2443. return qualified, errors.New("获取运单信息失败")
  2444. }
  2445. // 未签收,不返回数据
  2446. if waybill.Status != model.WaybillStatusReceipt {
  2447. return qualified, nil
  2448. }
  2449. // 获取公司秘钥
  2450. var company model.SysDept
  2451. company, err = model.GetCompanyById(waybill.DeptId)
  2452. if err != nil {
  2453. e.Log.Errorf("db error: %s", err)
  2454. return qualified, model.GetCompanyKeyErr
  2455. }
  2456. err = e.Orm.Model(&data).
  2457. Where("waybill_no = ?", waybillNo).
  2458. Order("id desc").
  2459. Find(&taskList).Error
  2460. if err != nil {
  2461. e.Log.Errorf("db error: %s", err)
  2462. return qualified, global.GetFailedErr
  2463. }
  2464. // 获取最后一个任务id
  2465. //var lastWaybillTask model.WaybillTask
  2466. //err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", waybillNo).Last(&lastWaybillTask).Error
  2467. //if err != nil {
  2468. // e.Log.Errorf("db error: %s", err)
  2469. // err = errors.New("获取运单信息错误!")
  2470. // return qualified, err
  2471. //}
  2472. // 创建名称到权重的映射
  2473. orderMap := make(map[string]int)
  2474. for i, v := range taskList {
  2475. orderMap[v.Sn] = i
  2476. }
  2477. for i := 0; i < len(taskList); i++ {
  2478. // 获取传感器信息
  2479. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  2480. var T_snid string
  2481. deviceSensorParameterMap := map[string]nats_server.DeviceSensorParameter_R{}
  2482. for _, r := range deviceSensorList {
  2483. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  2484. deviceSensorParameterMap[fmt.Sprintf("%s-%d", r.T_sn, r.T_id)] = r.T_DeviceSensorParameter
  2485. }
  2486. var list []nats_server.DeviceData_R
  2487. list, _, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  2488. if err != nil {
  2489. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  2490. return qualified, global.GetFailedErr
  2491. }
  2492. // 判断数据是否合格
  2493. qualified = true
  2494. for _, v := range list {
  2495. dsp := deviceSensorParameterMap[fmt.Sprintf("%s-%d", v.T_sn, v.T_id)]
  2496. if v.T_t < dsp.T_Tlower || v.T_t > dsp.T_Tupper || v.T_rh < dsp.T_RHlower || v.T_t > dsp.T_RHupper {
  2497. qualified = false
  2498. break
  2499. }
  2500. }
  2501. }
  2502. return qualified, nil
  2503. }