db->beginTransaction(); try { //开启条件升级 $mall_id = $order['mall_id']; $user_id = $order['user_id']; $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id); $upgrade_user_id_arr [] = $user_id; $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr); $model_list = DoubleCopyUser::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->orderBy([new Expression("FIND_IN_SET(user_id,'".implode(',',$upgrade_user_id_arr)."')")])->indexBy('user_id')->all(); if (empty($model_list)) { $trans->commit(); return true; } $upgrade_user_ids = []; // 获取等级 $where = []; $where[] = ['mall_id' => $mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; $params = []; $configs = \Yii::$app->services->setting->addons->get($mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic'); if($configs && isset($configs['is_open_level_limit']) && !empty($configs['is_open_level_limit'])){ $params['order'] = 'level asc'; $is_open_level_limit = true; }else{ $params['order'] = 'level desc'; $is_open_level_limit = false; } $params['where'] = $where; $level_list = DoubleCopyLevel::lists($params); if (empty($level_list)) { $trans->commit(); return true; } foreach ($model_list as $identity) { $flag = false; $upgrade_status = 0; foreach ($level_list as $identity_level_arr) { // 当前等级大于或等于可以升级的等级则直接退出 if(!$is_open_level_limit && $identity->level >= $identity_level_arr['level']){ break; } if($is_open_level_limit && $identity->level >= $identity_level_arr['level']){ continue; } $can_upgrade_level = $identity_level_arr['level'];// 要升级的等级 //开启条件升级 if ($identity_level_arr['upgrade_type_condition']&&$identity_level_arr['is_auto_upgrade']) { $upgrade_status = DoubleCopyEnum::UPGRADE_STATUS_CONDITION; $res = self::check($identity->user_id, $identity_level_arr, $order['id']); if ($res) { $flag = true; break; } } } if ($flag && $can_upgrade_level > $identity->level) { $identity->level = $can_upgrade_level; $identity->upgrade_status = $upgrade_status; $identity->upgrade_level_at = time(); $identity->upgrade_boss_at = !$identity->upgrade_boss_at && $can_upgrade_level >= 2 ? $identity->upgrade_level_at : 0; if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']},二二复制条件升级失败"); $upgrade_user_ids[] = $identity->user_id; } if($is_open_level_limit) continue; } $trans->commit(); return $upgrade_user_ids; } catch (Exception $e) { $trans->rollBack(); $exception = FormatHelper::exception($e, "二二复制条件升级"); echo $exception; $this->setError($exception); Yii::error($exception); return false; } } /** * 检查用户是否符合升级条件 * @Author: lun * @DateTime: 2022/7/8 0008 15:44 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $user_id * @param $level_arr * @param $order_id * @return bool */ public static function check($user_id, $level_arr, $order_id = 0) { if (empty($level_arr['condition_type'])) return false; $condition_type = $level_arr['condition_type']; $keys_arr = json_decode($level_arr['checked_condition_keys'], true); $values_arr = json_decode($level_arr['checked_condition_values'], true); $arr = [];//升级条件 foreach ($values_arr as $K => $v) { $arr[$v['key']] = $v['value']; } $is_return = false; sort($keys_arr); foreach ($keys_arr as $id) { $function = 'condition' . ($id+1); $params['user_id'] = $user_id; $params['arr'] = $arr[$id]; $params['order_id'] = $order_id; if (!method_exists(self::class, $function)) continue; $is_bool = self::$function($params); //满足其一 if ($condition_type == 1) { if ($is_bool) { $is_return = true; break; } else { $is_return = false; } } //满足所有 if ($condition_type == 2) { if ($is_bool) { $is_return = true; } else { $is_return = false; break; } } } return $is_return; } /** * 条件1: 升级前身份等级为代理,直推N个代理后升级 * @Author: lun * @DateTime: 2022/7/8 0008 9:30 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $params * @param $user_id_arr * @param $arr * @param $key * @return bool */ public static function condition1($params) { $user_id = $params['user_id']; $arr = $params['arr']; $is_bool = false; // 获取当前用户等级 $user = DoubleCopyUser::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->asArray()->one(); if (empty($user)) return $is_bool; // 当前用户身份必须为代理 if ($user['level'] != DoubleCopyEnum::LEVEL_AGENT) return $is_bool; // 获取直推下级的助力人数 $count = DoubleCopyUser::find()->where(['pid' => $user_id, 'status' => StatusEnum::ENABLED])->andWhere(['>=', 'level', DoubleCopyEnum::LEVEL_AGENT])->count(); if ($count >= $arr['val0']) $is_bool = true;// 符合条件 return $is_bool; } /** * 条件2:当前等级为X,直推前N个市场都成为Y等级 * @Author: lun * @DateTime: 2022/7/8 0008 15:37 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $params * @return bool */ public static function condition2($params) { $user_id = $params['user_id']; $arr = $params['arr']; $is_bool = false; // 获取当前用户等级 $user = DoubleCopyUser::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->asArray()->one(); if (empty($user)) return $is_bool; // 当前用户身份必须为设置等级 if ($user['level'] < $arr['val0']) return $is_bool; // 获取直推下级的助力人数 $list = DoubleCopyUser::find()->where(['pid' => $user_id, 'status' => StatusEnum::ENABLED])->orderBy('pos asc')->asArray()->all(); if (empty($list)) return $is_bool; $count = 0;// 符合条件的数量 foreach ($list as $key => $item) { if ($item['pos'] > $arr['val1']) break;// 只获取直推的前N个市场 if ($item['level'] >= $arr['val2']) $count ++;// 符合条件的市场进行累加 } if ($count >= $arr['val1']) $is_bool = true;// 符合条件 return $is_bool; } /** * 购买指定商品,商品ID组_______ * @param $params * @return bool */ public static function condition3($params) { $user_id = $params['user_id']; $arr = $params['arr']; $is_bool = false; // 获取当前用户等级 $user = DoubleCopyUser::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->asArray()->one(); if (empty($user)) return $is_bool; $goods_ids = $arr['val0']; if(!$goods_ids) return $is_bool; $goods_ids = explode(',',$goods_ids); // 购买指定商品订单 (修改补充订单。已发货、已收货、待自提、自提成功状态) $detail = OrderDetail::find()->where(['user_id' => $user_id,'goods_id' => $goods_ids]) ->andWhere(['order_status' => [OrderStatusEnum::ACCOMPLISH,OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]])->one(); if (empty($detail)) return $is_bool; return true; } protected static function condition4($params) { if (empty($params['order_id'])) return false; $user_id = $params['user_id']; $arr = $params['arr']; if (!isset($arr['val0']) || !isset($arr['val1'])) return false; $goods_ids = $arr['val0']; $finish_order_money = $arr['val1']; $total_money = OrderDetail::find()->select('goods_price')->where(['order_id' => $params['order_id'], 'user_id' => $user_id, 'goods_id' => explode(',', $goods_ids), 'order_status' => OrderStatusEnum::ACCOMPLISH, 'status' => StatusEnum::ENABLED])->sum('goods_price') ?? 0; if ($total_money >= $finish_order_money) return true; return false; } }