db->beginTransaction(); try { // 获取订单内容 $where = ['id' => $order_id]; $order = Order::find()->select("id,user_id,mall_id,order_no,pay_time") ->where($where) ->with(['detail' => function($query){ $query->select("order_id,goods_id,num,goods_price,goods_name,price,pic_url"); }]) ->asArray()->one(); if(empty($order)) throw new Exception("订单不存在"); // 获取订单内容 $order['order_status'] = $settlement_type; self::buyGoodsUpgrade($order); self::conditionUpgrade($order); $t->commit(); return true; } catch (Exception $e) { $t->rollBack(); self::setStaticError($e->getMessage()); return false; } } public static function buyGoodsUpgrade(array $order, $order_by = 'level desc') { $identity_desc = 'Rebate'; try { $mall_id = $order['mall_id']; $user_id = $order['user_id']; $upgrade_uid = 0; $model = RebateUser::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]); if (empty($model)) { $model = new RebateUser(); $model->mall_id = $mall_id; $model->user_id = $user_id; $model->level = 0; $model->upgrade_at = 0; $model->loadDefaultValues(); } $where = []; $where[] = ['mall_id' => $mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; $where[] = ['>', 'level', $model->level]; $params = []; $params['where'] = $where; $params['order'] = $order_by; // 获取等级 $level_list = RebateUserLevel::lists($params); $where = []; $where[] = ['mall_id' => $mall_id]; $where[] = ['order_id' => $order['id']]; $where[] = ['user_id' => $user_id]; $params = []; $params['where'] = $where; $order_detail_list = OrderDetail::lists($params); $buy_goods_id_arr = array_column($order_detail_list, 'goods_id'); $can_upgrade_level = 0; $upgrade_status = 0; $flag = false; //开启购买升级商品 if (!empty($level_list)) { foreach ($level_list as $level_arr) { $can_upgrade_level = $level_arr['level']; //开启购买升级商品 if ($level_arr['upgrade_type_goods'] && $level_arr['is_auto_upgrade']) { $upgrade_status = 2; $goods_id_arr = Json::decode($level_arr['goods_ids'], true); $res = UpgradeCondition::buyGoods($level_arr['goods_type'], $buy_goods_id_arr, $goods_id_arr); if ($res) { if ($level_arr['buy_goods_type'] == 0 && $order['order_status'] == OrderStatusEnum::ACCOMPLISH) { $flag = true; break; } if ($level_arr['buy_goods_type'] == 1 && $order['order_status'] == OrderStatusEnum::PAY) { $flag = true; break; } } } } if ($flag) { $model->level = $can_upgrade_level; $model->upgrade_status = $upgrade_status; $model->upgrade_at = time(); if (!$model->save()) throw new Exception("{用户ID:$user_id},订单ID:{$order['id']}," . AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败"); $upgrade_uid = $user_id; } } return $upgrade_uid; } catch (Exception $e) { $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败"); var_dump($exception); return false; } } public static function conditionUpgrade(array $order, $order_by = 'level desc') { $identity_desc = 'Rebate'; 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 = RebateUser::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all(); $model_arr = $upgrade_user_ids = []; foreach ($upgrade_user_id_arr as $id) { if (!isset($model_list[$id])) { } if (!empty($model_list[$id])) { $model_arr[] = $model_list[$id]; } else { $model = new RebateUser(); $model->mall_id = $mall_id; $model->user_id = $id; $model->level = 0; $model->upgrade_at = 0; $model_arr[] = $model; } } foreach ($model_arr as $identity) { $where = []; $where[] = ['mall_id' => $mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; $where[] = ['>', 'level', $identity->level]; $params = []; $params['where'] = $where; $params['order'] = $order_by; $level_list = RebateUserLevel::lists($params); $flag = false; $can_upgrade_level = 0; $upgrade_status = 0; if ($level_list) { foreach ($level_list as $identity_level_arr) { $can_upgrade_level = $identity_level_arr['level']; //开启条件升级 if ($identity_level_arr['upgrade_type_condition'] && $identity_level_arr['is_auto_upgrade']) { $upgrade_status = 1; $res = self::check($identity->user_id, $identity_level_arr, $mall_id, $identity_level_arr['level']); if ($res) { $flag = true; break; } } } } if ($flag && $can_upgrade_level > $identity->level) { $identity->level = $can_upgrade_level; $identity->upgrade_status = $upgrade_status; $identity->upgrade_at = time(); if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']}," . AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败"); $upgrade_user_ids[] = $identity->user_id; } } return $upgrade_user_ids; } catch (Exception $e) { $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败"); echo $exception; return false; } } public static function check($user_id, $agent_level_arr, $mall_id = 0, $upgrade_level = 0) { if (empty($agent_level_arr['condition_type'])) return false; $condition_type = $agent_level_arr['condition_type']; $keys_arr = json_decode($agent_level_arr['checked_condition_keys'], true); $values_arr = json_decode($agent_level_arr['checked_condition_values'], true); if (empty($values_arr)) return false; $arr = [];//升级条件 foreach ($values_arr as $K => $v) { $arr[$v['key']] = $v; } $is_return = false; sort($keys_arr); foreach ($keys_arr as $id) { $function = 'condition' . $id; $params['user_id'] = $user_id; $params['arr'] = $arr; $params['key'] = $id; $params['children_id_arr1'] = []; $params['children_id_arr2'] = []; $params['user_id_arr'] = []; $params['children_id_arr'] = []; $params['name1'] = ''; $params['name2'] = ''; $params['model_class'] = ''; $params['data'] = []; $params['mall_id'] = $mall_id; $params['upgrade_level'] = $upgrade_level; if (!method_exists(static::class, $function)) continue; $is_bool = static::$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; } public static function condition1($params) { $is_bool = false; if (empty($params['user_id']) || empty($params['arr']) || empty($params['key'])) return $is_bool; $user_id_arr = UserPartitionRelationship::getChildIdArr($params['user_id'], 1); if (empty($user_id_arr)) return $is_bool; $arr = $params['arr']; $key = $params['key']; $level = $arr[$key]['value']['direct_rebate_user_level']; $direct_rebate_user_level_num = $arr[$key]['value']['direct_rebate_user_level_num']; $counts = RebateUser::find()->where(['user_id' => $user_id_arr, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]) ->andWhere(['>=', 'level', $level]) ->count(); if ($counts >= $direct_rebate_user_level_num) $is_bool = true; return $is_bool; } }