TimestampBehavior::class, ] ]; } public static function afterOrderSave($insert, $changedAttributes, $order) { try{ if($insert){ return; } $ods = $order->detail; foreach($ods as $item){ $activity = ActivityRebateOrderN::activityAt($order['store_id'], $item['goods_id']); if(!$activity){ continue; } if (isset($changedAttributes['is_pay']) && ($order->is_pay == 1) && ($changedAttributes['is_pay'] != 1)) { //debug_log($changedAttributes, __CLASS__ . '.log'); $orderUser = User::findOne($order->user_id); if(!$orderUser || !$orderUser->old_parent_id){ continue; } if($activity->child_level_min > -1){ if($orderUser->level < $activity->child_level_min){ continue; } } $user = User::findOne($orderUser->old_parent_id); if($activity->user_level_min > -1){ if($user->level < $activity->user_level_min){ continue; } } $saasUser = SaasUser::findOne(['mobile' => $user->binding]); self::addOrderId((int)$order['store_id'], $activity->id, (int)$item['goods_id'], (int)$saasUser['id'], (int)$user['id'], (int)$order->id); } } } catch (\Exception $ex) { \Yii::error($ex); //debug_log([__FUNCTION__, __LINE__, $ex->getMessage(), $ex->getTrace()], __CLASS__ . '.log'); } } public static function addOrderId($store_id, $activity_id, $goods_id, $saas_id, $user_id, $pay_order_id = 0) { //debug_log(func_get_args(), __CLASS__ . '.log'); $condition = [ 'activity_id' => $activity_id, 'store_id' => $store_id, 'goods_id' => $goods_id, 'saas_id' => $saas_id, 'user_id' => $user_id, ]; $model = self::findOne($condition); if(empty($model)){ $model = new self(); $model->setAttributes($condition, false); } $pay_order_ids = (array)json_decode($model->pay_order_id, true); if($pay_order_id && !in_array($pay_order_id, $pay_order_ids)){ $model->pay_order_id = json_encode(array_merge($pay_order_ids, [$pay_order_id])); } $save = $model->save(); if(!$save){ \Yii::error(array_shift($model->getFirstErrors())); } return [ 'code' => $save ? 0 : 1, 'msg' => array_shift($model->getFirstErrors()), 'data' => $model, ]; } public static function priceInfoOrderId($order_id) { try { if(isset($order_id->id)){ $order = $order_id; }else{ $order = Order::findOne($order_id); } if(empty($order)){ return; } $ods = $order->detail; $res = []; foreach($ods as $item){ $activity = ActivityRebateOrderN::activityAt($order['store_id'], $item['goods_id']); if(!$activity){ continue; } $orderUser = User::findOne($order->user_id); if(!$orderUser || !$orderUser->old_parent_id){ continue; } $user = User::findOne($orderUser->old_parent_id); $saasUser = SaasUser::findOne(['mobile' => $user->binding]); $res[$activity->id] = self::setPriceInfo($order['store_id'], $activity->id, (int)$item['goods_id'], (int)$saasUser['id'], (int)$user['id'], (int)$order->id); } return $res; } catch (\Exception $ex) { \Yii::error($ex); //debug_log([__FUNCTION__, __LINE__, $ex->getMessage(), $ex->getTrace()], __CLASS__ . '.log'); } } public static function setPriceInfo($store_id, $activity_id, $goods_id, $saas_id, $user_id) { //debug_log(func_get_args(), __CLASS__ . '.log'); $condition = [ 'activity_id' => $activity_id, 'store_id' => $store_id, 'goods_id' => $goods_id, 'saas_id' => $saas_id, 'user_id' => $user_id, ]; $model = self::findOne($condition); if(!$model){ return null; } if($model->price_info){ $priceInfo = (array)json_decode($model->price_info, true); }else{ $activity = ActivityRebateOrderN::findOne($activity_id); $priceInfo = ActivityRebateOrderN::decodeRules($activity->rebate_rules); } $pay_order_ids = (array)json_decode($model->pay_order_id, true); $orderDetails = OrderDetail::find()->alias('od') ->leftJoin(['o' => Order::tableName()], 'o.id = od.order_id') ->where(['o.id' => $pay_order_ids, 'od.goods_id' => $goods_id, 'o.is_sale' => 1, 'o.trade_status' => Order::ORDER_FLOW_CONFIRM]) ->andWhere([ 'not in', 'o.id', OrderRefund::find()->select('order_id')->where([ 'order_id' => $pay_order_ids, 'type' => 1, ])->andWhere(['in', 'status', [0, 1]]) ]) ->select('od.order_id id, sum(od.total_price) sum_price') ->groupBy('od.order_id') ->orderBy('o.confirm_time ASC') ->asArray()->all(); if(!$model->finished){ $finish = 1; $price = 0; $offset = 0; foreach ($priceInfo['list'] as $k => &$item) { if(count($orderDetails) >= $item['order_count']){ $orderDetailsArea = array_slice($orderDetails, $offset, ($item['order_count'] - $offset)); $offset = $item['order_count']; if($item['is_price'] == 1){ $price += $item['user_price']; continue; } $item['user_price_order'] = array_column($orderDetailsArea, 'id'); if($priceInfo['type'] == 0){ $item['user_price'] = sprintf("%.2f", $item['price']); }else{ $orderSum = array_sum(array_column($orderDetailsArea, 'sum_price')); $item['user_price'] = sprintf("%.2f", ((float)$orderSum) * $item['price'] / 100); } $item['pass'] = 1; $item['pass_time'] = date('Y-m-d H:i:s'); $orderId = $priceInfo['order_ids'][$item['order_count'] - 1]; $user = User::findOne($user_id); $user->total_price += $item['user_price']; $user->price += $item['user_price']; $user->save(); UserShareMoney::set($item['user_price'], $user->id, $orderId, 0, 1, $store_id, 0); $item['is_price'] = 1; $item['is_price_time'] = date('Y-m-d H:i:s'); $price += $item['user_price']; }else{ $item['pass'] = 0; $finish = 0; } } if($finish){ $model->finished = 1; } $model->price = sprintf("%.2f", $price); $model->price_info = json_encode($priceInfo); $save = $model->save(); } return [ 'code' => $save ? 0 : 1, 'msg' => array_shift($model->getFirstErrors()), 'data' => $priceInfo, 'model' => $model, '$orderDetails' => $orderDetails, ]; } }