ActivityRebateOrderNLog.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. /**
  3. * 厦门云联储网络科技有限公司
  4. * https://www.baokuaiyun.com
  5. * Copyright (c) 2023 爆块云 All rights reserved.
  6. */
  7. namespace app\models;
  8. use Yii;
  9. use yii\behaviors\TimestampBehavior;
  10. use yii\db\ActiveRecord;
  11. /**
  12. * This is the model class for table "{{%activity_rebate_order_n_log}}".
  13. *
  14. * @property integer $id
  15. */
  16. class ActivityRebateOrderNLog extends \yii\db\ActiveRecord
  17. {
  18. /**
  19. * @inheritdoc
  20. */
  21. public static function tableName()
  22. {
  23. return '{{%activity_rebate_order_n_log}}';
  24. }
  25. public function behaviors()
  26. {
  27. return [
  28. [
  29. 'class' => TimestampBehavior::class,
  30. ]
  31. ];
  32. }
  33. public static function afterOrderSave($insert, $changedAttributes, $order) {
  34. try{
  35. if($insert){
  36. return;
  37. }
  38. $ods = $order->detail;
  39. foreach($ods as $item){
  40. $activity = ActivityRebateOrderN::activityAt($order['store_id'], $item['goods_id']);
  41. if(!$activity){
  42. continue;
  43. }
  44. if (isset($changedAttributes['is_pay']) && ($order->is_pay == 1) && ($changedAttributes['is_pay'] != 1)) {
  45. //debug_log($changedAttributes, __CLASS__ . '.log');
  46. $orderUser = User::findOne($order->user_id);
  47. if(!$orderUser || !$orderUser->old_parent_id){
  48. continue;
  49. }
  50. if($activity->child_level_min > -1){
  51. if($orderUser->level < $activity->child_level_min){
  52. continue;
  53. }
  54. }
  55. $user = User::findOne($orderUser->old_parent_id);
  56. if($activity->user_level_min > -1){
  57. if($user->level < $activity->user_level_min){
  58. continue;
  59. }
  60. }
  61. $saasUser = SaasUser::findOne(['mobile' => $user->binding]);
  62. self::addOrderId((int)$order['store_id'], $activity->id, (int)$item['goods_id'], (int)$saasUser['id'], (int)$user['id'], (int)$order->id);
  63. }
  64. }
  65. } catch (\Exception $ex) {
  66. \Yii::error($ex);
  67. //debug_log([__FUNCTION__, __LINE__, $ex->getMessage(), $ex->getTrace()], __CLASS__ . '.log');
  68. }
  69. }
  70. public static function addOrderId($store_id, $activity_id, $goods_id, $saas_id, $user_id, $pay_order_id = 0) {
  71. //debug_log(func_get_args(), __CLASS__ . '.log');
  72. $condition = [
  73. 'activity_id' => $activity_id,
  74. 'store_id' => $store_id,
  75. 'goods_id' => $goods_id,
  76. 'saas_id' => $saas_id,
  77. 'user_id' => $user_id,
  78. ];
  79. $model = self::findOne($condition);
  80. if(empty($model)){
  81. $model = new self();
  82. $model->setAttributes($condition, false);
  83. }
  84. $pay_order_ids = (array)json_decode($model->pay_order_id, true);
  85. if($pay_order_id && !in_array($pay_order_id, $pay_order_ids)){
  86. $model->pay_order_id = json_encode(array_merge($pay_order_ids, [$pay_order_id]));
  87. }
  88. $save = $model->save();
  89. if(!$save){
  90. \Yii::error(array_shift($model->getFirstErrors()));
  91. }
  92. return [
  93. 'code' => $save ? 0 : 1,
  94. 'msg' => array_shift($model->getFirstErrors()),
  95. 'data' => $model,
  96. ];
  97. }
  98. public static function priceInfoOrderId($order_id) {
  99. try {
  100. if(isset($order_id->id)){
  101. $order = $order_id;
  102. }else{
  103. $order = Order::findOne($order_id);
  104. }
  105. if(empty($order)){
  106. return;
  107. }
  108. $ods = $order->detail;
  109. $res = [];
  110. foreach($ods as $item){
  111. $activity = ActivityRebateOrderN::activityAt($order['store_id'], $item['goods_id']);
  112. if(!$activity){
  113. continue;
  114. }
  115. $orderUser = User::findOne($order->user_id);
  116. if(!$orderUser || !$orderUser->old_parent_id){
  117. continue;
  118. }
  119. $user = User::findOne($orderUser->old_parent_id);
  120. $saasUser = SaasUser::findOne(['mobile' => $user->binding]);
  121. $res[$activity->id] = self::setPriceInfo($order['store_id'], $activity->id, (int)$item['goods_id'], (int)$saasUser['id'], (int)$user['id'], (int)$order->id);
  122. }
  123. return $res;
  124. } catch (\Exception $ex) {
  125. \Yii::error($ex);
  126. //debug_log([__FUNCTION__, __LINE__, $ex->getMessage(), $ex->getTrace()], __CLASS__ . '.log');
  127. }
  128. }
  129. public static function setPriceInfo($store_id, $activity_id, $goods_id, $saas_id, $user_id) {
  130. //debug_log(func_get_args(), __CLASS__ . '.log');
  131. $condition = [
  132. 'activity_id' => $activity_id,
  133. 'store_id' => $store_id,
  134. 'goods_id' => $goods_id,
  135. 'saas_id' => $saas_id,
  136. 'user_id' => $user_id,
  137. ];
  138. $model = self::findOne($condition);
  139. if(!$model){
  140. return null;
  141. }
  142. if($model->price_info){
  143. $priceInfo = (array)json_decode($model->price_info, true);
  144. }else{
  145. $activity = ActivityRebateOrderN::findOne($activity_id);
  146. $priceInfo = ActivityRebateOrderN::decodeRules($activity->rebate_rules);
  147. }
  148. $pay_order_ids = (array)json_decode($model->pay_order_id, true);
  149. $orderDetails = OrderDetail::find()->alias('od')
  150. ->leftJoin(['o' => Order::tableName()], 'o.id = od.order_id')
  151. ->where(['o.id' => $pay_order_ids, 'od.goods_id' => $goods_id, 'o.is_sale' => 1, 'o.trade_status' => Order::ORDER_FLOW_CONFIRM])
  152. ->andWhere([
  153. 'not in',
  154. 'o.id',
  155. OrderRefund::find()->select('order_id')->where([
  156. 'order_id' => $pay_order_ids,
  157. 'type' => 1,
  158. ])->andWhere(['in', 'status', [0, 1]])
  159. ])
  160. ->select('od.order_id id, sum(od.total_price) sum_price')
  161. ->groupBy('od.order_id')
  162. ->orderBy('o.confirm_time ASC')
  163. ->asArray()->all();
  164. if(!$model->finished){
  165. $finish = 1;
  166. $price = 0;
  167. $offset = 0;
  168. foreach ($priceInfo['list'] as $k => &$item) {
  169. if(count($orderDetails) >= $item['order_count']){
  170. $orderDetailsArea = array_slice($orderDetails, $offset, ($item['order_count'] - $offset));
  171. $offset = $item['order_count'];
  172. if($item['is_price'] == 1){
  173. $price += $item['user_price'];
  174. continue;
  175. }
  176. $item['user_price_order'] = array_column($orderDetailsArea, 'id');
  177. if($priceInfo['type'] == 0){
  178. $item['user_price'] = sprintf("%.2f", $item['price']);
  179. }else{
  180. $orderSum = array_sum(array_column($orderDetailsArea, 'sum_price'));
  181. $item['user_price'] = sprintf("%.2f", ((float)$orderSum) * $item['price'] / 100);
  182. }
  183. $item['pass'] = 1;
  184. $item['pass_time'] = date('Y-m-d H:i:s');
  185. $orderId = $priceInfo['order_ids'][$item['order_count'] - 1];
  186. $user = User::findOne($user_id);
  187. $user->total_price += $item['user_price'];
  188. $user->price += $item['user_price'];
  189. $user->save();
  190. UserShareMoney::set($item['user_price'], $user->id, $orderId, 0, 1, $store_id, 0);
  191. $item['is_price'] = 1;
  192. $item['is_price_time'] = date('Y-m-d H:i:s');
  193. $price += $item['user_price'];
  194. }else{
  195. $item['pass'] = 0;
  196. $finish = 0;
  197. }
  198. }
  199. if($finish){
  200. $model->finished = 1;
  201. }
  202. $model->price = sprintf("%.2f", $price);
  203. $model->price_info = json_encode($priceInfo);
  204. $save = $model->save();
  205. }
  206. return [
  207. 'code' => $save ? 0 : 1,
  208. 'msg' => array_shift($model->getFirstErrors()),
  209. 'data' => $priceInfo,
  210. 'model' => $model,
  211. '$orderDetails' => $orderDetails,
  212. ];
  213. }
  214. }