order.go 12 KB

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