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(); } }