DeviceTrendPanel.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Globalization;
  5. using System.Threading.Tasks;
  6. using Bitsplash.DatePicker;
  7. using Newtonsoft.Json;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. using XCharts.Runtime;
  11. public class DeviceTrendPanel : MonoBehaviour
  12. {
  13. public RectTransform rect;
  14. public LineChart _LineChart;
  15. public Text nameText;
  16. public GameObject listItemOri;
  17. public List<GameObject> listObj = new List<GameObject>();
  18. public Transform listRoot;
  19. public Button closeButton;
  20. public Button resetButton;
  21. public Button checkButton;
  22. public Text tipsText;
  23. public DatePickerDropDownTextMeshPro DatePicker_Start;
  24. public DatePickerDropDownTextMeshPro DatePicker_End;
  25. public string startDateStr = "";
  26. public string endDateStr = "";
  27. public int currentType = 0; //0补元 1套口
  28. public string _sid;
  29. public string _gid;
  30. public string dataName;
  31. private GongChengType currentGongChengType;
  32. public Text fanweiText;
  33. public Text leijiText;
  34. public Text pingjiaText;
  35. private void Awake()
  36. {
  37. rect = this.GetComponent<RectTransform>();
  38. _LineChart = this.transform.Find("LineChart").GetComponent<LineChart>();
  39. listRoot = this.transform.Find("ScrollView/Viewport/Content").transform;
  40. closeButton = this.transform.Find("CloseButton").GetComponent<Button>();
  41. nameText = this.transform.Find("nameText").GetComponent<Text>();
  42. checkButton = this.transform.Find("CheckButton").GetComponent<Button>();
  43. tipsText = this.transform.Find("tipsText").GetComponent<Text>();
  44. tipsText.enabled = false;
  45. checkButton.onClick.AddListener(() => { GetData(); });
  46. closeButton.onClick.AddListener(() =>
  47. {
  48. Hide();
  49. // if (GCJKLayer._Instance.currentSelectItem != null)
  50. // {
  51. // GCJKLayer._Instance.currentSelectItem.SetHighLight(false);
  52. // GCJKLayer._Instance.currentSelectItem = null;
  53. // }
  54. });
  55. }
  56. public void InitDatePicker()
  57. {
  58. DatePicker_Start = this.transform.Find("DatePicker_Start").GetComponent<DatePickerDropDownTextMeshPro>();
  59. DatePicker_End = this.transform.Find("DatePicker_End").GetComponent<DatePickerDropDownTextMeshPro>();
  60. DatePicker_Start.GetDateString += (string dateStr) =>
  61. {
  62. startDateStr = dateStr;
  63. CheckDate();
  64. };
  65. DatePicker_End.GetDateString += (string dateStr) =>
  66. {
  67. endDateStr = dateStr;
  68. CheckDate();
  69. };
  70. }
  71. public void CheckDate()
  72. {
  73. if (!startDateStr.Equals("") && !endDateStr.Equals(""))
  74. {
  75. var startD = DateTime.ParseExact(startDateStr, "yyyy-MM-dd", null);
  76. var endD = DateTime.ParseExact(endDateStr, "yyyy-MM-dd", null);
  77. var disD = endD - startD;
  78. Debug.Log(disD.TotalDays);
  79. if (disD.TotalDays > 183)
  80. {
  81. Debug.Log("时间间隔大于6个月");
  82. checkButton.gameObject.SetActive(false);
  83. tipsText.enabled = true;
  84. }
  85. else
  86. {
  87. tipsText.enabled = false;
  88. checkButton.gameObject.SetActive(true);
  89. }
  90. }
  91. }
  92. public async void SetPingJiaText(string valueType)
  93. {
  94. var ids=GCJKLayer._Instance.GetAllDevicesOfType_id(currentGongChengType);
  95. List<float> rangeValues = new List<float>();
  96. List<float> currentValues = new List<float>();
  97. for (int i = 0; i < ids.Count; i++)
  98. {
  99. string getJsonStr =
  100. await HttpHelper._Instance.GetDeviceTrend(currentType, _gid, _sid, startDateStr, endDateStr);
  101. DeviceTrendRequest requestData = JsonConvert.DeserializeObject<DeviceTrendRequest>(getJsonStr);
  102. if (requestData is { data: { Length: > 0 } })
  103. {
  104. float.TryParse(requestData.data[0].r1,out var valueS);
  105. float.TryParse(requestData.data[^1].r1,out var valueE);
  106. rangeValues.Add(valueS-valueE);
  107. currentValues.Add(valueE);
  108. }
  109. }
  110. rangeValues.Sort();
  111. currentValues.Sort();
  112. string deviceTypeName = "";
  113. switch (currentGongChengType)
  114. {
  115. case GongChengType.shuiWei:
  116. deviceTypeName = "水位计";
  117. break;
  118. case GongChengType.shenYaJi:
  119. deviceTypeName = "渗压计";
  120. break;
  121. case GongChengType.jingLiShuiZhunYi:
  122. deviceTypeName = "静力水准仪";
  123. break;
  124. case GongChengType.wenDu:
  125. deviceTypeName = "温度";
  126. break;
  127. case GongChengType.yinZhangXianYi:
  128. deviceTypeName = "引张线仪";
  129. break;
  130. case GongChengType.chuiXianZuoBiaoYi:
  131. deviceTypeName = "垂线坐标仪";
  132. break;
  133. case GongChengType.tuYaLiJi:
  134. deviceTypeName = "土压力计";
  135. break;
  136. case GongChengType.yingLiJi:
  137. deviceTypeName = "应力计";
  138. break;
  139. case GongChengType.sanXiangWeiCuoJi:
  140. deviceTypeName = "三向位错计";
  141. break;
  142. case GongChengType.erXiangCeFengJi:
  143. deviceTypeName = "二向测缝计";
  144. break;
  145. case GongChengType.weiYiJi:
  146. deviceTypeName = "位移计";
  147. break;
  148. }
  149. fanweiText.text = rangeValues.Count > 1 ? $"{rangeValues[0]}<color=#A5BFE2>~</color>{rangeValues[^1]} {valueType}" : "-<color=#A5BFE2>~</color>-";
  150. leijiText.text = currentValues.Count > 1 ? $"{currentValues[0]}<color=#A5BFE2>~</color>{currentValues[^1]} {valueType}" : "-<color=#A5BFE2>~</color>-";
  151. string leijiMin = currentValues.Count > 1 ? currentValues[0].ToString(CultureInfo.InvariantCulture) : "-";
  152. string leijiMax = currentValues.Count > 1 ? currentValues[^1].ToString(CultureInfo.InvariantCulture) : "-";
  153. string fanweiMin = rangeValues.Count > 1 ? rangeValues[0].ToString(CultureInfo.InvariantCulture) : "-";
  154. string fanweiMax = rangeValues.Count > 1 ? rangeValues[^1].ToString(CultureInfo.InvariantCulture) : "-";
  155. pingjiaText.text = $"截至到{endDateStr}止,{(currentType==0?"补元退洪闸":"套口进洪闸")}的{deviceTypeName}的累计变化量为{leijiMin}到{leijiMax}{valueType}之间,范围变化量在{fanweiMin}到{fanweiMax}{valueType}之间。";
  156. }
  157. public void OnDrag()
  158. {
  159. var mousePos = Input.mousePosition;
  160. mousePos.x -= Screen.width * 0.5f;
  161. mousePos.y -= Screen.height * 0.5f;
  162. rect.anchoredPosition = mousePos;
  163. }
  164. public async Task GetData()
  165. {
  166. string getJsonStr =
  167. await HttpHelper._Instance.GetDeviceTrend(currentType, _gid, _sid, startDateStr, endDateStr);
  168. GetTrend(getJsonStr);
  169. }
  170. public async Task Show(string _name, GongChengType type, string gid, string sid)
  171. {
  172. dataName = _name;
  173. _gid = gid;
  174. _sid = sid;
  175. _name = _name.Replace(" ", "");
  176. string typeText = "";
  177. currentGongChengType = type;
  178. switch (currentGongChengType)
  179. {
  180. case GongChengType.shuiWei:
  181. typeText = "水位/m";
  182. break;
  183. case GongChengType.shenYaJi:
  184. typeText = "渗压/KPa";
  185. break;
  186. case GongChengType.jingLiShuiZhunYi:
  187. typeText = "位移/mm";
  188. break;
  189. case GongChengType.wenDu:
  190. typeText = "温度/\u2103";
  191. break;
  192. case GongChengType.yinZhangXianYi:
  193. typeText = "位移/mm";
  194. break;
  195. case GongChengType.chuiXianZuoBiaoYi:
  196. typeText = "位移/mm";
  197. break;
  198. case GongChengType.tuYaLiJi:
  199. typeText = "应力/MPa";
  200. break;
  201. case GongChengType.yingLiJi:
  202. typeText = "应力/MPa";
  203. break;
  204. case GongChengType.sanXiangWeiCuoJi:
  205. typeText = "位移/mm";
  206. break;
  207. case GongChengType.erXiangCeFengJi:
  208. typeText = "位移/mm";
  209. break;
  210. case GongChengType.weiYiJi:
  211. typeText = "位移/mm";
  212. break;
  213. }
  214. YAxis tempXaxis = _LineChart.GetChartComponent<YAxis>();
  215. var tempSeries = _LineChart.series;
  216. tempSeries[0].serieName = typeText;
  217. tempXaxis.axisName.name = typeText+" "+DateTime.Now.ToString("yyyy");
  218. nameText.text = $"{_name} {typeText}趋势";
  219. string endTime = DateTime.Now.ToString("yyyy-MM-dd");
  220. string startTime = DateTime.Now.AddMonths(-3).ToString("yyyy-MM-dd");
  221. startDateStr = startTime;
  222. endDateStr = endTime;
  223. DatePicker_Start.SetLabelText(startTime);
  224. DatePicker_End.SetLabelText(endTime);
  225. string getJsonStr = await HttpHelper._Instance.GetDeviceTrend(currentType, gid, sid, startTime, endTime);
  226. GetTrend(getJsonStr);
  227. }
  228. public void Hide()
  229. {
  230. GCJKLayer._Instance.RemovePanel(this);
  231. DestroyImmediate(this.gameObject);
  232. }
  233. /// <summary>
  234. /// 获取时间范围内的趋势图
  235. /// </summary>
  236. public void GetTrend(string jsonStr)
  237. {
  238. pingjiaText.text = "...";
  239. fanweiText.text = "-<color=#A5BFE2>~</color>-";
  240. leijiText.text = "-<color=#A5BFE2>~</color>-";
  241. try
  242. {
  243. Debug.Log("GetTrend requestData:" + jsonStr);
  244. DeviceTrendRequest requestData = JsonConvert.DeserializeObject<DeviceTrendRequest>(jsonStr);
  245. XAxis tempXaxis = _LineChart.GetChartComponent<XAxis>();
  246. tempXaxis.data.Clear();
  247. var finalData = new DeviceTrendData[requestData.data.Length];
  248. for (int i = 0; i < finalData.Length; i++)
  249. {
  250. finalData[i] = requestData.data[requestData.data.Length - 1 - i];
  251. }
  252. for (int i = 0; i < finalData.Length; i++)
  253. {
  254. var tempTimeDate = DateTime.ParseExact(finalData[i].timeGroup, "yyyy-MM-dd HH:mm:ss",
  255. CultureInfo.InvariantCulture);
  256. tempXaxis.AddData(tempTimeDate.ToString("MM-dd"));
  257. }
  258. var tempSeries = _LineChart.series;
  259. SerieData[] tempDatas = new SerieData[finalData.Length];
  260. string typeText = "";
  261. switch (currentGongChengType)
  262. {
  263. case GongChengType.shuiWei:
  264. typeText = "水位/m";
  265. break;
  266. case GongChengType.shenYaJi:
  267. typeText = "渗压/KPa";
  268. break;
  269. case GongChengType.jingLiShuiZhunYi:
  270. typeText = "位移/mm";
  271. break;
  272. case GongChengType.wenDu:
  273. typeText = "温度/\u2103";
  274. break;
  275. case GongChengType.yinZhangXianYi:
  276. typeText = "位移/mm";
  277. break;
  278. case GongChengType.chuiXianZuoBiaoYi:
  279. typeText = "位移/mm";
  280. break;
  281. case GongChengType.tuYaLiJi:
  282. typeText = "应力/MPa";
  283. break;
  284. case GongChengType.yingLiJi:
  285. typeText = "应力/MPa";
  286. break;
  287. case GongChengType.sanXiangWeiCuoJi:
  288. typeText = "位移/mm";
  289. break;
  290. case GongChengType.erXiangCeFengJi:
  291. typeText = "位移/mm";
  292. break;
  293. case GongChengType.weiYiJi:
  294. typeText = "位移/mm";
  295. break;
  296. }
  297. tempSeries[0].serieName = typeText;
  298. string startTimeStr=DateTime.Parse(startDateStr).ToString("yyyy");
  299. string endTimeStr=DateTime.Parse(endDateStr).ToString("yyyy");
  300. string finalStr = startTimeStr.Equals(endDateStr) ? startTimeStr : $"{startTimeStr}-{endTimeStr}";
  301. tempXaxis.axisName.name = typeText+" "+finalStr;
  302. for (int i = 0; i < tempDatas.Length; i++)
  303. {
  304. tempDatas[i] = new SerieData();
  305. tempDatas[i].data = new List<double>();
  306. tempDatas[i].data.Add(i);
  307. //Debug.Log(requestData.data[i].r1);
  308. double tempValue = double.Parse(float.Parse(finalData[i].r1).ToString("0.00"));
  309. //Debug.Log(tempValue * 100);
  310. tempDatas[i].data.Add(tempValue);
  311. }
  312. tempSeries[0].data.Clear();
  313. tempSeries[0].data.AddRange(tempDatas);
  314. StartCoroutine(CreatList(requestData,typeText));
  315. SetPingJiaText(typeText);
  316. }
  317. catch (Exception e)
  318. {
  319. Debug.LogError(e.ToString());
  320. throw;
  321. }
  322. }
  323. IEnumerator CreatList(DeviceTrendRequest deviceData,string unit)
  324. {
  325. var wait = new WaitForEndOfFrame();
  326. if (listObj.Count > 0)
  327. {
  328. GameObject[] deleteObjs = listObj.ToArray();
  329. for (int i = 0; i < deleteObjs.Length; i++)
  330. {
  331. Destroy(deleteObjs[i]);
  332. }
  333. }
  334. listObj.Clear();
  335. int creatCount = 0;
  336. float lastWaterValue = 0;
  337. for (int i = 0; i < deviceData.data.Length; i++)
  338. {
  339. float value = float.Parse(float.Parse(deviceData.data[i].r1).ToString("F2"));
  340. GameObject tempObj = Instantiate(listItemOri, listRoot);
  341. tempObj.transform.Find("unit").GetComponent<Text>().text = $"{unit}";
  342. tempObj.transform.Find("time").GetComponent<Text>().text = $"{deviceData.data[i].timeGroup}";
  343. tempObj.transform.Find("value").GetComponent<Text>().text = $"{value}";
  344. string dirStr = "-";
  345. if (i == 0)
  346. {
  347. dirStr = "→";
  348. lastWaterValue = value;
  349. }
  350. else
  351. {
  352. float currentWaterValue = value;
  353. if (currentWaterValue > lastWaterValue)
  354. {
  355. dirStr = "↑";
  356. }
  357. else if (currentWaterValue < lastWaterValue)
  358. {
  359. dirStr = "↓";
  360. }
  361. else
  362. {
  363. dirStr = "→";
  364. }
  365. lastWaterValue = currentWaterValue;
  366. }
  367. tempObj.transform.Find("trend").GetComponent<Text>().text = $"{dirStr}";
  368. listObj.Add(tempObj);
  369. creatCount++;
  370. if (creatCount >= 10)
  371. {
  372. creatCount = 0;
  373. yield return wait;
  374. }
  375. }
  376. }
  377. }