@thescs

Как лучше составить алгоритм адресации требуемой информации конкретному пользователю?

Помогите пожалуйста с этой задачей.
Суть вопроса:
В базе данных 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)			// подготовка строки для отправки в телегу
	{
		...
	}
}
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
27 окт. 2021, в 07:38
2000 руб./за проект
27 окт. 2021, в 06:32
1000 руб./за проект