custom->logs('mall_id不存在', compact('data')); return; } if (empty($data['behavior']) || !isset(AgentBehaviorLogsEnum::BEHAVIOR_MAP[$data['behavior']])) { $data['method'] = __METHOD__; Yii::$app->custom->logs('行为类型不存在', $data); return; } try { $data['ip'] = ArrayHelper::get_client_ip(); $data['operation_time'] = time(); $data['mall_id'] = !empty($data['mall_id']) ? $data['mall_id'] : $mallId; $event = new AgentBehaviorLogsEvent($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) { $params['operator_user_id'] = !empty($params['operator_user_id']) ? $params['operator_user_id'] : $params['user_id']; $params['operator_user_type'] = !empty($params['is_admin']) ? AgentBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN : AgentBehaviorLogsEnum::OPERATOR_USER_TYPE_USER; $params['operator_target_user_id'] = !empty($params['operator_target_user_id']) ? $params['operator_target_user_id'] : $params['user_id']; if (!empty($params['order_id'])) { $params['extra_info']['order_id'] = $params['order_id']; } if (!empty($params['agent_id'])) { $params['extra_info']['agent_id'] = $params['agent_id']; } if (!empty($params['level'])) { $params['extra_info']['level'] = $params['level']; } $params['mobile'] = User::getUserMobile($params['mall_id'], $params['operator_target_user_id']); // 根据类型判断,设置sprintf(desc)所需的数据 switch ($params['behavior']) { case AgentBehaviorLogsEnum::BEHAVIOR_DELETE_AGENT: break; case AgentBehaviorLogsEnum::BEHAVIOR_MANUAL_UPGRADE: case AgentBehaviorLogsEnum::BEHAVIOR_MANUAL_DOWNGRADE: case AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE: case AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE: // 自动升级需要判断保存额外字段 if (in_array($params['behavior'], [AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE, AgentBehaviorLogsEnum::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']; } } // 查询等级名称 $levelNameKV = self::getLevelName($params['mall_id'], [$params['before_level'], $params['after_level']]); $params['before_level_name'] = $levelNameKV[$params['before_level']] ?? ''; $params['after_level_name'] = $levelNameKV[$params['after_level']] ?? ''; if (!empty($params['before_level'])) { $params['extra_info']['before_level'] = $params['before_level']; } if (!empty($params['after_level'])) { $params['extra_info']['after_level'] = $params['after_level']; } break; case AgentBehaviorLogsEnum::BEHAVIOR_ADD_AGENT: $params['level_name'] = self::getLevelName($params['mall_id'], [$params['level']])[$params['level']] ?? ''; break; case AgentBehaviorLogsEnum::BEHAVIOR_MODIFY_AGENT_PROVINCE: $regionKV = Region::lists(['where' => [['level' => 1]], 'select' => 'id,name']); $regionKV = array_column($regionKV, 'name', 'id'); $params['before_province_name'] = $regionKV[$params['before_province_id']] ?? ''; $params['after_province_name'] = $regionKV[$params['after_province_id']] ?? ''; if (!empty($params['before_province_id'])) { $params['extra_info']['before_province_id'] = $params['before_province_id']; } if (!empty($params['after_province_id'])) { $params['extra_info']['after_province_id'] = $params['after_province_id']; } 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'] ? AgentBehaviorLogsEnum::BEHAVIOR_MANUAL_UPGRADE : AgentBehaviorLogsEnum::BEHAVIOR_MANUAL_DOWNGRADE; } return $data['after_level'] > $data['before_level'] ? AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE : AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE; } /** * 获取行为描述 * * @param array $params * * @return string */ protected static function getBehaviorDesc(array $params): string { switch ($params['behavior']) { case AgentBehaviorLogsEnum::BEHAVIOR_MANUAL_UPGRADE: case AgentBehaviorLogsEnum::BEHAVIOR_MANUAL_DOWNGRADE: $str = '会员ID:%d,会员手机号:%s,由旧等级:【%s】 更改为:【%s】'; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile'), self::getValueOrReturnDefault($params, 'before_level_name'), self::getValueOrReturnDefault($params, 'after_level_name'), ]; break; case AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE: case AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE: $str = '会员ID:%d,会员手机号:%s,由【%s】等级%s级为【%s】等级,%s级方式:%s,订单ID:%d'; $upgradeOrDowngrade = [AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE => '升', AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_DOWNGRADE => '降']; $upgradeType = [ 'condition' => '条件升级', 'buyGoods' => '购买商品升级', ]; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile'), self::getValueOrReturnDefault($params, 'before_level_name'), $upgradeOrDowngrade[$params['behavior']], self::getValueOrReturnDefault($params, 'after_level_name'), $upgradeOrDowngrade[$params['behavior']], AgentBehaviorLogsEnum::BEHAVIOR_SYSTEM_UPGRADE == $params['behavior'] ? ($upgradeType[$params['extra_info']['upgrade_type']] ?? '') : '售后退单', self::getValueOrReturnDefault($params, 'order_id'), ]; break; case AgentBehaviorLogsEnum::BEHAVIOR_ADD_AGENT: $str = '会员ID:%d,会员手机号:%s,等级:【%s】'; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile'), self::getValueOrReturnDefault($params, 'level_name'), ]; break; case AgentBehaviorLogsEnum::BEHAVIOR_DELETE_AGENT: $str = '会员ID:%d,会员手机号:%s'; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile'), ]; break; case AgentBehaviorLogsEnum::BEHAVIOR_MODIFY_AGENT_PROVINCE: $str = '会员ID:%d,会员手机号:%s,由【%s】区域,更改为【%s】区域'; $args = [ self::getValueOrReturnDefault($params, 'user_id'), self::getValueOrReturnDefault($params, 'mobile'), self::getValueOrReturnDefault($params, 'before_province_name'), self::getValueOrReturnDefault($params, 'after_province_name'), ]; 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; } /** * @param int $mallId * @param array $level * * @return array */ protected static function getLevelName(int $mallId, array $level = []): array { $where = [['mall_id' => $mallId], ['=', 'status', StatusEnum::ENABLED]]; if (!empty($level)) { $where[] = ['level' => $level]; } $args['where'] = $where; $args['select'] = 'level,name'; $args['order'] = 'level asc'; $list = array_column(AgentLevel::lists($args, true), 'name', 'level'); if (!isset($list[0])) { $list[0] = '默认等级'; } return $list; } }