waybill.go 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899
  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. //查询对应药品信息
  144. for i, _ := range *list {
  145. var drugs []model.Drug
  146. e.Orm.Where("drug.waybill_no = ?", (*list)[i].WaybillNo).Find(&drugs)
  147. (*list)[i].Drugs = drugs
  148. }
  149. return nil
  150. }
  151. func (e *Waybill) GetUserPage(c *dto.WaybillGetPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  152. var err error
  153. var data model.Waybill
  154. // 构建基础查询
  155. db := e.Orm.Model(&data).
  156. Scopes(
  157. orStatus(c.Status),
  158. cDto.MakeCondition(c.GetNeedSearch()),
  159. )
  160. // 添加用户相关的条件
  161. db = db.Where("delivery_id = ?", p.UserId)
  162. // 先计算总条目数
  163. if err = db.Count(count).Error; err != nil {
  164. e.Log.Errorf("db error: %s", err)
  165. return global.GetFailedErr
  166. }
  167. // 如果PageSize设置为9999,则不分页
  168. if c.PageSize == 9999 {
  169. err = db.Find(list).Error
  170. } else {
  171. // 应用分页
  172. err = db.Scopes(
  173. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  174. ).
  175. Preload("CoolerBox").
  176. Preload("Delivery").
  177. Preload("ReCheck").
  178. Find(list).Error
  179. }
  180. if err != nil {
  181. e.Log.Errorf("db error: %s", err)
  182. return global.GetFailedErr
  183. }
  184. //查询对应药品信息
  185. for i, _ := range *list {
  186. var drugs []model.Drug
  187. e.Orm.Where("drug.waybill_no = ?", (*list)[i].WaybillNo).Find(&drugs)
  188. (*list)[i].Drugs = drugs
  189. }
  190. return nil
  191. }
  192. func (e *Waybill) GetAppletPage(c *dto.WaybillGetAppletPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  193. var err error
  194. //var data model.Waybill
  195. var logistics model.WaybillLogistics
  196. err = e.Orm.Table("waybill").
  197. Select("waybill.*,waybill_logistics.status as status").
  198. Scopes(
  199. cDto.MakeCondition(c.GetNeedSearch()),
  200. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  201. actions.Permission(logistics.TableName(), p)).
  202. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  203. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  204. Find(&list).Limit(-1).Offset(-1).Count(count).Error
  205. if err != nil {
  206. e.Log.Errorf("db error: %s", err)
  207. return global.GetFailedErr
  208. }
  209. return nil
  210. }
  211. func (e *Waybill) GetAppletCount(list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  212. var err error
  213. //var data model.Waybill
  214. var logistics model.WaybillLogistics
  215. err = e.Orm.Table("waybill").
  216. Select("waybill.*,waybill_logistics.status as status").
  217. Scopes(
  218. actions.Permission(logistics.TableName(), p)).
  219. Where("waybill_logistics.id in (SELECT MAX(id) FROM waybill_logistics where user_id = ? group by waybill_no )", p.UserId).
  220. Joins("left join waybill_logistics on waybill.waybill_no = waybill_logistics.waybill_no").
  221. Find(list).Count(count).Error
  222. if err != nil {
  223. e.Log.Errorf("db error: %s", err)
  224. return global.GetFailedErr
  225. }
  226. return nil
  227. }
  228. func (e *Waybill) GetCustomerPage(c *dto.WaybillGetCustomerPageReq, list *[]model.Waybill, count *int64, p *actions.DataPermission) error {
  229. var err error
  230. var data model.Waybill
  231. if c.PageSize == 9999 {
  232. err = e.Orm.Model(&data).
  233. Scopes(
  234. cDto.MakeCondition(c.GetNeedSearch()),
  235. actions.Permission(data.TableName(), p),
  236. ).
  237. Find(list).Limit(-1).Offset(-1).
  238. Count(count).Error
  239. if err != nil {
  240. e.Log.Errorf("db error: %s", err)
  241. return global.GetFailedErr
  242. }
  243. return nil
  244. }
  245. err = e.Orm.Model(&data).
  246. Scopes(
  247. cDto.MakeCondition(c.GetNeedSearch()),
  248. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  249. actions.Permission(data.TableName(), p),
  250. ).
  251. Find(list).Limit(-1).Offset(-1).
  252. Count(count).Error
  253. if err != nil {
  254. e.Log.Errorf("db error: %s", err)
  255. return global.GetFailedErr
  256. }
  257. return nil
  258. }
  259. // Get 获取Waybill对象
  260. func (e *Waybill) Get(d *dto.WaybillGetReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  261. err := e.Orm.
  262. Scopes(actions.Permission(waybillModel.TableName(), p)).
  263. Preload("User").
  264. First(waybillModel, d.GetId()).Error
  265. if err != nil {
  266. e.Log.Errorf("db error: %s", err)
  267. if errors.Is(err, gorm.ErrRecordNotFound) {
  268. return global.GetNotFoundOrNoPermissionErr
  269. }
  270. return global.GetFailedErr
  271. }
  272. return nil
  273. }
  274. func (e *Waybill) GetByWaybillNo(d *dto.WaybillGetByWaybillPdfReq, waybillModel *model.Waybill, p *actions.DataPermission) error {
  275. err := e.Orm.
  276. Scopes(actions.Permission(waybillModel.TableName(), p)).
  277. Where("waybill.waybill_no = ?", d.WaybillNo).
  278. Joins("left join drug on drug.waybill_no = waybill.waybill_no").
  279. Preload("Dept").
  280. Preload("CoolerBox").
  281. Preload("Delivery").
  282. Preload("ReCheck").
  283. First(waybillModel).Error
  284. if err != nil {
  285. e.Log.Errorf("db error: %s", err)
  286. if errors.Is(err, gorm.ErrRecordNotFound) {
  287. return global.GetNotFoundOrNoPermissionErr
  288. }
  289. return global.GetFailedErr
  290. }
  291. var drugs []model.Drug
  292. e.Orm.Where("drug.waybill_no = ?", waybillModel.WaybillNo).Find(&drugs)
  293. waybillModel.Drugs = drugs
  294. return nil
  295. }
  296. // Insert 创建Waybill对象
  297. func (e *Waybill) Insert(c *dto.WaybillInsertReq) error {
  298. var err error
  299. var data model.Waybill
  300. tx := e.Orm.Begin()
  301. defer func() {
  302. if err != nil {
  303. tx.Rollback()
  304. } else {
  305. tx.Commit()
  306. }
  307. }()
  308. var no string
  309. for {
  310. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  311. var j int64
  312. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  313. if err != nil {
  314. continue
  315. }
  316. if j == 0 {
  317. break
  318. }
  319. }
  320. // 添加运单
  321. data.WaybillNo = no
  322. sole, err := e.CreateSole()
  323. if err != nil {
  324. err = errors.New("生成运单号失败")
  325. return err
  326. }
  327. data.OrderNo = sole
  328. c.Generate(&data)
  329. if c.IsPhone {
  330. data.Status = model.WaybillStatusInDeliverys
  331. data.AssignmentStatus = 2
  332. }
  333. err = tx.Create(&data).Error
  334. if err != nil {
  335. e.Log.Errorf("db error: %s", err)
  336. return global.CreateFailedErr
  337. }
  338. c.Id = data.Id
  339. // 保存发货地址
  340. if c.SaveConsigneeAddress {
  341. // 查询地址是否存在
  342. address := model.Address{}
  343. err = e.Orm.Where("address = ? and phone = ? and name = ? and dept_id = ? and address_type = 'consignee'",
  344. c.ConsigneeAddressDetails, c.ConsigneeAddressPhone, c.ConsigneeAddressName, c.DeptId).First(&address).Error
  345. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  346. address.Address = c.ConsigneeAddressDetails
  347. address.Phone = c.ConsigneeAddressPhone
  348. address.Name = c.ConsigneeAddressName
  349. address.DeptId = c.DeptId
  350. address.AddressType = "consignee"
  351. err = tx.Create(&address).Error
  352. if err != nil {
  353. e.Log.Errorf("创建地址失败: %s", err)
  354. return global.CreateFailedErr
  355. }
  356. }
  357. }
  358. if len(c.Drugs) > 0 {
  359. for _, drug := range c.Drugs {
  360. var drugs model.Drug
  361. drugs.WaybillNo = no
  362. drugs.Drug_ent_base_info_id = drug.Drug_ent_base_info_id
  363. drugs.Ent_name = drug.Ent_name
  364. drugs.Physic_name = drug.Physic_name
  365. drugs.Approval_licence_no = drug.Approval_licence_no
  366. drugs.Prepn_spec = drug.Prepn_spec
  367. drugs.Physic_type_desc = drug.Physic_type_desc
  368. drugs.Pkg_spec_crit = drug.Pkg_spec_crit
  369. drugs.Prepn_type_desc = drug.Prepn_type_desc
  370. drugs.Code = drug.Code
  371. err = tx.Save(&drugs).Error
  372. if err != nil {
  373. e.Log.Errorf("db error: %s", err)
  374. return errors.New("保存药品信息失败")
  375. }
  376. }
  377. }
  378. return nil
  379. }
  380. // Update 修改Waybill对象
  381. func (e *Waybill) Update(c *dto.WaybillUpdateReq, p *actions.DataPermission) error {
  382. var err error
  383. tx := e.Orm.Begin()
  384. defer func() {
  385. if err != nil {
  386. tx.Rollback()
  387. } else {
  388. tx.Commit()
  389. }
  390. }()
  391. var waybillModel = model.Waybill{}
  392. // 查询运单是否存在
  393. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  394. First(&waybillModel, c.GetId()).Error
  395. if err != nil {
  396. e.Log.Errorf("db error: %s", err)
  397. if errors.Is(err, gorm.ErrRecordNotFound) {
  398. return global.UpdateNotFoundOrNoPermissionErr
  399. }
  400. return global.UpdateFailedErr
  401. }
  402. c.Generate(&waybillModel)
  403. var count int64
  404. for _, drug := range c.Drugs {
  405. e.Orm.Model(&model.Drug{}).Where("code = ?", drug.Code).Count(&count)
  406. if count > 0 {
  407. return errors.New("药品编号已存在")
  408. }
  409. }
  410. waybillModel.Drugs = append(waybillModel.Drugs, c.Drugs...)
  411. err = tx.Where("id = ?", waybillModel.Id).Updates(&waybillModel).Error
  412. if err != nil {
  413. e.Log.Errorf("db error: %s", err)
  414. return global.UpdateFailedErr
  415. }
  416. c.Id = waybillModel.Id
  417. return nil
  418. }
  419. // 审核订单
  420. func (e *Waybill) Audit(c *dto.WaybillUpdateReqaudit, p *actions.DataPermission) error {
  421. var err error
  422. tx := e.Orm.Begin()
  423. defer func() {
  424. if err != nil {
  425. tx.Rollback()
  426. } else {
  427. tx.Commit()
  428. }
  429. }()
  430. var waybillModel = model.Waybill{}
  431. // 查询运单是否存在
  432. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  433. First(&waybillModel, c.GetId()).Error
  434. if err != nil {
  435. e.Log.Errorf("db error: %s", err)
  436. if errors.Is(err, gorm.ErrRecordNotFound) {
  437. return global.UpdateNotFoundOrNoPermissionErr
  438. }
  439. return global.UpdateFailedErr
  440. }
  441. c.Generate(&waybillModel)
  442. waybillModel.Status = c.Status
  443. waybillModel.ReCheckId = p.UserId
  444. err = tx.Updates(&waybillModel).Error
  445. if err != nil {
  446. e.Log.Errorf("db error: %s", err)
  447. return global.UpdateFailedErr
  448. }
  449. c.Id = waybillModel.Id
  450. return nil
  451. }
  452. // AdminAudit 管理员审核订单
  453. func (e *Waybill) AdminAudit(c *dto.WaybillAdmin, p *actions.DataPermission) error {
  454. var err error
  455. tx := e.Orm.Begin()
  456. defer func() {
  457. if err != nil {
  458. tx.Rollback()
  459. } else {
  460. tx.Commit()
  461. }
  462. }()
  463. var waybillModel = model.Waybill{}
  464. // 查询运单是否存在
  465. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  466. First(&waybillModel, c.GetId()).Error
  467. if err != nil {
  468. e.Log.Errorf("db error: %s", err)
  469. if errors.Is(err, gorm.ErrRecordNotFound) {
  470. return global.UpdateNotFoundOrNoPermissionErr
  471. }
  472. return global.UpdateFailedErr
  473. }
  474. c.Generate(&waybillModel)
  475. waybillModel.AdminAuditRemark = c.AdminAuditRemark
  476. err = tx.Updates(&waybillModel).Error
  477. if err != nil {
  478. e.Log.Errorf("db error: %s", err)
  479. return global.UpdateFailedErr
  480. }
  481. c.Id = waybillModel.Id
  482. return nil
  483. }
  484. func (e *Waybill) UpdateStatus(c *dto.UpdateStatusReq, p *actions.DataPermission) error {
  485. var err error
  486. tx := e.Orm.Begin()
  487. defer func() {
  488. if err != nil {
  489. tx.Rollback()
  490. } else {
  491. tx.Commit()
  492. }
  493. }()
  494. // 查询运单是否存在
  495. for _, v := range c.Id {
  496. var waybillModel = model.Waybill{}
  497. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  498. First(&waybillModel, v).Error
  499. if err != nil {
  500. e.Log.Errorf("db error: %s", err)
  501. if errors.Is(err, gorm.ErrRecordNotFound) {
  502. return global.UpdateNotFoundOrNoPermissionErr
  503. }
  504. return global.UpdateFailedErr
  505. }
  506. //添加确认人信息
  507. if waybillModel.Status == model.WaybillStatusAudits {
  508. err, sysUser := GetUserProfile(e.Orm, p.UserId)
  509. if err != nil {
  510. e.Log.Errorf("db 获取用户信息失败: %s", err)
  511. return errors.New("获取用户信息失败")
  512. }
  513. waybillModel.Confirmer = sysUser.NickName
  514. waybillModel.ConfirmerPhone = sysUser.Phone
  515. }
  516. waybillModel.Status = c.Status
  517. err = tx.Table(waybillModel.TableName()).Where("id=?", v).Updates(&waybillModel).Error
  518. if err != nil {
  519. e.Log.Errorf("db error: %s", err)
  520. return global.UpdateFailedErr
  521. }
  522. }
  523. return nil
  524. }
  525. // Delivery 派单
  526. func (e *Waybill) Delivery(c *dto.WaybillDeliveryReq, p *actions.DataPermission) error {
  527. var err error
  528. tx := e.Orm.Begin()
  529. defer func() {
  530. if err != nil {
  531. tx.Rollback()
  532. } else {
  533. tx.Commit()
  534. }
  535. }()
  536. var user model.SysUser
  537. first := e.Orm.Table(user.TableName()).Where("id = ?", p.UserId).First(&user)
  538. if first.Error != nil {
  539. return global.GetFailedErr
  540. }
  541. if !lib.StrListEqual(c.IceRaftCode, c.OldIceRaftCode) {
  542. // 获取删除的冰排列表
  543. //missingIceRaftCode = lib.FindStrListMissingData(c.OldIceRaftCode, c.IceRaftCode)
  544. //if len(missingIceRaftCode) > 0 {
  545. // // 删除冰排出库记录
  546. // IceRaftList := []model.IceRaft{}
  547. // err = tx.Model(&model.IceRaft{}).Where("code in (?)", missingIceRaftCode).Find(&IceRaftList).Error
  548. // if err != nil {
  549. // e.Log.Errorf("db error: %s", err)
  550. // return errors.New("获取冰排列表失败")
  551. // }
  552. // for _, iceRaft := range IceRaftList {
  553. // // 获取冰排记录
  554. // err = tx.Model(&model.IceRaftRecord{}).
  555. // Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusUsing).
  556. // Updates(map[string]interface{}{
  557. // "status": model.IceRaftRecordStatusWaitUse,
  558. // "out_storage_time": nil,
  559. // "cooler_box_id": 0,
  560. // }).Error
  561. // if err != nil {
  562. // e.Log.Errorf("db error: %s", err)
  563. // return errors.New(fmt.Sprintf("冰排【%s】返库失败", iceRaft.Code))
  564. // }
  565. // }
  566. //}
  567. // 获取新增的冰排列表
  568. //判断是否可以随时出库冰排
  569. extraData := lib.FindStrListExtraData(c.OldIceRaftCode, c.IceRaftCode)
  570. if len(extraData) > 0 {
  571. for _, code := range extraData {
  572. var iceRaft model.IceRaft
  573. err = tx.Model(&model.IceRaft{}).Where("code = ?", code).Preload("IceRaftRecord").First(&iceRaft).Error
  574. if err != nil {
  575. e.Log.Errorf("db error: %s", err)
  576. if errors.Is(err, gorm.ErrRecordNotFound) {
  577. return errors.New(fmt.Sprintf("冰排【%s】不存在", code))
  578. } else {
  579. return errors.New(fmt.Sprintf("获取冰排【%s】信息失败", code))
  580. }
  581. }
  582. if user.Dept.IsOutStorage {
  583. if iceRaft.IceRaftRecord.Status != model.IceRaftRecordStatusWaitUse {
  584. err = errors.New(fmt.Sprintf("冰排【%s】状态为%s,出库保温箱失败!", code, model.GetIceRaftRecordStatus(iceRaft.IceRaftRecord.Status)))
  585. return err
  586. }
  587. err = tx.Model(&model.IceRaftRecord{}).
  588. Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusWaitUse).
  589. Updates(map[string]interface{}{
  590. "status": model.IceRaftRecordStatusUsing,
  591. "out_storage_time": time.Now(),
  592. "cooler_box_id": c.CoolerBoxId,
  593. }).Error
  594. if err != nil {
  595. e.Log.Errorf("db error: %s", err)
  596. return errors.New(fmt.Sprintf("冰排【%s】出库失败", iceRaft.Code))
  597. }
  598. } else {
  599. err = tx.Model(&model.IceRaftRecord{}).
  600. Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusFreezing).
  601. Or("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusWaitUse).
  602. Or("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordReleasedInTheCold).
  603. Updates(map[string]interface{}{
  604. "status": model.IceRaftRecordStatusUsing,
  605. "out_storage_time": time.Now(),
  606. "cooler_box_id": c.CoolerBoxId,
  607. }).Error
  608. if err != nil {
  609. e.Log.Errorf("db error: %s", err)
  610. return errors.New(fmt.Sprintf("冰排【%s】出库失败", iceRaft.Code))
  611. }
  612. }
  613. // 获取冰排记录
  614. //err = tx.Model(&model.IceRaftRecord{}).
  615. // Where("ice_raft_id = ? and status = ?", iceRaft.Id, model.IceRaftRecordStatusWaitUse).
  616. // Updates(map[string]interface{}{
  617. // "status": model.IceRaftRecordStatusUsing,
  618. // "out_storage_time": time.Now(),
  619. // "cooler_box_id": c.CoolerBoxId,
  620. // }).Error
  621. //if err != nil {
  622. // e.Log.Errorf("db error: %s", err)
  623. // return errors.New(fmt.Sprintf("冰排【%s】出库失败", iceRaft.Code))
  624. //}
  625. }
  626. }
  627. }
  628. var coolerBox = model.CoolerBox{}
  629. // 查询保温箱信息
  630. if c.CoolerBoxId != 0 {
  631. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  632. First(&coolerBox, c.CoolerBoxId).Error
  633. if err != nil {
  634. e.Log.Errorf("获取保温箱信息失败: %s", err)
  635. return errors.New("获取保温箱信息失败")
  636. }
  637. }
  638. for _, id := range c.WaybillIds {
  639. var waybillModel = model.Waybill{}
  640. // 查询运单是否存在
  641. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  642. First(&waybillModel, id).Error
  643. if err != nil {
  644. e.Log.Errorf("db error: %s", err)
  645. if errors.Is(err, gorm.ErrRecordNotFound) {
  646. return global.UpdateNotFoundOrNoPermissionErr
  647. }
  648. return global.UpdateFailedErr
  649. }
  650. //派单时添加
  651. //waybillModeStatus := waybillModel.Status
  652. if waybillModel.Status == model.WaybillStatusInDeliverys || (waybillModel.Status == model.WaybillStatusInDeliverys && waybillModel.CoolerBoxId != c.CoolerBoxId) || (waybillModel.Status == model.WaybillStatusInDeliverys && !lib.StrListEqual(c.IceRaftCode, c.OldIceRaftCode)) {
  653. waybillModel.Status = model.WaybillStatusInDeliverys
  654. waybillModel.TamperProofLabel = c.TamperProofLabel
  655. waybillModel.TamperProofLabelImg = c.TamperProofLabelImg // 防拆标签
  656. waybillModel.DeliveryId = c.DeliveryId
  657. waybillModel.AssignmentStatus = 2 // 分配状态 2 已派单
  658. waybillModel.CoolerBoxId = c.CoolerBoxId
  659. waybillModel.DeliveryTime = model2.Time(time.Now())
  660. waybillModel.IceRaftCode = c.IceRaftCode
  661. waybillModel.SecondaryTime = model2.Time(time.Now()) //分配时间
  662. if c.Status == model.WaybillStatusInShippeds {
  663. waybillModel.Status = c.Status
  664. var data model.IceRaft
  665. var list []string
  666. err := e.Orm.Model(&data).
  667. Select("ice_raft.code").
  668. Scopes(
  669. actions.Permission(data.TableName(), p),
  670. IceRaftNameRecordStatusScopes(model.IceRaftRecordStatusUsing),
  671. IceRaftNameRecordCoolerBoxIdScopes(c.CoolerBoxId),
  672. ).
  673. Joins("left join ice_raft_record on ice_raft.ice_raft_record_id = ice_raft_record.id").
  674. Find(&list).Error
  675. if err != nil {
  676. e.Log.Errorf("db error: %s", err)
  677. return errors.New("获取冰排编号失败")
  678. }
  679. //查询保温箱记录信息状态为1使用中
  680. var cooler model.CoolerBoxRecord
  681. var count int64
  682. e.Orm.Scopes(actions.Permission(cooler.TableName(), p)).
  683. Where("cooler_box_id = ?", c.CoolerBoxId).Where("status = ?", 1).First(&cooler).Count(&count)
  684. if count == 0 {
  685. cooler.CoolerBoxId = c.CoolerBoxId
  686. cooler.Name = coolerBox.Name
  687. cooler.Sn = coolerBox.Sn
  688. cooler.CoolerUseUsers = user.NickName
  689. if len(list) == 0 {
  690. cooler.HistoryCode = append(cooler.HistoryCode, c.IceRaftCode...)
  691. cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
  692. } else {
  693. cooler.HistoryCode = append(cooler.HistoryCode, list...)
  694. cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
  695. }
  696. cooler.CoolerUserTime = model2.Time(time.Now())
  697. cooler.Status = "2" //使用结束
  698. cooler.DeptId = user.DeptId
  699. err := e.Orm.Save(&cooler).Error
  700. if err != nil {
  701. e.Log.Errorf("保存保温箱记录失败: %s", err)
  702. return errors.New("保存保温箱记录失败")
  703. }
  704. } else {
  705. cooler.CoolerUseUsers = user.NickName
  706. if len(list) == 0 {
  707. cooler.HistoryCode = append(cooler.HistoryCode, c.IceRaftCode...)
  708. cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
  709. } else {
  710. cooler.HistoryCode = append(cooler.HistoryCode, list...)
  711. cooler.HistoryCode = cDto.UniqueSlice(cooler.HistoryCode)
  712. }
  713. cooler.CoolerUserTime = model2.Time(time.Now())
  714. cooler.Status = "2" //使用结束
  715. err = e.Orm.Updates(&cooler).Where("id = ?", cooler.Id).Error
  716. if err != nil {
  717. e.Log.Errorf("保存保温箱记录失败: %s", err)
  718. return errors.New("保存保温箱记录失败")
  719. }
  720. }
  721. // 配送中状态下才发送短信
  722. ss := sms.NewSMS(conf.ExtConfig.SubMail.Appid, conf.ExtConfig.SubMail.Signature)
  723. addr := conf.ExtConfig.Applet.WaybillUrl + url.QueryEscape(lib.AesEncryptCBC(waybillModel.WaybillNo, lib.AesKey))
  724. res, err1 := ss.SmsXSend(waybillModel.ConsigneeAddressPhone, addr)
  725. if err1 != nil || res.Status != sms.SUCCESS {
  726. e.Log.Errorf("派单短信发送失败", zap.Any("res", res), zap.Error(err1))
  727. err = errors.New("派单短信发送失败,请检查收件人电话是否正确!")
  728. return err
  729. }
  730. waybillModel.SendLog = model.WaybillSendLog{
  731. Phone: waybillModel.ConsigneeAddressPhone,
  732. Content: "【冷链送药追溯平台】您的运单正在派送中,点击查看详情:" + addr,
  733. }
  734. //// 查询任务
  735. //var logistics model.WaybillLogistics
  736. // 添加物流
  737. //logisticsObj := model.WaybillLogistics{
  738. // WaybillNo: waybillModel.WaybillNo,
  739. // Status: waybillModel.Status,
  740. // CoolerBoxId: coolerBox.Id,
  741. // ControlBy: model2.ControlBy{
  742. // CreateBy: p.UserId,
  743. // },
  744. // DeptBy: model2.DeptBy{
  745. // DeptId: p.DeptId,
  746. // },
  747. //}
  748. //err = tx.Create(&logisticsObj).Error
  749. //if err != nil {
  750. // e.Log.Errorf("db error: %s", err)
  751. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  752. //}
  753. //logistics.CoolerBoxId = coolerBox.Id
  754. //err = tx.Save(&logistics).Error
  755. //if err != nil {
  756. // e.Log.Errorf("db error: %s", err)
  757. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  758. //}
  759. }
  760. // 查询任务
  761. err = tx.Save(&waybillModel).Error
  762. if err != nil {
  763. e.Log.Errorf("db error: %s", err)
  764. return global.UpdateFailedErr
  765. }
  766. // 查询任务
  767. //var logistics model.WaybillLogistics
  768. //err = tx.Model(&logistics).Where("waybill_no = ?", waybillModel.WaybillNo).
  769. // Last(&logistics).Error
  770. //if err != nil {
  771. // if errors.Is(err, gorm.ErrRecordNotFound) {
  772. // // 添加物流
  773. // logisticsObj := model.WaybillLogistics{
  774. // WaybillNo: waybillModel.WaybillNo,
  775. // Status: waybillModel.Status,
  776. // CoolerBoxId: coolerBox.Id,
  777. // ControlBy: model2.ControlBy{
  778. // CreateBy: p.UserId,
  779. // },
  780. // DeptBy: model2.DeptBy{
  781. // DeptId: p.DeptId,
  782. // },
  783. // }
  784. // err = tx.Create(&logisticsObj).Error
  785. // if err != nil {
  786. // e.Log.Errorf("db error: %s", err)
  787. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  788. // }
  789. // } else {
  790. // e.Log.Errorf("db error: %s", err)
  791. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  792. // }
  793. // logistics.CoolerBoxId = coolerBox.Id
  794. // err = tx.Save(&logistics).Error
  795. // if err != nil {
  796. // e.Log.Errorf("db error: %s", err)
  797. // return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  798. // }
  799. //}
  800. // 添加物流
  801. logisticsObj := model.WaybillLogistics{
  802. WaybillNo: waybillModel.WaybillNo,
  803. Status: waybillModel.Status,
  804. CoolerBoxId: coolerBox.Id,
  805. ControlBy: model2.ControlBy{
  806. CreateBy: p.UserId,
  807. },
  808. DeptBy: model2.DeptBy{
  809. DeptId: p.DeptId,
  810. },
  811. }
  812. err = tx.Create(&logisticsObj).Error
  813. if err != nil {
  814. e.Log.Errorf("db error: %s", err)
  815. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  816. }
  817. // 查询任务
  818. var task model.WaybillTask
  819. err = tx.Model(&task).Where("waybill_no = ? ", waybillModel.WaybillNo).
  820. Last(&task).Error
  821. if err != nil {
  822. if errors.Is(err, gorm.ErrRecordNotFound) {
  823. // 添加任务
  824. taskObj := model.WaybillTask{
  825. WaybillNo: waybillModel.WaybillNo,
  826. CoolerBoxId: coolerBox.Id,
  827. UserId: p.UserId,
  828. Sn: coolerBox.Sn,
  829. StartTime: model2.Time(time.Now()),
  830. ControlBy: model2.ControlBy{
  831. CreateBy: p.UserId,
  832. },
  833. DeptBy: model2.DeptBy{
  834. DeptId: p.DeptId,
  835. },
  836. }
  837. err = tx.Create(&taskObj).Error
  838. if err != nil {
  839. e.Log.Errorf("db error: %s", err)
  840. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  841. }
  842. } else {
  843. //task.StartTime = model2.Time(time.Now())
  844. task.UpdateBy = p.UserId
  845. task.CoolerBoxId = coolerBox.Id
  846. task.Sn = coolerBox.Sn
  847. err = tx.Save(&task).Error
  848. if err != nil {
  849. e.Log.Errorf("db error: %s", err)
  850. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  851. }
  852. }
  853. } else {
  854. task.UpdateBy = p.UserId
  855. task.CoolerBoxId = coolerBox.Id
  856. task.Sn = coolerBox.Sn
  857. err = tx.Save(&task).Error
  858. if err != nil {
  859. e.Log.Errorf("db error: %s", err)
  860. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  861. }
  862. }
  863. }
  864. }
  865. return nil
  866. }
  867. // Remove 删除Waybill
  868. func (e *Waybill) Remove(c *dto.WaybillDeleteReq, p *actions.DataPermission) error {
  869. var err error
  870. tx := e.Orm.Begin()
  871. defer func() {
  872. if err != nil {
  873. tx.Rollback()
  874. } else {
  875. tx.Commit()
  876. }
  877. }()
  878. var waybillModel model.Waybill
  879. // 查询运单是否存在
  880. err = e.Orm.Scopes(actions.Permission(waybillModel.TableName(), p)).
  881. First(&waybillModel, c.GetId()).Error
  882. if err != nil {
  883. e.Log.Errorf("db error: %s", err)
  884. if errors.Is(err, gorm.ErrRecordNotFound) {
  885. return global.DeleteNotFoundOrNoPermissionErr
  886. }
  887. return global.DeleteFailedErr
  888. }
  889. if waybillModel.Status != model.WaybillStatusWaitDelivery {
  890. return errors.New(fmt.Sprintf("运单状态为%s,禁止删除", model.WaybillStatusMap[waybillModel.Status]))
  891. }
  892. db := tx.Delete(&waybillModel)
  893. if err = db.Error; err != nil {
  894. e.Log.Errorf("db error: %s", err)
  895. return global.DeleteFailedErr
  896. }
  897. if db.RowsAffected == 0 {
  898. return global.DeleteNotFoundOrNoPermissionErr
  899. }
  900. return nil
  901. }
  902. func (e *Waybill) Receipt(c *dto.WaybillReceiptReq, p *actions.DataPermission) error {
  903. var err error
  904. tx := e.Orm.Begin()
  905. defer func() {
  906. if err != nil {
  907. tx.Rollback()
  908. } else {
  909. tx.Commit()
  910. }
  911. }()
  912. var waybillModel = model.Waybill{}
  913. // 查询运单是否存在
  914. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  915. Where("waybill_no = ?", c.WaybillNo).
  916. First(&waybillModel).Error
  917. if err != nil {
  918. e.Log.Errorf("db error: %s", err)
  919. if errors.Is(err, gorm.ErrRecordNotFound) {
  920. return errors.New(fmt.Sprintf("运单号%s不存在", c.WaybillNo))
  921. }
  922. return errors.New(fmt.Sprintf("运单号%s查询失败", c.WaybillNo))
  923. }
  924. // 查询保温箱信息
  925. var coolerBox = model.CoolerBox{}
  926. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  927. First(&coolerBox, waybillModel.CoolerBoxId).Error
  928. if err != nil {
  929. e.Log.Errorf("db error: %s", err)
  930. return errors.New("获取保温箱信息失败")
  931. }
  932. if waybillModel.Status == model.WaybillStatusWaitDelivery {
  933. err = errors.New(fmt.Sprintf("运单状态为%s,禁止操作", model.WaybillStatusMap[waybillModel.Status]))
  934. return err
  935. }
  936. if waybillModel.Status == model.WaybillStatusReceipts || waybillModel.Status == model.WaybillStatusRejections {
  937. return nil
  938. }
  939. waybillModel.Status = c.Status
  940. waybillModel.RejectionReason = c.RejectionReason
  941. waybillModel.ReceiptTime = model2.Time(time.Now())
  942. waybillModel.ReceiptImg = c.ReceiptImg
  943. waybillModel.Receiptsign = c.Receiptsign
  944. waybillModel.PaymentStatus = c.PaymentStatus
  945. waybillModel.PaymentType = c.PaymentType
  946. waybillModel.PaymentRemark = c.PaymentRemark
  947. waybillModel.AssessContent = c.AssessContent
  948. waybillModel.AssessStar = c.AssessStar
  949. waybillModel.DeliveryDuration = int(time.Now().Sub(waybillModel.DeliveryTime.Local()).Minutes())
  950. err = tx.Save(&waybillModel).Error
  951. if err != nil {
  952. e.Log.Errorf("db error: %s", err)
  953. return errors.New(fmt.Sprintf("保存运单信息失败:%s", err))
  954. }
  955. var lng, lat string
  956. lng, lat, err = e.GetSite(waybillModel.DeptId, coolerBox.Sn, waybillModel.ReceiptTime.String())
  957. if err != nil {
  958. e.Log.Errorf("获取定位信息失败: %s", err)
  959. return err
  960. }
  961. // 查询任务
  962. var task model.WaybillTask
  963. err = tx.Model(&task).Where("waybill_no = ? and cooler_box_id = ?", c.WaybillNo, coolerBox.Id).
  964. Last(&task).Error
  965. if err != nil {
  966. e.Log.Errorf("db error: %s", err)
  967. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  968. }
  969. // 未下车 直接点签收
  970. if time.Time(task.EndTime).IsZero() {
  971. task.EndTime = model2.Time(time.Now())
  972. task.CoolerBoxId = coolerBox.Id
  973. //task.UpdateBy = p.UserIds
  974. err = tx.Save(&task).Error
  975. if err != nil {
  976. e.Log.Errorf("db error: %s", err)
  977. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  978. }
  979. }
  980. var userId int
  981. if p != nil {
  982. userId = p.UserId
  983. }
  984. // 添加签收记录
  985. Logistics := model.WaybillLogistics{
  986. WaybillNo: c.WaybillNo,
  987. Status: c.Status,
  988. CoolerBoxId: coolerBox.Id,
  989. UserId: userId,
  990. Lng: lng,
  991. Lat: lat,
  992. ControlBy: model2.ControlBy{
  993. CreateBy: userId,
  994. },
  995. DeptBy: model2.DeptBy{
  996. DeptId: waybillModel.DeptId,
  997. },
  998. ModelTime: model2.ModelTime{
  999. CreatedAt: waybillModel.ReceiptTime,
  1000. },
  1001. }
  1002. err = tx.Create(&Logistics).Error
  1003. if err != nil {
  1004. e.Log.Errorf("db error: %s", err)
  1005. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1006. }
  1007. return nil
  1008. }
  1009. // 获取入库 出库 上车 下车 定位信息
  1010. func (e *Waybill) GetSite(companyId int, sn string, time string) (lng, lat string, err error) {
  1011. // 获取公司秘钥
  1012. var company model.SysDept
  1013. company, err = model.GetCompanyById(companyId)
  1014. if err != nil {
  1015. e.Log.Errorf("db error: %s", err)
  1016. return lng, lat, model.GetCompanyKeyErr
  1017. }
  1018. // 获取传感器信息
  1019. var deviceSensorList = []nats_server.DeviceSensor_R{}
  1020. var count int64
  1021. deviceSensorList, count, err = nats_server.Cold_CompanyDeviceSensor_List_ByKey(sn, company.ColdKey)
  1022. if err != nil || count == 0 {
  1023. err = errors.New("查询设备定位信息失败")
  1024. return lng, lat, err
  1025. }
  1026. var deviceData nats_server.DeviceData_
  1027. deviceData, err = nats_server.Cold_ReadDeviceDataBy_T_snid_T_time(deviceSensorList[0].T_sn, deviceSensorList[0].T_id, time)
  1028. if err != nil {
  1029. err = errors.New("查询设备定位信息失败")
  1030. return lng, lat, err
  1031. }
  1032. if len(deviceData.T_site) > 0 {
  1033. site := strings.Split(deviceSensorList[0].T_DeviceSensorData.T_site, ",")
  1034. if len(site) == 2 {
  1035. lng = site[0]
  1036. lat = site[1]
  1037. }
  1038. }
  1039. return lng, lat, nil
  1040. }
  1041. // 获取今日运单数 未派单 未装车 未入库 运送中
  1042. // 本月运单总数 上月运单总数 本年运单总数 上年运单总数
  1043. func (e *Waybill) GetBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission) dto.WaybillStatsRes {
  1044. var res dto.WaybillStatsRes
  1045. var data model.Waybill
  1046. type DateCount struct {
  1047. Date string
  1048. Count int64
  1049. }
  1050. yearCount := make([]DateCount, 0)
  1051. monthCount := make([]DateCount, 0)
  1052. now := time.Now()
  1053. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  1054. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  1055. // 获取上个月第一天
  1056. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  1057. // 获取去年的第一天
  1058. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  1059. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  1060. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  1061. // 今日总运单数
  1062. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  1063. // 待确定
  1064. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  1065. // 配送中
  1066. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusInDeliverys).Count(&res.InDeliveryNum)
  1067. // 已签收
  1068. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusReceipts).Count(&res.ReceiptNum)
  1069. // 已取消
  1070. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p)).Where("status = ?", model.WaybillStatusRejections).Count(&res.RejectionNum)
  1071. // 获取本月,上月数据
  1072. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  1073. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  1074. for _, month := range monthCount {
  1075. if month.Date == now.Format("200601") {
  1076. res.ThisMonthNum = month.Count
  1077. }
  1078. if month.Date == firstDayOfLastMonth.Format("200601") {
  1079. res.LastMonthNum = month.Count
  1080. }
  1081. }
  1082. // 获取本年,上年数据
  1083. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p)).
  1084. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  1085. for _, month := range yearCount {
  1086. if month.Date == now.Format("2006") {
  1087. res.ThisYearNum = month.Count
  1088. }
  1089. if month.Date == firstDayOfLastYear.Format("2006") {
  1090. res.LastYearNum = month.Count
  1091. }
  1092. }
  1093. if c.Type == "year" {
  1094. // 获取上个月第一天
  1095. year, _ := strconv.Atoi(c.Date)
  1096. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1097. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1098. // 年度数据统计
  1099. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1100. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1101. }
  1102. if c.Type == "month" {
  1103. // 获取上个月第一天
  1104. month, _ := time.ParseInLocation("2006-01", c.Date, time.Local)
  1105. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1106. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1107. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p)).
  1108. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1109. }
  1110. return res
  1111. }
  1112. func GetDeliveryStatsScopes(userId int) func(db *gorm.DB) *gorm.DB {
  1113. return func(db *gorm.DB) *gorm.DB {
  1114. if userId == 0 {
  1115. return db
  1116. }
  1117. return db.Where("delivery_id = ?", userId)
  1118. }
  1119. }
  1120. func GetReCheckStatsScopes(userId int) func(db *gorm.DB) *gorm.DB {
  1121. return func(db *gorm.DB) *gorm.DB {
  1122. if userId == 0 {
  1123. return db
  1124. }
  1125. return db.Where("re_check_id = ?", userId)
  1126. }
  1127. }
  1128. // 获取配送员统计信息
  1129. func (e *Waybill) GetDeliveryStats(c *dto.WaybillUserStatsReq, p *actions.DataPermission) (res []dto.WaybillUserStats) {
  1130. // 获取用户列表
  1131. var userList []model.SysUser
  1132. if err := e.Orm.Model(&userList).Scopes(actions.Permission(model.SysUser{}.TableName(), p), WaybillUserStatsUserIdScopes(c.UserIds)).
  1133. Where("status = 2").Order("created_at desc").Find(&userList).Error; err != nil {
  1134. return nil
  1135. }
  1136. for _, user := range userList {
  1137. stats := e.GetUserStats(c, p, GetDeliveryStatsScopes(user.Id))
  1138. stats.Name = user.NickName
  1139. res = append(res, stats)
  1140. }
  1141. return
  1142. }
  1143. func (e *Waybill) GetReCheckStats(c *dto.WaybillUserStatsReq, p *actions.DataPermission) (res []dto.WaybillUserStats) {
  1144. // 获取用户列表
  1145. var userList []model.SysUser
  1146. if err := e.Orm.Model(&userList).Scopes(actions.Permission(model.SysUser{}.TableName(), p), WaybillUserStatsUserIdScopes(c.UserIds)).
  1147. Where("status = 2").Order("created_at desc").Find(&userList).Error; err != nil {
  1148. return nil
  1149. }
  1150. for _, user := range userList {
  1151. stats := e.GetUserStats(c, p, GetReCheckStatsScopes(user.Id))
  1152. stats.Name = user.NickName
  1153. res = append(res, stats)
  1154. }
  1155. return
  1156. }
  1157. func WaybillUserStatsUserIdScopes(userIds []int) func(db *gorm.DB) *gorm.DB {
  1158. return func(db *gorm.DB) *gorm.DB {
  1159. if len(userIds) == 0 {
  1160. return db
  1161. }
  1162. if len(userIds) == 1 {
  1163. return db.Where("id = ?", userIds[0])
  1164. }
  1165. return db.Where("id in (?)", userIds)
  1166. }
  1167. }
  1168. func GetUserBasicsStatsScopes(userId int) func(db *gorm.DB) *gorm.DB {
  1169. return func(db *gorm.DB) *gorm.DB {
  1170. if userId == 0 {
  1171. return db
  1172. }
  1173. return db.Where("delivery_id = ? or re_check_id = ? or create_by = ?", userId, userId, userId)
  1174. }
  1175. }
  1176. func (e *Waybill) GetUserBasicsStats(c *dto.WaybillStatsReq, p *actions.DataPermission, scopes func(*gorm.DB) *gorm.DB) dto.WaybillStatsRes {
  1177. var res dto.WaybillStatsRes
  1178. var data model.Waybill
  1179. type DateCount struct {
  1180. Date string
  1181. Count int64
  1182. }
  1183. yearCount := make([]DateCount, 0)
  1184. monthCount := make([]DateCount, 0)
  1185. now := time.Now()
  1186. todayStartTime := now.Format("2006-01-02") + " 00:00:00"
  1187. todayEndTime := now.Format("2006-01-02") + " 23:59:59"
  1188. // 获取上个月第一天
  1189. firstDayOfLastMonth := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
  1190. // 获取去年的第一天
  1191. firstDayOfLastYear := time.Date(now.Year()-1, time.January, 1, 0, 0, 0, 0, now.Location())
  1192. monthStartTime := firstDayOfLastMonth.Format("2006-01-02") + " 00:00:00"
  1193. yearStartTime := firstDayOfLastYear.Format("2006-01-02") + " 00:00:00"
  1194. // 今日总运单数
  1195. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1196. Where("order_time between ? and ?", todayStartTime, todayEndTime).Count(&res.TodayNum)
  1197. // 待派单
  1198. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1199. Where("status = ?", model.WaybillStatusWaitDelivery).Count(&res.WaitDeliveryNum)
  1200. // 配送中
  1201. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1202. Where("status = ?", model.WaybillStatusInDeliverys).Count(&res.InDeliveryNum)
  1203. // 已送达
  1204. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1205. Where("status = ?", model.WaybillStatusReceipts).Count(&res.ReceiptNum)
  1206. // 已取消
  1207. e.Orm.Model(&data).Scopes(actions.Permission(data.TableName(), p), scopes).
  1208. Where("status = ?", model.WaybillStatusRejections).Count(&res.RejectionNum)
  1209. // 获取本月,上月数据
  1210. e.Orm.Model(&data).Select("date_format(order_time,'%Y%m') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1211. Where("order_time between ? and ?", monthStartTime, now).Group("date").Find(&monthCount)
  1212. for _, month := range monthCount {
  1213. if month.Date == now.Format("200601") {
  1214. res.ThisMonthNum = month.Count
  1215. }
  1216. if month.Date == firstDayOfLastMonth.Format("200601") {
  1217. res.LastMonthNum = month.Count
  1218. }
  1219. }
  1220. // 获取本年,上年数据
  1221. e.Orm.Model(&data).Select("date_format(order_time,'%Y') date,count(1) as count ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1222. Where("order_time between ? and ?", yearStartTime, now).Group("date").Find(&yearCount)
  1223. for _, month := range yearCount {
  1224. if month.Date == now.Format("2006") {
  1225. res.ThisYearNum = month.Count
  1226. }
  1227. if month.Date == firstDayOfLastYear.Format("2006") {
  1228. res.LastYearNum = month.Count
  1229. }
  1230. }
  1231. if c.Type == "year" {
  1232. // 获取上个月第一天
  1233. year, _ := strconv.Atoi(c.Date)
  1234. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1235. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1236. // 年度数据统计
  1237. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1238. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1239. }
  1240. if c.Type == "month" {
  1241. // 获取上个月第一天
  1242. month, _ := time.ParseInLocation("2006-01", c.Date, time.Local)
  1243. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1244. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1245. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1246. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1247. }
  1248. return res
  1249. }
  1250. func (e *Waybill) GetUserStats(c *dto.WaybillUserStatsReq, p *actions.DataPermission, scopes func(*gorm.DB) *gorm.DB) dto.WaybillUserStats {
  1251. var res dto.WaybillUserStats
  1252. var data model.Waybill
  1253. type DateCount struct {
  1254. Date string
  1255. Count int64
  1256. }
  1257. now := time.Now()
  1258. if c.Type == "year" {
  1259. // 获取上个月第一天
  1260. year, _ := strconv.Atoi(c.Date)
  1261. firstDayOfyear := time.Date(year, 1, 1, 0, 0, 0, 0, now.Location())
  1262. lastDayOfyear := time.Date(year, 12, 31, 23, 59, 59, 0, now.Location())
  1263. // 年度数据统计
  1264. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1265. Where("order_time between ? and ?", firstDayOfyear, lastDayOfyear).Group("date").Find(&res.Stats)
  1266. // 获取这个月的所有日期
  1267. allDates := getAllDatesInYear(c.Date)
  1268. // 补齐缺失日期的数据
  1269. res.Stats = completeMissingDates(allDates, res.Stats)
  1270. }
  1271. if c.Type == "month" {
  1272. // 获取上个月第一天
  1273. month, _ := time.ParseInLocation("2006-01", c.Date, time.Local)
  1274. firstDayOfMonth := time.Date(month.Year(), month.Month(), 1, 0, 0, 0, 0, now.Location())
  1275. lastDayOfMonth := time.Date(month.Year(), month.Month()+1, 1, 23, 59, 59, 0, now.Location()).Add(-time.Hour * 24)
  1276. e.Orm.Model(&data).Select("date_format(order_time,'%Y-%m-%d') date,count(1) as num ").Scopes(actions.Permission(data.TableName(), p), scopes).
  1277. Where("order_time between ? and ?", firstDayOfMonth, lastDayOfMonth).Group("date").Find(&res.Stats)
  1278. // 获取这个月的所有日期
  1279. allDates := getAllDatesInMonth(c.Date)
  1280. // 补齐缺失日期的数据
  1281. res.Stats = completeMissingDates(allDates, res.Stats)
  1282. }
  1283. return res
  1284. }
  1285. // 获取指定月份的所有日期
  1286. func getAllDatesInMonth(month string) []string {
  1287. var dates []string
  1288. layout := "2006-01-02"
  1289. firstDay, _ := time.Parse(layout, month+"-01")
  1290. if time.Now().Before(firstDay) {
  1291. return dates
  1292. }
  1293. lastDay := firstDay.AddDate(0, 1, -1)
  1294. if time.Now().Before(lastDay) {
  1295. lastDay = time.Now()
  1296. }
  1297. for d := firstDay; !d.After(lastDay); d = d.AddDate(0, 0, 1) {
  1298. dates = append(dates, d.Format(layout))
  1299. }
  1300. return dates
  1301. }
  1302. // 获取指定年份的所有日期
  1303. func getAllDatesInYear(year string) []string {
  1304. var dates []string
  1305. layout := "2006-01"
  1306. firstDay, _ := time.Parse(layout, year+"-01")
  1307. lastDay := firstDay.AddDate(1, 0, -1)
  1308. if time.Now().Before(firstDay) {
  1309. return dates
  1310. }
  1311. if time.Now().Before(lastDay) {
  1312. lastDay = time.Now()
  1313. }
  1314. for d := firstDay; !d.After(lastDay); d = d.AddDate(0, 1, 0) {
  1315. dates = append(dates, d.Format(layout))
  1316. }
  1317. return dates
  1318. }
  1319. // 补齐缺失日期的数据
  1320. func completeMissingDates(allDates []string, stats []dto.WaybillStats) []dto.WaybillStats {
  1321. dateMap := make(map[string]int64)
  1322. for _, stat := range stats {
  1323. dateMap[stat.Date] = stat.Num
  1324. }
  1325. var completedStats []dto.WaybillStats
  1326. for _, date := range allDates {
  1327. num, exists := dateMap[date]
  1328. if !exists {
  1329. num = 0
  1330. }
  1331. completedStats = append(completedStats, dto.WaybillStats{Date: date, Num: num})
  1332. }
  1333. return completedStats
  1334. }
  1335. // 获取运单所有温湿度素具
  1336. func (e *Waybill) GetAllData(c *dto.WaybillGetByWaybillNoReq) ([]nats_server.DeviceData_R, []WaybillPDF, error) {
  1337. var err error
  1338. var data model.WaybillTask
  1339. var waybill model.Waybill
  1340. var taskList []model.WaybillTask
  1341. var waybillPDF []WaybillPDF
  1342. dataList := make([]nats_server.DeviceData_R, 0)
  1343. err = e.Orm.Model(&waybill).Where("waybill_no = ?", c.WaybillNo).First(&waybill).Error
  1344. if err != nil {
  1345. e.Log.Errorf("db error: %s", err)
  1346. return dataList, waybillPDF, errors.New("获取运单信息失败")
  1347. }
  1348. // 未签收,不返回数据
  1349. if waybill.Status != model.WaybillStatusReceipts {
  1350. return dataList, waybillPDF, nil
  1351. }
  1352. // 获取公司秘钥
  1353. var company model.SysDept
  1354. company, err = model.GetCompanyById(waybill.DeptId)
  1355. if err != nil {
  1356. e.Log.Errorf("db error: %s", err)
  1357. return dataList, waybillPDF, model.GetCompanyKeyErr
  1358. }
  1359. err = e.Orm.Model(&data).
  1360. Where("waybill_no = ?", c.WaybillNo).
  1361. Order("id desc").
  1362. Find(&taskList).Error
  1363. if err != nil {
  1364. e.Log.Errorf("db error: %s", err)
  1365. return dataList, waybillPDF, global.GetFailedErr
  1366. }
  1367. // 获取最后一个任务id
  1368. var lastWaybillTask model.WaybillTask
  1369. err = e.Orm.Model(&lastWaybillTask).Where("waybill_no = ?", c.WaybillNo).Last(&lastWaybillTask).Error
  1370. if err != nil {
  1371. e.Log.Errorf("db error: %s", err)
  1372. err = errors.New("获取运单信息错误!")
  1373. return dataList, waybillPDF, err
  1374. }
  1375. // 创建名称到权重的映射
  1376. orderMap := make(map[string]int)
  1377. for i, v := range taskList {
  1378. orderMap[v.Sn] = i
  1379. }
  1380. for i := 0; i < len(taskList); i++ {
  1381. // 获取传感器信息
  1382. deviceSensorList, _, _ := nats_server.Cold_CompanyDeviceSensor_List_ByKey(taskList[i].Sn, company.ColdKey)
  1383. var T_snid string
  1384. var list []nats_server.DeviceData_R
  1385. for _, r := range deviceSensorList {
  1386. T_snid += fmt.Sprintf("%s,%d|", r.T_sn, r.T_id)
  1387. }
  1388. var count int64
  1389. list, count, err = nats_server.Cold_ReadDeviceDataListBy_T_snid(T_snid, taskList[i].StartTime.String(), taskList[i].EndTime.String(), 0, 9999)
  1390. if err != nil {
  1391. e.Log.Errorf("nats 获取温湿度信息失败: %s", err)
  1392. return dataList, waybillPDF, global.GetFailedErr
  1393. }
  1394. firstMap := map[int]nats_server.DeviceData_R{}
  1395. lastMap := map[int]nats_server.DeviceData_R{}
  1396. if count > 0 {
  1397. for _, v := range deviceSensorList {
  1398. for j := 0; j < len(list); j++ {
  1399. if v.T_id == list[j].T_id {
  1400. if list[j].T_time != taskList[i].StartTime.String() {
  1401. firstData := list[j]
  1402. firstData.T_time = taskList[i].StartTime.String()
  1403. firstMap[v.T_id] = firstData
  1404. count += 1
  1405. }
  1406. break
  1407. }
  1408. }
  1409. if waybill.Status == model.WaybillStatusReceipts {
  1410. for k := len(list) - 1; k >= 0; k-- {
  1411. if v.T_id == list[k].T_id {
  1412. if taskList[i].Id == lastWaybillTask.Id && list[k].T_time != taskList[i].EndTime.String() && !time.Time(taskList[i].EndTime).IsZero() {
  1413. lastData := list[k]
  1414. lastData.T_time = taskList[i].EndTime.String()
  1415. lastMap[v.T_id] = lastData
  1416. count += 1
  1417. }
  1418. break
  1419. }
  1420. }
  1421. }
  1422. }
  1423. }
  1424. for _, v := range firstMap {
  1425. list = append(list, v)
  1426. }
  1427. for _, v := range lastMap {
  1428. list = append(list, v)
  1429. }
  1430. sort.Slice(list, func(x, y int) bool {
  1431. if list[x].T_time == list[y].T_time {
  1432. // 如果时间相同,则按预设顺序排序
  1433. return orderMap[list[x].T_sn] < orderMap[list[y].T_sn]
  1434. }
  1435. return list[x].T_time > list[y].T_time
  1436. })
  1437. dataList = append(dataList, list...)
  1438. waybillPDF = append(waybillPDF, WaybillPDF{
  1439. Data: list,
  1440. DeviceSensorList: deviceSensorList,
  1441. Task: taskList[i],
  1442. })
  1443. }
  1444. sort.Slice(dataList, func(i, j int) bool {
  1445. if dataList[i].T_time == dataList[j].T_time {
  1446. // 如果时间相同,则按预设顺序排序
  1447. return orderMap[dataList[i].T_sn] < orderMap[dataList[j].T_sn]
  1448. }
  1449. return dataList[i].T_time < dataList[j].T_time
  1450. })
  1451. return dataList, waybillPDF, nil
  1452. }
  1453. type WaybillPDF struct {
  1454. Data []nats_server.DeviceData_R `json:"data"`
  1455. DeviceSensorList []nats_server.DeviceSensor_R `json:"deviceSensorList"`
  1456. Task model.WaybillTask `json:"task"`
  1457. }
  1458. // Insert 创建Waybill对象
  1459. func (e *Waybill) InsertByOrderId(c *dto.WeianGetWaybillNoReq) error {
  1460. var err error
  1461. var data model.Waybill
  1462. tx := e.Orm.Begin()
  1463. defer func() {
  1464. if err != nil {
  1465. tx.Rollback()
  1466. } else {
  1467. tx.Commit()
  1468. }
  1469. }()
  1470. var company model.SysDept
  1471. var i int64
  1472. err = e.Orm.Model(&company).Where("name = ?", c.CompanyName).Count(&i).Error
  1473. if err != nil {
  1474. e.Log.Errorf("db error: %s", err)
  1475. return global.CreateFailedErr
  1476. }
  1477. if i == 0 {
  1478. err = errors.New("公司名称不存在!")
  1479. e.Log.Errorf("db error: %s", err)
  1480. return err
  1481. }
  1482. var no string
  1483. for {
  1484. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  1485. var j int64
  1486. err = e.Orm.Model(&data).Where("waybill_no = ?", no).Count(&j).Error
  1487. if err != nil {
  1488. continue
  1489. }
  1490. if j == 0 {
  1491. break
  1492. }
  1493. }
  1494. // 添加运单
  1495. data.WaybillNo = no
  1496. data.OrderNo = c.OrderId
  1497. data.DeptId = company.Id
  1498. data.Status = 1
  1499. data.OrderTime = model2.Time(time.Now())
  1500. err = tx.Create(&data).Error
  1501. if err != nil {
  1502. e.Log.Errorf("db error: %s", err)
  1503. return global.CreateFailedErr
  1504. }
  1505. c.WaybillNo = data.WaybillNo
  1506. return nil
  1507. }
  1508. // CreateSole 生成唯一订单编号
  1509. func (e *Waybill) CreateSole() (string, error) {
  1510. var waybill model.Waybill
  1511. var err error
  1512. var count int64
  1513. format := time.Now().Format("20060102")
  1514. un := time.Now().Unix()
  1515. waybillno := fmt.Sprintf("%v%v", format, un)
  1516. err = e.Orm.Model(&waybill).Where("waybill_no = ?", waybillno).Count(&count).Error
  1517. if count > 0 {
  1518. return e.CreateSole()
  1519. }
  1520. if err != nil {
  1521. e.Log.Errorf("生成订单号错误: %s", err)
  1522. err = errors.New("生成订单号错误,请重新生成")
  1523. return "", err
  1524. }
  1525. return waybillno, nil
  1526. }
  1527. // WaybillTurnarounds 订单转门店
  1528. func (e *Waybill) WaybillTurnarounds(c *dto.WaybillTurnarounds, p *actions.DataPermission) error {
  1529. var err error
  1530. var waybillModel model.Waybill
  1531. var count int64
  1532. //查询订单是否存在
  1533. tx := e.Orm.Begin()
  1534. defer func() {
  1535. if err != nil {
  1536. tx.Rollback()
  1537. } else {
  1538. tx.Commit()
  1539. }
  1540. }()
  1541. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1542. Where("waybill_no = ?", c.WaybillNo).
  1543. First(&waybillModel).Count(&count).Error
  1544. if err != nil {
  1545. e.Log.Errorf("db error: %s", err)
  1546. if errors.Is(err, gorm.ErrRecordNotFound) {
  1547. return global.GetNotFoundOrNoPermissionErr
  1548. }
  1549. return global.GetFailedErr
  1550. }
  1551. if count == 0 {
  1552. return errors.New("订单不存在")
  1553. }
  1554. //查询门店是否存在可以转换
  1555. var data model.SysDept
  1556. var Depts []model.SysDept
  1557. err = e.Orm.Model(&data).
  1558. Scopes(
  1559. CompanyIdScopesUser(p.DeptId),
  1560. ).Find(&Depts).Error
  1561. if err != nil {
  1562. e.Log.Errorf("db error: %s", err)
  1563. return global.GetFailedErr
  1564. }
  1565. contains := false
  1566. for _, v := range Depts {
  1567. if v.Id == c.DeptId {
  1568. contains = true
  1569. break
  1570. } else {
  1571. contains = false
  1572. }
  1573. }
  1574. if !contains {
  1575. return errors.New("转门店不存在")
  1576. }
  1577. waybillModel.DeptId = c.DeptId
  1578. update := tx.Updates(&waybillModel)
  1579. if update.Error != nil {
  1580. e.Log.Errorf("db error: %s", update.Error)
  1581. return global.UpdateFailedErr
  1582. }
  1583. return nil
  1584. }
  1585. // SecondaryDistribution 二次分配订单
  1586. func (e *Waybill) SecondaryDistribution(c *dto.WaybillAssignment, p *actions.DataPermission) error {
  1587. var err error
  1588. var waybillModel model.Waybill
  1589. var count int64
  1590. //查询订单是否存在
  1591. tx := e.Orm.Begin()
  1592. defer func() {
  1593. if err != nil {
  1594. tx.Rollback()
  1595. } else {
  1596. tx.Commit()
  1597. }
  1598. }()
  1599. err = tx.Scopes(actions.Permission(waybillModel.TableName(), p)).
  1600. Where("waybill_no = ?", c.WaybillNo).
  1601. First(&waybillModel).Count(&count).Error
  1602. if err != nil {
  1603. e.Log.Errorf("db error: %s", err)
  1604. if errors.Is(err, gorm.ErrRecordNotFound) {
  1605. return global.GetNotFoundOrNoPermissionErr
  1606. }
  1607. return global.GetFailedErr
  1608. }
  1609. if count == 0 {
  1610. return errors.New("订单不存在")
  1611. }
  1612. if !waybillModel.IsSecondaryDistribution {
  1613. return errors.New("该订单不允许二次分配")
  1614. }
  1615. var coolerBox = model.CoolerBox{}
  1616. // 查询保温箱信息
  1617. if c.CoolerBoxId != 0 {
  1618. err = tx.Scopes(actions.Permission(coolerBox.TableName(), p)).
  1619. First(&coolerBox, waybillModel.CoolerBoxId).Error
  1620. if err != nil {
  1621. e.Log.Errorf("获取保温箱信息失败: %s", err)
  1622. return errors.New("获取保温箱信息失败")
  1623. }
  1624. }
  1625. var waybil model.Waybill
  1626. sole, err := e.CreateSole()
  1627. var no string
  1628. for {
  1629. no = time.Now().Format("200601021504") + utils.GetRandString(6, "0123456789", 0)
  1630. var j int64
  1631. err = e.Orm.Model(&waybil).Where("waybill_no = ?", no).Count(&j).Error
  1632. if err != nil {
  1633. continue
  1634. }
  1635. if j == 0 {
  1636. break
  1637. }
  1638. }
  1639. // 添加运单
  1640. waybil.WaybillNo = no
  1641. sole, err = e.CreateSole()
  1642. if err != nil {
  1643. err = errors.New("生成运单号失败")
  1644. return err
  1645. }
  1646. waybil.OrderNo = sole
  1647. waybil.Status = model.WaybillStatusInShippeds
  1648. waybil.DeptId = waybillModel.DeptId
  1649. waybil.DeliveryName = waybillModel.DeliveryName
  1650. waybil.DeliveryId = waybillModel.DeliveryId
  1651. waybil.DeliveryPhone = waybillModel.DeliveryPhone
  1652. waybil.OrderTime = model2.Time(time.Now())
  1653. waybil.IsSecondaryDistribution = false
  1654. waybil.ReCheckId = waybillModel.ReCheckId
  1655. waybil.IceRaftCode = waybillModel.IceRaftCode
  1656. waybil.CoolerBoxId = waybillModel.CoolerBoxId
  1657. waybil.IsChild = true
  1658. waybil.ConsigneeAddressDetails = c.ConsigneeAddressDetails
  1659. waybil.ConsigneeAddressName = c.ConsigneeAddressName
  1660. waybil.ConsigneeAddressPhone = c.ConsigneeAddressPhone
  1661. //c.Generate(&waybil)
  1662. err = tx.Create(&waybil).Error
  1663. if err != nil {
  1664. e.Log.Errorf("db error: %s", err)
  1665. return global.CreateFailedErr
  1666. }
  1667. // 保存发货地址
  1668. if c.SaveConsigneeAddress {
  1669. // 查询地址是否存在
  1670. address := model.Address{}
  1671. err = e.Orm.Where("address = ? and phone = ? and name = ? and dept_id = ? and address_type = 'consignee'",
  1672. c.ConsigneeAddressDetails, c.ConsigneeAddressPhone, c.ConsigneeAddressName, c.DeptId).First(&address).Error
  1673. if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
  1674. address.Address = c.ConsigneeAddressDetails
  1675. address.Phone = c.ConsigneeAddressPhone
  1676. address.Name = c.ConsigneeAddressName
  1677. address.DeptId = c.DeptId
  1678. address.AddressType = "consignee"
  1679. err = tx.Create(&address).Error
  1680. if err != nil {
  1681. e.Log.Errorf("创建地址失败: %s", err)
  1682. return global.CreateFailedErr
  1683. }
  1684. }
  1685. }
  1686. if len(c.Drugs) > 0 {
  1687. for _, drug := range c.Drugs {
  1688. var drugs model.Drug
  1689. drugs.WaybillNo = no
  1690. drugs.Drug_ent_base_info_id = drug.Drug_ent_base_info_id
  1691. drugs.Ent_name = drug.Ent_name
  1692. drugs.Physic_name = drug.Physic_name
  1693. drugs.Approval_licence_no = drug.Approval_licence_no
  1694. drugs.Prepn_spec = drug.Prepn_spec
  1695. drugs.Physic_type_desc = drug.Physic_type_desc
  1696. drugs.Pkg_spec_crit = drug.Pkg_spec_crit
  1697. drugs.Prepn_type_desc = drug.Prepn_type_desc
  1698. drugs.Code = drug.Code
  1699. err = tx.Save(&drugs).Error
  1700. if err != nil {
  1701. e.Log.Errorf("保存药品信息失败: %s", err)
  1702. return errors.New("保存药品信息失败")
  1703. }
  1704. err := e.Orm.Table(model.Drug{}.TableName()).Where("waybill_no = ?", waybillModel.WaybillNo).Where("code = ?", drug.Code).Update("is_assignment", true).Error
  1705. if err != nil {
  1706. e.Log.Errorf("更新药品状态失败: %s", err)
  1707. return errors.New("更新药品状态失败")
  1708. }
  1709. }
  1710. }
  1711. waybillModel.ChildWaybills = append(waybillModel.ChildWaybills, waybil.WaybillNo)
  1712. err = tx.Save(&waybillModel).Error
  1713. if err != nil {
  1714. e.Log.Errorf("更新运单失败: %s", err)
  1715. return global.UpdateFailedErr
  1716. }
  1717. // 二次分配订单发送短信
  1718. ss := sms.NewSMS(conf.ExtConfig.SubMail.Appid, conf.ExtConfig.SubMail.Signature)
  1719. addr := conf.ExtConfig.Applet.WaybillUrl + url.QueryEscape(lib.AesEncryptCBC(waybil.WaybillNo, lib.AesKey))
  1720. res, err1 := ss.SmsXSend(c.ConsigneeAddressPhone, addr)
  1721. if err1 != nil || res.Status != sms.SUCCESS {
  1722. e.Log.Errorf("派单短信发送失败", zap.Any("res", res), zap.Error(err1))
  1723. err = errors.New("派单短信发送失败,请检查收件人电话是否正确!")
  1724. return err
  1725. }
  1726. waybil.SendLog = model.WaybillSendLog{
  1727. Phone: c.ConsigneeAddressPhone,
  1728. Content: "【冷链送药追溯平台】您的运单正在派送中,点击查看详情:" + addr,
  1729. }
  1730. // 添加物流
  1731. logisticsObj := model.WaybillLogistics{
  1732. WaybillNo: waybil.WaybillNo,
  1733. Status: waybil.Status,
  1734. CoolerBoxId: waybil.CoolerBoxId,
  1735. ControlBy: model2.ControlBy{
  1736. CreateBy: p.UserId,
  1737. },
  1738. DeptBy: model2.DeptBy{
  1739. DeptId: p.DeptId,
  1740. },
  1741. }
  1742. err = tx.Create(&logisticsObj).Error
  1743. if err != nil {
  1744. e.Log.Errorf("db error: %s", err)
  1745. return errors.New(fmt.Sprintf("保存运单物流信息失败:%s", err))
  1746. }
  1747. // 查询任务
  1748. var task model.WaybillTask
  1749. err = tx.Model(&task).Where("waybill_no = ? ", waybil.WaybillNo).
  1750. Last(&task).Error
  1751. if err != nil {
  1752. if errors.Is(err, gorm.ErrRecordNotFound) {
  1753. // 添加任务
  1754. taskObj := model.WaybillTask{
  1755. WaybillNo: waybil.WaybillNo,
  1756. CoolerBoxId: waybil.CoolerBoxId,
  1757. UserId: p.UserId,
  1758. Sn: coolerBox.Sn,
  1759. StartTime: model2.Time(time.Now()),
  1760. ControlBy: model2.ControlBy{
  1761. CreateBy: p.UserId,
  1762. },
  1763. DeptBy: model2.DeptBy{
  1764. DeptId: p.DeptId,
  1765. },
  1766. }
  1767. err = tx.Create(&taskObj).Error
  1768. if err != nil {
  1769. e.Log.Errorf("db error: %s", err)
  1770. return errors.New(fmt.Sprintf("保存运单任务信息失败:%s", err))
  1771. }
  1772. } else {
  1773. e.Log.Errorf("db error: %s", err)
  1774. return errors.New(fmt.Sprintf("查询运单任务信息失败:%s", err))
  1775. }
  1776. }
  1777. return nil
  1778. }