| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- <?php
- namespace addons\Agent\common\services;
- use addons\Agent\common\enums\AgentBehaviorLogsEnum;
- use addons\Agent\common\event\AgentBehaviorLogsEvent;
- use addons\Agent\common\models\AgentBehaviorLogs;
- use addons\Agent\common\models\AgentLevel;
- use common\enums\RabbitMqEnum;
- use common\enums\StatusEnum;
- use common\helpers\ArrayHelper;
- use common\helpers\FormatHelper;
- use common\models\common\Region;
- use common\models\user\User;
- use Exception;
- use InvalidArgumentException;
- use Yii;
- class AgentBehaviorLogsService
- {
- /**
- * 处理用户行为事件
- *
- * @param array $data
- *
- * @return void
- */
- public static function handleSync(array $data)
- {
- self::getInsertDataByParams($data);
- AgentBehaviorLogs::setData($data);
- }
- /**
- * 触发行为记录事件
- *
- * @param int $mallId
- * @param array $data
- *
- * @return void
- */
- public static function dispatchUserBehaviorLogsEvent(int $mallId, array $data)
- {
- if (empty($mallId) && empty($data['mall_id'])) {
- $data['method'] = __METHOD__;
- Yii::$app->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;
- }
- }
|