'好友添加', 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(); } }