custom->logs('mall_id不存在', compact('data')); return; } if (empty($data['behavior']) || !isset(UserBehaviorLogsEnum::BEHAVIOR_MAP[$data['behavior']])) { $data['method'] = __METHOD__; Yii::$app->custom->logs('行为类型不存在', $data); return; } try { $data['ip'] = !empty($data['ip']) ? $data['ip'] : ArrayHelper::get_client_ip(); $data['operation_time'] = time(); $data['mall_id'] = !empty($data['mall_id']) ? $data['mall_id'] : $mallId; $event = new UserBehaviorLogsEvent($data['mall_id']); Yii::$app->services->events->dispatch($event, $data, $event->listeners); } catch (Exception $e) { $data['method'] = __METHOD__; Yii::$app->custom->logs(FormatHelper::exception($e, '触发用户行为事件失败'), compact('data')); } } /** * 根据传入的数据,完善模型写入时所需的数据 * * @param array $params * * @return void */ protected static function getInsertDataByParams(array &$params) { // 判断是否是系统自动操作(不包含下级退单的情况,因为下级退单认为是下级用户的操作) if (!empty($params['system_auto'])) { $params['operator_user_id'] = 0; $params['operator_user_type'] = UserBehaviorLogsEnum::OPERATOR_USER_TYPE_SYSTEM; } else { $params['operator_user_id'] = !empty($params['operator_user_id']) ? $params['operator_user_id'] : $params['user_id']; $params['operator_user_type'] = !empty($params['is_admin']) ? UserBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN : UserBehaviorLogsEnum::OPERATOR_USER_TYPE_USER; } $params['operator_target_user_id'] = !empty($params['operator_target_user_id']) ? $params['operator_target_user_id'] : $params['user_id']; // 存在order_id则存储起来 if (!empty($params['order_id'])) { $params['extra_info']['order_id'] = $params['order_id']; } switch ($params['behavior']) { case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_MOBILE: if (empty($params['new_mobile'])) { $params['new_mobile'] = User::getUserMobile($params['mall_id'], $params['operator_target_user_id']); } break; case UserBehaviorLogsEnum::BEHAVIOR_CANCEL: case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_PWD: if (empty($params['mobile'])) { $params['mobile'] = User::getUserMobile($params['mall_id'], $params['operator_target_user_id']); } break; case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_RELATIONSHIP: if (empty($params['before_parent_mobile']) && !empty($params['before_parent_id'])) { $params['before_parent_mobile'] = User::getUserMobile($params['mall_id'], $params['before_parent_id']); } if (empty($params['after_parent_mobile']) && !empty($params['after_parent_id'])) { $params['after_parent_mobile'] = User::getUserMobile($params['mall_id'], $params['after_parent_id']); } break; case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_PAY_PWD: $params['mobile'] = User::getUserMobile($params['mall_id'], $params['operator_target_user_id']); break; case UserBehaviorLogsEnum::BEHAVIOR_MANUAL_UPGRADE: case UserBehaviorLogsEnum::BEHAVIOR_MANUAL_DOWNGRADE: $params['mobile'] = User::getUserMobile($params['mall_id'], $params['operator_target_user_id']); $params['extra_info']['after_level'] = self::getValueOrReturnDefault($params, 'after_level', 0); $params['extra_info']['before_level'] = self::getValueOrReturnDefault($params, 'before_level', 0); break; case UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE: case UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE: // 判断是否是是否是系统操作(不是自己,就是系统) if (!empty($params['operator_user_id']) && !empty($params['operator_target_user_id'])) { $params['extra_info']['is_system'] = (int)($params['operator_user_id'] != $params['operator_target_user_id']); } if (!empty($params['upgrade_type'])) { $params['extra_info']['upgrade_type'] = $params['upgrade_type']; } $params['mobile'] = User::getUserMobile($params['mall_id'], $params['operator_target_user_id']); $params['extra_info']['after_level'] = self::getValueOrReturnDefault($params, 'after_level', 0); $params['extra_info']['before_level'] = self::getValueOrReturnDefault($params, 'before_level', 0); break; } $params['desc'] = self::getBehaviorDesc($params); } /** * 将行为事件写入队列 * * @param array $data * * @return void */ public static function logsPushQueue(array $data) { try { Yii::$app->services->rabbitMq->push( RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, self::class, 'handleSync' ); } catch (Exception $e) { $data['method'] = __METHOD__; Yii::$app->custom->logs(FormatHelper::exception($e, '行为日志发布队列失败'), $data); } } /** * 根据数据,返回是手动升降级还是系统升降级 * * @param array $data * * @return int */ public static function getLevelChangeBehavior(array $data): int { if (!empty($data['is_admin'])) { return $data['after_level'] > $data['before_level'] ? UserBehaviorLogsEnum::BEHAVIOR_MANUAL_UPGRADE : UserBehaviorLogsEnum::BEHAVIOR_MANUAL_DOWNGRADE; } return $data['after_level'] > $data['before_level'] ? UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE : UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE; } /** * 获取行为描述 * * @param array $params * * @return string */ protected static function getBehaviorDesc(array $params): string { switch ($params['behavior']) { case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_MOBILE: $str = '会员ID:%d, 由旧手机号:%d 更改为 新手机号:%d'; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'old_mobile'), self::getValueOrReturnDefault($params, 'new_mobile'), ]; break; case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_RELATIONSHIP: $afterParentId = self::getValueOrReturnDefault($params, 'after_parent_id'); $beforeParentId = self::getValueOrReturnDefault($params, 'before_parent_id'); if (!empty($afterParentId) && !empty($beforeParentId)) { $str = '由原来分享人ID=%d,手机号:%d 更改为 现分享人ID=%d,手机号:%d'; $args = [ self::getValueOrReturnDefault($params, 'before_parent_id'), self::getValueOrReturnDefault($params, 'before_parent_mobile'), self::getValueOrReturnDefault($params, 'after_parent_id'), self::getValueOrReturnDefault($params, 'after_parent_mobile'), ]; } elseif (empty($beforeParentId)) { $str = '由平台 更改为 分享人ID=%d,手机号:%d'; $args = [ self::getValueOrReturnDefault($params, 'after_parent_id'), self::getValueOrReturnDefault($params, 'after_parent_mobile'), ]; } else { $str = '由原来分享人ID=%d,手机号:%d 更改为 平台'; $args = [ self::getValueOrReturnDefault($params, 'before_parent_id'), self::getValueOrReturnDefault($params, 'before_parent_mobile'), ]; } break; case UserBehaviorLogsEnum::BEHAVIOR_CANCEL: $str = '会员ID:%d,会员手机号:%d'; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile') ]; break; case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_PWD: case UserBehaviorLogsEnum::BEHAVIOR_MODIFY_PAY_PWD: $str = '会员ID:%d,会员手机号:%d,更改密码'; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile') ]; break; case UserBehaviorLogsEnum::BEHAVIOR_MANUAL_UPGRADE: case UserBehaviorLogsEnum::BEHAVIOR_MANUAL_DOWNGRADE: $str = '会员ID:%d,会员手机号:%s,由旧等级:【%s】 更改为:【%s】'; $userLevelArr = UserLevel::getUserLevelArr($params['mall_id']); $defaultLevelName = MallSetting::getDefaultLevelName($params['mall_id']); $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile'), $userLevelArr[self::getValueOrReturnDefault($params, 'before_level')] ?? $defaultLevelName, $userLevelArr[self::getValueOrReturnDefault($params, 'after_level')] ?? $defaultLevelName, ]; break; case UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE: case UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE: $userLevelArr = UserLevel::getUserLevelArr($params['mall_id']); $defaultLevelName = MallSetting::getDefaultLevelName($params['mall_id']); $str = '会员ID:%d,会员手机号:%s,由【%s】等级%s级为【%s】等级,%s级方式:%s,订单ID:%d'; $upgradeOrDowngrade = [UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE => '升', UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE => '降']; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile'), $userLevelArr[self::getValueOrReturnDefault($params, 'before_level')] ?? $defaultLevelName, $upgradeOrDowngrade[$params['behavior']], $userLevelArr[self::getValueOrReturnDefault($params, 'after_level')] ?? $defaultLevelName, $upgradeOrDowngrade[$params['behavior']], UserBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE == $params['behavior'] ? UserBehaviorLogsEnum::getMapValueByKey(3, $params['extra_info']['upgrade_type'] ?? '') : UserBehaviorLogsEnum::getMapValueByKey(2, $params['system_auto'] ?? '', '售后退单'), self::getValueOrReturnDefault($params, 'order_id'), ]; break; default: throw new InvalidArgumentException('不存在的类型'); } return sprintf($str, ...$args); } /** * @param array $data * @param string $key * @param string $defaultValue * * @return mixed */ protected static function getValueOrReturnDefault(array $data, string $key, string $defaultValue = '') { return $data[$key] ?? $defaultValue; } }