waybill.go 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588
  1. package service
  2. import (
  3. "cold-delivery/app/admin/model"
  4. "cold-delivery/app/admin/service/dto"
  5. "cold-delivery/common/actions"
  6. cDto "cold-delivery/common/dto"
  7. "cold-delivery/common/global"
  8. "cold-delivery/common/lib"
  9. model2 "cold-delivery/common/model"
  10. "cold-delivery/common/nats/nats_server"
  11. "cold-delivery/conf"
  12. "errors"
  13. "fmt"
  14. "go.uber.org/zap"
  15. "gogs.baozhida.cn/zoie/OAuth-core/pkg/sms"
  16. "gogs.baozhida.cn/zoie/OAuth-core/pkg/utils"
  17. "gogs.baozhida.cn/zoie/OAuth-core/service"
  18. "gorm.io/gorm"
  19. "net/url"
  20. "sort"
  21. "strconv"
  22. "strings"
  23. "time"
  24. )
  25. type Waybill struct {
  26. service.Service
  27. }
  28. func orStatus(id int) func(db *gorm.DB) *gorm.DB {
  29. return func(db *gorm.DB) *gorm.DB {
  30. if id == 0 {
  31. return db
  32. }
  33. return db.Where("status = ? ", id).Or("status =? ", model.WaybillStatusoverrule)
  34. }
  35. }
  36. // GetPage 获取Waybill列表
  37. //
  38. // func (e *Waybill) GetPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  39. // var err error
  40. // var data model.Waybill
  41. // if c.PageSize == 9999 {
  42. // err = e.Orm.Model(&data).
  43. // Scopes(
  44. // cDto.MakeCondition(c.GetNeedSearch()),
  45. // actions.Permission(data.TableName(), p),
  46. // ).
  47. // Preload("CoolerBox").
  48. // Preload("Delivery").
  49. // Preload("ReCheck").
  50. // Find(list).Limit(-1).Offset(-1).
  51. // Count(count).Error
  52. // if err != nil {
  53. // e.Log.Errorf("db error: %s", err)
  54. // return global.GetFailedErr
  55. // }
  56. // return nil
  57. // }
  58. //
  59. // err = e.Orm.Model(&data).
  60. // Scopes(
  61. // cDto.MakeCondition(c.GetNeedSearch()),
  62. // cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  63. // actions.Permission(data.TableName(), p),
  64. // ).
  65. // Preload("CoolerBox").
  66. // Preload("Delivery").
  67. // Preload("ReCheck").
  68. // Find(list).Limit(-1).Offset(-1).
  69. // Count(count).Error
  70. // if err != nil {
  71. // e.Log.Errorf("db error: %s", err)
  72. // return global.GetFailedErr
  73. // }
  74. // return nil
  75. // }
  76. //
  77. // func (e *Waybill) GetUserPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  78. // var err error
  79. // var data model.Waybill
  80. // if c.PageSize == 9999 {
  81. // err = e.Orm.Model(&data).
  82. // Scopes(
  83. // cDto.MakeCondition(c.GetNeedSearch()),
  84. // ).
  85. // Where("create_by = ?", p.UserId).
  86. // Find(list).Limit(-1).Offset(-1).
  87. // Count(count).Error
  88. // if err != nil {
  89. // e.Log.Errorf("db error: %s", err)
  90. // return global.GetFailedErr
  91. // }
  92. // return nil
  93. // }
  94. //
  95. // err = e.Orm.Model(&data).
  96. // Scopes(
  97. // cDto.MakeCondition(c.GetNeedSearch()),
  98. // cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  99. // ).
  100. // Where("delivery_id = ? or re_check_id = ? or create_by = ?", p.UserId, p.UserId, p.UserId).
  101. // Preload("CoolerBox").
  102. // Preload("Delivery").
  103. // Preload("ReCheck").
  104. // Find(list).Limit(-1).Offset(-1).
  105. // Count(count).Error
  106. // if err != nil {
  107. // e.Log.Errorf("db error: %s", err)
  108. // return global.GetFailedErr
  109. // }
  110. // return nil
  111. // }
  112. func (e *Waybill) GetPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  113. var err error
  114. var data model.Waybill
  115. // 构建基础查询
  116. db := e.Orm.Model(&data).
  117. Scopes(
  118. cDto.MakeCondition(c.GetNeedSearch()),
  119. actions.Permission(data.TableName(), p),
  120. orStatus(c.Status),
  121. ).
  122. Preload("CoolerBox").
  123. Preload("Delivery").
  124. Preload("ReCheck")
  125. // 先计算总条目数
  126. if err = db.Count(count).Error; err != nil {
  127. e.Log.Errorf("db error: %s", err)
  128. return global.GetFailedErr
  129. }
  130. // 如果PageSize设置为9999,则不分页
  131. if c.PageSize == 9999 {
  132. err = db.Find(list).Error
  133. } else {
  134. // 应用分页
  135. err = db.Scopes(
  136. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  137. ).Find(list).Error
  138. }
  139. if err != nil {
  140. e.Log.Errorf("db error: %s", err)
  141. return global.GetFailedErr
  142. }
  143. return nil
  144. }
  145. func (e *Waybill) GetUserPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  146. var err error
  147. var data model.Waybill
  148. // 构建基础查询
  149. db := e.Orm.Model(&data).
  150. Scopes(
  151. orStatus(c.Status),
  152. cDto.MakeCondition(c.GetNeedSearch()),
  153. )
  154. // 添加用户相关的条件
  155. db = db.Where("delivery_id = ?", p.UserId)
  156. // 先计算总条目数
  157. if err = db.Count(count).Error; err != nil {
  158. e.Log.Errorf("db error: %s", err)
  159. return global.GetFailedErr
  160. }
  161. // 如果PageSize设置为9999,则不分页
  162. if c.PageSize == 9999 {
  163. err = db.Find(list).Error
  164. } else {
  165. // 应用分页
  166. err = db.Scopes(
  167. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  168. ).
  169. Preload("CoolerBox").
  170. Preload("Delivery").
  171. Preload("ReCheck").
  172. Find(list).Error
  173. }
  174. if err != nil {
  175. e.Log.Errorf("db error: %s", err)
  176. return global.GetFailedErr
  177. }
  178. return nil
  179. }
  180. func (e *Waybill) GetAppletPage(c *dto.WaybillGetAppletPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  181. var err error
  182. //var data model.Waybill
  183. var logistics model.WaybillLogistics
  184. err = e.Orm.Table("waybill").
  185. Select("waybill.*,waybill_logistics.status as status").
  186. Scopes(
  187. cDto.MakeCondition(c.GetNeedSearch()),
  188. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  189. actions.Permission(logistics.TableName(), p)).
  190. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  191. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  192. Find(&list).Limit(-1).Offset(-1).Count(count).Error
  193. if err != nil {
  194. e.Log.Errorf("db error: %s", err)
  195. return global.GetFailedErr
  196. }
  197. return nil
  198. }
  199. func (e *Waybill) GetAppletCount(list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  200. var err error
  201. //var data model.Waybill
  202. var logistics model.WaybillLogistics
  203. err = e.Orm.Table("waybill").
  204. Select("waybill.*,waybill_logistics.status as status").
  205. Scopes(
  206. actions.Permission(logistics.TableName(), p)).
  207. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  208. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  209. Find(list).Count(count).Error
  210. if err != nil {
  211. e.Log.Errorf("db error: %s", err)
  212. return global.GetFailedErr
  213. }
  214. return nil
  215. }
  216. func (e *Waybill) GetCustomerPage(c *dto.WaybillGetCustomerPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  217. var err error
  218. var data model.Waybill
  219. if c.PageSize == 9999 {
  220. err = e.Orm.Model(&data).
  221. Scopes(
  222. cDto.MakeCondition(c.GetNeedSearch()),
  223. actions.Permission(data.TableName(), p),
  224. ).
  225. Find(list).Limit(-1).Offset(-1).
  226. Count(count).Error
  227. if err != nil {
  228. e.Log.Errorf("db error: %s", err)
  229. return global.GetFailedErr
  230. }
  231. return nil
  232. }
  233. err = e.Orm.Model(&data).
  234. Scopes(
  235. cDto.MakeCondition(c.GetNeedSearch()),
  236. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  237. actions.Permission(data.TableName(), p),
  238. ).
  239. Find(list).Limit(-1).Offset(-1).
  240. Count(count).Error
  241. if err != nil {
  242. e.Log.Errorf("db error: %s", err)
  243. return global.GetFailedErr
  244. }
  245. return nil
  246. }
  247. // Get 获取Waybill对象
  248. func (e *Waybill) Get(d *dto.WaybillGetReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  249. err := e.Orm.
  250. Scopes(actions.Permission(waybillModel.TableName(), p)).
  251. Preload("User").
  252. First(waybillModel, d.GetId()).Error
  253. if err != nil {
  254. e.Log.Errorf("db error: %s", err)
  255. if errors.Is(err, gorm.ErrRecordNotFound) {
  256. return global.GetNotFoundOrNoPermissionErr
  257. }
  258. return global.GetFailedErr
  259. }
  260. return nil
  261. }
  262. func (e *Waybill) GetByWaybillNo(d *dto.WaybillGetByWaybillPdfReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  263. err := e.Orm.
  264. Scopes(actions.Permission(waybillModel.TableName(), p)).
  265. Where("waybill_no = ?", d.WaybillNo).
  266. Preload("Dept").
  267. Preload("CoolerBox").
  268. Preload("Delivery").
  269. Preload("ReCheck").
  270. First(waybillModel).Error
  271. if err != nil {
  272. e.Log.Errorf("db error: %s", err)
  273. if errors.Is(err, gorm.ErrRecordNotFound) {
  274. return global.GetNotFoundOrNoPermissionErr
  275. }
  276. return global.GetFailedErr
  277. }
  278. return nil
  279. }
  280. // Insert 创建Waybill对象
  281. func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
  282. var err error
  283. var data model.Waybill
  284. tx := e.Orm.Begin()
  285. defer func() {
  286. if err != nil {
  287. tx.Rollback()
  288. } else {
  289. tx.Commit()
  290. }
  291. }()
  292. var no string
  293. for {
  294. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  295. var j int64
  296. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  297. if err != nil {
  298. continue
  299. }
  300. if j == 0 {
  301. break
  302. }
  303. }
  304. // 添加运单
  305. data.WaybillNo = no
  306. c.Generate(&data)
  307. err = tx.Create(&data).Error
  308. if err != nil {
  309. e.Log.Errorf("db error: %s", err)
  310. return global.CreateFailedErr
  311. }
  312. c.Id = data.Id
  313. // 保存收货地址
  314. //if c.SaveSenderAddress {
  315. // // 查询地址是否存在
  316. // address := model.Address{}
  317. // err = e.Orm.Where("address = ? and phone = ? and name = ? and dept_id = ? and address_type = 'sender'",
  318. // c.SenderAddressDetails, c.SenderAddressPhone, c.SenderAddressName, c.DeptId).First(&address).Error
  319. // if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  320. // address.Address = c.SenderAddressDetails
  321. // address.Phone = c.SenderAddressPhone
  322. // address.Name = c.SenderAddressName
  323. // address.DeptId = c.DeptId
  324. // address.AddressType = "sender"
  325. // err = tx.Create(&address).Error
  326. // if err != nil {
  327. // e.Log.Errorf("创建地址失败: %s", err)
  328. // return global.CreateFailedErr
  329. // }
  330. // }
  331. //}
  332. // 保存发货地址
  333. if c.SaveConsigneeAddress {
  334. // 查询地址是否存在
  335. address := model.Address{}
  336. err = e.Orm.Where("address = ? and phone = ? and name = ? and dept_id = ? and address_type = 'consignee'",
  337. c.ConsigneeAddressDetails, c.ConsigneeAddressPhone, c.ConsigneeAddressName, c.DeptId).First(&address).Error
  338. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  339. address.Address = c.ConsigneeAddressDetails
  340. address.Phone = c.ConsigneeAddressPhone
  341. address.Name = c.ConsigneeAddressName
  342. address.DeptId = c.DeptId
  343. address.AddressType = "consignee"
  344. err = tx.Create(&address).Error
  345. if err != nil {
  346. e.Log.Errorf("创建地址失败: %s", err)
  347. return global.CreateFailedErr
  348. }
  349. }
  350. }
  351. return nil
  352. }
  353. // Update 修改Waybill对象
  354. func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) error {
  355. var err error
  356. tx := e.Orm.Begin()
  357. defer func() {
  358. if err != nil {
  359. tx.Rollback()
  360. } else {
  361. tx.Commit()
  362. }
  363. }()
  364. var waybillModel = model.Waybill{}
  365. // 查询运单是否存在
  366. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  367. First(&waybillModel, c.GetId()).Error
  368. if err != nil {
  369. e.Log.Errorf("db error: %s", err)
  370. if errors.Is(err, gorm.ErrRecordNotFound) {
  371. return global.UpdateNotFoundOrNoPermissionErr
  372. }
  373. return global.UpdateFailedErr
  374. }
  375. c.Generate(&waybillModel)
  376. err = tx.Save(&waybillModel).Error
  377. if err != nil {
  378. e.Log.Errorf("db error: %s", err)
  379. return global.UpdateFailedErr
  380. }
  381. c.Id = waybillModel.Id
  382. return nil
  383. }
  384. // 审核订单
  385. func (e *Waybill) Audit(c *dto.WaybillUpdateReqaudit, p *actions.DataPermission) error {
  386. var err error
  387. tx := e.Orm.Begin()
  388. defer func() {
  389. if err != nil {
  390. tx.Rollback()
  391. } else {
  392. tx.Commit()
  393. }
  394. }()
  395. var waybillModel = model.Waybill{}
  396. // 查询运单是否存在
  397. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  398. First(&waybillModel, c.GetId()).Error
  399. if err != nil {
  400. e.Log.Errorf("db error: %s", err)
  401. if errors.Is(err, gorm.ErrRecordNotFound) {
  402. return global.UpdateNotFoundOrNoPermissionErr
  403. }
  404. return global.UpdateFailedErr
  405. }
  406. c.Generate(&waybillModel)
  407. waybillModel.Status = c.Status
  408. waybillModel.ReCheckId = p.UserId
  409. err = tx.Updates(&waybillModel).Error
  410. if err != nil {
  411. e.Log.Errorf("db error: %s", err)
  412. return global.UpdateFailedErr
  413. }
  414. c.Id = waybillModel.Id
  415. return nil
  416. }
  417. // 管理员审核订单
  418. func (e *Waybill) AdminAudit(c *dto.WaybillAdmin, p *actions.DataPermission) error {
  419. var err error
  420. tx := e.Orm.Begin()
  421. defer func() {
  422. if err != nil {
  423. tx.Rollback()
  424. } else {
  425. tx.Commit()
  426. }
  427. }()
  428. var waybillModel = model.Waybill{}
  429. // 查询运单是否存在
  430. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  431. First(&waybillModel, c.GetId()).Error
  432. if err != nil {
  433. e.Log.Errorf("db error: %s", err)
  434. if errors.Is(err, gorm.ErrRecordNotFound) {
  435. return global.UpdateNotFoundOrNoPermissionErr
  436. }
  437. return global.UpdateFailedErr
  438. }
  439. c.Generate(&waybillModel)
  440. waybillModel.AdminAuditRemark = c.AdminAuditRemark
  441. err = tx.Updates(&waybillModel).Error
  442. if err != nil {
  443. e.Log.Errorf("db error: %s", err)
  444. return global.UpdateFailedErr
  445. }
  446. c.Id = waybillModel.Id
  447. return nil
  448. }
  449. func (e *Waybill) UpdateStatus(c *dto.UpdateStatusReq, p *actions.DataPermission) error {
  450. var err error
  451. tx := e.Orm.Begin()
  452. defer func() {
  453. if err != nil {
  454. tx.Rollback()
  455. } else {
  456. tx.Commit()
  457. }
  458. }()
  459. // 查询运单是否存在
  460. for _, v := range c.Id {
  461. var waybillModel = model.Waybill{}
  462. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  463. First(&waybillModel, v).Error
  464. if err != nil {
  465. e.Log.Errorf("db error: %s", err)
  466. if errors.Is(err, gorm.ErrRecordNotFound) {
  467. return global.UpdateNotFoundOrNoPermissionErr
  468. }
  469. return global.UpdateFailedErr
  470. }
  471. waybillModel.Status = c.Status
  472. err = tx.Table(waybillModel.TableName()).Where("id=?", v).Update("status", c.Status).Error
  473. if err != nil {
  474. e.Log.Errorf("db error: %s", err)
  475. return global.UpdateFailedErr
  476. }
  477. // 查询任务
  478. //var logistics model.WaybillLogistics
  479. //err = tx.Model(&logistics).Where("waybill_no = ? and status = ?", waybillModel.WaybillNo, model.WaybillStatusInDeliverys).
  480. // Last(&logistics).Error
  481. //if err != nil {
  482. // if errors.Is(err, gorm.ErrRecordNotFound) {
  483. // // 添加物流
  484. // logisticsObj := model.WaybillLogistics{
  485. // WaybillNo: waybillModel.WaybillNo,
  486. // Status: waybillModel.Status,
  487. // ControlBy: model2.ControlBy{
  488. // CreateBy: p.UserId,
  489. // },
  490. // DeptBy: model2.DeptBy{
  491. // DeptId: p.DeptId,
  492. // },
  493. // }
  494. // err = tx.Create(&logisticsObj).Error
  495. // if err != nil {
  496. // e.Log.Errorf("db error: %s", err)
  497. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  498. // }
  499. // } else {
  500. // e.Log.Errorf("db error: %s", err)
  501. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  502. // }
  503. //}
  504. //err = tx.Save(&logistics).Error
  505. //if err != nil {
  506. // e.Log.Errorf("db error: %s", err)
  507. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  508. //}
  509. }
  510. //err = tx.Save(&waybillModel).Error
  511. //if err != nil {
  512. // e.Log.Errorf("db error: %s", err)
  513. // return global.UpdateFailedErr
  514. //}
  515. return nil
  516. }
  517. // 派单
  518. func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
  519. var err error
  520. tx := e.Orm.Begin()
  521. defer func() {
  522. if err != nil {
  523. tx.Rollback()
  524. } else {
  525. tx.Commit()
  526. }
  527. }()
  528. if !lib.StrListEqual(c.IceRaftCode, c.OldIceRaftCode) {
  529. // 获取删除的冰排列表
  530. //missingIceRaftCode = lib.FindStrListMissingData(c.OldIceRaftCode, c.IceRaftCode)
  531. //if len(missingIceRaftCode) > 0 {
  532. // // 删除冰排出库记录
  533. // IceRaftList := []model.IceRaft{}
  534. // err = tx.Model(&model.IceRaft{}).Where("code in (?)", missingIceRaftCode).Find(&IceRaftList).Error
  535. // if err != nil {
  536. // e.Log.Errorf("db error: %s", err)
  537. // return errors.New("获取冰排列表失败")
  538. // }
  539. // for _, iceRaft := range IceRaftList {
  540. // // 获取冰排记录
  541. // err = tx.Model(&model.IceRaftRecord{}).
  542. // Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusUsing).
  543. // Updates(map[string]interface{}{
  544. // "status": model.IceRaftRecordStatusWaitUse,
  545. // "out_storage_time": nil,
  546. // "cooler_box_id": 0,
  547. // }).Error
  548. // if err != nil {
  549. // e.Log.Errorf("db error: %s", err)
  550. // return errors.New(fmt.Sprintf("冰排【%s】返库失败", iceRaft.Code))
  551. // }
  552. // }
  553. //}
  554. // 获取新增的冰排列表
  555. extraData := lib.FindStrListExtraData(c.OldIceRaftCode, c.IceRaftCode)
  556. if len(extraData) > 0 {
  557. for _, code := range extraData {
  558. var iceRaft model.IceRaft
  559. err = tx.Model(&model.IceRaft{}).Where("code = ?", code).Preload("IceRaftRecord").First(&iceRaft).Error
  560. if err != nil {
  561. e.Log.Errorf("db error: %s", err)
  562. if errors.Is(err, gorm.ErrRecordNotFound) {
  563. return errors.New(fmt.Sprintf("冰排【%s】不存在", code))
  564. } else {
  565. return errors.New(fmt.Sprintf("获取冰排【%s】信息失败", code))
  566. }
  567. }
  568. if iceRaft.IceRaftRecord.Status != model.IceRaftRecordStatusWaitUse {
  569. err = errors.New(fmt.Sprintf("冰排【%s】状态为%s,出库保温箱失败!", code, model.GetIceRaftRecordStatus(iceRaft.IceRaftRecord.Status)))
  570. return err
  571. }
  572. // 获取冰排记录
  573. err = tx.Model(&model.IceRaftRecord{}).
  574. Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusWaitUse).
  575. Updates(map[string]interface{}{
  576. "status": model.IceRaftRecordStatusUsing,
  577. "out_storage_time": time.Now(),
  578. "cooler_box_id": c.CoolerBoxId,
  579. }).Error
  580. if err != nil {
  581. e.Log.Errorf("db error: %s", err)
  582. return errors.New(fmt.Sprintf("冰排【%s】出库失败", iceRaft.Code))
  583. }
  584. }
  585. }
  586. }
  587. var coolerBox = model.CoolerBox{}
  588. // 查询保温箱信息
  589. if c.CoolerBoxId != 0 {
  590. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  591. First(&coolerBox, c.CoolerBoxId).Error
  592. if err != nil {
  593. e.Log.Errorf("db error: %s", err)
  594. return errors.New("获取保温箱信息失败")
  595. }
  596. }
  597. for _, id := range c.WaybillIds {
  598. var waybillModel = model.Waybill{}
  599. // 查询运单是否存在
  600. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  601. First(&waybillModel, id).Error
  602. if err != nil {
  603. e.Log.Errorf("db error: %s", err)
  604. if errors.Is(err, gorm.ErrRecordNotFound) {
  605. return global.UpdateNotFoundOrNoPermissionErr
  606. }
  607. return global.UpdateFailedErr
  608. }
  609. //派单时添加
  610. waybillModeStatus := waybillModel.Status
  611. if waybillModel.Status == model.WaybillStatusInDeliverys ||
  612. (waybillModel.Status == model.WaybillStatusInDeliverys && waybillModel.CoolerBoxId != c.CoolerBoxId) ||
  613. (waybillModel.Status == model.WaybillStatusInDeliverys && !lib.StrListEqual(c.IceRaftCode, c.OldIceRaftCode)) {
  614. waybillModel.Status = model.WaybillStatusInDeliverys
  615. waybillModel.TamperProofLabel = c.TamperProofLabel
  616. waybillModel.TamperProofLabelImg = c.TamperProofLabelImg // 防拆标签
  617. waybillModel.DeliveryId = c.DeliveryId
  618. waybillModel.AssignmentStatus = 2 // 分配状态 2 已派单
  619. waybillModel.CoolerBoxId = c.CoolerBoxId
  620. waybillModel.DeliveryTime = model2.Time(time.Now())
  621. waybillModel.IceRaftCode = c.IceRaftCode
  622. if c.Status == model.WaybillStatusInShippeds {
  623. waybillModel.Status = c.Status
  624. // 配送中状态下才发送短信
  625. if waybillModeStatus == model.WaybillStatusInShippeds {
  626. ss := sms.NewSMS(conf.ExtConfig.SubMail.Appid, conf.ExtConfig.SubMail.Signature)
  627. addr := conf.ExtConfig.Applet.WaybillUrl + url.QueryEscape(lib.AesEncryptCBC(waybillModel.WaybillNo, lib.AesKey))
  628. res, err1 := ss.SmsXSend(waybillModel.ConsigneeAddressPhone, addr)
  629. if err1 != nil || res.Status != sms.SUCCESS {
  630. e.Log.Errorf("派单短信发送失败", zap.Any("res", res), zap.Error(err1))
  631. err = errors.New("派单短信发送失败,请检查收件人电话是否正确!")
  632. return err
  633. }
  634. waybillModel.SendLog = model.WaybillSendLog{
  635. Phone: waybillModel.ConsigneeAddressPhone,
  636. Content: "【冷链送药追溯平台】您的运单正在派送中,点击查看详情:" + addr,
  637. }
  638. }
  639. // 查询任务
  640. var logistics model.WaybillLogistics
  641. // 添加物流
  642. logisticsObj := model.WaybillLogistics{
  643. WaybillNo: waybillModel.WaybillNo,
  644. Status: waybillModel.Status,
  645. CoolerBoxId: coolerBox.Id,
  646. ControlBy: model2.ControlBy{
  647. CreateBy: p.UserId,
  648. },
  649. DeptBy: model2.DeptBy{
  650. DeptId: p.DeptId,
  651. },
  652. }
  653. err = tx.Create(&logisticsObj).Error
  654. if err != nil {
  655. e.Log.Errorf("db error: %s", err)
  656. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  657. }
  658. logistics.CoolerBoxId = coolerBox.Id
  659. err = tx.Save(&logistics).Error
  660. if err != nil {
  661. e.Log.Errorf("db error: %s", err)
  662. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  663. }
  664. }
  665. err = tx.Save(&waybillModel).Error
  666. if err != nil {
  667. e.Log.Errorf("db error: %s", err)
  668. return global.UpdateFailedErr
  669. }
  670. // 查询任务
  671. var logistics model.WaybillLogistics
  672. err = tx.Model(&logistics).Where("waybill_no = ?", waybillModel.WaybillNo).
  673. Last(&logistics).Error
  674. if err != nil {
  675. if errors.Is(err, gorm.ErrRecordNotFound) {
  676. // 添加物流
  677. logisticsObj := model.WaybillLogistics{
  678. WaybillNo: waybillModel.WaybillNo,
  679. Status: waybillModel.Status,
  680. CoolerBoxId: coolerBox.Id,
  681. ControlBy: model2.ControlBy{
  682. CreateBy: p.UserId,
  683. },
  684. DeptBy: model2.DeptBy{
  685. DeptId: p.DeptId,
  686. },
  687. }
  688. err = tx.Create(&logisticsObj).Error
  689. if err != nil {
  690. e.Log.Errorf("db error: %s", err)
  691. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  692. }
  693. } else {
  694. e.Log.Errorf("db error: %s", err)
  695. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  696. }
  697. logistics.CoolerBoxId = coolerBox.Id
  698. err = tx.Save(&logistics).Error
  699. if err != nil {
  700. e.Log.Errorf("db error: %s", err)
  701. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  702. }
  703. }
  704. // 查询任务
  705. var task model.WaybillTask
  706. err = tx.Model(&task).Where("waybill_no = ? ", waybillModel.WaybillNo).
  707. Last(&task).Error
  708. if err != nil {
  709. if errors.Is(err, gorm.ErrRecordNotFound) {
  710. // 添加任务
  711. taskObj := model.WaybillTask{
  712. WaybillNo: waybillModel.WaybillNo,
  713. CoolerBoxId: coolerBox.Id,
  714. UserId: p.UserId,
  715. Sn: coolerBox.Sn,
  716. StartTime: model2.Time(time.Now()),
  717. ControlBy: model2.ControlBy{
  718. CreateBy: p.UserId,
  719. },
  720. DeptBy: model2.DeptBy{
  721. DeptId: p.DeptId,
  722. },
  723. }
  724. err = tx.Create(&taskObj).Error
  725. if err != nil {
  726. e.Log.Errorf("db error: %s", err)
  727. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  728. }
  729. } else {
  730. e.Log.Errorf("db error: %s", err)
  731. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  732. }
  733. task.StartTime = model2.Time(time.Now())
  734. task.UpdateBy = p.UserId
  735. task.CoolerBoxId = coolerBox.Id
  736. task.Sn = coolerBox.Sn
  737. err = tx.Save(&task).Error
  738. if err != nil {
  739. e.Log.Errorf("db error: %s", err)
  740. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  741. }
  742. }
  743. }
  744. }
  745. return nil
  746. }
  747. // Remove 删除Waybill
  748. func (e *Waybill) Remove(c *dto.WaybillDeleteReq, p *actions.DataPermission) error {
  749. var err error
  750. tx := e.Orm.Begin()
  751. defer func() {
  752. if err != nil {
  753. tx.Rollback()
  754. } else {
  755. tx.Commit()
  756. }
  757. }()
  758. var waybillModel model.Waybill
  759. // 查询运单是否存在
  760. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  761. First(&waybillModel, c.GetId()).Error
  762. if err != nil {
  763. e.Log.Errorf("db error: %s", err)
  764. if errors.Is(err, gorm.ErrRecordNotFound) {
  765. return global.DeleteNotFoundOrNoPermissionErr
  766. }
  767. return global.DeleteFailedErr
  768. }
  769. if waybillModel.Status != model.WaybillStatusWaitDelivery {
  770. return errors.New(fmt.Sprintf("运单状态为%s,禁止删除", model.WaybillStatusMap[waybillModel.Status]))
  771. }
  772. db := tx.Delete(&waybillModel)
  773. if err = db.Error; err != nil {
  774. e.Log.Errorf("db error: %s", err)
  775. return global.DeleteFailedErr
  776. }
  777. if db.RowsAffected == 0 {
  778. return global.DeleteNotFoundOrNoPermissionErr
  779. }
  780. return nil
  781. }
  782. func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) error {
  783. var err error
  784. tx := e.Orm.Begin()
  785. defer func() {
  786. if err != nil {
  787. tx.Rollback()
  788. } else {
  789. tx.Commit()
  790. }
  791. }()
  792. var waybillModel = model.Waybill{}
  793. // 查询运单是否存在
  794. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  795. Where("waybill_no = ?", c.WaybillNo).
  796. First(&waybillModel).Error
  797. if err != nil {
  798. e.Log.Errorf("db error: %s", err)
  799. if errors.Is(err, gorm.ErrRecordNotFound) {
  800. return errors.New(fmt.Sprintf("运单号%s不存在", c.WaybillNo))
  801. }
  802. return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
  803. }
  804. // 查询保温箱信息
  805. var coolerBox = model.CoolerBox{}
  806. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  807. First(&coolerBox, waybillModel.CoolerBoxId).Error
  808. if err != nil {
  809. e.Log.Errorf("db error: %s", err)
  810. return errors.New("获取保温箱信息失败")
  811. }
  812. if waybillModel.Status == model.WaybillStatusWaitDelivery {
  813. err = errors.New(fmt.Sprintf("运单状态为%s,禁止操作", model.WaybillStatusMap[waybillModel.Status]))
  814. return err
  815. }
  816. if waybillModel.Status == model.WaybillStatusReceipts || waybillModel.Status == model.WaybillStatusRejections {
  817. return nil
  818. }
  819. waybillModel.Status = c.Status
  820. waybillModel.RejectionReason = c.RejectionReason
  821. waybillModel.ReceiptTime = model2.Time(time.Now())
  822. waybillModel.ReceiptImg = c.ReceiptImg
  823. waybillModel.Receiptsign = c.Receiptsign
  824. waybillModel.PaymentStatus = c.PaymentStatus
  825. waybillModel.PaymentType = c.PaymentType
  826. waybillModel.PaymentRemark = c.PaymentRemark
  827. waybillModel.AssessContent = c.AssessContent
  828. waybillModel.AssessStar = c.AssessStar
  829. waybillModel.DeliveryDuration = int(time.Now().Sub(waybillModel.DeliveryTime.Local()).Minutes())
  830. err = tx.Save(&waybillModel).Error
  831. if err != nil {
  832. e.Log.Errorf("db error: %s", err)
  833. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  834. }
  835. var lng, lat string
  836. lng, lat, err = e.GetSite(waybillModel.DeptId, coolerBox.Sn, waybillModel.ReceiptTime.String())
  837. if err != nil {
  838. e.Log.Errorf("获取定位信息失败: %s", err)
  839. return err
  840. }
  841. // 查询任务
  842. var task model.WaybillTask
  843. err = tx.Model(&task).Where("waybill_no = ? and cooler_box_id = ?", c.WaybillNo, coolerBox.Id).
  844. Last(&task).Error
  845. if err != nil {
  846. e.Log.Errorf("db error: %s", err)
  847. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  848. }
  849. // 未下车 直接点签收
  850. if time.Time(task.EndTime).IsZero() {
  851. task.EndTime = model2.Time(time.Now())
  852. //task.UpdateBy = p.UserIds
  853. err = tx.Save(&task).Error
  854. if err != nil {
  855. e.Log.Errorf("db error: %s", err)
  856. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  857. }
  858. }
  859. var userId int
  860. if p != nil {
  861. userId = p.UserId
  862. }
  863. // 添加签收记录
  864. Logistics := model.WaybillLogistics{
  865. WaybillNo: c.WaybillNo,
  866. Status: c.Status,
  867. CoolerBoxId: coolerBox.Id,
  868. UserId: userId,
  869. Lng: lng,
  870. Lat: lat,
  871. ControlBy: model2.ControlBy{
  872. CreateBy: userId,
  873. },
  874. DeptBy: model2.DeptBy{
  875. DeptId: waybillModel.DeptId,
  876. },
  877. ModelTime: model2.ModelTime{
  878. CreatedAt: waybillModel.ReceiptTime,
  879. },
  880. }
  881. err = tx.Create(&Logistics).Error
  882. if err != nil {
  883. e.Log.Errorf("db error: %s", err)
  884. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  885. }
  886. return nil
  887. }
  888. // 获取入库 出库 上车 下车 定位信息
  889. func (e *Waybill) GetSite(companyId int, sn string, time string) (lng, lat string, err error) {
  890. // 获取公司秘钥
  891. var company model.SysDept
  892. company, err = model.GetCompanyById(companyId)
  893. if err != nil {
  894. e.Log.Errorf("db error: %s", err)
  895. return lng, lat, model.GetCompanyKeyErr
  896. }
  897. // 获取传感器信息
  898. var deviceSensorList = []nats_server.DeviceSensor_R{}
  899. var count int64
  900. deviceSensorList, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(sn, company.ColdKey)
  901. if err != nil || count == 0 {
  902. err = errors.New("查询设备定位信息失败")
  903. return lng, lat, err
  904. }
  905. var deviceData nats_server.DeviceData_
  906. deviceData, err = nats_server.Cold_ReadDeviceDataBy_T_snid_T_time(deviceSensorList[0].T_sn, deviceSensorList[0].T_id, time)
  907. if err != nil {
  908. err = errors.New("查询设备定位信息失败")
  909. return lng, lat, err
  910. }
  911. if len(deviceData.T_site) > 0 {
  912. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  913. if len(site) == 2 {
  914. lng = site[0]
  915. lat = site[1]
  916. }
  917. }
  918. return lng, lat, nil
  919. }
  920. // 获取今日运单数 未派单 未装车 未入库 运送中
  921. // 本月运单总数 上月运单总数 本年运单总数 上年运单总数
  922. func (e *Waybill) GetBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission) dto.WaybillStatsRes {
  923. var res dto.WaybillStatsRes
  924. var data model.Waybill
  925. type DateCount struct {
  926. Date string
  927. Count int64
  928. }
  929. yearCount := make([]DateCount, 0)
  930. monthCount := make([]DateCount, 0)
  931. now := time.Now()
  932. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  933. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  934. // 获取上个月第一天
  935. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  936. // 获取去年的第一天
  937. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  938. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  939. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  940. // 今日总运单数
  941. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  942. // 待确定
  943. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  944. // 配送中
  945. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusInDeliverys).Count(&res.InDeliveryNum)
  946. // 已签收
  947. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusReceipts).Count(&res.ReceiptNum)
  948. // 已取消
  949. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusRejections).Count(&res.RejectionNum)
  950. // 获取本月,上月数据
  951. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  952. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  953. for _, month := range monthCount {
  954. if month.Date == now.Format("200601") {
  955. res.ThisMonthNum = month.Count
  956. }
  957. if month.Date == firstDayOfLastMonth.Format("200601") {
  958. res.LastMonthNum = month.Count
  959. }
  960. }
  961. // 获取本年,上年数据
  962. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  963. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  964. for _, month := range yearCount {
  965. if month.Date == now.Format("2006") {
  966. res.ThisYearNum = month.Count
  967. }
  968. if month.Date == firstDayOfLastYear.Format("2006") {
  969. res.LastYearNum = month.Count
  970. }
  971. }
  972. if c.Type == "year" {
  973. // 获取上个月第一天
  974. year, _ := strconv.Atoi(c.Date)
  975. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  976. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  977. // 年度数据统计
  978. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  979. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  980. }
  981. if c.Type == "month" {
  982. // 获取上个月第一天
  983. month, _ := time.ParseInLocation("2006-01", c.Date, time.Local)
  984. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  985. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  986. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  987. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  988. }
  989. return res
  990. }
  991. func GetDeliveryStatsScopes(userId int) func(db *gorm.DB) *gorm.DB {
  992. return func(db *gorm.DB) *gorm.DB {
  993. if userId == 0 {
  994. return db
  995. }
  996. return db.Where("delivery_id = ?", userId)
  997. }
  998. }
  999. func GetReCheckStatsScopes(userId int) func(db *gorm.DB) *gorm.DB {
  1000. return func(db *gorm.DB) *gorm.DB {
  1001. if userId == 0 {
  1002. return db
  1003. }
  1004. return db.Where("re_check_id = ?", userId)
  1005. }
  1006. }
  1007. // 获取配送员统计信息
  1008. func (e *Waybill) GetDeliveryStats(c *dto.WaybillUserStatsReq, p *actions.DataPermission) (res []dto.WaybillUserStats) {
  1009. // 获取用户列表
  1010. var userList []model.SysUser
  1011. if err := e.Orm.Model(&userList).Scopes(actions.Permission(model.SysUser{}.TableName(), p), WaybillUserStatsUserIdScopes(c.UserIds)).
  1012. Where("status = 2").Order("created_at desc").Find(&userList).Error; err != nil {
  1013. return nil
  1014. }
  1015. for _, user := range userList {
  1016. stats := e.GetUserStats(c, p, GetDeliveryStatsScopes(user.Id))
  1017. stats.Name = user.NickName
  1018. res = append(res, stats)
  1019. }
  1020. return
  1021. }
  1022. func (e *Waybill) GetReCheckStats(c *dto.WaybillUserStatsReq, p *actions.DataPermission) (res []dto.WaybillUserStats) {
  1023. // 获取用户列表
  1024. var userList []model.SysUser
  1025. if err := e.Orm.Model(&userList).Scopes(actions.Permission(model.SysUser{}.TableName(), p), WaybillUserStatsUserIdScopes(c.UserIds)).
  1026. Where("status = 2").Order("created_at desc").Find(&userList).Error; err != nil {
  1027. return nil
  1028. }
  1029. for _, user := range userList {
  1030. stats := e.GetUserStats(c, p, GetReCheckStatsScopes(user.Id))
  1031. stats.Name = user.NickName
  1032. res = append(res, stats)
  1033. }
  1034. return
  1035. }
  1036. func WaybillUserStatsUserIdScopes(userIds []int) func(db *gorm.DB) *gorm.DB {
  1037. return func(db *gorm.DB) *gorm.DB {
  1038. if len(userIds) == 0 {
  1039. return db
  1040. }
  1041. if len(userIds) == 1 {
  1042. return db.Where("id = ?", userIds[0])
  1043. }
  1044. return db.Where("id in (?)", userIds)
  1045. }
  1046. }
  1047. func GetUserBasicsStatsScopes(userId int) func(db *gorm.DB) *gorm.DB {
  1048. return func(db *gorm.DB) *gorm.DB {
  1049. if userId == 0 {
  1050. return db
  1051. }
  1052. return db.Where("delivery_id = ? or re_check_id = ? or create_by = ?", userId, userId, userId)
  1053. }
  1054. }
  1055. func (e *Waybill) GetUserBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission, scopes func(*gorm.DB) *gorm.DB) dto.WaybillStatsRes {
  1056. var res dto.WaybillStatsRes
  1057. var data model.Waybill
  1058. type DateCount struct {
  1059. Date string
  1060. Count int64
  1061. }
  1062. yearCount := make([]DateCount, 0)
  1063. monthCount := make([]DateCount, 0)
  1064. now := time.Now()
  1065. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  1066. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  1067. // 获取上个月第一天
  1068. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  1069. // 获取去年的第一天
  1070. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  1071. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  1072. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  1073. // 今日总运单数
  1074. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1075. Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  1076. // 待派单
  1077. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1078. Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  1079. // 配送中
  1080. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1081. Where("status = ?", model.WaybillStatusInDeliverys).Count(&res.InDeliveryNum)
  1082. // 已送达
  1083. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1084. Where("status = ?", model.WaybillStatusReceipts).Count(&res.ReceiptNum)
  1085. // 已取消
  1086. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1087. Where("status = ?", model.WaybillStatusRejections).Count(&res.RejectionNum)
  1088. // 获取本月,上月数据
  1089. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1090. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  1091. for _, month := range monthCount {
  1092. if month.Date == now.Format("200601") {
  1093. res.ThisMonthNum = month.Count
  1094. }
  1095. if month.Date == firstDayOfLastMonth.Format("200601") {
  1096. res.LastMonthNum = month.Count
  1097. }
  1098. }
  1099. // 获取本年,上年数据
  1100. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1101. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  1102. for _, month := range yearCount {
  1103. if month.Date == now.Format("2006") {
  1104. res.ThisYearNum = month.Count
  1105. }
  1106. if month.Date == firstDayOfLastYear.Format("2006") {
  1107. res.LastYearNum = month.Count
  1108. }
  1109. }
  1110. if c.Type == "year" {
  1111. // 获取上个月第一天
  1112. year, _ := strconv.Atoi(c.Date)
  1113. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1114. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1115. // 年度数据统计
  1116. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1117. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1118. }
  1119. if c.Type == "month" {
  1120. // 获取上个月第一天
  1121. month, _ := time.ParseInLocation("2006-01", c.Date, time.Local)
  1122. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1123. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1124. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1125. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1126. }
  1127. return res
  1128. }
  1129. func (e *Waybill) GetUserStats(c *dto.WaybillUserStatsReq, p *actions.DataPermission, scopes func(*gorm.DB) *gorm.DB) dto.WaybillUserStats {
  1130. var res dto.WaybillUserStats
  1131. var data model.Waybill
  1132. type DateCount struct {
  1133. Date string
  1134. Count int64
  1135. }
  1136. now := time.Now()
  1137. if c.Type == "year" {
  1138. // 获取上个月第一天
  1139. year, _ := strconv.Atoi(c.Date)
  1140. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1141. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1142. // 年度数据统计
  1143. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1144. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1145. // 获取这个月的所有日期
  1146. allDates := getAllDatesInYear(c.Date)
  1147. // 补齐缺失日期的数据
  1148. res.Stats = completeMissingDates(allDates, res.Stats)
  1149. }
  1150. if c.Type == "month" {
  1151. // 获取上个月第一天
  1152. month, _ := time.ParseInLocation("2006-01", c.Date, time.Local)
  1153. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1154. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1155. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1156. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1157. // 获取这个月的所有日期
  1158. allDates := getAllDatesInMonth(c.Date)
  1159. // 补齐缺失日期的数据
  1160. res.Stats = completeMissingDates(allDates, res.Stats)
  1161. }
  1162. return res
  1163. }
  1164. // 获取指定月份的所有日期
  1165. func getAllDatesInMonth(month string) []string {
  1166. var dates []string
  1167. layout := "2006-01-02"
  1168. firstDay, _ := time.Parse(layout, month+"-01")
  1169. if time.Now().Before(firstDay) {
  1170. return dates
  1171. }
  1172. lastDay := firstDay.AddDate(0, 1, -1)
  1173. if time.Now().Before(lastDay) {
  1174. lastDay = time.Now()
  1175. }
  1176. for d := firstDay; !d.After(lastDay); d = d.AddDate(0, 0, 1) {
  1177. dates = append(dates, d.Format(layout))
  1178. }
  1179. return dates
  1180. }
  1181. // 获取指定年份的所有日期
  1182. func getAllDatesInYear(year string) []string {
  1183. var dates []string
  1184. layout := "2006-01"
  1185. firstDay, _ := time.Parse(layout, year+"-01")
  1186. lastDay := firstDay.AddDate(1, 0, -1)
  1187. if time.Now().Before(firstDay) {
  1188. return dates
  1189. }
  1190. if time.Now().Before(lastDay) {
  1191. lastDay = time.Now()
  1192. }
  1193. for d := firstDay; !d.After(lastDay); d = d.AddDate(0, 1, 0) {
  1194. dates = append(dates, d.Format(layout))
  1195. }
  1196. return dates
  1197. }
  1198. // 补齐缺失日期的数据
  1199. func completeMissingDates(allDates []string, stats []dto.WaybillStats) []dto.WaybillStats {
  1200. dateMap := make(map[string]int64)
  1201. for _, stat := range stats {
  1202. dateMap[stat.Date] = stat.Num
  1203. }
  1204. var completedStats []dto.WaybillStats
  1205. for _, date := range allDates {
  1206. num, exists := dateMap[date]
  1207. if !exists {
  1208. num = 0
  1209. }
  1210. completedStats = append(completedStats, dto.WaybillStats{Date: date, Num: num})
  1211. }
  1212. return completedStats
  1213. }
  1214. // 获取运单所有温湿度素具
  1215. func (e *Waybill) GetAllData(c *dto.WaybillGetByWaybillNoReq) ([]nats_server.DeviceData_R, []WaybillPDF, error) {
  1216. var err error
  1217. var data model.WaybillTask
  1218. var waybill model.Waybill
  1219. var taskList []model.WaybillTask
  1220. var waybillPDF []WaybillPDF
  1221. dataList := make([]nats_server.DeviceData_R, 0)
  1222. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  1223. if err != nil {
  1224. e.Log.Errorf("db error: %s", err)
  1225. return dataList, waybillPDF, errors.New("获取运单信息失败")
  1226. }
  1227. // 未签收,不返回数据
  1228. if waybill.Status != model.WaybillStatusReceipts {
  1229. return dataList, waybillPDF, nil
  1230. }
  1231. // 获取公司秘钥
  1232. var company model.SysDept
  1233. company, err = model.GetCompanyById(waybill.DeptId)
  1234. if err != nil {
  1235. e.Log.Errorf("db error: %s", err)
  1236. return dataList, waybillPDF, model.GetCompanyKeyErr
  1237. }
  1238. err = e.Orm.Model(&data).
  1239. Where("waybill_no = ?", c.WaybillNo).
  1240. Order("id desc").
  1241. Find(&taskList).Error
  1242. if err != nil {
  1243. e.Log.Errorf("db error: %s", err)
  1244. return dataList, waybillPDF, global.GetFailedErr
  1245. }
  1246. // 获取最后一个任务id
  1247. var lastWaybillTask model.WaybillTask
  1248. err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", c.WaybillNo).Last(&lastWaybillTask).Error
  1249. if err != nil {
  1250. e.Log.Errorf("db error: %s", err)
  1251. err = errors.New("获取运单信息错误!")
  1252. return dataList, waybillPDF, err
  1253. }
  1254. // 创建名称到权重的映射
  1255. orderMap := make(map[string]int)
  1256. for i, v := range taskList {
  1257. orderMap[v.Sn] = i
  1258. }
  1259. for i := 0; i < len(taskList); i++ {
  1260. // 获取传感器信息
  1261. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  1262. var T_snid string
  1263. var list []nats_server.DeviceData_R
  1264. for _, r := range deviceSensorList {
  1265. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  1266. }
  1267. var count int64
  1268. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  1269. if err != nil {
  1270. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  1271. return dataList, waybillPDF, global.GetFailedErr
  1272. }
  1273. firstMap := map[int]nats_server.DeviceData_R{}
  1274. lastMap := map[int]nats_server.DeviceData_R{}
  1275. if count > 0 {
  1276. for _, v := range deviceSensorList {
  1277. for j := 0; j < len(list); j++ {
  1278. if v.T_id == list[j].T_id {
  1279. if list[j].T_time != taskList[i].StartTime.String() {
  1280. firstData := list[j]
  1281. firstData.T_time = taskList[i].StartTime.String()
  1282. firstMap[v.T_id] = firstData
  1283. count += 1
  1284. }
  1285. break
  1286. }
  1287. }
  1288. if waybill.Status == model.WaybillStatusReceipts {
  1289. for k := len(list) - 1; k >= 0; k-- {
  1290. if v.T_id == list[k].T_id {
  1291. if taskList[i].Id == lastWaybillTask.Id && list[k].T_time != taskList[i].EndTime.String() && !time.Time(taskList[i].EndTime).IsZero() {
  1292. lastData := list[k]
  1293. lastData.T_time = taskList[i].EndTime.String()
  1294. lastMap[v.T_id] = lastData
  1295. count += 1
  1296. }
  1297. break
  1298. }
  1299. }
  1300. }
  1301. }
  1302. }
  1303. for _, v := range firstMap {
  1304. list = append(list, v)
  1305. }
  1306. for _, v := range lastMap {
  1307. list = append(list, v)
  1308. }
  1309. sort.Slice(list, func(x, y int) bool {
  1310. if list[x].T_time == list[y].T_time {
  1311. // 如果时间相同,则按预设顺序排序
  1312. return orderMap[list[x].T_sn] < orderMap[list[y].T_sn]
  1313. }
  1314. return list[x].T_time > list[y].T_time
  1315. })
  1316. dataList = append(dataList, list...)
  1317. waybillPDF = append(waybillPDF, WaybillPDF{
  1318. Data: list,
  1319. DeviceSensorList: deviceSensorList,
  1320. Task: taskList[i],
  1321. })
  1322. }
  1323. sort.Slice(dataList, func(i, j int) bool {
  1324. if dataList[i].T_time == dataList[j].T_time {
  1325. // 如果时间相同,则按预设顺序排序
  1326. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  1327. }
  1328. return dataList[i].T_time < dataList[j].T_time
  1329. })
  1330. return dataList, waybillPDF, nil
  1331. }
  1332. type WaybillPDF struct {
  1333. Data []nats_server.DeviceData_R `json:"data"`
  1334. DeviceSensorList []nats_server.DeviceSensor_R `json:"deviceSensorList"`
  1335. Task model.WaybillTask `json:"task"`
  1336. }
  1337. // Insert 创建Waybill对象
  1338. func (e *Waybill) InsertByOrderId(c *dto.WeianGetWaybillNoReq) error {
  1339. var err error
  1340. var data model.Waybill
  1341. tx := e.Orm.Begin()
  1342. defer func() {
  1343. if err != nil {
  1344. tx.Rollback()
  1345. } else {
  1346. tx.Commit()
  1347. }
  1348. }()
  1349. var company model.SysDept
  1350. var i int64
  1351. err = e.Orm.Model(&company).Where("name = ?", c.CompanyName).Count(&i).Error
  1352. if err != nil {
  1353. e.Log.Errorf("db error: %s", err)
  1354. return global.CreateFailedErr
  1355. }
  1356. if i == 0 {
  1357. err = errors.New("公司名称不存在!")
  1358. e.Log.Errorf("db error: %s", err)
  1359. return err
  1360. }
  1361. var no string
  1362. for {
  1363. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  1364. var j int64
  1365. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  1366. if err != nil {
  1367. continue
  1368. }
  1369. if j == 0 {
  1370. break
  1371. }
  1372. }
  1373. // 添加运单
  1374. data.WaybillNo = no
  1375. data.OrderNo = c.OrderId
  1376. data.DeptId = company.Id
  1377. data.Status = 1
  1378. data.OrderTime = model2.Time(time.Now())
  1379. err = tx.Create(&data).Error
  1380. if err != nil {
  1381. e.Log.Errorf("db error: %s", err)
  1382. return global.CreateFailedErr
  1383. }
  1384. c.WaybillNo = data.WaybillNo
  1385. return nil
  1386. }
  1387. // CreateSole 生成唯一订单编号
  1388. func (e *Waybill) CreateSole() (string, error) {
  1389. var waybill model.Waybill
  1390. var err error
  1391. var count int64
  1392. format := time.Now().Format("20060102")
  1393. un := time.Now().Unix()
  1394. waybillno := fmt.Sprintf("%v%v", format, un)
  1395. err = e.Orm.Model(&waybill).Where("waybill_no = ?", waybillno).Count(&count).Error
  1396. if count > 0 {
  1397. return e.CreateSole()
  1398. }
  1399. if err != nil {
  1400. e.Log.Errorf("生成订单号错误: %s", err)
  1401. err = errors.New("生成订单号错误,请重新生成")
  1402. return "", err
  1403. }
  1404. return waybillno, nil
  1405. }
  1406. // WaybillTurnarounds 订单转门店
  1407. func (e *Waybill) WaybillTurnarounds(c *dto.WaybillTurnarounds, p *actions.DataPermission) error {
  1408. var err error
  1409. var waybillModel model.Waybill
  1410. var count int64
  1411. //查询订单是否存在
  1412. tx := e.Orm.Begin()
  1413. defer func() {
  1414. if err != nil {
  1415. tx.Rollback()
  1416. } else {
  1417. tx.Commit()
  1418. }
  1419. }()
  1420. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1421. Where("waybill_no = ?", c.WaybillNo).
  1422. First(&waybillModel).Count(&count).Error
  1423. if err != nil {
  1424. e.Log.Errorf("db error: %s", err)
  1425. if errors.Is(err, gorm.ErrRecordNotFound) {
  1426. return global.GetNotFoundOrNoPermissionErr
  1427. }
  1428. return global.GetFailedErr
  1429. }
  1430. if count == 0 {
  1431. return errors.New("订单不存在")
  1432. }
  1433. //查询门店是否存在可以转换
  1434. var data model.SysDept
  1435. var Depts []model.SysDept
  1436. err = e.Orm.Model(&data).
  1437. Scopes(
  1438. CompanyIdScopesUser(p.DeptId),
  1439. ).Find(&Depts).Error
  1440. if err != nil {
  1441. e.Log.Errorf("db error: %s", err)
  1442. return global.GetFailedErr
  1443. }
  1444. contains := false
  1445. for _, v := range Depts {
  1446. if v.Id == c.DeptId {
  1447. contains = true
  1448. } else {
  1449. contains = false
  1450. }
  1451. }
  1452. if !contains {
  1453. return errors.New("转门店不存在")
  1454. }
  1455. waybillModel.DeptId = c.DeptId
  1456. update := tx.Updates(&waybillModel)
  1457. if update.Error != nil {
  1458. e.Log.Errorf("db error: %s", update.Error)
  1459. return global.UpdateFailedErr
  1460. }
  1461. return nil
  1462. }