add task server
This commit is contained in:
83
Server/application/common/TaskServer.php
Normal file
83
Server/application/common/TaskServer.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
namespace app\common;
|
||||
|
||||
use think\Db;
|
||||
use think\facade\Log;
|
||||
use Workerman\Lib\Timer;
|
||||
use think\worker\Server;
|
||||
|
||||
class TaskServer extends Server
|
||||
{
|
||||
|
||||
const PROCESS_COUNT = 4;
|
||||
|
||||
protected $socket = 'text://0.0.0.0:2980';
|
||||
|
||||
protected $option = [
|
||||
'count' => self::PROCESS_COUNT,
|
||||
'name' => 'ckb_task_server'
|
||||
];
|
||||
|
||||
/**
|
||||
* 当客户端的连接上发生错误时触发
|
||||
* @param $connection
|
||||
* @param $code
|
||||
* @param $msg
|
||||
*/
|
||||
public function onError($connection, $code, $msg)
|
||||
{
|
||||
Log::record("error $code $msg");
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function onMessage($connection, $data) {}
|
||||
|
||||
public function onClose($connection) {}
|
||||
|
||||
public function onConnect($connection) {}
|
||||
|
||||
public function onWorkerStart($worker)
|
||||
{
|
||||
|
||||
$current_worker_id = $worker->id;
|
||||
|
||||
// echo "current_worker_id: $current_worker_id\n";
|
||||
|
||||
$process_count_for_status_0 = self::PROCESS_COUNT - 1;
|
||||
|
||||
|
||||
// todo 临时测试,回头封装到类里调用,每个任务一个类
|
||||
Timer::add(5, function () use ($current_worker_id, $process_count_for_status_0) {
|
||||
if ($current_worker_id == self::PROCESS_COUNT - 1) {
|
||||
// TODO 专门检查添加后的情况,是否通过
|
||||
|
||||
$tasks = Db::name('task_customer')
|
||||
->where('status', 1)
|
||||
->limit(100)
|
||||
->select();
|
||||
if ($tasks) {
|
||||
// TODO 检查是否添加成功,是否需要再次发送,然后,更新状态为2或3 ...
|
||||
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
// 其他任务 -- 现在只用于处理场景获客的后置操作(处理 status = 0 的数据);可添加其他任务进来~
|
||||
$tasks = Db::name('task_customer')
|
||||
->where('status', 0)
|
||||
->whereRaw("id % $process_count_for_status_0 = {$current_worker_id}")
|
||||
->limit(100)
|
||||
->select();
|
||||
if ($tasks) {
|
||||
// ... 更新状态为1,然后处理,再更新为2或3 ...
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -62,7 +62,7 @@ class PostCreateAddFriendPlanV1Controller extends Controller
|
||||
return ResponseHelper::error('标签设置格式不正确', 400);
|
||||
}
|
||||
|
||||
// 插入数据库
|
||||
// 插入数据库 customer_acquisition_task
|
||||
$result = Db::name('friend_plan')->insert($data);
|
||||
|
||||
if ($result) {
|
||||
@@ -74,4 +74,20 @@ class PostCreateAddFriendPlanV1Controller extends Controller
|
||||
return ResponseHelper::error('系统错误: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证JSON格式是否正确
|
||||
*
|
||||
* @param string $string
|
||||
* @return bool
|
||||
*/
|
||||
private function validateJson($string)
|
||||
{
|
||||
if (empty($string)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
json_decode($string);
|
||||
return (json_last_error() == JSON_ERROR_NONE);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace app\cunkebao\controller\plan;
|
||||
|
||||
use think\Controller;
|
||||
use think\Request;
|
||||
use EasyWeChat\Factory;
|
||||
// use EasyWeChat\Kernel\Exceptions\DecryptException;
|
||||
use EasyWeChat\Kernel\Http\StreamResponse;
|
||||
use think\Db;
|
||||
class PosterWeChatMiniProgram extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return 'Hello, World!';
|
||||
}
|
||||
|
||||
const MINI_PROGRAM_CONFIG = [
|
||||
'app_id' => 'wx12345678',
|
||||
'secret' => 'your-app-secret',
|
||||
|
||||
'response_type' => 'array'
|
||||
];
|
||||
|
||||
|
||||
// 生成小程序码,存客宝-操盘手调用
|
||||
public function generateMiniProgramCodeWithScene() {
|
||||
|
||||
$taskId = request()->param('id');
|
||||
|
||||
$app = Factory::miniProgram(self::MINI_PROGRAM_CONFIG);
|
||||
|
||||
// scene参数长度限制为32位
|
||||
// $scene = 'taskId=' . $taskId;
|
||||
$scene = 'id=' . $taskId;
|
||||
|
||||
// 调用接口生成小程序码
|
||||
$response = $app->app_code->getUnlimit($scene, [
|
||||
'page' => 'pages/poster/index', // 必须是已经发布的小程序页面
|
||||
'width' => 430, // 二维码的宽度,默认430
|
||||
// 'auto_color' => false, // 自动配置线条颜色
|
||||
// 'line_color' => ['r' => 0, 'g' => 0, 'b' => 0], // 颜色设置
|
||||
// 'is_hyaline' => false, // 是否需要透明底色
|
||||
]);
|
||||
|
||||
// 保存小程序码到文件
|
||||
if ($response instanceof StreamResponse) {
|
||||
// $filename = 'minicode_' . $taskId . '.png';
|
||||
// $response->saveAs('path/to/codes', $filename);
|
||||
// return 'path/to/codes/' . $filename;
|
||||
|
||||
$img = $response->getBody()->getContents();//获取图片二进制流
|
||||
$img_base64 = 'data:image/png;base64,' .base64_encode($img);//转化base64
|
||||
return $img_base64;
|
||||
}
|
||||
|
||||
// return false;
|
||||
return null;
|
||||
}
|
||||
|
||||
// getPhoneNumber
|
||||
public function getPhoneNumber() {
|
||||
|
||||
$taskId = request()->param('id');
|
||||
$code = request()->param('code');
|
||||
// code 不能为空
|
||||
if (!$code) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'message' => 'code不能为空'
|
||||
]);
|
||||
}
|
||||
|
||||
$task = Db::name('customer_acquisition_task')->where('id', $taskId)->find();
|
||||
if (!$task) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'message' => '任务不存在'
|
||||
]);
|
||||
}
|
||||
|
||||
$app = Factory::miniProgram(self::MINI_PROGRAM_CONFIG);
|
||||
|
||||
$result = $app->phone_number->getUserPhoneNumber($code);
|
||||
|
||||
if ($result['errcode'] == 0 && isset($result['phone_info']['phoneNumber'])) {
|
||||
|
||||
// TODO 拿到手机号之后的后续操作:
|
||||
// 1. 先写入 ck_traffic_pool 表 identifier mobile 都是 用 phone字段的值
|
||||
$trafficPool = Db::name('traffic_pool')->where('identifier', $result['phone_info']['phoneNumber'])->find();
|
||||
if (!$trafficPool) {
|
||||
Db::name('traffic_pool')->insert([
|
||||
'identifier' => $result['phone_info']['phoneNumber'],
|
||||
'mobile' => $result['phone_info']['phoneNumber']
|
||||
]);
|
||||
}
|
||||
// 2. 写入 ck_task_customer: 以 task_id ~~identifier~~ phone 为条件,如果存在则忽略,使用类似laravel的firstOrcreate(但我不知道thinkphp5.1里的写法)
|
||||
// $taskCustomer = Db::name('task_customer')->where('task_id', $taskId)->where('identifier', $result['phone_info']['phoneNumber'])->find();
|
||||
$taskCustomer = Db::name('task_customer')->where('task_id', $taskId)->where('phone', $result['phone_info']['phoneNumber'])->find();
|
||||
if (!$taskCustomer) {
|
||||
Db::name('task_customer')->insert([
|
||||
'task_id' => $taskId,
|
||||
// 'identifier' => $result['phone_info']['phoneNumber'],
|
||||
'phone' => $result['phone_info']['phoneNumber']
|
||||
]);
|
||||
}
|
||||
// return $result['phone_info']['phoneNumber'];
|
||||
return json([
|
||||
'code' => 0,
|
||||
'message' => '获取手机号成功',
|
||||
'data' => $result['phone_info']['phoneNumber']
|
||||
]);
|
||||
} else {
|
||||
// return null;
|
||||
return json([
|
||||
'code' => 400,
|
||||
'message' => '获取手机号失败: ' . $result['errmsg'] ?? '未知错误'
|
||||
]);
|
||||
}
|
||||
|
||||
// return $result;
|
||||
|
||||
}
|
||||
|
||||
// todo 获取海报获客任务的任务/海报数据 -- 表还没设计好,不急 ck_customer_acquisition_task
|
||||
public function getPosterTaskData() {
|
||||
$id = request()->param('id');
|
||||
$task = Db::name('customer_acquisition_task')->where('id', $id)->find();
|
||||
// todo 只需 返回 poster_url success_tip
|
||||
return json([
|
||||
'code' => 0,
|
||||
'message' => '获取海报获客任务数据成功',
|
||||
'data' => $task
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -27,7 +27,8 @@
|
||||
"topthink/think-queue": "2.0.*",
|
||||
"textalk/websocket": "^1.5",
|
||||
"guzzlehttp/guzzle": "^7.9",
|
||||
"eison/utils": "^1.2"
|
||||
"eison/utils": "^1.2",
|
||||
"overtrue/wechat": "~5.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
@@ -40,7 +41,8 @@
|
||||
"config": {
|
||||
"preferred-install": "dist",
|
||||
"allow-plugins": {
|
||||
"topthink/think-installer": true
|
||||
"topthink/think-installer": true,
|
||||
"easywechat-composer/easywechat-composer": true
|
||||
}
|
||||
},
|
||||
"require-dev": {
|
||||
|
||||
1389
Server/composer.lock
generated
1389
Server/composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,7 @@ return [
|
||||
'port' => 2345, // 监听端口
|
||||
'socket' => '', // 完整监听地址
|
||||
'context' => [], // socket 上下文选项
|
||||
'worker_class' => '', // 自定义Workerman服务类名 支持数组定义多个服务
|
||||
'worker_class' => 'app\common\TaskServer', // 自定义Workerman服务类名 支持数组定义多个服务
|
||||
|
||||
// 支持workerman的所有配置参数
|
||||
'name' => 'thinkphp',
|
||||
|
||||
Reference in New Issue
Block a user