WorkerController.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. using Assets.Scripts.Models;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading;
  7. using UnityEngine;
  8. using UnityEngine.SceneManagement;
  9. using UnityEngine.UI;
  10. public class WorkerController : MonoBehaviour
  11. {
  12. public static Dictionary<uint, List<Structure>> Workers = new Dictionary<uint, List<Structure>>();
  13. public static List<Structure> TestStructures = new List<Structure>();
  14. public GameObject WorkersList; // scroll content
  15. public Dropdown DropdownCompany;
  16. public Dropdown DropdownLocation;
  17. public Dropdown DropdownData;
  18. public GameObject inputField_date;
  19. public InputField inputField_location;
  20. public GameObject TimeStart;
  21. public GameObject TimeEnd;
  22. public GameObject StartHour;
  23. public GameObject StartMin;
  24. public GameObject StartSec;
  25. public GameObject EndHour;
  26. public GameObject EndMin;
  27. public GameObject EndSec;
  28. public GameObject StartStopButton;
  29. public GameObject ErrorDialog;
  30. public GameObject ButtonPlay;
  31. public Dropdown DropdownMode;
  32. public Toggle ToggleLine;
  33. public Toggle ToggleDisappearance;
  34. public GameObject DatePicker;
  35. public Camera camera;
  36. public Toggle projection;
  37. InputField inputField_date_text;
  38. enum Mode { RealTime = 0, History = 1, Stop = 2 };
  39. Mode active_mode = Mode.Stop;
  40. int mode = 0;
  41. //public GameObject Time;
  42. static Client client = new Client();
  43. DateTimePicker Date;
  44. public List<GameObject> maps;
  45. static List<bool> starting = new List<bool>(); // флаги остановок
  46. public static Dictionary<uint, bool> end_send = new Dictionary<uint, bool>(); // флаги завершения загрузки
  47. Dictionary<uint, MarkerMoving> moving = new Dictionary<uint, MarkerMoving>(); // флаги начала движения
  48. //bool real_time = false;
  49. //bool history_start = false;
  50. float interpolationPeriod = 0.1f;
  51. float time_realtime = 0;
  52. float time_draw = 0;
  53. public static List<User> users = new List<User>();
  54. public static bool users_load = false;
  55. //List<bool> StartStop = new List<bool>();
  56. // Start is called before the first frame update
  57. void Start()
  58. {
  59. DebugHelper.ActivateConsole();
  60. //WorkerMarker(4, Color.red);
  61. //WorkerMarker(356, Color.green);
  62. inputField_date_text = inputField_date.transform.GetComponent<InputField>();
  63. //Year = DatePicker.transform.GetChild(0).GetComponent<Dropdown>();
  64. //Month = DatePicker.transform.GetChild(1).GetComponent<Dropdown>();
  65. //Day = DatePicker.transform.GetChild(2).GetComponent<Dropdown>();
  66. Date = DatePicker.GetComponent<DateTimePicker>();
  67. //foreach (var s in structures.Select(s => s.acc_id).Distinct())
  68. // WorkerMarker(s, UnityEngine.Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f));
  69. //foreach (var s in structures.Select(s => s.ts.Date).Distinct())
  70. //{
  71. // dates.Add(s);
  72. // DropdownData.options.Add(new Dropdown.OptionData(s.ToString("dd.MM.yyyy")));
  73. //}
  74. //foreach (var s in structures.Select(s => s.location_id).Distinct())
  75. //{
  76. // locations.Add(s);
  77. DropdownLocation.options.Add(new Dropdown.OptionData("1 Братск"));
  78. DropdownLocation.options.Add(new Dropdown.OptionData("22 Офис Ижевск"));
  79. DropdownLocation.options.Add(new Dropdown.OptionData("25"));
  80. inputField_date_text.text = DateTime.Now.ToString("yyyy.MM.dd");
  81. DropdownCompany.options.Add(new Dropdown.OptionData("Тайшет"));
  82. DropdownCompany.options.Add(new Dropdown.OptionData("Тестовая"));
  83. DropdownCompany.options.Add(new Dropdown.OptionData("Братское"));
  84. //}
  85. }
  86. int active_location = 0;
  87. int active_company = 0;
  88. // Update is called once per frame
  89. void Update()
  90. {
  91. if (DropdownMode.value != mode)
  92. {
  93. StopProgress();
  94. active_mode = Mode.Stop;
  95. mode = DropdownMode.value;
  96. switch (DropdownMode.value)
  97. {
  98. case 0:
  99. //history_start = false;
  100. //////inputField_date.gameObject.SetActive(false);
  101. DatePicker.SetActive(false);
  102. TimeStart.SetActive(false);
  103. TimeEnd.SetActive(false);
  104. break;
  105. case 1:
  106. //real_time = false;
  107. //////inputField_date.gameObject.SetActive(true);
  108. DatePicker.SetActive(true);
  109. TimeStart.SetActive(true);
  110. TimeEnd.SetActive(true);
  111. break;
  112. }
  113. }
  114. if(active_company != DropdownCompany.value)
  115. {
  116. active_company = DropdownCompany.value;
  117. foreach(var m in markers)
  118. {
  119. Destroy(m.marker.gameObject);
  120. Destroy(m.marker_line.gameObject);
  121. Destroy(m.toggle.gameObject);
  122. }
  123. markers = new List<Marker>();
  124. client.SendGetUsers((uint) active_company + 1);
  125. }
  126. if (active_location != DropdownLocation.value)
  127. {
  128. maps.ElementAt(active_location).SetActive(false);
  129. maps.ElementAt(DropdownLocation.value).SetActive(true);
  130. active_location = DropdownLocation.value;
  131. switch (DropdownLocation.value)
  132. {
  133. case 0:
  134. inputField_location.text = "1";
  135. break;
  136. case 1:
  137. inputField_location.text = "22";
  138. break;
  139. case 2:
  140. inputField_location.text = "25";
  141. break;
  142. }
  143. }
  144. foreach (var m in markers)
  145. {
  146. m.marker.SetActive(m.toggle.isOn);
  147. if (m.toggle.isOn && Workers.ContainsKey(m.acc_id) && starting.Last() && end_send[m.acc_id])
  148. {
  149. //end_send[m.value.acc_id] = false;
  150. // moving.Add(true);
  151. //if (markers.Count - 1 == m.i)
  152. time_draw += Time.deltaTime;
  153. if (time_draw >= interpolationPeriod)
  154. {
  155. time_draw -= interpolationPeriod;
  156. StartingAccPositiong(m);
  157. }
  158. }
  159. }
  160. time_realtime += Time.deltaTime;
  161. if (active_mode == Mode.RealTime && !inputField_location.text.Equals("") && time_realtime >= interpolationPeriod)
  162. {
  163. time_realtime -= interpolationPeriod;
  164. //var dateNow = DateTime.UtcNow.AddHours(3);
  165. //Time.GetComponent<Text>().text = dateNow.ToString();
  166. starting.Add(true);
  167. var location_id = uint.Parse(inputField_location.text);
  168. foreach (var m in markers)
  169. {
  170. if (m.toggle.isOn)
  171. {
  172. client.CoordinatesRequest(0, 0, 1, location_id, m.acc_id);
  173. //history_start = true;
  174. end_send[m.acc_id] = false;
  175. }
  176. }
  177. }
  178. if (ToggleLine.isOn)
  179. {
  180. foreach (var m in markers)
  181. m.marker_line.gameObject.SetActive(true);
  182. ToggleDisappearance.interactable = true;
  183. }
  184. else
  185. {
  186. foreach (var m in markers)
  187. {
  188. m.marker_line.gameObject.SetActive(false);
  189. m.marker_line.positionCount = 0;
  190. }
  191. ToggleDisappearance.interactable = false;
  192. }
  193. if (projection.isOn)
  194. {
  195. //camera_2d.SetActive(true);
  196. //camera_2_5D.SetActive(false);
  197. camera.orthographic = true;
  198. }
  199. else
  200. {
  201. //camera_2d.SetActive(false);
  202. //camera_2_5D.SetActive(true);
  203. camera.orthographic = false;
  204. }
  205. if (users_load)
  206. {
  207. foreach(var u in users.OrderBy(u => u.id))
  208. WorkerMarker(u, Color.green);
  209. users_load = false;
  210. }
  211. }
  212. public static List<Marker> markers = new List<Marker>();
  213. /// <summary>
  214. /// Создание маркера для сотрудника
  215. /// </summary>
  216. /// <param name="acc_id"></param>
  217. void WorkerMarker(User user, Color color)
  218. {
  219. var toggle = Instantiate(Resources.Load("GameObjects/Toggle", typeof(Toggle))) as Toggle;
  220. toggle.name = $"{user.id}";
  221. toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = $"{user.id} {user.name}";
  222. toggle.transform.SetParent(WorkersList.transform);
  223. toggle.isOn = false;
  224. var marker = Instantiate(Resources.Load("GameObjects/Capsule", typeof(GameObject))) as GameObject;
  225. marker.name = $"marker_{user.id}";
  226. marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{user.id}";
  227. marker.GetComponent<Renderer>().material.color = color; // UnityEngine.Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
  228. var marker_line = Instantiate(Resources.Load("GameObjects/Line", typeof(LineRenderer))) as LineRenderer;
  229. marker_line.name = $"marker_line_{user.id}";
  230. marker_line.startColor = color;
  231. marker_line.endColor = Color.white;
  232. marker_line.material.color = color;
  233. markers.Add(new Marker { acc_id = user.id, marker = marker, toggle = toggle, marker_line = marker_line });
  234. }
  235. /// <summary>
  236. /// Смена положения маркера
  237. /// </summary>
  238. /// <param name="pause">Задержка</param>
  239. /// <param name="step">Шаг до нового положения</param>
  240. /// <param name="start_pos">Начальное положение</param>
  241. /// <param name="end_pos">Финальное положение</param>
  242. /// <param name="worker_marker">Маркер сотрудника</param>
  243. /// <param name="w">Данные из БД</param>
  244. /// <param name="count">Номер процесса/запуска</param>
  245. /// <param name="progress">Номер записи из БД</param>
  246. /// <param name="all">Всего записей из БД</param>
  247. /// <returns></returns>
  248. //static IEnumerator MarkerPostion(float pause, float step, Vector3 start_pos, Vector3 end_pos, GameObject worker_marker, Toggle toggle, Structure w, int count, int progress, int all)
  249. //{
  250. // yield return new WaitForSeconds(pause);
  251. // if (worker_marker.activeSelf == true && history_start && starting[count])
  252. // {
  253. // var x_position = Mathf.Lerp(start_pos.x, end_pos.x, step);
  254. // var y_position = Mathf.Lerp(start_pos.z, end_pos.z, step);
  255. // //Debug.Log($"marker name={worker_marker.name} time={pause} step={step} sec x={x_position} y={y_position} x0={start_pos.x} y0={start_pos.z} x1={end_pos.x} y1={end_pos.z}");
  256. // worker_marker.transform.position = new Vector3(x_position, 0.5f, y_position);
  257. // worker_marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{w.acc_id} x={end_pos.x} y={end_pos.z}";
  258. // toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = $"{w.acc_id} {w.ts:hh:mm:ss}\n{progress + 1} из {all}";
  259. // if (progress + 1 == all)
  260. // {
  261. // sStartStopButton.transform.GetChild(0).GetComponent<Text>().text = "Отобразить";
  262. // starting[count] = false;
  263. // history_start = false;
  264. // }
  265. // }
  266. //}
  267. void Position(float step, Vector3 start_pos, Vector3 end_pos, Marker marker, Structure w, int count, string progress)
  268. {
  269. if (marker.marker.activeSelf == true && starting[count])
  270. {
  271. var x_position = Mathf.Lerp(start_pos.x, end_pos.x, step);
  272. var y_position = Mathf.Lerp(start_pos.z, end_pos.z, step);
  273. //Debug.Log($"marker name={worker_marker.name} time={pause} step={step} sec x={x_position} y={y_position} x0={start_pos.x} y0={start_pos.z} x1={end_pos.x} y1={end_pos.z}");
  274. var new_position = new Vector3(x_position, 0.5f, y_position);
  275. if (marker.marker.transform.position != new_position)
  276. {
  277. marker.marker.transform.position = new Vector3(x_position, 0.5f, y_position);
  278. marker.marker_line.SetPosition(marker.marker_line.positionCount++, new Vector3(x_position, 0, y_position));
  279. if(ToggleDisappearance.isOn)marker.marker_line = LineDisappearance(marker.marker_line);
  280. }
  281. marker.marker.transform.GetChild(0).transform.GetChild(0).transform.GetChild(0).GetComponent<Text>().text = $"{w.acc_id} x={end_pos.x} y={end_pos.z}";
  282. marker.toggle.transform.GetChild(1).gameObject.GetComponent<Text>().text = $"{w.acc_id} {w.ts.ToString("hh:mm:ss")}{progress}";
  283. }
  284. }
  285. //static IEnumerator RequestPostion(long ts, long te, uint loc, uint account_id)
  286. //{
  287. // client.CoordinatesRequest(ts, te, 1, loc);
  288. // yield return new WaitForSeconds(5);
  289. // foreach (var t in TestStructures)
  290. // Debug.Log(t);
  291. //}
  292. /// <summary>
  293. /// Запуск отрисовки
  294. /// </summary>
  295. public void ButtonStart()
  296. {
  297. if (active_mode == Mode.Stop)
  298. foreach (var m in markers)
  299. m.marker_line.positionCount = 0;
  300. var button_text = StartStopButton.transform.GetChild(0);
  301. switch (DropdownMode.value)
  302. {
  303. case 0:
  304. //real_time = !real_time;
  305. if (active_mode == Mode.Stop/*real_time*/) {
  306. active_mode = Mode.RealTime;
  307. button_text.GetComponent<Text>().text = "Остановить";
  308. }
  309. else {
  310. active_mode = Mode.Stop;
  311. button_text.GetComponent<Text>().text = "Отобразить";
  312. }
  313. break;
  314. case 1:
  315. if (int.Parse(StartHour.GetComponent<InputField>().text) == 99) SceneManager.LoadScene("Editor3D");
  316. else {
  317. if (active_mode == Mode.Stop/*real_time*/) active_mode = Mode.History;
  318. else active_mode = Mode.Stop;
  319. }//history_start = !history_start;
  320. if (active_mode == Mode.History/*history_start*/)
  321. {
  322. starting.Add(true);
  323. var date = DateTime.Now; var error_date = false;
  324. ////////try
  325. ////////{
  326. //date = DateTime.Parse(inputField_date_text.text);
  327. date = Date.Date;
  328. //////}
  329. //////catch (Exception e)
  330. //////{
  331. ////// ErrorDialog.SetActive(true);
  332. ////// error_date = true;
  333. ////// var text = ErrorDialog.transform.GetChild(0).GetComponent<Text>().text = "Некорректный формат даты";
  334. ////// //history_start = false;
  335. ////// active_mode = Mode.Stop;
  336. //////}
  337. var time_start = date; //new DateTime(dates.ElementAt(DropdownData.value).Ticks);
  338. time_start = time_start.AddHours(int.Parse(StartHour.GetComponent<InputField>().text));
  339. time_start = time_start.AddMinutes(int.Parse(StartMin.GetComponent<InputField>().text));
  340. time_start = time_start.AddSeconds(int.Parse(StartSec.GetComponent<InputField>().text));
  341. Debug.Log(time_start);
  342. //var time_start = new DateTime(1, 1, 1, int.Parse(StartHour.GetComponent<InputField>().text), int.Parse(StartMin.GetComponent<InputField>().text), int.Parse(StartSec.GetComponent<InputField>().text));
  343. //var time_end = new DateTime(1, 1, 1, int.Parse(EndHour.GetComponent<InputField>().text), int.Parse(EndMin.GetComponent<InputField>().text), int.Parse(EndSec.GetComponent<InputField>().text));
  344. var time_end = date; //new DateTime(dates.ElementAt(DropdownData.value).Ticks);
  345. time_end = time_end.AddHours(int.Parse(EndHour.GetComponent<InputField>().text));
  346. time_end = time_end.AddMinutes(int.Parse(EndMin.GetComponent<InputField>().text));
  347. time_end = time_end.AddSeconds(int.Parse(EndSec.GetComponent<InputField>().text));
  348. // client.account_id = 356;
  349. //StartCoroutine(RequestPostion(time_start.Ticks, time_end.Ticks, 22, 356));
  350. if (!error_date)
  351. {
  352. try
  353. {
  354. var location_id = uint.Parse(inputField_location.text);
  355. foreach (var m in markers)
  356. {
  357. if (m.toggle.isOn)
  358. {
  359. client.CoordinatesRequest(time_start.Ticks, time_end.Ticks, 1, location_id, m.acc_id);
  360. end_send[m.acc_id] = false;
  361. }
  362. }
  363. button_text.GetComponent<Text>().text = "Остановить";
  364. }
  365. catch (Exception e)
  366. {
  367. ErrorDialog.SetActive(true);
  368. ErrorDialog.transform.GetChild(0).GetComponent<Text>().text = "Введите идентификатор локации";
  369. //history_start = false;
  370. active_mode = Mode.Stop;
  371. }
  372. }
  373. // var workers = structures.Where(w => w.ts >= time_start && w.ts <= time_end && w.location_id == int.Parse(DropdownLocation.options[DropdownLocation.value].text.ToString())).ToList();
  374. //foreach (var m in markers)
  375. // if (m.toggle.isOn)
  376. // StartingAccPositiong(m);
  377. }
  378. else
  379. {
  380. StopProgress();
  381. }
  382. break;
  383. }
  384. }
  385. public void ErrorDialogClose()
  386. {
  387. ErrorDialog.SetActive(false);
  388. }
  389. void StopProgress()
  390. {
  391. if (starting.Any()) starting[starting.Count - 1] = false;
  392. StartStopButton.transform.GetChild(0).GetComponent<Text>().text = "Отобразить";
  393. foreach (var m in markers)
  394. {
  395. end_send[m.acc_id] = false;
  396. moving.Remove(m.acc_id);
  397. }
  398. }
  399. /// <summary>
  400. /// Затухание траектории
  401. /// </summary>
  402. /// <param name="lineRenderer">Траектория</param>
  403. /// <returns></returns>
  404. LineRenderer LineDisappearance(LineRenderer lineRenderer)
  405. {
  406. //LineRenderer lineRenderer = GetComponent<LineRenderer>();
  407. int newPositionCount = lineRenderer.positionCount - 1;
  408. Vector3[] newPositions = new Vector3[newPositionCount];
  409. for (int i = 0; i < newPositionCount; i++)
  410. {
  411. newPositions[i] = lineRenderer.GetPosition(i + 1);
  412. }
  413. lineRenderer.SetPositions(newPositions);
  414. return lineRenderer;
  415. }
  416. //void StartingAccPositiong(Marker m, float time)
  417. //{
  418. // var worker = Workers[m.acc_id].OrderBy(wr => wr.ts).ToList();
  419. // if (worker.Any())
  420. // {
  421. // var offset = 0.1f;
  422. // for (int i = 0; i < worker.Count; i++)
  423. // {
  424. // var w = worker.ElementAt(i);
  425. // var start_pos = m.marker.transform.position;
  426. // if (i != 0) start_pos = new Vector3(worker.ElementAt(i - 1).coord_x / 100f, 0.5f, worker.ElementAt(i - 1).coord_y / 100f);
  427. // var end_pos = new Vector3(w.coord_x / 100f, 0.5f, w.coord_y / 100f);
  428. // //if (real_time)
  429. // Position(time, start_pos, end_pos, m, w, starting.Count - 1, "");
  430. // //if (history_start)
  431. // //{
  432. // // for (float j = 0; j <= 1.1f; j += 0.1f) // 1.1f из-за округления float
  433. // // {
  434. // // StartCoroutine(MarkerPostion(i + offset + j, j, start_pos, end_pos, m.marker, m.toggle, w, starting.Count - 1, i, worker.Count));
  435. // // }
  436. // // offset += 0.1f;
  437. // //}
  438. // }
  439. // }
  440. //}
  441. /// <summary>
  442. /// Смена положения по интервалу
  443. /// Шаги для плавного перемещения
  444. /// </summary>
  445. /// <param name="m">Данные о маркере</param>
  446. void StartingAccPositiong(Marker m)
  447. {
  448. int i = 0;
  449. float step = 0.1f;
  450. if (moving.ContainsKey(m.acc_id))
  451. {
  452. if (moving[m.acc_id].index < Workers[m.acc_id].Count) i = moving[m.acc_id].index;
  453. {
  454. if (moving[m.acc_id].step < 1.1f) step = moving[m.acc_id].step;
  455. }
  456. }
  457. else moving[m.acc_id] = new MarkerMoving();
  458. var worker = Workers[m.acc_id].OrderBy(wr => wr.ts).ToList();
  459. if (worker.Any())
  460. {
  461. var w = worker.ElementAt(i);
  462. var start_pos = m.marker.transform.position;
  463. if (i != 0) start_pos = new Vector3(worker.ElementAt(i - 1).coord_x / 100f, 0.5f, worker.ElementAt(i - 1).coord_y / 100f);
  464. if (active_mode == Mode.History && i == 0) start_pos = new Vector3(w.coord_x / 100f, 0.5f, w.coord_y / 100f);
  465. var end_pos = new Vector3(w.coord_x / 100f, 0.5f, w.coord_y / 100f);
  466. var progress = "";
  467. if (active_mode == Mode.History) progress = $"\n{i + 1} из {Workers[m.acc_id].Count}";
  468. Position(step, start_pos, end_pos, m, w, starting.Count - 1, progress);
  469. // StartingAccPositiong(m.value, time_step);
  470. }
  471. if (step >= 1) i++;
  472. step += interpolationPeriod; // 0.1f;
  473. moving[m.acc_id].index = i;
  474. moving[m.acc_id].step = step;
  475. }
  476. public void OpenEditor()
  477. {
  478. SceneManager.LoadScene("Scenes/Editor2D");
  479. }
  480. void OnGUI()
  481. {
  482. //if (Input.GetKeyDown(KeyCode.BackQuote))
  483. DebugHelper.DrawConsole();
  484. }
  485. }