Помогите пожалуйста с этой задачей.
Суть вопроса:
В базе данных MySQL хранятся таблицы:
- addresses
- tickets
- tg_users
Стуктуры:
addresses
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| employeeid | int | YES | | NULL | |
| building_code | varchar(10) | YES | | NULL | |
| building_name | tinytext | YES | | NULL | |
+---------------+-------------+------+-----+---------+-------+
tickets
+-----------------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | 0 | |
| no | text | YES | | NULL | |
| organization_id | int | YES | | NULL | |
| district_id | int | YES | | NULL | |
| building_code | text | YES | | NULL | |
| district_name | text | YES | | NULL | |
| sector_id | int | YES | | NULL | |
| sector_name | text | YES | | NULL | |
| building_id | int | YES | | NULL | |
| device_id | int | YES | | NULL | |
| turnon_plan_time | datetime | YES | | NULL | |
| address | text | YES | | NULL | |
...
| created | datetime | YES | | NULL | |
| updated | datetime | YES | | NULL | |
| street_id | int | YES | | NULL | |
| return_count | int | YES | | NULL | |
....
+-----------------------------+-------------+------+-----+---------+-------+
tg_users
+------------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+----------+------+-----+---------+-------+
| id | int | NO | PRI | 0 | |
| first_name | tinytext | YES | | NULL | |
| username | tinytext | YES | | NULL | |
| account_pending | int | YES | | NULL | |
| hash | tinytext | YES | | NULL | |
| rights | int | YES | | 0 | |
| full_name | tinytext | YES | | NULL | |
| user_houses | tinytext | YES | | NULL | |
| show_map | int | YES | | NULL | |
| send_all_tickets | int | YES | | NULL | |
| inchat | int | YES | | NULL | |
| chatwith | int | YES | | NULL | |
| filters | json | YES | | NULL | |
| settings | json | YES | | NULL | |
+------------------+----------+------+-----+---------+-------+
tickets_sended
+-------------------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+------+------+-----+---------+-------+
| id | int | NO | PRI | 0 | |
| telegrammessageid | int | NO | | 0 | |
| channel | text | NO | | NULL | |
+-------------------+------+------+-----+---------+-------+
Есть скрипт, который должен отправить каждому активному пользователю в его телеграм тикет, перед этим проверив, не был ли тикет отправлен этому пользователю ранее, а также проверяя настройку пользователя по выборке: отправлять ему все тикеты, либо отправлять только те, которые совпадают полями building_code по таблицам addresses и tickets, а также совпадают с ID пользователя tg_users.id и addresses.employeeid.
В случае, если тикет был ранее отправлен пользователю, тогда переходим к следующему пользователю и проверям все те же условия в отношении него.
Если же тикет ранее НЕ был отправлен, то отправляем его юзеру согласно настройкам в его профиле и отмечаем в базе, что тикет юзеру отправлен.
Такова вот задача. Я переписывал код несколько раз, и вроде бы по коду условия получаются логичными, но на деле работает всё совсем не так как надо :(
Прошу помощи у хабравчан.
Вот актуальный код, который с горем пололам, но работает:
<?php
namespace App\Controllers;
class Telegramm extends BaseController
{
public function __construct()
{
parent::__construct();
$this->$db = db_connect();
$msg = new \CodeIgniter\HTTP\Message;
$msg->setHeader('Content-type', 'text/plain');
}
public function index()
{
$data['title'] = "Internal subsystem";
$data['subtitle'] = "";
echo view('global/header', $data);
echo view('global/navigation', $data);
echo view('global/footer');
}
public function broadcast()
{
$users = $this->$db->query("select * from `tg_users`")->getResult(); // юзеры телеги
$tickets = $this->$db->query("select * from ticket_itera LEFT JOIN tickets_sended USING (id) LEFT JOIN addresses USING (building_code) WHERE created >= CURDATE()")->getResult(); // тикеты Итеры за текущий день
//$tickets = $this->$db->query("select * from ticket_itera LEFT JOIN tickets_sended USING (id) LEFT JOIN buildings ON buildings.code = ticket_itera.building_code WHERE created >= CURDATE()")->getResult(); // тикеты Итеры за текущий день
foreach ($tickets as $ticket)
{
if ($ticket->malfunction_id == 3) continue;
foreach ($users as $user)
{
if($user->account_pending) continue; // неактивным не шлем
$par = json_decode($user->settings); // раскодировка конфига юзера
if (!(array)$par) continue; // если конфиг пустой, нач след цикл
if(in_array($user->id, explode(' ', rtrim($ticket->channel)))) continue; // защита от повторных отправлений
if(!$par->onlymy) // если в профиле указано высылать все заявки
{
if(in_array($ticket->district_id, $par->ds)) // выбираем районы
if(in_array($ticket->malfunction_type_id, $par->eq)) //оборудование
{
//$received = json_encode(array_push(json_decode($ticket->received), $user->id));
$response = $this->telegram->send->chat($user->id)->text($this->prepareText('text', (array)$ticket))->send(); //сообщение
if($par->showmap) $this->telegram->send->chat($user->id)->location($ticket->lat, $ticket->lon)->send(); // карта
//$this->$db->query("insert ignore into tickets_sended values (".$ticket->id.", ".$response['message_id'].", ".$user->id.", '$received')"); // вставляем запись в таблицу отправленных
$recv = $ticket->channel;
$recv .= ' '.$user->id . ' ';
if(! $this->$db->query("insert into tickets_sended values (".$ticket->id.", ".$response['message_id'].", '".$recv."') ON DUPLICATE KEY UPDATE channel='$recv'")) var_dump($this->$db->error()).'<br>';
continue;
}
}else{
if($user->id == $ticket->userid) // если в профиле указано высылать заявки только по адресам пользователя
{
//$received = json_encode(array_push(json_decode($ticket->received), $user->id));
$response = $this->telegram->send->chat($user->id)->text($this->prepareText('text', (array)$ticket))->send();
if($par->showmap) $this->telegram->send->chat($user->id)->location($ticket->lat, $ticket->lon)->send();
//$this->$db->query("insert ignore into tickets_sended values (".$ticket->id.", ".$response['message_id'].", ".$user->id.", '$received')");
$recv = $ticket->channel;
$recv .= ' '.$user->id . ' ';
if(! $this->$db->query("insert into tickets_sended values (".$ticket->id.", ".$response['message_id'].", '".$recv."') ON DUPLICATE KEY UPDATE channel='$recv'")) var_dump($this->$db->error()).'<br>';
}
}
/*if(!in_array($user->id, explode(' ', rtrim($recv)))) */
//var_dump( explode(' ', rtrim($recv)));
//unset($recv);
/*if(!$ticket->channel) $received = array(); else $received = unserialize($ticket->channel);
$received = serialize($received[$user->id] = $user->id);
$var = (array)unserialize($received);
var_dump( $var[rand()] = rand());*/
//var_dump((array)unserialize($received)).'<br>';
//echo "insert into tickets_sended values (".$ticket->id.", ".$response['message_id'].", ".$recv.") ON DUPLICATE KEY UPDATE channel='$recv'";
}
}
}
private function prepareText($type='text', $ticket) // подготовка строки для отправки в телегу
{
...
}
}