Files
cunkebao_v3/Server/application/cunkebao/controller/plan/PostUpdateAddFriendPlanV1Controller.php

287 lines
13 KiB
PHP
Raw Normal View History

2025-06-17 15:56:02 +08:00
<?php
namespace app\cunkebao\controller\plan;
2025-08-12 15:02:00 +08:00
use app\cunkebao\controller\BaseController;
2025-06-17 15:56:02 +08:00
use library\ResponseHelper;
use think\Controller;
use think\Db;
/**
* 更新获客计划控制器
*/
2025-08-13 17:02:36 +08:00
class PostUpdateAddFriendPlanV1Controller extends BaseController
2025-06-17 15:56:02 +08:00
{
/**
* 更新计划任务
*
* @return \think\response\Json
*/
public function index()
{
try {
$params = $this->request->param();
2025-08-12 09:28:57 +08:00
2025-06-17 15:56:02 +08:00
// 验证必填字段
if (empty($params['planId'])) {
return ResponseHelper::error('计划ID不能为空', 400);
}
2025-08-12 09:28:57 +08:00
2025-06-17 15:56:02 +08:00
if (empty($params['name'])) {
return ResponseHelper::error('计划名称不能为空', 400);
}
2025-08-12 09:28:57 +08:00
2025-06-17 15:56:02 +08:00
if (empty($params['sceneId'])) {
return ResponseHelper::error('场景ID不能为空', 400);
}
2025-08-12 09:28:57 +08:00
if (empty($params['deveiceGroups'])) {
2025-06-17 15:56:02 +08:00
return ResponseHelper::error('请选择设备', 400);
}
// 检查计划是否存在
$plan = Db::name('customer_acquisition_task')
->where('id', $params['planId'])
->find();
if (!$plan) {
return ResponseHelper::error('计划不存在', 404);
}
// 归类参数
$msgConf = isset($params['messagePlans']) ? $params['messagePlans'] : [];
$tagConf = [
'scenarioTags' => $params['scenarioTags'] ?? [],
2025-08-12 09:28:57 +08:00
'customTags' => $params['customTags'] ?? [],
2025-06-17 15:56:02 +08:00
];
$reqConf = [
2025-08-12 09:28:57 +08:00
'device' => $params['deveiceGroups'] ?? [],
'remarkType' => $params['remarkType'] ?? '',
'greeting' => $params['greeting'] ?? '',
2025-06-17 15:56:02 +08:00
'addFriendInterval' => $params['addFriendInterval'] ?? '',
2025-08-12 09:28:57 +08:00
'startTime' => $params['startTime'] ?? '',
'endTime' => $params['endTime'] ?? '',
2025-06-17 15:56:02 +08:00
];
2025-08-12 09:28:57 +08:00
2025-06-17 15:56:02 +08:00
// 其余参数归为sceneConf
$sceneConf = $params;
unset(
2025-07-07 14:54:01 +08:00
$sceneConf['id'],
$sceneConf['apiKey'],
$sceneConf['userId'],
$sceneConf['status'],
2025-06-17 15:56:02 +08:00
$sceneConf['planId'],
$sceneConf['name'],
$sceneConf['sceneId'],
$sceneConf['messagePlans'],
$sceneConf['scenarioTags'],
$sceneConf['customTags'],
2025-08-12 09:28:57 +08:00
$sceneConf['deveiceGroups'],
2025-07-07 14:54:01 +08:00
$sceneConf['orderTableFileName'],
$sceneConf['userInfo'],
$sceneConf['textUrl'],
2025-06-17 15:56:02 +08:00
$sceneConf['remarkType'],
$sceneConf['greeting'],
$sceneConf['addFriendInterval'],
$sceneConf['startTime'],
2025-07-07 14:54:01 +08:00
$sceneConf['orderTableFile'],
2025-06-17 15:56:02 +08:00
$sceneConf['endTime']
);
// 构建更新数据
$data = [
2025-08-12 09:28:57 +08:00
'name' => $params['name'],
'sceneId' => $params['sceneId'],
2025-06-17 15:56:02 +08:00
'sceneConf' => json_encode($sceneConf, JSON_UNESCAPED_UNICODE),
2025-08-12 09:28:57 +08:00
'reqConf' => json_encode($reqConf, JSON_UNESCAPED_UNICODE),
'msgConf' => json_encode($msgConf, JSON_UNESCAPED_UNICODE),
'tagConf' => json_encode($tagConf, JSON_UNESCAPED_UNICODE),
2025-08-13 17:02:36 +08:00
'status' => !empty($params['status']) ? 1 : 0,
2025-08-12 09:28:57 +08:00
'updateTime' => time(),
2025-06-17 15:56:02 +08:00
];
2025-07-07 14:54:01 +08:00
2025-06-17 15:56:02 +08:00
try {
// 更新数据
$result = Db::name('customer_acquisition_task')
->where('id', $params['planId'])
->update($data);
2025-08-12 09:28:57 +08:00
2025-06-17 15:56:02 +08:00
if ($result === false) {
throw new \Exception('更新计划失败');
}
2025-08-12 09:28:57 +08:00
//订单
if ($params['sceneId'] == 2) {
if (!empty($params['orderTableFile'])) {
// 先下载到本地临时文件,再分析,最后删除
$originPath = $params['orderTableFile'];
$tmpFile = tempnam(sys_get_temp_dir(), 'order_');
// 判断是否为远程文件
if (preg_match('/^https?:\/\//i', $originPath)) {
// 远程URL下载到本地
$fileContent = file_get_contents($originPath);
if ($fileContent === false) {
exit('远程文件下载失败: ' . $originPath);
}
file_put_contents($tmpFile, $fileContent);
} else {
// 本地文件直接copy
if (!file_exists($originPath)) {
exit('文件不存在: ' . $originPath);
}
copy($originPath, $tmpFile);
}
// 解析临时文件
$ext = strtolower(pathinfo($originPath, PATHINFO_EXTENSION));
$rows = [];
if (in_array($ext, ['xls', 'xlsx'])) {
// 直接用composer自动加载的PHPExcel
$excel = \PHPExcel_IOFactory::load($tmpFile);
$sheet = $excel->getActiveSheet();
$data = $sheet->toArray();
if (count($data) > 1) {
array_shift($data); // 去掉表头
}
foreach ($data as $cols) {
$rows[] = [
'name' => isset($cols[0]) ? trim($cols[0]) : '',
'phone' => isset($cols[1]) ? trim($cols[1]) : '',
2025-08-13 17:02:36 +08:00
'wechatId' => isset($cols[2]) ? trim($cols[2]) : '',
2025-08-12 09:28:57 +08:00
'source' => isset($cols[3]) ? trim($cols[3]) : '',
'orderAmount' => isset($cols[4]) ? trim($cols[4]) : '',
'orderDate' => isset($cols[5]) ? trim($cols[5]) : '',
];
}
} elseif ($ext === 'csv') {
$content = file_get_contents($tmpFile);
$lines = preg_split('/\r\n|\r|\n/', $content);
if (count($lines) > 1) {
array_shift($lines); // 去掉表头
foreach ($lines as $line) {
if (trim($line) === '') continue;
$cols = str_getcsv($line);
if (count($cols) >= 6) {
$rows[] = [
'name' => isset($cols[0]) ? trim($cols[0]) : '',
'phone' => isset($cols[1]) ? trim($cols[1]) : '',
2025-08-13 17:02:36 +08:00
'wechatId' => isset($cols[2]) ? trim($cols[2]) : '',
2025-08-12 09:28:57 +08:00
'source' => isset($cols[3]) ? trim($cols[3]) : '',
'orderAmount' => isset($cols[4]) ? trim($cols[4]) : '',
'orderDate' => isset($cols[5]) ? trim($cols[5]) : '',
];
}
2025-07-03 18:14:53 +08:00
}
}
2025-08-12 09:28:57 +08:00
} else {
unlink($tmpFile);
exit('暂不支持的文件类型: ' . $ext);
}
// 删除临时文件
unlink($tmpFile);
2025-08-13 17:02:36 +08:00
}
}
2025-08-12 09:28:57 +08:00
2025-08-13 17:02:36 +08:00
//电话获客
if ($params['sceneId'] == 5) {
$rows = Db::name('call_recording')
->where('companyId', $this->getUserInfo('companyId'))
->group('phone')
->field('id,phone')
->select();
2025-08-12 09:28:57 +08:00
}
//群获客
if ($params['sceneId'] == 7) {
2025-08-12 15:02:00 +08:00
if (!empty($params['wechatGroups']) && is_array($params['wechatGroups'])) {
2025-08-12 09:28:57 +08:00
$rows = Db::name('wechat_group_member')->alias('gm')
->join('wechat_account wa', 'gm.identifier = wa.wechatId')
->where('gm.companyId', $this->getUserInfo('companyId'))
2025-08-12 15:02:00 +08:00
->whereIn('gm.groupId', $params['wechatGroups'])
2025-08-12 09:28:57 +08:00
->group('gm.identifier')
->column('wa.id,wa.wechatId,wa.alias,wa.phone');
2025-08-13 17:02:36 +08:00
}
}
2025-08-12 09:28:57 +08:00
2025-08-13 17:02:36 +08:00
if (in_array($params['sceneId'], [2, 5, 7]) && !empty($rows) && is_array($rows)) {
// 1000条为一组进行批量处理
$batchSize = 1000;
$totalRows = count($rows);
for ($i = 0; $i < $totalRows; $i += $batchSize) {
$batchRows = array_slice($rows, $i, $batchSize);
if (!empty($batchRows)) {
// 1. 提取当前批次的phone
// 1. 提取当前批次的phone
$phones = [];
foreach ($batchRows as $row) {
if (!empty($row['phone'])) {
$phone = $row['phone'];
} elseif (!empty($row['alias'])) {
$phone = $row['alias'];
} else {
$phone = $row['wechatId'];
2025-08-12 09:28:57 +08:00
}
2025-08-13 17:02:36 +08:00
if (!empty($phone)) {
$phones[] = $phone;
2025-08-12 09:28:57 +08:00
}
2025-08-13 17:02:36 +08:00
}
// 2. 批量查询已存在的phone
$existingPhones = [];
if (!empty($phones)) {
$existing = Db::name('task_customer')
->where('task_id', $params['planId'])
->where('phone', 'in', $phones)
->field('phone')
->select();
$existingPhones = array_column($existing, 'phone');
}
2025-08-12 09:28:57 +08:00
2025-08-13 17:02:36 +08:00
// 3. 过滤出新数据,批量插入
$newData = [];
foreach ($batchRows as $row) {
if (!empty($row['phone'])) {
$phone = $row['phone'];
} elseif (!empty($row['alias'])) {
$phone = $row['alias'];
} else {
$phone = $row['wechatId'];
2025-07-03 18:14:53 +08:00
}
2025-08-13 17:02:36 +08:00
if (!empty($phone) && !in_array($phone, $existingPhones)) {
$newData[] = [
'task_id' => $params['planId'],
'name' => !empty($row['name']) ? $row['name'] : '',
'source' => '场景获客_' . $params['name'] ?? '',
'phone' => $phone,
'tags' => json_encode([], JSON_UNESCAPED_UNICODE),
'siteTags' => json_encode([], JSON_UNESCAPED_UNICODE),
'createTime' => time(),
];
2025-08-12 09:28:57 +08:00
}
2025-07-03 18:14:53 +08:00
}
2025-08-13 17:02:36 +08:00
// 4. 批量插入新数据
if (!empty($newData)) {
Db::name('task_customer')->insertAll($newData);
}
2025-07-03 18:14:53 +08:00
}
}
2025-08-12 09:28:57 +08:00
}
2025-07-03 18:14:53 +08:00
2025-08-13 17:02:36 +08:00
2025-06-17 15:56:02 +08:00
return ResponseHelper::success(['planId' => $params['planId']], '更新计划任务成功');
2025-08-12 09:28:57 +08:00
2025-06-17 15:56:02 +08:00
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
throw $e;
}
2025-08-12 09:28:57 +08:00
2025-06-17 15:56:02 +08:00
} catch (\Exception $e) {
return ResponseHelper::error('系统错误: ' . $e->getMessage(), 500);
}
}
}