waybill.go 61 KB

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