OrderService.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace addons\BusinessActivity\common\service;
  3. use addons\BusinessActivity\common\enums\BusinessActivityEnum;
  4. use addons\BusinessActivity\common\models\AddonsBusinessActivityGoodsModel;
  5. use addons\BusinessActivity\common\models\AddonsBusinessActivityModel;
  6. use addons\BusinessActivity\common\models\AddonsBusinessActivityOrderModel;
  7. use common\enums\OrderStatusEnum;
  8. use common\enums\StatusEnum;
  9. use common\helpers\FormatHelper;
  10. use common\models\order\Order;
  11. use common\models\order\OrderDetail;
  12. use common\models\user\User;
  13. use yii\helpers\Json;
  14. class OrderService
  15. {
  16. /**
  17. * @param int $mall_id
  18. * @param array $params
  19. * @return array|false|mixed|string|null
  20. */
  21. public function page(int $mall_id, array $params)
  22. {
  23. $where[]['mall_id'] = $mall_id;
  24. $where[]['status'] = StatusEnum::ENABLED;
  25. if (!empty($params['name'])) {
  26. $a_ids = AddonsBusinessActivityModel::find()->where(['mall_id' => $mall_id])
  27. ->andWhere(['like', 'name', "%{$params['name']}%", false])->select('id')->column();
  28. if (!empty($a_ids)) {
  29. $where[]['activity_id'] = $a_ids;
  30. } else {
  31. $where[]['activity_id'] = StatusEnum::DISABLED; // 如果没有相关的活动,则不返回数据
  32. }
  33. }
  34. if (!empty($params['member'])) {
  35. $user_or[] = 'or';
  36. $user_or[] = ['like', 'id', $params['member']];
  37. $user_or[] = ['like', 'nickname', $params['member']];
  38. $u_ids = User::find()->where(['mall_id' => $mall_id])->andWhere($user_or)->column();
  39. if (!empty($u_ids)) {
  40. $where[] = ['in', 'user_id', $u_ids];
  41. } else {
  42. $where[] = ['user_id' => StatusEnum::DISABLED];
  43. }
  44. }
  45. if (!empty($params['date_start']) && !empty($params['date_end'])) {
  46. $s = strtotime($params['date_start']);
  47. $e = strtotime($params['date_end']);
  48. $where[] = ['between', 'created_at', $s, $e];
  49. } elseif (!empty($params['date_start'])) {
  50. $s = strtotime($params['date_start']);
  51. $where[] = ['<=', 'created_at', $s];
  52. } elseif (!empty($params['date_end'])) {
  53. $e = strtotime($params['date_end']);
  54. $where[] = ['>=', 'created_at', $e];
  55. }
  56. $ret = AddonsBusinessActivityOrderModel::listPage([
  57. 'where' => $where,
  58. 'with' => ['activity', 'user', 'order' => function($query) {
  59. $query->with(['detail']);
  60. }],
  61. 'order' => 'id desc'
  62. ]);
  63. if (!empty(AddonsBusinessActivityOrderModel::getStaticError())) return AddonsBusinessActivityOrderModel::getStaticError();
  64. return $ret;
  65. }
  66. /**
  67. * 同步创建订单
  68. * @param Order $order
  69. * @param int $business_activity_id
  70. * @param array $activity_goods_ids
  71. * @return void
  72. * @throws \Exception
  73. */
  74. public function create(Order $order, int $business_activity_id, array $activity_goods_ids)
  75. {
  76. $model = new AddonsBusinessActivityOrderModel();
  77. $model->mall_id = $order->mall_id;
  78. $model->activity_id = $business_activity_id;
  79. $model->user_id = $order->user_id;
  80. $model->order_id = $order->id;
  81. $model->status = StatusEnum::ENABLED;
  82. $model->order_status = OrderStatusEnum::NOT_PAY;
  83. $model->goods_ids = Json::encode($activity_goods_ids); // 存储商品ID
  84. if (!$model->save()) {
  85. throw new \Exception("同步订单 {$order->id} 至招商活动 {$business_activity_id} 失败 {$model->getErrorMessage()}");
  86. }
  87. // 将订单来源修改一下
  88. $order->order_source = BusinessActivityEnum::ADDONS_NAME;
  89. $order->marketing_type = BusinessActivityEnum::ADDONS_NAME;
  90. if (!$order->save()) throw new \Exception("同步订单 {$order->id} 至招商活动 {$business_activity_id} 失败 {$order->getErrorMessage()}");
  91. }
  92. /**
  93. * 同步更新订单状态
  94. * @param Order $order
  95. * @param int $status
  96. * @param \Closure|null $callback
  97. * @return bool
  98. */
  99. public function changeStatus(Order $order, AddonsBusinessActivityOrderModel $data, int $status, \Closure $callback = null)
  100. {
  101. $t = \Yii::$app->db->beginTransaction();
  102. try {
  103. $data->order_status = $status;
  104. if (!$data->save()) {
  105. \Yii::error("同步订单 {$order->id} 状态 {$status} 至招商活动 {$data->activity_id} 失败 {$data->getErrorMessage()}");
  106. throw new \Exception($data->getErrorMessage());
  107. }
  108. // 闭包处理
  109. if (!empty($callback)) {
  110. $callback->call($this);
  111. }
  112. $t->commit();
  113. return true;
  114. } catch (\Exception $e) {
  115. $t->rollBack();
  116. \Yii::error(FormatHelper::exception($e, __CLASS__));
  117. return false;
  118. }
  119. }
  120. /**
  121. * 获取活动数量
  122. * @param int $mall_id
  123. * @param array $activity_ids
  124. * @return array|\yii\db\ActiveRecord|null
  125. */
  126. public function totalByActivity(int $mall_id, array $activity_ids)
  127. {
  128. return AddonsBusinessActivityOrderModel::find()->where(['mall_id' => $mall_id])
  129. ->andWhere(['activity_id' => $activity_ids])
  130. ->andWhere(['status' => StatusEnum::ENABLED])
  131. ->select('COUNT(distinct user_id) as total_order')->asArray()->one();
  132. }
  133. }