'发送消息', self::BEHAVIOR_TYPE_RECEIVE_MSG => '接收消息', self::BEHAVIOR_TYPE_VIEW => '浏览', self::BEHAVIOR_TYPE_CLICK => '点击', self::BEHAVIOR_TYPE_CONSULT => '咨询', self::BEHAVIOR_TYPE_ORDER => '下单', self::BEHAVIOR_TYPE_PAY => '支付', self::BEHAVIOR_TYPE_REFUND => '退款', self::BEHAVIOR_TYPE_LIKE_MOMENTS => '点赞朋友圈', self::BEHAVIOR_TYPE_COMMENT_MOMENTS => '评论朋友圈', ]; /** * 关联公司流量详情 */ public function poolCompany() { return $this->belongsTo(TrafficPoolCompany::class, 'poolCompanyId', 'id'); } /** * 获取额外信息 * @param string $value * @return array */ public function getExtraAttr($value) { return $value ? json_decode($value, true) : []; } /** * 设置额外信息 * @param array $value * @return string */ public function setExtraAttr($value) { return $value ? json_encode($value, JSON_UNESCAPED_UNICODE) : null; } /** * 获取行为类型名称 * @return string */ public function getBehaviorTypeNameAttr() { return self::BEHAVIOR_TYPE_NAMES[$this->behaviorType] ?? '未知行为'; } /** * 记录消息行为 * @param int $poolCompanyId * @param string $identifier * @param int $companyId * @param int $behaviorType 发送/接收 * @param int $messageId * @param int $wechatAccountId * @param array $extra * @return static */ public static function recordMessageBehavior(int $poolCompanyId, string $identifier, int $companyId, int $behaviorType, int $messageId = null, int $wechatAccountId = null, array $extra = []) { $behavior = self::create([ 'poolCompanyId' => $poolCompanyId, 'identifier' => $identifier, 'companyId' => $companyId, 'behaviorType' => $behaviorType, 'behaviorName' => self::BEHAVIOR_TYPE_NAMES[$behaviorType] ?? '消息', 'messageId' => $messageId, 'wechatAccountId' => $wechatAccountId, 'extra' => $extra, 'behaviorTime' => time(), 'createTime' => time(), ]); // 更新流量统计 $poolCompany = TrafficPoolCompany::find($poolCompanyId); if ($poolCompany) { $poolCompany->incrementMsgCount(1); } return $behavior; } /** * 记录订单行为 * @param int $poolCompanyId * @param string $identifier * @param int $companyId * @param int $behaviorType * @param string $orderId * @param float $amount * @param array $extra * @return static */ public static function recordOrderBehavior(int $poolCompanyId, string $identifier, int $companyId, int $behaviorType, string $orderId, float $amount = 0, array $extra = []) { $behavior = self::create([ 'poolCompanyId' => $poolCompanyId, 'identifier' => $identifier, 'companyId' => $companyId, 'behaviorType' => $behaviorType, 'behaviorName' => self::BEHAVIOR_TYPE_NAMES[$behaviorType] ?? '订单', 'orderId' => $orderId, 'amount' => $amount, 'extra' => $extra, 'behaviorTime' => time(), 'createTime' => time(), ]); // 如果是支付行为,更新订单统计 if ($behaviorType === self::BEHAVIOR_TYPE_PAY) { $poolCompany = TrafficPoolCompany::find($poolCompanyId); if ($poolCompany) { $poolCompany->incrementOrderStats($amount); } } return $behavior; } /** * 记录朋友圈互动行为 * @param int $poolCompanyId * @param string $identifier * @param int $companyId * @param int $behaviorType 点赞/评论 * @param int $momentsId * @param array $extra * @return static */ public static function recordMomentsBehavior(int $poolCompanyId, string $identifier, int $companyId, int $behaviorType, int $momentsId, array $extra = []) { return self::create([ 'poolCompanyId' => $poolCompanyId, 'identifier' => $identifier, 'companyId' => $companyId, 'behaviorType' => $behaviorType, 'behaviorName' => self::BEHAVIOR_TYPE_NAMES[$behaviorType] ?? '朋友圈互动', 'momentsId' => $momentsId, 'extra' => $extra, 'behaviorTime' => time(), 'createTime' => time(), ]); } /** * 获取用户行为轨迹 * @param int $poolCompanyId * @param int $limit * @return \think\Collection */ public static function getUserJourney(int $poolCompanyId, int $limit = 50) { return self::where('poolCompanyId', $poolCompanyId) ->order('behaviorTime DESC') ->limit($limit) ->select(); } /** * 分页获取用户行为轨迹 * @param int $poolCompanyId * @param int $page 页码 * @param int $pageSize 每页数量 * @param string $keyword 搜索关键词(搜索行为名称) * @param int $behaviorType 行为类型筛选 * @return array ['list' => [], 'total' => 0, 'page' => 1, 'pageSize' => 10] */ public static function getUserJourneyPaginated(int $poolCompanyId, int $page = 1, int $pageSize = 20, string $keyword = '', int $behaviorType = 0): array { $query = self::where('poolCompanyId', $poolCompanyId); // 关键词搜索 if (!empty($keyword)) { $query->where('behaviorName', 'like', '%' . $keyword . '%'); } // 行为类型筛选 if ($behaviorType > 0) { $query->where('behaviorType', $behaviorType); } // 统计总数 $total = $query->count(); // 分页查询 $behaviors = $query->order('behaviorTime DESC') ->page($page, $pageSize) ->select() ->toArray(); return [ 'list' => $behaviors, 'total' => $total, 'page' => $page, 'pageSize' => $pageSize ]; } }