1、新增一个所有好友的流量池

2、旧版场景获客数据迁移
3、场景获客功能兼容旧版数据
This commit is contained in:
wong
2026-01-07 10:41:39 +08:00
parent 228d59402f
commit b2e84a2259
15 changed files with 516 additions and 57 deletions

View File

@@ -38,6 +38,41 @@ class TrafficController extends BaseController
$list = $package->page($page, $limit)->order('isSys ASC,id DESC')->select();
$total = $package->count();
// 添加"所有好友"特殊流量池ID为0
$allFriendsPackage = [
'id' => 0,
'name' => '所有好友',
'description' => '展示公司下所有设备的好友',
'pic' => '',
'type' => 1, // 系统类型
'createTime' => '',
'num' => 0, // 数量将在下面计算
];
// 计算所有好友数量
try {
$companyId = $this->getUserInfo('companyId');
$wechatIds = Db::name('device')->alias('d')
->join('(SELECT MAX(id) AS id, deviceId FROM ck_device_wechat_login WHERE companyId='.$companyId.' GROUP BY deviceId) dwl_max', 'dwl_max.deviceId = d.id')
->join('device_wechat_login dwl', 'dwl.id = dwl_max.id')
->where(['d.companyId' => $companyId, 'd.deleteTime' => 0])
->column('dwl.wechatId');
if (!empty($wechatIds)) {
$allFriendsCount = Db::table('s2_wechat_friend')
->where('ownerWechatId', 'in', $wechatIds)
->where('isDeleted', 0)
->count();
$allFriendsPackage['num'] = $allFriendsCount;
}
} catch (\Exception $e) {
// 如果查询失败保持num为0
}
// 将"所有好友"添加到列表最前面
array_unshift($list, $allFriendsPackage);
$total = $total + 1; // 总数加1
$rfmRule = 'default';
foreach ($list as $k => &$v) {
if ($v['type'] != 1) {
@@ -132,6 +167,11 @@ class TrafficController extends BaseController
return ResponseHelper::error('流量池ID不能为空');
}
// 禁止编辑"所有好友"特殊流量池
if ($packageId === '0' || $packageId === 0) {
return ResponseHelper::error('"所有好友"流量池不允许编辑');
}
if (empty($packageName)) {
return ResponseHelper::error('流量池名称不能为空');
}
@@ -194,6 +234,11 @@ class TrafficController extends BaseController
return ResponseHelper::error('流量池ID不能为空');
}
// 禁止删除"所有好友"特殊流量池
if ($packageId === '0' || $packageId === 0) {
return ResponseHelper::error('"所有好友"流量池不允许删除');
}
// 检查流量池是否存在且属于当前公司
$package = TrafficSourcePackage::where(['id' => $packageId, 'isDel' => 0])
->whereIn('companyId', [$companyId, 0])
@@ -243,6 +288,87 @@ class TrafficController extends BaseController
}
/**
* 获取流量池详情
* @return \think\response\Json
* @throws \Exception
*/
public function getPackageDetail()
{
$packageId = $this->request->param('packageId', '');
$companyId = $this->getUserInfo('companyId');
if (empty($packageId) && $packageId !== '0' && $packageId !== 0) {
return ResponseHelper::error('流量池ID不能为空');
}
// 特殊处理packageId为0时返回"所有好友"的详情
if ($packageId === '0' || $packageId === 0) {
$data = [
'id' => 0,
'name' => '所有好友',
'description' => '展示公司下所有设备的好友',
'pic' => '',
'type' => 1, // 系统类型
'isSys' => 1,
'createTime' => '',
'updateTime' => '',
'num' => 0,
];
// 计算所有好友数量
try {
$wechatIds = Db::name('device')->alias('d')
->join('(SELECT MAX(id) AS id, deviceId FROM ck_device_wechat_login WHERE companyId='.$companyId.' GROUP BY deviceId) dwl_max', 'dwl_max.deviceId = d.id')
->join('device_wechat_login dwl', 'dwl.id = dwl_max.id')
->where(['d.companyId' => $companyId, 'd.deleteTime' => 0])
->column('dwl.wechatId');
if (!empty($wechatIds)) {
$allFriendsCount = Db::table('s2_wechat_friend')
->where('ownerWechatId', 'in', $wechatIds)
->where('isDeleted', 0)
->count();
$data['num'] = $allFriendsCount;
}
} catch (\Exception $e) {
// 如果查询失败保持num为0
}
return ResponseHelper::success($data);
}
// 查询普通流量池详情
$package = TrafficSourcePackage::where(['id' => $packageId, 'isDel' => 0])
->whereIn('companyId', [$companyId, 0])
->find();
if (empty($package)) {
return ResponseHelper::error('流量池不存在或已删除');
}
// 统计流量池中的数量
$itemCount = TrafficSourcePackageItem::where([
'packageId' => $packageId,
'companyId' => $companyId,
'isDel' => 0
])->count();
$data = [
'id' => $package['id'],
'name' => $package['name'],
'description' => $package['description'] ?? '',
'pic' => $package['pic'] ?? '',
'type' => $package['isSys'] ?? 0,
'isSys' => $package['isSys'] ?? 0,
'createTime' => !empty($package['createTime']) ? formatRelativeTime($package['createTime']) : '',
'updateTime' => !empty($package['updateTime']) ? formatRelativeTime($package['updateTime']) : '',
'num' => $itemCount,
];
return ResponseHelper::success($data);
}
/**
* 流量池列表
* @return \think\response\Json
@@ -257,10 +383,15 @@ class TrafficController extends BaseController
$companyId = $this->getUserInfo('companyId');
$userId = $this->getUserInfo('id');
if (empty($packageId)) {
if (empty($packageId) && $packageId !== '0' && $packageId !== 0) {
return ResponseHelper::error('流量包id不能为空');
}
// 特殊处理packageId为0时查询所有好友
if ($packageId === '0' || $packageId === 0) {
return $this->getAllFriendsList($page, $limit, $keyword, $companyId);
}
$trafficSourcePackage = TrafficSourcePackage::where(['id' => $packageId, 'isDel' => 0])->whereIn('companyId', [$companyId, 0])->find();
if (empty($trafficSourcePackage)) {
return ResponseHelper::error('流量包不存在或已删除');
@@ -270,7 +401,7 @@ class TrafficController extends BaseController
['tspi.packageId', '=', $packageId],
];
if (empty($keyword)) {
if (!empty($keyword)) {
$where[] = ['wa.nickname|wa.phone|wa.alias|wa.wechatId|p.mobile|p.identifier', 'like', '%' . $keyword . '%'];
}
@@ -287,7 +418,7 @@ class TrafficController extends BaseController
$query->order('tspi.id DESC,p.id DESC')->group('p.identifier');
$list = $query->page($page, $limit)->select()->toArray();
$list = $query->page($page, $limit)->select();
$total = $query->count();
foreach ($list as $k => &$v) {
@@ -307,8 +438,8 @@ class TrafficController extends BaseController
$v['F'] = $scores['F'];
$v['M'] = $scores['M'];
$v['RFM'] = $scores['R'] + $scores['F'] + $scores['M'];
$v['money'] = 2222;
$v['msgCount'] = 2222;
$v['money'] = 3;
$v['msgCount'] = 3 ;
$v['tag'] = ['test', 'test2'];
}
unset($v);
@@ -318,4 +449,78 @@ class TrafficController extends BaseController
return ResponseHelper::success($data);
}
/**
* 获取所有好友列表(特殊流量池)
* @param int $page
* @param int $limit
* @param string $keyword
* @param int $companyId
* @return \think\response\Json
*/
private function getAllFriendsList($page, $limit, $keyword, $companyId)
{
try {
// 获取公司下所有设备的微信ID
$wechatIds = Db::name('device')->alias('d')
->join('(SELECT MAX(id) AS id, deviceId FROM ck_device_wechat_login WHERE companyId='.$companyId.' GROUP BY deviceId) dwl_max', 'dwl_max.deviceId = d.id')
->join('device_wechat_login dwl', 'dwl.id = dwl_max.id')
->where(['d.companyId' => $companyId, 'd.deleteTime' => 0])
->column('dwl.wechatId');
if (empty($wechatIds)) {
return ResponseHelper::success(['list' => [], 'total' => 0]);
}
// 构建查询条件
$where = [
['wf.ownerWechatId', 'in', $wechatIds],
['wf.isDeleted', '=', 0],
];
// 关键字搜索
if (!empty($keyword)) {
$where[] = ['wf.nickname|wf.alias|wf.wechatId|wf.conRemark', 'like', '%' . $keyword . '%'];
}
// 查询好友列表
$query = Db::table('s2_wechat_friend')->alias('wf')
->join(['s2_wechat_account' => 'wa'], 'wa.wechatId = wf.ownerWechatId', 'left')
->field([
'wf.id', 'wf.wechatId as identifier', 'wf.wechatId',
Db::raw($companyId . ' as companyId'), 'wf.nickname', 'wf.avatar', 'wf.gender', 'wf.phone', 'wf.alias'
])
->where($where);
$total = $query->count();
$list = $query->order('wf.id DESC')->page($page, $limit)->select();
foreach ($list as $k => &$v) {
// 获取好友所属的流量池包
$package = TrafficSourcePackageItem::alias('tspi')
->join('traffic_source_package p', 'tspi.packageId=p.id AND tspi.companyId=p.companyId')
->where(['tspi.identifier' => $v['identifier']])
->whereIn('tspi.companyId', [0, $companyId])
->column('p.name');
$v['packages'] = $package;
$v['phone'] = !empty($v['phone']) ? $v['phone'] : '';
// RFM评分示例数据实际应该从业务数据计算
$scores = RFMController::calcRfmScores(30, 30, 30);
$v['R'] = $scores['R'];
$v['F'] = $scores['F'];
$v['M'] = $scores['M'];
$v['RFM'] = $scores['R'] + $scores['F'] + $scores['M'];
$v['money'] = 2222;
$v['msgCount'] = 2222;
$v['tag'] = ['test', 'test2'];
}
unset($v);
$data = ['list' => $list, 'total' => $total];
return ResponseHelper::success($data);
} catch (\Exception $e) {
return ResponseHelper::error('获取好友列表失败:' . $e->getMessage());
}
}
}