| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- <?php
- /**
- * 厦门云联储网络科技有限公司
- * https://www.baokuaiyun.com
- * Copyright (c) 2023 爆块云 All rights reserved.
- */
- namespace app\models;
- use Yii;
- use yii\behaviors\TimestampBehavior;
- use yii\db\ActiveRecord;
- /**
- * This is the model class for table "{{%activity_rebate_order_n_log}}".
- *
- * @property integer $id
- */
- class ActivityRebateOrderNLog extends \yii\db\ActiveRecord
- {
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return '{{%activity_rebate_order_n_log}}';
- }
- public function behaviors()
- {
- return [
- [
- 'class' => 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,
- ];
- }
- }
|