Files
CKB-Interface/application/common/model/TrafficPoolBehavior.php
2026-02-04 11:02:33 +08:00

241 lines
7.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\model;
use think\Model;
/**
* 流量行为表模型类
* 表名ck_traffic_pool_behavior
* 用途:记录流量的各种行为(包括所有消息互动)
*/
class TrafficPoolBehavior extends Model
{
// 设置数据表名
protected $name = 'traffic_pool_behavior';
// 主键
protected $pk = 'id';
// 自动写入时间戳
protected $autoWriteTimestamp = 'createTime';
protected $createTime = 'createTime';
protected $updateTime = false;
// 行为类型常量
const BEHAVIOR_TYPE_SEND_MSG = 1; // 发送消息
const BEHAVIOR_TYPE_RECEIVE_MSG = 2; // 接收消息
const BEHAVIOR_TYPE_VIEW = 3; // 浏览
const BEHAVIOR_TYPE_CLICK = 4; // 点击
const BEHAVIOR_TYPE_CONSULT = 5; // 咨询
const BEHAVIOR_TYPE_ORDER = 6; // 下单
const BEHAVIOR_TYPE_PAY = 7; // 支付
const BEHAVIOR_TYPE_REFUND = 8; // 退款
const BEHAVIOR_TYPE_LIKE_MOMENTS = 9; // 点赞朋友圈
const BEHAVIOR_TYPE_COMMENT_MOMENTS = 10; // 评论朋友圈
// 行为类型名称映射
const BEHAVIOR_TYPE_NAMES = [
self::BEHAVIOR_TYPE_SEND_MSG => '发送消息',
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
];
}
}