136 lines
3.8 KiB
PHP
136 lines
3.8 KiB
PHP
<?php
|
||
|
||
namespace app\common\model;
|
||
|
||
use think\Model;
|
||
|
||
/**
|
||
* 流量来源表模型类
|
||
* 表名:ck_traffic_pool_source
|
||
* 用途:记录流量的获取渠道和来源路径
|
||
*/
|
||
class TrafficPoolSource extends Model
|
||
{
|
||
// 设置数据表名
|
||
protected $name = 'traffic_pool_source';
|
||
|
||
// 主键
|
||
protected $pk = 'id';
|
||
|
||
// 自动写入时间戳
|
||
protected $autoWriteTimestamp = true;
|
||
protected $createTime = 'createTime';
|
||
protected $updateTime = 'updateTime';
|
||
|
||
// 来源类型常量
|
||
const SOURCE_TYPE_FRIEND_ADD = 1; // 好友添加
|
||
const SOURCE_TYPE_GROUP_MEMBER = 2; // 群成员
|
||
const SOURCE_TYPE_POSTER = 3; // 海报获客
|
||
const SOURCE_TYPE_PHONE = 4; // 电话获客
|
||
const SOURCE_TYPE_ORDER = 5; // 订单获客
|
||
const SOURCE_TYPE_API = 6; // API导入
|
||
const SOURCE_TYPE_MANUAL = 7; // 手动导入
|
||
const SOURCE_TYPE_FISSION = 8; // 裂变活动
|
||
|
||
// 来源类型名称映射
|
||
const SOURCE_TYPE_NAMES = [
|
||
self::SOURCE_TYPE_FRIEND_ADD => '好友添加',
|
||
self::SOURCE_TYPE_GROUP_MEMBER => '群成员',
|
||
self::SOURCE_TYPE_POSTER => '海报获客',
|
||
self::SOURCE_TYPE_PHONE => '电话获客',
|
||
self::SOURCE_TYPE_ORDER => '订单获客',
|
||
self::SOURCE_TYPE_API => 'API导入',
|
||
self::SOURCE_TYPE_MANUAL => '手动导入',
|
||
self::SOURCE_TYPE_FISSION => '裂变活动',
|
||
];
|
||
|
||
/**
|
||
* 关联公司流量详情
|
||
*/
|
||
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 getSourceTypeNameAttr()
|
||
{
|
||
return self::SOURCE_TYPE_NAMES[$this->sourceType] ?? '未知来源';
|
||
}
|
||
|
||
/**
|
||
* 创建来源记录
|
||
* @param int $poolCompanyId
|
||
* @param string $identifier
|
||
* @param int $companyId
|
||
* @param int $sourceType
|
||
* @param array $data
|
||
* @return static
|
||
*/
|
||
public static function createSource(int $poolCompanyId, string $identifier, int $companyId, int $sourceType, array $data = [])
|
||
{
|
||
// 检查是否为首次来源
|
||
$existSource = self::where('poolCompanyId', $poolCompanyId)->find();
|
||
$isFirstSource = $existSource ? 0 : 1;
|
||
|
||
$insertData = array_merge([
|
||
'poolCompanyId' => $poolCompanyId,
|
||
'identifier' => $identifier,
|
||
'companyId' => $companyId,
|
||
'sourceType' => $sourceType,
|
||
'isFirstSource' => $isFirstSource,
|
||
'createTime' => time(),
|
||
], $data);
|
||
|
||
$source = self::create($insertData);
|
||
|
||
// 如果是首次来源,更新公司流量详情表
|
||
if ($isFirstSource) {
|
||
TrafficPoolCompany::where('id', $poolCompanyId)->update([
|
||
'firstSourceType' => $sourceType,
|
||
'firstSourceTime' => time(),
|
||
'updateTime' => time()
|
||
]);
|
||
}
|
||
|
||
return $source;
|
||
}
|
||
|
||
/**
|
||
* 获取流量的所有来源
|
||
* @param int $poolCompanyId
|
||
* @return \think\Collection
|
||
*/
|
||
public static function getSourcesByPoolCompany(int $poolCompanyId)
|
||
{
|
||
return self::where('poolCompanyId', $poolCompanyId)
|
||
->order('createTime DESC')
|
||
->select();
|
||
}
|
||
}
|
||
|
||
|