order.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "gas-cylinder-api/app/admin/model"
  6. "gas-cylinder-api/app/admin/service/dto"
  7. "gas-cylinder-api/common/actions"
  8. cDto "gas-cylinder-api/common/dto"
  9. "gas-cylinder-api/common/global"
  10. common "gas-cylinder-api/common/model"
  11. "gogs.baozhida.cn/zoie/OAuth-core/service"
  12. "gorm.io/gorm"
  13. "gorm.io/gorm/utils"
  14. "time"
  15. )
  16. type Order struct {
  17. service.Service
  18. }
  19. // GetPage 获取Order列表
  20. func (e *Order) GetPage(c *dto.OrderGetPageReq, list *[]model.Order, count *int64, p *actions.DataPermission) error {
  21. var err error
  22. var data model.Order
  23. err = e.Orm.Model(&data).
  24. Scopes(
  25. cDto.MakeCondition(c.GetNeedSearch()),
  26. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  27. OrderDeptIdScopes(p.DeptId),
  28. OrderStateScopes(c.State),
  29. ).
  30. Preload("Customer").Preload("Store").Preload("User").Preload("Goods").Preload("Spec").
  31. Find(list).Limit(-1).Offset(-1).
  32. Count(count).Error
  33. if err != nil {
  34. e.Log.Errorf("db error: %s", err)
  35. return global.GetFailedErr
  36. }
  37. return nil
  38. }
  39. // 创建订单门店和配送门店都可以查看订单
  40. func OrderDeptIdScopes(deptId int) func(db *gorm.DB) *gorm.DB {
  41. return func(db *gorm.DB) *gorm.DB {
  42. return db.Where("dept_id = ? or store_id = ?", deptId, deptId)
  43. }
  44. }
  45. func OrderStateScopes(state int) func(db *gorm.DB) *gorm.DB {
  46. return func(db *gorm.DB) *gorm.DB {
  47. if state == 0 {
  48. return db
  49. }
  50. if state == model.OrderStateInDelivery {
  51. return db.Where("state = ? or state = ?", model.OrderStateInDelivery, model.OrderStateInDeliveryInspected)
  52. }
  53. return db.Where("state = ? ", state)
  54. }
  55. }
  56. func (e *Order) GetDeliveryPage(c *dto.OrderGetDeliveryPageReq, list *[]model.Order, count *int64, p *actions.DataPermission) error {
  57. var err error
  58. var data model.Order
  59. err = e.Orm.Model(&data).
  60. Scopes(
  61. cDto.MakeCondition(c.GetNeedSearch()),
  62. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  63. OrderStateScopes(c.State),
  64. ).
  65. Where("user_id = ? and state > 1", p.UserId).
  66. Preload("Customer").Preload("Store").Preload("Goods").Preload("Spec").
  67. Find(list).Limit(-1).Offset(-1).
  68. Count(count).Error
  69. if err != nil {
  70. e.Log.Errorf("db error: %s", err)
  71. return global.GetFailedErr
  72. }
  73. return nil
  74. }
  75. // Get 获取Order对象
  76. func (e *Order) Get(d *dto.OrderGetReq, orderModel *model.Order, p *actions.DataPermission) error {
  77. err := e.Orm.
  78. Scopes(actions.Permission(orderModel.TableName(), p)).
  79. First(orderModel, d.GetId()).Error
  80. if err != nil {
  81. e.Log.Errorf("db error: %s", err)
  82. if errors.Is(err, gorm.ErrRecordNotFound) {
  83. return global.GetNotFoundOrNoPermissionErr
  84. }
  85. return global.GetFailedErr
  86. }
  87. return nil
  88. }
  89. // Insert 创建Order对象
  90. func (e *Order) Insert(c *dto.OrderInsertReq) error {
  91. var err error
  92. var data model.Order
  93. tx := e.Orm.Begin()
  94. defer func() {
  95. if err != nil {
  96. tx.Rollback()
  97. } else {
  98. tx.Commit()
  99. }
  100. }()
  101. // 添加订单
  102. c.Generate(&data)
  103. err = tx.Create(&data).Error
  104. if err != nil {
  105. e.Log.Errorf("db error: %s", err)
  106. return global.CreateFailedErr
  107. }
  108. c.Id = data.Id
  109. return nil
  110. }
  111. func (e *Order) AppletInsert(c *dto.OrderAppletInsertReq) error {
  112. var err error
  113. var data model.Order
  114. tx := e.Orm.Begin()
  115. defer func() {
  116. if err != nil {
  117. tx.Rollback()
  118. } else {
  119. tx.Commit()
  120. }
  121. }()
  122. // 查询小程序客户是否存在
  123. storeCustomerId := c.CustomerId + "_" + utils.ToString(c.DeptId)
  124. var customer model.Customer
  125. err = e.Orm.
  126. Where("id = ?", c.CustomerId).
  127. First(&customer).Error
  128. if err != nil {
  129. e.Log.Errorf("db error: %s", err)
  130. return global.CreateFailedErr
  131. }
  132. store, err := model.GetProvCodeById(c.StoreId)
  133. if err != nil {
  134. e.Log.Errorf("db error: %s", err)
  135. return global.CreateFailedErr
  136. }
  137. // 查询门店客户是否存在
  138. var storeCustomer model.Customer
  139. err = e.Orm.
  140. Where("id = ?", storeCustomerId).
  141. First(&storeCustomer).Error
  142. if err != nil {
  143. e.Log.Errorf("db error: %s", err)
  144. if errors.Is(err, gorm.ErrRecordNotFound) {
  145. // TODO 1.1.1.16新增客户信息
  146. // 添加客户
  147. obj := model.Customer{
  148. ProvCustomer: model.ProvCustomer{
  149. Id: storeCustomerId,
  150. PrincipalName: customer.Name,
  151. PrincipalPhone: customer.PrincipalPhone,
  152. ShopName: customer.Name,
  153. Address: c.Address,
  154. AddressImg: c.AddressImg,
  155. Lng: c.Lng,
  156. Lat: c.Lat,
  157. Type: customer.Type,
  158. City: c.City,
  159. Area: c.Area,
  160. Remark: c.Remark,
  161. StoreCode: store.CmpCode,
  162. },
  163. Name: customer.Name,
  164. DeptBy: common.DeptBy{
  165. DeptId: c.StoreId,
  166. },
  167. }
  168. dataIntegrity := CustomerCheckDataIntegrity(obj)
  169. if dataIntegrity {
  170. // TODO 同步省平台
  171. obj.IsSyncProv = true
  172. }
  173. err = tx.Create(&obj).Error
  174. if err != nil {
  175. e.Log.Errorf("db error: %s", err)
  176. return global.CreateFailedErr
  177. }
  178. } else {
  179. return global.CreateFailedErr
  180. }
  181. }
  182. if len(storeCustomer.ProvCustomer.Id) > 0 {
  183. storeCustomer.Name = c.Name
  184. storeCustomer.Lng = c.Lng
  185. storeCustomer.Lat = c.Lat
  186. storeCustomer.City = c.City
  187. storeCustomer.Area = c.Area
  188. storeCustomer.Address = c.Address
  189. storeCustomer.AddressImg = c.AddressImg
  190. dataIntegrity := CustomerCheckDataIntegrity(storeCustomer)
  191. if dataIntegrity {
  192. // TODO 同步省平台 更新客户信息
  193. storeCustomer.IsSyncProv = true
  194. }
  195. err = tx.Save(&storeCustomer).Error
  196. if err != nil {
  197. e.Log.Errorf("db error: %s", err)
  198. return global.UpdateFailedErr
  199. }
  200. }
  201. // 添加订单
  202. c.Generate(&data)
  203. data.CustomerId = storeCustomerId
  204. err = tx.Create(&data).Error
  205. if err != nil {
  206. e.Log.Errorf("db error: %s", err)
  207. return global.CreateFailedErr
  208. }
  209. c.Id = data.Id
  210. return nil
  211. }
  212. // Update 修改Order对象
  213. func (e *Order) Update(c *dto.OrderUpdateReq, p *actions.DataPermission) error {
  214. var err error
  215. tx := e.Orm.Begin()
  216. defer func() {
  217. if err != nil {
  218. tx.Rollback()
  219. } else {
  220. tx.Commit()
  221. }
  222. }()
  223. var orderModel = model.Order{}
  224. // 查询订单是否存在
  225. err = e.Orm.Scopes(actions.Permission(orderModel.TableName(), p)).
  226. First(&orderModel, c.GetId()).Error
  227. if err != nil {
  228. e.Log.Errorf("db error: %s", err)
  229. if errors.Is(err, gorm.ErrRecordNotFound) {
  230. return global.UpdateNotFoundOrNoPermissionErr
  231. }
  232. return global.UpdateFailedErr
  233. }
  234. // 订单为未派送才可以取消
  235. c.Generate(&orderModel)
  236. err = tx.Save(&orderModel).Error
  237. if err != nil {
  238. e.Log.Errorf("db error: %s", err)
  239. return global.UpdateFailedErr
  240. }
  241. c.Id = orderModel.Id
  242. return nil
  243. }
  244. func (e *Order) AppletUpdate(c *dto.OrderAppletUpdateReq) error {
  245. var err error
  246. tx := e.Orm.Begin()
  247. defer func() {
  248. if err != nil {
  249. tx.Rollback()
  250. } else {
  251. tx.Commit()
  252. }
  253. }()
  254. var orderModel = model.Order{}
  255. // 查询订单是否存在
  256. err = e.Orm.First(&orderModel, c.GetId()).Error
  257. if err != nil {
  258. e.Log.Errorf("db error: %s", err)
  259. if errors.Is(err, gorm.ErrRecordNotFound) {
  260. return global.UpdateNotFoundOrNoPermissionErr
  261. }
  262. return global.UpdateFailedErr
  263. }
  264. // 如果修改地址 则同步修改用户信息
  265. if orderModel.Address != c.Address {
  266. // TODO 同步省平台 修改用户信息
  267. err = tx.Model(&model.Customer{}).Where("id = ?", orderModel.CustomerId).Updates(
  268. map[string]interface{}{
  269. "area": c.Area,
  270. "city": c.City,
  271. "address": c.Address,
  272. "name": c.Name,
  273. }).Error
  274. if err != nil {
  275. return global.UpdateFailedErr
  276. }
  277. }
  278. // 订单为未派送才可以修改
  279. if orderModel.State != model.OrderStateOrder {
  280. return errors.New(fmt.Sprintf("订单状态为%s状态,无法修改", model.OrderStateMap[orderModel.State]))
  281. }
  282. c.Generate(&orderModel)
  283. err = tx.Save(&orderModel).Error
  284. if err != nil {
  285. e.Log.Errorf("db error: %s", err)
  286. return global.UpdateFailedErr
  287. }
  288. c.Id = orderModel.Id
  289. return nil
  290. }
  291. // Remove 删除Order
  292. func (e *Order) Remove(c *dto.OrderDeleteReq, p *actions.DataPermission) error {
  293. var err error
  294. tx := e.Orm.Begin()
  295. defer func() {
  296. if err != nil {
  297. tx.Rollback()
  298. } else {
  299. tx.Commit()
  300. }
  301. }()
  302. var orderModel model.Order
  303. // 查询订单是否存在
  304. err = e.Orm.Scopes(actions.Permission(orderModel.TableName(), p)).
  305. First(&orderModel, c.GetId()).Error
  306. if err != nil {
  307. e.Log.Errorf("db error: %s", err)
  308. if errors.Is(err, gorm.ErrRecordNotFound) {
  309. return nil
  310. }
  311. return global.DeleteFailedErr
  312. }
  313. if orderModel.State != model.OrderStateOrder && orderModel.State != model.OrderStateCancel {
  314. err = errors.New(fmt.Sprintf("订单状态为%s,无法删除", model.OrderStateMap[orderModel.State]))
  315. return err
  316. }
  317. db := tx.Delete(&orderModel)
  318. if err = db.Error; err != nil {
  319. e.Log.Errorf("db error: %s", err)
  320. return global.DeleteFailedErr
  321. }
  322. if db.RowsAffected == 0 {
  323. return global.DeleteNotFoundOrNoPermissionErr
  324. }
  325. return nil
  326. }
  327. func (e *Order) Cancel(c *dto.OrderCancelReq, p *actions.DataPermission) error {
  328. var err error
  329. tx := e.Orm.Begin()
  330. defer func() {
  331. if err != nil {
  332. tx.Rollback()
  333. } else {
  334. tx.Commit()
  335. }
  336. }()
  337. var orderModel model.Order
  338. // 查询订单是否存在
  339. err = e.Orm.Scopes(actions.Permission(orderModel.TableName(), p)).
  340. First(&orderModel, c.GetId()).Error
  341. if err != nil {
  342. e.Log.Errorf("db error: %s", err)
  343. if errors.Is(err, gorm.ErrRecordNotFound) {
  344. return global.UpdateNotFoundOrNoPermissionErr
  345. }
  346. return global.UpdateFailedErr
  347. }
  348. if orderModel.State == model.OrderStateCancel {
  349. return nil
  350. }
  351. if orderModel.State != model.OrderStateOrder && orderModel.State != model.OrderStateDelivery {
  352. return errors.New(fmt.Sprintf("订单状态为%s,禁止取消", model.OrderStateMap[orderModel.State]))
  353. }
  354. orderModel.State = model.OrderStateCancel
  355. orderModel.CancelTime = common.Time(time.Now())
  356. db := tx.Save(&orderModel)
  357. if err = db.Error; err != nil {
  358. e.Log.Errorf("db error: %s", err)
  359. return global.UpdateFailedErr
  360. }
  361. if db.RowsAffected == 0 {
  362. return global.UpdateNotFoundOrNoPermissionErr
  363. }
  364. return nil
  365. }
  366. // Delivery 派单
  367. func (e *Order) Delivery(c *dto.OrderDeliveryReq, p *actions.DataPermission) error {
  368. var err error
  369. var orderModel = model.Order{}
  370. // 查询订单是否存在
  371. err = e.Orm.Scopes(OrderDeptIdScopes(p.DeptId)).
  372. First(&orderModel, c.GetId()).Error
  373. if err != nil {
  374. e.Log.Errorf("db error: %s", err)
  375. if errors.Is(err, gorm.ErrRecordNotFound) {
  376. return global.UpdateNotFoundOrNoPermissionErr
  377. }
  378. return global.UpdateFailedErr
  379. }
  380. c.Generate(&orderModel)
  381. err = e.Orm.Save(&orderModel).Error
  382. if err != nil {
  383. e.Log.Errorf("db error: %s", err)
  384. return global.UpdateFailedErr
  385. }
  386. c.Id = orderModel.Id
  387. return nil
  388. }
  389. // UpdateState 修改订单状态
  390. func (e *Order) UpdateState(c *dto.OrderUpdateStateReq, p *actions.DataPermission) error {
  391. var err error
  392. var orderModel = model.Order{}
  393. // 查询订单是否存在
  394. err = e.Orm.
  395. Scopes(InDeptIdScopes(p.DeptId)).
  396. Preload("User").Preload("Store").Preload("Dept").
  397. First(&orderModel, c.GetId()).Error
  398. if err != nil {
  399. e.Log.Errorf("db error: %s", err)
  400. if errors.Is(err, gorm.ErrRecordNotFound) {
  401. return global.UpdateNotFoundOrNoPermissionErr
  402. }
  403. return global.UpdateFailedErr
  404. }
  405. tx := e.Orm.Begin()
  406. defer func() {
  407. if err != nil {
  408. tx.Rollback()
  409. } else {
  410. tx.Commit()
  411. }
  412. }()
  413. // 配送中
  414. if c.State == model.OrderStateInDelivery {
  415. orderModel.State = c.State
  416. orderModel.DeliveryTime = common.Time(time.Now())
  417. }
  418. // 已送达
  419. if c.State == model.OrderStateArrive {
  420. orderModel.State = c.State
  421. orderModel.ArriveTime = common.Time(time.Now())
  422. err = InsertOperationLogByOptType26Or36(tx, "26", c.ChipUid, orderModel)
  423. if err != nil {
  424. e.Log.Errorf("db error: %s", err)
  425. return global.UpdateFailedErr
  426. }
  427. var orderInnerCodeList []model.OrderInnerCode
  428. for _, chipUid := range c.ChipUid {
  429. orderInnerCodeList = append(orderInnerCodeList, model.OrderInnerCode{
  430. InnerCode: chipUid,
  431. State: 1,
  432. })
  433. }
  434. orderModel.OrderInnerCodeList = orderInnerCodeList
  435. }
  436. // 已取消
  437. if c.State == model.OrderStateCancel && orderModel.State == model.OrderStateArrive {
  438. orderModel.State = c.State
  439. orderModel.CancelTime = common.Time(time.Now())
  440. // 已取消钢瓶不参与流传
  441. var orderInnerCodeMap = make(map[string]int)
  442. for _, v := range orderModel.OrderInnerCodeList {
  443. orderInnerCodeMap[v.InnerCode] = v.State
  444. }
  445. var chipUid []string
  446. for i := 0; i < len(c.ChipUid); i++ {
  447. if state, ok := orderInnerCodeMap[c.ChipUid[i]]; ok && state == 1 {
  448. chipUid = append(chipUid, c.ChipUid[i])
  449. }
  450. }
  451. err = InsertOperationLogByOptType26Or36(tx, "36", chipUid, orderModel)
  452. if err != nil {
  453. e.Log.Errorf("db error: %s", err)
  454. return global.UpdateFailedErr
  455. }
  456. // 更新钢瓶状态为已取消
  457. var chipUidMap = make(map[string]struct{})
  458. for _, s := range c.ChipUid {
  459. chipUidMap[s] = struct{}{}
  460. }
  461. for i := 0; i < len(orderModel.OrderInnerCodeList); i++ {
  462. if _, ok := chipUidMap[orderModel.OrderInnerCodeList[i].InnerCode]; ok {
  463. orderModel.OrderInnerCodeList[i].State = 2
  464. }
  465. }
  466. // 判断所有钢瓶状态是否为已取消
  467. // 所有钢瓶状态为已取消,订单状态改为已取消,否则还是已送达
  468. var flag = true
  469. for _, code := range orderModel.OrderInnerCodeList {
  470. if code.State == 1 {
  471. flag = false
  472. break
  473. }
  474. }
  475. // 所有钢瓶状态为已取消,订单状态改为已取消,否则还是已送达
  476. if !flag {
  477. orderModel.State = model.OrderStateArrive
  478. }
  479. }
  480. err = e.Orm.Model(&orderModel).Updates(&orderModel).Error
  481. if err != nil {
  482. e.Log.Errorf("db error: %s", err)
  483. return global.UpdateFailedErr
  484. }
  485. c.Id = orderModel.Id
  486. return nil
  487. }
  488. func AppletOrderState(state int) func(db *gorm.DB) *gorm.DB {
  489. return func(db *gorm.DB) *gorm.DB {
  490. if state == 0 {
  491. return db
  492. }
  493. if state == 1 || state == 2 {
  494. return db.Where("state = 1 or state = 2 ")
  495. }
  496. return db.Where("state = ? ", state)
  497. }
  498. }
  499. func (e *Order) AppletGetPage(c *dto.AppletOrderGetPageReq, list *[]model.Order, count *int64) error {
  500. var err error
  501. var data model.Order
  502. err = e.Orm.Model(&data).
  503. Scopes(
  504. AppletOrderState(c.State),
  505. cDto.MakeCondition(c.GetNeedSearch()),
  506. cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  507. ).
  508. Preload("Customer").Preload("Store").Preload("User").Preload("Goods").Preload("Spec").
  509. Find(list).Limit(-1).Offset(-1).
  510. Count(count).Error
  511. if err != nil {
  512. e.Log.Errorf("db error: %s", err)
  513. return global.GetFailedErr
  514. }
  515. return nil
  516. }