chts.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <template>
  2. <div>
  3. <Title :title="(switchValue == 2?'病害':'虫害') + '态势'">
  4. <template v-slot:title-slot>
  5. <div class="switch yse-events" @click="handleSwitch">
  6. <el-icon color="#00FFF0" size="15"><Switch /></el-icon>
  7. <span>可切换{{switchValue == 2 ?'虫害':'病害'}}</span>
  8. </div>
  9. <div class="slot-right">
  10. <div class="btn yse-events">异常复盘</div>
  11. <div class="btn yse-events">态势详情</div>
  12. </div>
  13. </template>
  14. </Title>
  15. <div class="content-box">
  16. <div ref="chartDom" class="charts yse-events"></div>
  17. <div class="info">
  18. <el-select
  19. v-model="value"
  20. class="select yse-events"
  21. effect="dark"
  22. popper-class="v-select-popper-ns"
  23. >
  24. <el-option
  25. v-for="item in optionsList"
  26. :key="item.value"
  27. :label="item.label"
  28. :value="item.value"
  29. />
  30. </el-select>
  31. <div class="desc" v-html="textArr[value]">
  32. </div>
  33. </div>
  34. </div>
  35. </div>
  36. </template>
  37. <script setup>
  38. import { onMounted, ref, onBeforeUnmount } from "vue";
  39. import { useStore } from "vuex";
  40. import * as echarts from "echarts";
  41. import Title from "../../../components/title";
  42. // 在组件或全局监听器中监听自定义事件
  43. function handleStorageUpdate(e) {
  44. curGardenId.value = e.detail;
  45. initData();
  46. }
  47. // 在组件或全局监听器中监听自定义事件
  48. window.addEventListener("storageChanged", handleStorageUpdate);
  49. // 组件销毁前移除监听
  50. onBeforeUnmount(() => {
  51. window.removeEventListener("storageChanged", handleStorageUpdate);
  52. });
  53. const getters = useStore().getters;
  54. const curGardenId = ref(getters.userinfo.curGardenId);
  55. let chartDom = ref(null);
  56. let myChart = null;
  57. let textArr = ref([])
  58. onMounted(() => {
  59. myChart = echarts.init(chartDom.value);
  60. myChart.setOption(options);
  61. initData();
  62. });
  63. const sData = [
  64. {
  65. name: "虫害",
  66. value: "40000",
  67. text: "当天虫害比例",
  68. },
  69. {
  70. name: "正常",
  71. value: "53000",
  72. text: "当天虫害比例",
  73. },
  74. ];
  75. //数据模型类
  76. function dataModel(name, radius, mData){
  77. let data = {
  78. name: name || "第一层环",
  79. type: "pie",
  80. z: 3,
  81. tooltip: {
  82. show: true,
  83. },
  84. center: ["50%", "45%"],
  85. radius: radius || ["24%", "30%"],
  86. hoverAnimation: false,
  87. clockWise: false,
  88. itemStyle: {
  89. normal: {
  90. color: function (params) {
  91. return colorList[params.dataIndex];
  92. },
  93. },
  94. },
  95. label: {
  96. show: false,
  97. },
  98. data: mData || sData,
  99. }
  100. return data;
  101. }
  102. const colorList = ["#FFD700", "#02EDE0"];
  103. const options = {
  104. tooltip: {
  105. trigger: "item",
  106. borderColor: "rgba(5,209,199,.5)",
  107. backgroundColor: "rgba(47, 87, 97.1)",
  108. borderWidth: 1,
  109. padding: 0,
  110. textStyle: {
  111. color: "#fff",
  112. fontSize: 11,
  113. },
  114. formatter: function (parms) {
  115. var str = `<div class='v-echarts-tooltip'>
  116. <div>${parms.data.text}</div>
  117. <span>${parms.data.name}: ${parms.percent}%</span>
  118. </div>`;
  119. return str;
  120. },
  121. },
  122. legend: {
  123. icon: "circle",
  124. bottom: "0%",
  125. textStyle: {
  126. color: "#fff",
  127. },
  128. itemWidth: 8,
  129. data: ["虫害", "正常"],
  130. },
  131. series: [
  132. // new dataModel("第四层环", ["63%", "69%"], sData),
  133. // new dataModel("第三层环", ["50%", "56%"], sData),
  134. // new dataModel("第二层环", ["37%", "43%"], sData),
  135. // new dataModel("第一层环", ["24%", "30%"], sData),
  136. ],
  137. };
  138. const initData = async () => {
  139. options.legend.data = [switchValue.value == 2 ?'病害':'虫害', "正常"]
  140. let radiusList = [["63%", "69%"],["50%", "56%"],["37%", "43%"],["24%", "30%"]]
  141. let nameList = ["第四层环","第三层环","第二层环","第一层环"]
  142. let prefixList = ["预计未来7天","当前","过去7天",""]
  143. options.series = []
  144. let texts = []
  145. VE_API.znxy.pestStatistics({gardenId:curGardenId.value,warningType:switchValue.value}).then(({data})=>{
  146. let j=0
  147. for(let i = data.length - 1; i >=0; i--){
  148. let item = data[i]
  149. let name = item.warningType == 2 ? "病害" : "虫害"
  150. texts.push(item.text)
  151. if( j!=2 ){
  152. options.series.push(new dataModel(nameList[j], radiusList[j], [{
  153. name,
  154. value: item.num7d,
  155. text: `${prefixList[j]}${name}比例`,
  156. },
  157. {
  158. name: "正常",
  159. value: item.treeCount - item.num7d+"",
  160. text: `${prefixList[j]}正常比例`,
  161. }]))
  162. j++
  163. }
  164. options.series.push(new dataModel(nameList[j], radiusList[j],[{
  165. name,
  166. value: item.num,
  167. text: `${prefixList[j]}${name}比例`,
  168. },
  169. {
  170. name: "正常",
  171. value: item.treeCount - item.num+"",
  172. text: `${prefixList[j]}正常比例`,
  173. }]))
  174. j++
  175. }
  176. textArr.value = texts
  177. myChart.clear();
  178. options && myChart.setOption(options);
  179. })
  180. };
  181. const value = ref(1);
  182. const optionsList = [
  183. {
  184. value: 0,
  185. label: "7天",
  186. },
  187. {
  188. value: 1,
  189. label: "3天",
  190. },
  191. ];
  192. const switchValue = ref(2)
  193. const handleSwitch = () =>{
  194. switchValue.value = switchValue.value == 2 ? 1 : 2;
  195. initData()
  196. }
  197. </script>
  198. <style lang="scss" scoped>
  199. .switch{
  200. display: flex;
  201. color: #FF0101;
  202. font-size: 13px;
  203. align-items: center;
  204. width: 39%;
  205. cursor: pointer;
  206. span{
  207. margin-left: 4px;
  208. }
  209. }
  210. .slot-right {
  211. width: 70%;
  212. box-sizing: border-box;
  213. display: flex;
  214. flex-direction: row;
  215. justify-content: right;
  216. align-items: center;
  217. padding-right: 12px;
  218. .btn {
  219. cursor: pointer;
  220. background: url("@/assets/img/tabs_btn3.png") no-repeat center center / 100%
  221. 100%;
  222. margin-right: 5px;
  223. color: rgba(180, 255, 251, 0.8);
  224. font-weight: bold;
  225. font-size: 15px;
  226. width: 92px;
  227. height: 32px;
  228. text-align: center;
  229. line-height: 32px;
  230. }
  231. }
  232. .content-box {
  233. width: 100%;
  234. height: calc(100% - 48px);
  235. padding: 8px 11px;
  236. box-sizing: border-box;
  237. color: #fffdfd;
  238. display: flex;
  239. justify-content: space-between;
  240. .info {
  241. width: 50%;
  242. display: flex;
  243. flex-direction: column;
  244. align-items: flex-end;
  245. .select {
  246. width: 40%;
  247. margin-bottom: 20px;
  248. ::v-deep {
  249. .el-select__wrapper {
  250. background: transparent;
  251. border: 1px solid rgba(81, 233, 240, 0.6);
  252. box-shadow: none;
  253. .el-select__placeholder {
  254. color: #b4fffb;
  255. }
  256. .el-select__caret {
  257. color: #b4fffb;
  258. }
  259. }
  260. }
  261. }
  262. }
  263. .desc {
  264. width: 100%;
  265. height: 100%;
  266. font-size: 12px;
  267. font-weight: bold;
  268. overflow: hidden;
  269. line-height: 20px;
  270. // text-overflow: ellipsis;
  271. // display: -webkit-box;
  272. // -webkit-box-orient: vertical;
  273. // -webkit-line-clamp: 5; /* 设置显示的行数 */
  274. background: url("@/assets/img/znxy/ts_bg.png") no-repeat center center /
  275. 100% 100%;
  276. box-sizing: border-box;
  277. padding: 5px;
  278. }
  279. .charts {
  280. width: 50%;
  281. height: 100%;
  282. }
  283. }
  284. </style>