You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
5.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* 使用定时器将符合条件的团队成员移出团队
*
* @author guogaobo
* @since 2021-05-20
*/
namespace app\common\command;
use think\Config;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\Db;
use think\response\Json;
use Workerman\Lib\Timer;
use Workerman\Worker;
class Team extends Command
{
protected $timer;
protected $interval = 10;
protected function configure()
{
$this->setName('team')
->addArgument('status', Argument::REQUIRED, 'start/stop/reload/status/connections')
->addOption('d', null, Option::VALUE_NONE, 'daemon守护进程方式启动')
->setDescription('团队成员移出定时器');
// 读取数据库配置文件
$filename = ROOT_PATH . 'config' . DS . 'database.php';
// 重新加载数据库配置文件
Config::load($filename, 'database');
}
/**
* 初始化
*
* @param Input $input
* @param Output $output
*/
protected function init(Input $input, Output $output)
{
global $argv;
$argv[1] = $input->getArgument('status') ?: 'start';
if ($input->hasOption('d')) {
$argv[2] = '-d';
} else {
unset($argv[2]);
}
}
/**
* 停止定时器
*/
public function stop()
{
Timer::del($this->timer);
}
/**
* 启动定时器
*/
public function start()
{
$this->timer = Timer::add(1, function () {
# 只在凌晨12点至6点间执行
if ((int)date('H') >= 0 && (int)date('H') < 6) {
# 团队成员过滤规则
db('crm_team')->where('target_time',0)->delete();
$ruleList = db('crm_team')
->where('target_time', '<', time())->select();
if (!empty($ruleList)) {
Db::startTrans();
try {
foreach ($ruleList as $v) {
switch ($v['types']) {
case 1 :
$data_name = 'customer_id';
$types = 'crm_customer';
$typesName = '客户';
break;
case 2 :
$data_name = 'contacts_id';
$types = 'crm_contacts';
$typesName = '联系人';
break;
case 3 :
$data_name = 'business_id';
$types = 'crm_business';
$typesName = '商机';
break;
case 4 :
$data_name = 'contract_id';
$types = 'crm_contract';
$typesName = '合同';
break;
case 5 :
$data_name = 'receivables_id';
$types = 'crm_receivables';
$typesName = '回款';
break;
}
$resData = db($types)->where([$data_name => $v['target_id']])->field('name,rw_user_id,ro_user_id')->find();
if ($v['types'] == 5) {
$resData = db($types)->where([$data_name => $v['target_id']])->field('number as name,rw_user_id,ro_user_id')->find();
}
$team_user_id = array_column($ruleList, 'team_user_id');
$old_rw_user_id = !empty($resData['rw_user_id']) ? explode(',', trim($resData['rw_user_id'], ',')) : []; //去重
//只读
$old_ro_user_id = !empty($resData['ro_user_id']) ? explode(',', trim($resData['ro_user_id'], ',')) : []; //去重
if ($v['auth'] == 1) {
$all_rw_user_id = $team_user_id ? array_diff($old_ro_user_id, $team_user_id) : ''; // 差集
$data['ro_user_id'] = $all_rw_user_id ? ',' . implode(',', $all_rw_user_id) . ',' : ''; //去空
} else {
$all_ro_user_id = $team_user_id ? array_diff($old_rw_user_id, $team_user_id) : ''; // 差集
$data['rw_user_id'] = $all_ro_user_id ? ',' . implode(',', $all_ro_user_id) . ',' : ''; //去空 ;
}
$upData = db($types)->where([$data_name => $v['target_id']])->update($data);
db('crm_team')->where(['target_id' => $v['target_id'], 'types' => $v['types'], 'team_user_id' => ['in', arrayToString($team_user_id)]])->delete();
}
Db::commit();
} catch (\Exception $e) {
Db::rollback();
}
}
}
});
}
protected function execute(Input $input, Output $output)
{
# 动态修改运行时参数
set_time_limit(0);
ini_set('memory_limit', '512M');
$this->init($input, $output);
# 创建定时器任务
$worker = new Worker();
$worker->name = 'team';
$worker->count = 1;
$worker->onWorkerStart = [$this, 'start'];
$worker->runAll();
}
}