index.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. <template>
  2. <div class="base-container no-events">
  3. <fnHeader showDate></fnHeader>
  4. <div class="content">
  5. <navigation @handleTab="handleTab"></navigation>
  6. <div class="left yes-events">
  7. <!-- <tool-list direction="left" :list="leftToolList" @handleActive="handleActiveLeft"></tool-list> -->
  8. <component :is="components[currentComponent]" />
  9. <!-- 箭头 -->
  10. <!-- <div class="arrow" @click="handleShrink('left')">
  11. <el-icon class="icon" color="#141414"><DArrowLeft /></el-icon>
  12. </div> -->
  13. </div>
  14. <!-- <div class="home-bottom">
  15. <div class="garden-file yes-events" :class="{ isShrink: isShrink }">
  16. <home-file></home-file>
  17. <div class="arrow" @click="handleShrink('bottom')">
  18. <el-icon class="icon" color="#141414"><DArrowLeft /></el-icon>
  19. </div>
  20. </div>
  21. </div> -->
  22. <div class="right yes-events">
  23. <div class="list adopt-list-wrap">
  24. <chart-box name="认养管理" arrow="">
  25. <el-tabs v-model="activeName" class="demo-tabs">
  26. <el-tab-pane label="认养列表" name="认养列表">
  27. <adopt-list></adopt-list>
  28. </el-tab-pane>
  29. <el-tab-pane label="客户列表" name="客户列表">
  30. <client-list></client-list>
  31. </el-tab-pane>
  32. <el-tab-pane label="认养申请" name="认养申请">
  33. <apply-list></apply-list>
  34. </el-tab-pane>
  35. <el-tab-pane label="确认地址" name="确认地址">
  36. <address-list></address-list>
  37. </el-tab-pane>
  38. </el-tabs>
  39. </chart-box>
  40. </div>
  41. <!-- <tool-list direction="right" :list="rightToolList" @handleActive="handleActiveRight"></tool-list> -->
  42. </div>
  43. <!-- 图例 -->
  44. <!-- <img class="legend yes-events" src="@/assets/images/home/legend-img.png" alt="" /> -->
  45. <div v-if="legendArr && legendArr.length" class="map-bg map-legend yes-events">
  46. <div class="item" v-for="(legend, legendI) in legendArr" :key="legendI">
  47. <span class="legend-block" :style="{background: legend.color}"></span>
  48. {{ legend.name }}
  49. </div>
  50. </div>
  51. <div v-else class="map-bg map-legend yes-events">
  52. <div class="item">
  53. <img src="@/assets/images/map/status/status-bh.png" alt="" />
  54. 病害异常
  55. </div>
  56. <div class="item">
  57. <img src="@/assets/images/map/status/status-ch.png" alt="" />
  58. 虫害异常
  59. </div>
  60. <div class="item">
  61. <img src="@/assets/images/map/status/status-zc.png" alt="" />
  62. 正常
  63. </div>
  64. <!-- <div class="item">
  65. <img src="@/assets/images/map/status/defalut-icon.png" alt="" />
  66. 无照片
  67. </div> -->
  68. </div>
  69. </div>
  70. </div>
  71. <div ref="mapRef" class="bottom-map"></div>
  72. <!-- 图片弹窗 -->
  73. <PicturePreview :imageUrl="urls" :curIndex="urlsIndex"></PicturePreview>
  74. <album-carousel></album-carousel>
  75. <PdfDialog title="果园报告"></PdfDialog>
  76. </template>
  77. <script setup>
  78. import { onMounted, onUnmounted, ref } from "vue";
  79. import config from "@/api/config.js";
  80. import timeLine from "@/components/timeLine.vue";
  81. import PicturePreview from "@/components/PicturePreview.vue";
  82. import fnHeader from "@/components/fnHeader.vue";
  83. import navigation from "@/components/navigation.vue";
  84. import chartBox from "@/components/chartBox.vue";
  85. import toolList from "@/components/toolList.vue";
  86. import fileBar from "@/components/fileBar.vue";
  87. import HomeMap from "./map/homeMap";
  88. import homePage from "./components/homePage.vue";
  89. import adoptList from "./components/adoptList.vue";
  90. import clientList from "./components/clientList.vue";
  91. import applyList from "./components/applyList.vue";
  92. import addressList from "./components/addressList.vue";
  93. import { useRouter } from "vue-router";
  94. import SamplePointLayer from "./map/samplePointLayer";
  95. import { useStore } from "vuex";
  96. import RegionLayer from "./map/regionLayer";
  97. import BlueRegionLayer from "./map/blueRegionLayer";
  98. import eventBus from "@/api/eventBus";
  99. import AlbumCarousel from "./album_compoents/albumCarousel.vue";
  100. // import compareDialog from "./album_compoents/compareDialog.vue";
  101. // import album from "./album/index.vue";
  102. import PdfDialog from "../../components/PdfDialog";
  103. let store = useStore();
  104. const components = {
  105. homePage,
  106. };
  107. //当前农场
  108. const currentFarm = {
  109. id: store.getters.userinfo.curFarmId,
  110. name: store.getters.userinfo.curFarmName,
  111. };
  112. //当前区域
  113. const currentRegion = {
  114. id: null,
  115. name: null,
  116. };
  117. let homeMap = new HomeMap();
  118. let samplePointLayer = null;
  119. let regionLayer = null;
  120. let blueRegionLayer = null;
  121. const router = useRouter();
  122. const mapRef = ref();
  123. const activeName = ref('认养列表')
  124. onMounted(() => {
  125. homeMap.initMap("POINT(113.61448114737868 23.585550924763083)", mapRef.value);
  126. // homeMap.initMap(store.getters.userinfo.location, mapRef.value);
  127. // regionLayer = new RegionLayer(homeMap.kmap.map, currentFarm, currentRegion)
  128. samplePointLayer = new SamplePointLayer(homeMap.kmap);
  129. blueRegionLayer = new BlueRegionLayer(homeMap.kmap);
  130. getYellow();
  131. // getFarmLog()
  132. //区域切换监听事件
  133. eventBus.on("area:id", areaId);
  134. //选项卡子项事件监听
  135. // eventBus.on("handleTabItem", handleTabItem);
  136. // 是否开启指标对比
  137. eventBus.on("compareTree", handleCompare)
  138. eventBus.on("clickToCompare:point", toggleCompare);
  139. });
  140. onUnmounted(() => {
  141. eventBus.off("area:id", areaId);
  142. // eventBus.off("handleTabItem", handleTabItem);
  143. eventBus.off("compareTree", handleCompare)
  144. eventBus.off("clickToCompare:point", toggleCompare);
  145. });
  146. function handleCompare(v) {
  147. isShrink.value = v
  148. if (v === false) {
  149. showCompareBtn.value = v
  150. }
  151. }
  152. const blueList = ref([]);
  153. const getBlueRegionList = (callback) => {
  154. let selectAll = undefined;
  155. if (regionId.value === 0) {
  156. selectAll = 1;
  157. }
  158. const areaId = selectAll ? undefined : regionId.value;
  159. VE_API.farm.blueRegionList({ farmId: organId.value, regionId: areaId, selectAll }).then(({ data }) => {
  160. blueList.value = data.map((item) => {
  161. let color = "rgba(255, 255, 255, 0.5)"; //失效区域
  162. if (item.status === 2) {
  163. //物候期风险
  164. // color = "rgba(63, 255, 53, 0.5)";
  165. color = "#2BFE00";
  166. }
  167. if (item.status === 3) {
  168. //生长异常
  169. // color = "rgba(255, 252, 61, 0.5)";
  170. color = "#FF7410";
  171. }
  172. if (item.status === 4) {
  173. //病虫害
  174. // color = "rgba(255, 73, 73, 0.5)";
  175. color = "#F82121";
  176. }
  177. return {
  178. ...item,
  179. color,
  180. };
  181. });
  182. blueRegionLayer.initData(blueList.value);
  183. callback && callback();
  184. });
  185. };
  186. // 图例
  187. const legendArr = ref([])
  188. const organId = ref(null);
  189. const regionId = ref(null);
  190. const tabName = ref("");
  191. const tabId = ref(0);
  192. eventBus.off("changePointLegend", toggleLegend)
  193. eventBus.on("changePointLegend", toggleLegend)
  194. function toggleLegend({colorObj}) {
  195. legendArr.value = colorObj?.list
  196. }
  197. //选项卡事件监听
  198. const handleTab = async ({ name, id, isUpdate, params, legend, colorObj }) => {
  199. eventBus.emit("changePointType", {legend, colorObj})
  200. legendArr.value = colorObj?.list
  201. console.log('name, id, isUpdate, params', name, id, isUpdate, params, legend, colorObj);
  202. tabName.value = name;
  203. tabId.value = id;
  204. if (id === 0) {
  205. getBlueRegionList(() => {
  206. if (isUpdate) {
  207. handleTabItem(params);
  208. }
  209. });
  210. } else {
  211. getFarmIndexReport(() => {
  212. if (isUpdate) {
  213. handleTabItem(params);
  214. }
  215. });
  216. }
  217. // 切换点位数据
  218. // samplePointLayer.changePointType(name, params)
  219. };
  220. //区域切换监听事件
  221. function areaId({ areaId, farmId }) {
  222. organId.value = farmId;
  223. regionId.value = areaId;
  224. samplePointLayer.initData(farmId, areaId);
  225. if (tabId.value === 0) {
  226. getBlueRegionList();
  227. } else {
  228. getFarmIndexReport();
  229. }
  230. }
  231. //选项卡子项事件监听
  232. const handleTabItem = (e) => {
  233. console.log('eeeeeeeeee', e, reportData.value);
  234. // if (reportData.value.blueZoneList) {
  235. // const index = reportData.value.blueZoneList.findIndex((item) => item.key === e);
  236. // let arr = [];
  237. // if (reportData.value.blueZoneList.length) {
  238. // arr = blueListConvert(reportData.value.blueZoneList[index].obj, index);
  239. // }
  240. // blueRegionLayer.initData(arr, "87");
  241. // }
  242. };
  243. const reportData = ref({});
  244. const blueListConvert = (data, index) => {
  245. const list = [];
  246. for (let key in data) {
  247. const filterData = reportData.value.blueZoneLegendList[index].list.filter((item) => item.val === key);
  248. const arr = data[key];
  249. arr.forEach((item) => {
  250. const listObj = blueList.value.filter((ele) => ele.blueZoneCode === item);
  251. const updateList = listObj.map((ele) => {
  252. return {
  253. ...ele,
  254. level: key,
  255. name: filterData[0].name,
  256. color: filterData[0].color,
  257. };
  258. });
  259. list.push(...updateList);
  260. });
  261. }
  262. return list;
  263. };
  264. const getFarmIndexReport = (callback) => {
  265. // const params = { farmId:organId.value,regionId:regionId.value, type: tabName.value };
  266. // VE_API.farm.farmIndexReport(params).then(({data,code}) => {
  267. // if (code === 0) {
  268. // reportData.value = data || {};
  269. // let arr = []
  270. // if(data.blueZoneList.length){
  271. // arr = blueListConvert(data.blueZoneList[0].obj,0)
  272. // }
  273. // blueRegionLayer.initData(arr,'87')
  274. // callback && callback()
  275. // }
  276. // });
  277. };
  278. const indicatorChartData = ref({});
  279. const blueZone = ref("ws0y1meyhxp4");
  280. const getFarmLog = () => {
  281. console.log("getfarmlog");
  282. const params = {
  283. id: null,
  284. farmId: 766,
  285. blueZone: blueZone.value,
  286. };
  287. VE_API.warning.fetchFarmLog(params).then(({ data }) => {
  288. indicatorChartData.value = data || {};
  289. eventBus.emit("chart:updateOption", data);
  290. });
  291. };
  292. const urls = ref([]);
  293. const urlsIndex = ref(0);
  294. const getYellow = () => {
  295. VE_API.home.getYellowList().then((res) => {
  296. // urls.value = res.data.map(item =>{
  297. // return {
  298. // ...item,
  299. // imgPath:config.base_img_url2+item.cloudFilename
  300. // }
  301. // })
  302. // urls.value = [
  303. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-07.jpg",
  304. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-08.jpg",
  305. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-09.jpg",
  306. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-10.jpg",
  307. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-11.jpg",
  308. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-12.jpg",
  309. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-13.jpg",
  310. // ]
  311. });
  312. };
  313. const btnIndex = ref(null);
  314. const btnName = ref("");
  315. const handleBtn = (e) => {
  316. btnName.value = "";
  317. btnIndex.value = e;
  318. eventBus.emit("clear:area");
  319. samplePointLayer.updateAreaStatus(e === 0 ? true : false);
  320. regionLayer.resetData();
  321. samplePointLayer.resetPoint();
  322. };
  323. //点击果园日志
  324. const handleSelectArea = () => {
  325. btnName.value = "";
  326. btnIndex.value = null;
  327. eventBus.emit("clear:area");
  328. regionLayer.resetData();
  329. samplePointLayer.resetPoint();
  330. samplePointLayer.updateAreaStatus(true);
  331. };
  332. //农事点击高亮
  333. const act = ref(null);
  334. const handleAct = (v) => {
  335. act.value = v;
  336. samplePointLayer.resetPoint();
  337. if (v === 1) {
  338. regionLayer.selectAreaMultiple([
  339. { value: 2, color: "blue" },
  340. { value: 4, color: "blue1" },
  341. { value: 5, color: "blue2" },
  342. { value: 7, color: "blue" },
  343. { value: 13, color: "blue2" },
  344. ]);
  345. }
  346. if (v === 2) {
  347. regionLayer.selectAreaMultiple([
  348. { value: 1, color: "blue" },
  349. { value: 2, color: "blue1" },
  350. { value: 9, color: "blue2" },
  351. { value: 12, color: "blue2" },
  352. ]);
  353. }
  354. };
  355. //柱状图点击事件监听
  356. eventBus.on("echart:barClick", (e) => {
  357. btnName.value = "";
  358. btnIndex.value = null;
  359. eventBus.emit("clear:area");
  360. samplePointLayer.updateAreaStatus(false);
  361. const arr = ["花穗伸长", "啃食虫害", "毛毡病"];
  362. const isDraw = arr.includes(e);
  363. const index = arr.indexOf(e);
  364. if (isDraw) {
  365. if (index === 0) {
  366. regionLayer.selectAreaMultiple([
  367. { value: 0, color: "green" },
  368. { value: 1, color: "green" },
  369. { value: 2, color: "green" },
  370. { value: 3, color: "green1" },
  371. { value: 4, color: "green1" },
  372. { value: 5, color: "green2" },
  373. { value: 6, color: "green1" },
  374. { value: 7, color: "green2" },
  375. { value: 8, color: "green2" },
  376. { value: 9, color: "green" },
  377. { value: 10, color: "green" },
  378. { value: 11, color: "green1" },
  379. { value: 12, color: "green2" },
  380. { value: 13, color: "green" },
  381. { value: 14, color: "green2" },
  382. ]);
  383. } else if (index === 1) {
  384. regionLayer.selectAreaMultiple([{ value: 6, color: "red" }]);
  385. } else {
  386. regionLayer.selectAreaMultiple([
  387. { value: 12, color: "red2" },
  388. { value: 10, color: "red" },
  389. { value: 1, color: "red" },
  390. ]);
  391. }
  392. }
  393. });
  394. //黄板点击事件监听
  395. eventBus.on("click:yellowBlock", (e) => {
  396. const arr = ["113.61396985128522", "113.61390710255375", "113.61491218688275"];
  397. if (arr[0] == e) {
  398. urls.value = ["HB-ws0y1menggxv"];
  399. urlsIndex.value = 0;
  400. }
  401. if (arr[1] == e) {
  402. urls.value = ["HB-ws0y1mg0pvd"];
  403. urlsIndex.value = 3;
  404. }
  405. if (arr[2] == e) {
  406. urls.value = ["HB-ws0y1mg9wpcp"];
  407. urlsIndex.value = 6;
  408. }
  409. eventBus.emit("dialog:show", true);
  410. });
  411. const showPoint = ref(true);
  412. const showType = ref("point");
  413. eventBus.on("click:updateArea", (e) => {
  414. blueZone.value = e.value;
  415. btnName.value = e.name;
  416. regionLayer.selectArea(e.name * 1 === 0 ? 0 : e.name * 1 - 1, "blue");
  417. //getFarmLog()
  418. });
  419. const currentComponent = ref("homePage");
  420. // 跳转果园档案
  421. const toFilePage = () => {
  422. router.push("/garden-file");
  423. };
  424. // 地图图例
  425. const showMapLegend = ref(true);
  426. const handleLegend = (e) => {
  427. blueRegionLayer.toggleLayer(e);
  428. };
  429. // 对比
  430. const compareData = ref([]);
  431. const showCompareBtn = ref(false);
  432. function toggleCompare(arr) {
  433. // eventBus.emit("clickToCompare:point",{farmId:fs.get("farmId"),sampleId:fs.get("sampleId"), data: fs.getProperties()})
  434. compareData.value = [];
  435. arr.map((fs) => {
  436. compareData.value.push({ farmId: fs.get("farmId"), sampleId: fs.get("id"), data: fs.getProperties() });
  437. });
  438. console.log("compareData", compareData.value);
  439. showCompareBtn.value = compareData.value.length > 1 ? true : false;
  440. }
  441. function showCompare() {
  442. eventBus.emit("showCompareDialog", compareData.value);
  443. }
  444. const isShrink = ref(false);
  445. const isLeftShrink = ref(false);
  446. const isRightShrink = ref(false);
  447. const handleShrink = (position) => {
  448. switch (position) {
  449. case "bottom":
  450. isShrink.value = !isShrink.value;
  451. break;
  452. case "left":
  453. isLeftShrink.value = !isLeftShrink.value;
  454. break;
  455. case "rigth":
  456. isRightShrink.value = !isRightShrink.value;
  457. break;
  458. }
  459. };
  460. const photoList = ref([
  461. {key: "病虫", statement: "病虫 2025年02月19日,发现毛毡病异常1级"},
  462. {key: "异常", statement: "2025年03月17日,发现花量大异常3级"},
  463. {key: "营养", statement: "无营养异常"},
  464. ]);
  465. </script>
  466. <style lang="scss" scoped>
  467. .base-container {
  468. width: 100%;
  469. height: 100vh;
  470. color: #fff;
  471. position: absolute;
  472. box-sizing: border-box;
  473. z-index: 1;
  474. .content {
  475. width: 100%;
  476. height: calc(100% - 74px - 48px);
  477. display: flex;
  478. justify-content: space-between;
  479. box-sizing: border-box;
  480. .left,
  481. .right {
  482. width: 376px;
  483. height: 100%;
  484. margin-top: 10px;
  485. box-sizing: border-box;
  486. display: flex;
  487. position: relative;
  488. }
  489. .left {
  490. background: #101010;
  491. border-radius: 4px;
  492. border: 1px solid #444444;
  493. margin-left: 25px;
  494. .arrow {
  495. position: absolute;
  496. right: -16px;
  497. top: calc(50% - 40px);
  498. background: #fff;
  499. width: 16px;
  500. height: 80px;
  501. line-height: 80px;
  502. border-radius: 0 5px 5px 0;
  503. text-align: center;
  504. cursor: pointer;
  505. }
  506. }
  507. .right {
  508. width: 376px;
  509. margin-right: 25px;
  510. .adopt-list-wrap {
  511. ::v-deep {
  512. .el-tabs__item {
  513. color: #727272;
  514. }
  515. .el-tabs__active-bar {
  516. background-color: #FFFFFF;
  517. height: 1px;
  518. }
  519. .el-tabs__item.is-active {
  520. color: #fff;
  521. }
  522. .el-tabs__nav-wrap:after {
  523. height: 1px;
  524. background-color: rgba(127, 127, 127, 0.3);
  525. }
  526. .el-tabs__nav {
  527. left: 50%;
  528. transform: translateX(-50%) !important;
  529. }
  530. }
  531. }
  532. .list {
  533. width: 100%;
  534. height: 100%;
  535. overflow: auto;
  536. .btn-wrap {
  537. width: 100%;
  538. height: 25px;
  539. line-height: 25px;
  540. margin: 10px 0;
  541. display: flex;
  542. align-items: center;
  543. justify-content: space-between;
  544. div {
  545. width: 48%;
  546. height: 100%;
  547. color: #ffd489;
  548. border: 1px solid rgba(255, 213, 137, 0.6);
  549. border-radius: 2px;
  550. text-align: center;
  551. font-size: 12px;
  552. cursor: pointer;
  553. &.active {
  554. background: #ffd489;
  555. color: #000;
  556. }
  557. }
  558. }
  559. .img-box {
  560. width: 100%;
  561. height: calc(100% - 35px);
  562. overflow: auto;
  563. }
  564. .img-box1 {
  565. width: 100%;
  566. height: calc(100% - 10px);
  567. overflow: auto;
  568. margin-top: 10px;
  569. }
  570. .img-box2 {
  571. width: 100%;
  572. height: calc(100% - 45px);
  573. overflow: auto;
  574. margin-top: 10px;
  575. }
  576. img {
  577. width: 100%;
  578. height: auto;
  579. object-fit: cover;
  580. margin-bottom: 12px;
  581. cursor: pointer;
  582. }
  583. .mt {
  584. margin-top: -12px;
  585. }
  586. }
  587. }
  588. .overflow {
  589. overflow: auto;
  590. }
  591. .home-bottom {
  592. display: flex;
  593. align-items: flex-end;
  594. width: calc(100% - 60px - 376px * 2);
  595. height: 152px;
  596. align-self: flex-end;
  597. .time-wrap {
  598. height: 85px;
  599. }
  600. .fly-icon {
  601. width: 148px;
  602. height: 100%;
  603. margin-left: 27px;
  604. }
  605. .log-box {
  606. height: 34%;
  607. width: calc(100% - 340px - 28px);
  608. margin-right: 28px;
  609. .box-name {
  610. width: 89px;
  611. height: 22px;
  612. text-align: center;
  613. line-height: 22px;
  614. border-radius: 20px;
  615. margin: 10px 0 5px 6px;
  616. cursor: pointer;
  617. background: linear-gradient(0deg, #bba269 0%, #3d3523 100%);
  618. }
  619. .log-content {
  620. font-size: 12px;
  621. line-height: 1.5;
  622. padding: 0 18px;
  623. }
  624. .chart-wrap {
  625. width: 100%;
  626. height: calc(100% - 50px);
  627. .line {
  628. margin-top: 10px;
  629. margin-bottom: 12px;
  630. }
  631. img {
  632. width: 100%;
  633. margin-bottom: 10px;
  634. }
  635. }
  636. }
  637. .garden-file {
  638. position: relative;
  639. top: 10px;
  640. // height: 30%;
  641. // min-height: 210px;
  642. // width: 640px;
  643. transition: all 0.3s;
  644. width: 800px;
  645. height: 320px;
  646. overflow: hidden;
  647. &.isShrink {
  648. height: 66px;
  649. width: 450px;
  650. overflow: hidden;
  651. .arrow {
  652. .icon {
  653. transform: rotate(90deg);
  654. }
  655. }
  656. }
  657. .arrow {
  658. position: absolute;
  659. right: 56px;
  660. top: 36px;
  661. background: #fff;
  662. height: 16px;
  663. width: 80px;
  664. line-height: 16px;
  665. border-radius: 0 0 5px 5px;
  666. text-align: center;
  667. cursor: pointer;
  668. .icon {
  669. transform: rotate(270deg);
  670. }
  671. }
  672. }
  673. .file-box {
  674. height: 25%;
  675. min-height: 210px;
  676. width: 340px;
  677. position: relative;
  678. img {
  679. width: 100%;
  680. margin-top: 12px;
  681. }
  682. .arrow-icon {
  683. top: -32px;
  684. left: 50%;
  685. position: absolute;
  686. background: #fff;
  687. width: 16px;
  688. height: 80px;
  689. line-height: 80px;
  690. border-radius: 5px 0 0 5px;
  691. text-align: center;
  692. transform: translateX(-50%) rotate(270deg);
  693. }
  694. .edit-btn {
  695. padding: 2px 24px;
  696. background: #ffd489;
  697. border-radius: 4px;
  698. color: #000;
  699. }
  700. }
  701. }
  702. .legend {
  703. position: fixed;
  704. bottom: 8px;
  705. right: 64px;
  706. // width: 525px;
  707. height: 20px;
  708. }
  709. .map-bg {
  710. position: fixed;
  711. z-index: 2;
  712. background: rgba(35, 35, 35, 0.8);
  713. border-radius: 18px;
  714. padding: 7px 16px;
  715. right: 460px;
  716. }
  717. .map-btn {
  718. top: 19px;
  719. cursor: pointer;
  720. }
  721. .map-legend {
  722. bottom: 34px;
  723. .item {
  724. display: flex;
  725. align-items: center;
  726. font-size: 14px;
  727. img {
  728. width: 16px;
  729. margin-right: 6px;
  730. }
  731. .legend-block {
  732. width: 16px;
  733. height: 16px;
  734. box-sizing: border-box;
  735. border-radius: 50%;
  736. border: 2px solid #fff;
  737. margin-right: 6px;
  738. }
  739. }
  740. .legend-title {
  741. border-bottom: 1px solid rgba(102, 102, 102, 0.35);
  742. }
  743. .item + .item {
  744. padding-top: 10px;
  745. }
  746. }
  747. }
  748. }
  749. .bottom-map {
  750. width: 100%;
  751. height: 100vh;
  752. position: absolute;
  753. z-index: 0;
  754. }
  755. .compare-start-btn {
  756. position: absolute;
  757. z-index: 2;
  758. left: 50%;
  759. transform: translateX(-50%);
  760. cursor: pointer;
  761. bottom: 106px;
  762. // right: 445px;
  763. img {
  764. height: 55px;
  765. }
  766. }
  767. </style>
  768. <style lang="less">
  769. .file-wrap {
  770. &.map-file {
  771. width: 367px;
  772. position: relative;
  773. background: url("@/assets/images/home/file-bg.png") no-repeat top center / 100% 100%;
  774. margin-left: 12px;
  775. padding: 12px;
  776. .file-title {
  777. font-size: 20px;
  778. color: #ffd489;
  779. .tag {
  780. border: 1px solid #FFD489;
  781. border-radius: 4px;
  782. font-size: 12px;
  783. display: inline-block;
  784. width: 44px;
  785. height: 20px;
  786. text-align: center;
  787. line-height: 18px;
  788. margin-left: 8px;
  789. padding: 1px 4px;
  790. }
  791. }
  792. .overview-file {
  793. padding-top: 20px;
  794. .box-title {
  795. font-size: 16px;
  796. padding-left: 13px;
  797. margin-bottom: 16px;
  798. position: relative;
  799. display: flex;
  800. justify-content: space-between;
  801. color: #fff;
  802. &::before {
  803. content: "";
  804. position: absolute;
  805. left: 0;
  806. top: 3px;
  807. width: 3px;
  808. height: 16px;
  809. background: #fff;
  810. border-radius: 11px;
  811. }
  812. }
  813. .title {
  814. color: #f3c11d;
  815. font-size: 16px;
  816. font-family: "PangMenZhengDao";
  817. margin-bottom: 20px;
  818. .big {
  819. width: 13px;
  820. height: 13px;
  821. margin: -10px 0 0 4px;
  822. }
  823. .small {
  824. width: 7px;
  825. height: 7px;
  826. margin-left: -3px;
  827. }
  828. }
  829. .base-data {
  830. background: rgba(207, 207, 207, 0.1);
  831. border-radius: 4px;
  832. padding: 6px 0;
  833. display: flex;
  834. .base-item {
  835. flex: 1;
  836. text-align: center;
  837. .label {
  838. font-size: 12px;
  839. color: #666666;
  840. }
  841. .value {
  842. padding-top: 2px;
  843. font-size: 16px;
  844. color: #ffffff;
  845. }
  846. }
  847. .base-item + .base-item {
  848. border-left: 1px solid rgba(102, 102, 102, 0.42);
  849. }
  850. }
  851. .list {
  852. margin-top: 15px;
  853. width: max-content;
  854. font-size: 14px;
  855. .list-item {
  856. color: #bbbbbb;
  857. display: flex;
  858. margin-bottom: 8px;
  859. .list-name {
  860. color: #f3c11d;
  861. margin-right: 6px;
  862. img {
  863. width: 17px;
  864. height: 13px;
  865. }
  866. }
  867. }
  868. }
  869. }
  870. .overview-file + .overview-file {
  871. margin-top: 8px;
  872. }
  873. .box-wrap {
  874. display: flex;
  875. .box-item {
  876. // flex: 1;
  877. min-width: 109px;
  878. display: flex;
  879. flex-direction: column;
  880. justify-content: center;
  881. align-items: center;
  882. padding: 6px;
  883. box-sizing: border-box;
  884. background: rgba(207, 207, 207, 0.1);
  885. border-radius: 4px;
  886. border: 1px solid rgba(207, 207, 207, 0.1);
  887. cursor: pointer;
  888. .item-name {
  889. font-size: 12px;
  890. color: #666666;
  891. width: max-content;
  892. }
  893. .item-val {
  894. font-size: 18px;
  895. color: #fff;
  896. width: max-content;
  897. padding-top: 3px;
  898. }
  899. &.active {
  900. background: rgba(255, 212, 137, 0.16);
  901. border: 1px solid #ffd489;
  902. .item-name {
  903. color: #bbbbbb;
  904. }
  905. }
  906. }
  907. .box-item + .box-item {
  908. margin-left: 8px;
  909. }
  910. }
  911. }
  912. }
  913. </style>