Index.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <template>
  2. <div class="map-ditu">
  3. <Tmap ref="map" :maplist="maplist" @feature-click="featureClick"></Tmap>
  4. <div class="ledata">
  5. <selecttree placeholder="请选择上级单位" :list="parentOpt" type="1" v-model="companyCode" @change="parentChange"
  6. :defaultParentProps="{
  7. children: 'children',
  8. label: 'companyName',
  9. value: 'codeNumber',
  10. }">
  11. </selecttree>
  12. <p>
  13. <span class="SpText">风场总数:</span>{{ totalList.fieldSumNumber }} 个
  14. </p>
  15. <p>
  16. <span class="SpText">已分析风场:</span>{{ totalList.analysisFinishNumber }} 个
  17. </p>
  18. <p>
  19. <span class="SpText">未分析风场:</span>{{ totalList.analysisUnFinishedNumber }} 个
  20. </p>
  21. <p>
  22. <span class="SpText">风机数量:</span>{{ totalList.engineGroupNumber }} 个
  23. </p>
  24. <p>
  25. <span class="SpText">风机状态:</span>
  26. <span class="red"></span>
  27. <span class="yellow"></span>
  28. <span class="green"></span>
  29. </p>
  30. <el-switch v-model="value1" active-text="显示" inactive-text="隐藏" @change="handleSwitchChange">
  31. </el-switch>
  32. </div>
  33. <Rightdata v-show="ShowRi" class="ridata"></Rightdata>
  34. <router-view></router-view>
  35. </div>
  36. </template>
  37. <script>
  38. import selecttree from "../../../components/selecttree.vue";
  39. import {
  40. getCompanyFieldNumberVo,
  41. getSysOrganizationAuthTreeByRoleId,
  42. } from "@/api/ledger.js";
  43. import Tmap from "@/components/map";
  44. import Rightdata from "./component/rightdata.vue";
  45. export default {
  46. name: "Index",
  47. components: {
  48. Tmap,
  49. Rightdata,
  50. selecttree,
  51. },
  52. data() {
  53. return {
  54. ShowRi: true,
  55. treeval: "",
  56. value1: true,
  57. treeval: "", // 绑定的输入框值
  58. showTree: false, // 控制树列表显示
  59. treeData: [
  60. // 树列表数据,根据实际需求自行替换
  61. {
  62. id: 1,
  63. label: "Node 1",
  64. children: [
  65. {
  66. id: 2,
  67. label: "Node 1-1",
  68. },
  69. ],
  70. },
  71. {
  72. id: 3,
  73. label: "Node 2",
  74. },
  75. ],
  76. maplist: [
  77. // { point: [116.4074, 39.9042], val: "1" },
  78. // { point: [104.0657, 30.6595], val: "2" },
  79. // { point: [108.9402, 34.3416], val: "3" },
  80. ],
  81. totalList: [],
  82. parentOpt: [],
  83. companyCode: "",
  84. };
  85. },
  86. created() {
  87. this.GETtree();
  88. this.GETtotal();
  89. },
  90. mounted() {
  91. //模拟地图上的点位
  92. const data = this.maplist;
  93. // data.forEach((element) => {
  94. // console.log(element);
  95. // // this.$refs.map.addMarker({ point: [116.40740,39.90420], val: "1" });
  96. // });
  97. },
  98. methods: {
  99. // 获取总数
  100. GETtotal() {
  101. getCompanyFieldNumberVo().then((res) => {
  102. this.totalList = res.data;
  103. });
  104. },
  105. // 获取企业数
  106. async GETtree() {
  107. const res = await getSysOrganizationAuthTreeByRoleId();
  108. const treedata = res.data;
  109. const processedData = this.processTreeData(treedata);
  110. this.parentOpt = processedData;
  111. },
  112. //过滤数据
  113. processTreeData(treeData) {
  114. const processedData = [];
  115. function processNode(node) {
  116. if (node.codeType === "field") {
  117. node.companyName = node.fieldName;
  118. }
  119. if (node.children && node.children.length > 0) {
  120. node.children.forEach((child) => {
  121. processNode(child);
  122. });
  123. }
  124. }
  125. treeData.forEach((root) => {
  126. processNode(root);
  127. processedData.push(root);
  128. });
  129. return processedData;
  130. },
  131. parseCoordinates(input) {
  132. if (input && typeof input === "string") {
  133. return input.split(",").map(Number);
  134. }
  135. return [];
  136. },
  137. parentChange(data) {
  138. //data为当前选中对象
  139. this.$refs.map.clearMarkers();
  140. this.maplist = data;
  141. console.log(data, "parentChange");
  142. if (data.codeType === "field") {
  143. if (this.parseCoordinates(data.longitudeAndLatitudeString).length > 0) {
  144. this.$refs.map.addMarker({
  145. point: this.parseCoordinates(data.longitudeAndLatitudeString),
  146. val: data.analysisState,
  147. ...data
  148. });
  149. return;
  150. }
  151. this.$refs.map.clearMarkers();
  152. } else {
  153. const dataMapList = data.children;
  154. dataMapList.forEach((element) => {
  155. console.log(element);
  156. if (
  157. this.parseCoordinates(element.longitudeAndLatitudeString).length > 0 && element.codeType === "field"
  158. ) {
  159. this.$refs.map.addMarker({
  160. point: this.parseCoordinates(element.longitudeAndLatitudeString),
  161. val: element.analysisState,
  162. ...element
  163. });
  164. return;
  165. }
  166. this.$refs.map.clearMarkers();
  167. });
  168. }
  169. },
  170. featureClick(data) {
  171. console.log(data, "featureClick");
  172. const val = data.val;
  173. if (val === "-1" || val === -1) {
  174. this.$message.error("当前风场未进行分析");
  175. } else if (val === "0" || val === 0) {
  176. this.$message({
  177. message: "当前风场正在分析中",
  178. type: "warning",
  179. });
  180. } else if (val === "1" || val === 1) {
  181. this.$router.push({
  182. path: "cockpitManage/electronic-map",
  183. query: {
  184. fieldCode: data.codeNumber,
  185. },
  186. });
  187. }
  188. },
  189. handleSwitchChange() {
  190. this.ShowRi = !this.ShowRi;
  191. },
  192. },
  193. };
  194. </script>
  195. <style lang="scss" scoped>
  196. .map-ditu {
  197. // min-width: 86.9vw;
  198. // max-width: 94.9vw;
  199. height: 93vh;
  200. position: relative;
  201. }
  202. .ridata {
  203. position: absolute;
  204. top: 20px;
  205. right: 20px;
  206. }
  207. .ledata {
  208. font-size: 14px;
  209. width: 300px;
  210. position: absolute;
  211. top: 20px;
  212. left: 60px;
  213. background: #008080;
  214. padding: 10px;
  215. color: #fff;
  216. border-radius: 5px;
  217. p {
  218. line-height: 24px;
  219. .SpText {
  220. display: inline-block;
  221. width: 90px;
  222. text-align: right;
  223. }
  224. .red,
  225. .yellow,
  226. .green {
  227. display: inline-block;
  228. width: 30px;
  229. height: 12px;
  230. margin-right: 5px;
  231. }
  232. .red {
  233. background-color: #e16757;
  234. }
  235. .yellow {
  236. background-color: #eecb5f;
  237. }
  238. .green {
  239. background-color: #7ecf51;
  240. }
  241. }
  242. }
  243. .Showtree {
  244. position: absolute;
  245. top: 55px;
  246. left: 10px;
  247. width: 280px;
  248. }
  249. </style>