You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

2159 lines
57 KiB

  1. <template>
  2. <div class="pages">
  3. <!-- 头部导航菜单以及筛选菜单 -->
  4. <header class="header">
  5. <!-- 导航菜单 -->
  6. <div class="head-top">
  7. <div class="nav-box">
  8. <div
  9. class="nav-box-item"
  10. v-for="(data, index) in headList"
  11. :key="data.title + index"
  12. :class="{ active: headIndex == data.title }"
  13. @click="selectNav(data)"
  14. v-show="data.show"
  15. >
  16. <img
  17. v-show="headIndex == data.title"
  18. class="nav-box-item-img"
  19. src="/img/bidata/lsideActive.png"
  20. alt=""
  21. />
  22. {{ data.title }}
  23. <img
  24. v-show="headIndex == data.title"
  25. class="nav-box-item-img"
  26. src="/img/bidata/rsideActive.png"
  27. alt=""
  28. />
  29. </div>
  30. </div>
  31. <div class="back" @click="backHome">回到首页</div>
  32. </div>
  33. <!-- 筛选菜单 -->
  34. <div class="head-bottom">
  35. <div class="head-box">
  36. <span class="text">接待时间</span>
  37. <div class="timer">
  38. <div
  39. class="timer-item"
  40. v-for="(data, index) in dateSelect"
  41. :key="data.title + index"
  42. :class="{ active: dateSelectIndex == data.value }"
  43. @click="timerClick(data.value)"
  44. >
  45. {{ data.title }}
  46. </div>
  47. <el-date-picker
  48. class="little"
  49. value-format="yyyy-MM-dd"
  50. v-model="time"
  51. type="daterange"
  52. range-separator="-"
  53. start-placeholder="开始日期"
  54. end-placeholder="结束日期"
  55. @change="timerChange"
  56. >
  57. </el-date-picker>
  58. </div>
  59. <span class="text" style="margin-left: 32px">公司</span>
  60. <el-select
  61. class="company"
  62. v-model="companyValue"
  63. placeholder="请选择"
  64. clearable
  65. filterable
  66. @change="changeCompany"
  67. :popper-append-to-body="false"
  68. >
  69. <el-option
  70. v-for="item in companyOptions"
  71. :key="item.orgCode"
  72. :label="item.orgName"
  73. :value="item.orgCode"
  74. >
  75. </el-option>
  76. </el-select>
  77. <template v-if="showSelect('接待分析')">
  78. <span class="text" style="margin-left: 32px">项目</span>
  79. <el-select
  80. class="company"
  81. v-model="projectValue"
  82. placeholder="请选择"
  83. :popper-append-to-body="false"
  84. >
  85. <el-option
  86. v-for="item in projectOptions"
  87. :key="item.label"
  88. :label="item.label"
  89. :value="item.value"
  90. >
  91. </el-option>
  92. </el-select>
  93. </template>
  94. <template v-if="showSelect('案场排名')">
  95. <span class="text" style="margin-left: 32px">排名类型</span>
  96. <el-select
  97. class="company"
  98. v-model="dimensionType"
  99. placeholder="请选择"
  100. :popper-append-to-body="false"
  101. >
  102. <el-option
  103. v-for="item in rankingTypeList"
  104. :key="item.title"
  105. :label="item.title"
  106. :value="item.value"
  107. :disabled="item.disabled"
  108. >
  109. </el-option>
  110. </el-select>
  111. <span class="text" style="margin-left: 32px">排名规则</span>
  112. <el-select
  113. class="company"
  114. v-model="orderBy"
  115. placeholder="请选择"
  116. :popper-append-to-body="false"
  117. >
  118. <el-option
  119. v-for="item in ruleTypeList"
  120. :key="item.title"
  121. :label="item.title"
  122. :value="item.value"
  123. >
  124. </el-option>
  125. </el-select>
  126. </template>
  127. <div class="search">
  128. <el-button type="primary" @click="initPage">查询</el-button>
  129. </div>
  130. </div>
  131. </div>
  132. </header>
  133. <!-- 中间部分 -->
  134. <section v-if="headIndex == '实时总览'" class="bodys">
  135. <!-- 柱状图 -->
  136. <div class="items lside">
  137. <div
  138. class="item-item"
  139. v-for="(data, index) in lsideDataList"
  140. :key="data.title + index"
  141. >
  142. <titles :title="data.title">
  143. <div class="rsidebox" slot="rside">
  144. <div
  145. :class="{ active: data.activeName == data.params }"
  146. @click="
  147. (data.activeName = data.params),
  148. getFormatter(data.params, data.title)
  149. "
  150. class="asd"
  151. >
  152. 按项目
  153. </div>
  154. <div
  155. :class="{ active: data.activeName == data.params1 }"
  156. @click="
  157. (data.activeName = data.params1),
  158. getFormatter(data.params1, data.title)
  159. "
  160. class="asd"
  161. >
  162. 按城市
  163. </div>
  164. </div>
  165. </titles>
  166. <div
  167. v-if="data.activeName == data.params"
  168. class="echarts"
  169. :id="data.params"
  170. ></div>
  171. <div
  172. v-if="data.activeName == data.params1"
  173. class="echarts"
  174. :id="data.params1"
  175. ></div>
  176. </div>
  177. </div>
  178. <!-- 中间展示 -->
  179. <div class="items middle">
  180. <!-- 第一部分 -->
  181. <div class="items-top">
  182. <p class="title">待处理</p>
  183. <div class="item-box">
  184. <!-- // background-size: 168px 168px;
  185. // background-position: center; -->
  186. <div
  187. class="item-box-item"
  188. v-for="(data, index) in stayHandleList"
  189. @click="showDialog(data)"
  190. :key="data.img + index"
  191. :style="{
  192. background: `url(${data.img}) no-repeat`,
  193. backgroundSize: '168px 168px',
  194. backgroundPosition: 'center',
  195. }"
  196. >
  197. <div class="num" :style="{ color: data.fontColor }">
  198. {{ data.data || 0 }}
  199. </div>
  200. <div class="item-title">{{ data.title }}</div>
  201. </div>
  202. </div>
  203. </div>
  204. <!-- 第二部分 -->
  205. <div class="item-btm">
  206. <img
  207. class="jiedailiang"
  208. src="/img/bidata/jiedailiang@2x.png"
  209. alt=""
  210. />
  211. <img class="bgdsada" src="/img/bidata/bgdsada@x2.png" alt="" />
  212. <div class="numberoftimes">
  213. <img
  214. class="numberoftimes-img"
  215. src="/img/bidata/weu@2x.png"
  216. alt=""
  217. />
  218. <div class="numberoftimes-box">
  219. <span class="cishu">{{ receptionCount }}</span>
  220. <span class="ci">次</span>
  221. </div>
  222. </div>
  223. <div class="ibox">
  224. <div
  225. class="ibox-item"
  226. v-for="(data, index) in jiedaiList"
  227. @click="showDialog(data)"
  228. :key="data.bgImg + index"
  229. :style="{
  230. background: `url(${data.bgImg}) no-repeat`,
  231. backgroundSize: data.unit ? '112px 112px' : '148px 108px',
  232. backgroundPosition: 'center',
  233. }"
  234. >
  235. <div
  236. class="num"
  237. :style="{
  238. width: data.unit ? '112px' : '148px',
  239. height: data.unit ? '112px' : '108px',
  240. }"
  241. >
  242. {{ data.data || 0 }}{{ data.unit || "" }}
  243. </div>
  244. <div class="title">{{ data.title }}</div>
  245. </div>
  246. </div>
  247. </div>
  248. <!-- 第三部分 -->
  249. <div class="item-mi">
  250. <div class="item-item lside">
  251. <titles title="接待趋势"></titles>
  252. <div class="echarts" id="tendencyData1"></div>
  253. </div>
  254. <div class="item-item rside">
  255. <titles title="销讲执行趋势"></titles>
  256. <div class="echarts" id="tendencyData2"></div>
  257. </div>
  258. </div>
  259. </div>
  260. <!-- 饼状图 -->
  261. <div class="items rside">
  262. <div
  263. class="item-item"
  264. v-for="(data, index) in rsideDataList"
  265. :key="data.params + index"
  266. >
  267. <titles :title="data.title"></titles>
  268. <div class="echarts" :id="data.params"></div>
  269. </div>
  270. </div>
  271. </section>
  272. <section class="caseRanking" v-if="headIndex == '案场排名'">
  273. <div class="head-boxs">
  274. <div
  275. class="head-box-items"
  276. v-for="(data, index) in caseRankingList"
  277. :key="data.title + index + data.unit"
  278. >
  279. <div class="t">{{ data.title }}</div>
  280. <div class="b">
  281. <p class="lside">
  282. <span class="resultA">{{ data.resultA }}</span>
  283. <span class="unit">{{ data.unit }}</span>
  284. </p>
  285. <p class="rside">
  286. <img
  287. v-if="data.resultB > 0"
  288. class="r-img"
  289. src="/img/indexIcon/indexCardUp.png"
  290. alt=""
  291. />
  292. <img
  293. v-if="data.resultB < 0"
  294. class="r-img"
  295. src="/img/indexIcon/indexCardDown.png"
  296. alt=""
  297. />
  298. <span :class="{ up: data.resultB > 0 }" v-if="data.resultB > 0"
  299. >+{{ data.resultB }}</span
  300. >
  301. <span
  302. :class="{ down: data.resultB < 0 }"
  303. v-if="data.resultB < 0"
  304. >{{ data.resultB }}</span
  305. >
  306. <!-- <span v-if="data.resultB == 0">{{ data.resultB }}</span> -->
  307. </p>
  308. </div>
  309. </div>
  310. </div>
  311. <div class="body-box">
  312. <div
  313. class="body-box-item"
  314. v-for="(data, index) in rankingEchartsBarList"
  315. :key="data.params + index"
  316. >
  317. <titles :title="data.title"></titles>
  318. <div class="echarts" :id="data.params"></div>
  319. </div>
  320. </div>
  321. </section>
  322. <el-dialog
  323. class="dialogtips"
  324. :title="dialogTitle"
  325. :visible.sync="dialogVisible"
  326. width="800px"
  327. :before-close="handleClose"
  328. >
  329. <el-table
  330. :data="tableData"
  331. height="363px"
  332. :style="{ background: '#0B1F53', border: 'none' }"
  333. :header-cell-style="{
  334. backgroundColor: '#0B1F53',
  335. color: '#34DBFC',
  336. fontSize: '14px',
  337. border: 'none',
  338. fontWeight: '600',
  339. }"
  340. :row-class-name="tableRowClassName"
  341. >
  342. <el-table-column
  343. v-for="(data, index) in tableNameList"
  344. :key="data.showParams + index"
  345. :property="data.showParams"
  346. :label="data.showTitle"
  347. ></el-table-column>
  348. </el-table>
  349. <el-pagination
  350. @size-change="handleSizeChange"
  351. @current-change="handleCurrentChange"
  352. :current-page="current"
  353. :page-sizes="[10, 50, 100]"
  354. :page-size="size"
  355. layout="total, sizes, prev, pager, next, jumper"
  356. :total="total"
  357. >
  358. </el-pagination>
  359. </el-dialog>
  360. </div>
  361. </template>
  362. <script>
  363. import * as echarts from "echarts";
  364. import titles from "./common/title.vue";
  365. import * as dialogConstList from "./index";
  366. import { mapGetters } from "vuex";
  367. export default {
  368. components: { titles },
  369. data() {
  370. return {
  371. headList: dialogConstList.headList,
  372. headIndex: "实时总览", // 默认选中nav选项
  373. time: [], //自定义时间
  374. // 日期类型选择
  375. dateSelect: dialogConstList.dateSelect,
  376. dateSelectIndex: 1, // 选中
  377. dialogVisible: false, // 提示文字
  378. dialogTitle: "", // 弹窗提示文字
  379. current: 1, // 页码
  380. size: 10, // 数量
  381. total: 0, // 总条数
  382. // 录音未开启数组
  383. stayHandleList: dialogConstList.stayHandleList,
  384. // 接待量数组
  385. jiedaiList: dialogConstList.jiedaiList,
  386. receptionCount: 0, // 接待量
  387. // 接待趋势
  388. receptionList: [],
  389. // 销讲执行趋势
  390. salesExecution: [],
  391. allRecSaleList: [], // 接待趋势&销讲执行趋势总数组
  392. // 公司
  393. companyOptions: [],
  394. companyValue: "",
  395. // 项目
  396. projectOptions: [],
  397. projectValue: "",
  398. visitReceptionDistribute: [], //到访次数分布
  399. invalidReceptionDistribute: [], //无效接待原因分布
  400. levelFractionDistribute: [], //客户意向度分布
  401. systemLevelDistribute: [], //客户等级分布
  402. rsideDataList: dialogConstList.rsideDataList, // 右侧菜单
  403. eceptionRankingByHouseTop10: [], //接待排名(按项目)
  404. activeReceptionByHouseTop10: [], //有效接待排名(按项目)
  405. violatedReceptionByHouseTop10: [], //违禁接待排名(按项目)
  406. visitReceptionByHouseTop10: [], //复访接待排名(按项目)
  407. receptionRankingByCityTop10: [], //接待排名(按城市)
  408. activeReceptionByCityTop10: [], //有效接待排名(按城市)
  409. violatedReceptionByCityTop10: [], //违禁接待排名(按城市)
  410. visitReceptionByCityTop10: [], //复访接待排名(按城市)
  411. lsideDataList: dialogConstList.lsideDataList, // 左侧菜单列表
  412. tableNameList: [], // table 循环的表头数据,
  413. tableData: [], // table数据
  414. showDialogData: {}, // 点击选项赋值
  415. caseRankingList: dialogConstList.caseRankingList, // 案场排名数组
  416. ruleTypeList: dialogConstList.ruleTypeList, // 排名规则
  417. rankingTypeList: dialogConstList.rankingTypeList, // 排名类型
  418. orderBy: 1, // 排序规则
  419. dimensionType: 1, //项目
  420. rankingEchartsBarList: dialogConstList.rankingEchartsBarList, // 案场排名柱状图
  421. };
  422. },
  423. computed: {
  424. ...mapGetters(["permissions"]),
  425. showSelect() {
  426. return (name) => {
  427. return name == this.headIndex;
  428. };
  429. },
  430. },
  431. created() {
  432. this.checkAuthority();
  433. },
  434. mounted() {
  435. this.initPage();
  436. },
  437. methods: {
  438. // 检测权限
  439. checkAuthority() {
  440. this.headList.forEach((item) => {
  441. if (this.permissions[item.methods]) {
  442. item.show = true;
  443. } else {
  444. item.show = false;
  445. }
  446. });
  447. let hIndex = sessionStorage.getItem("BIHeadIndex") || "实时总览";
  448. let obj = this.headList.find((item) => item.title == hIndex);
  449. if (obj.show) {
  450. this.selectNav(obj);
  451. } else {
  452. let obj1 = this.headList.find((item) => item.show === true);
  453. this.selectNav(obj1);
  454. }
  455. },
  456. // 清除数据
  457. clearData() {},
  458. // 初始化页面
  459. initPage() {
  460. this.biGetOrgCodeList();
  461. let obj = this.headList.find((item) => item.title == this.headIndex);
  462. this.$nextTick(() => {
  463. this[obj.methods]();
  464. });
  465. },
  466. // 实时总览
  467. initPageRealTimeOverview() {
  468. this.biDataOverview();
  469. },
  470. // 案场排名
  471. initCaseRanking() {
  472. this.biTopStatisticData();
  473. this.$nextTick(() => {
  474. this.biRankingData();
  475. });
  476. },
  477. // 案场排名顶部对比数据
  478. biTopStatisticData() {
  479. // 接口入参
  480. const params = {
  481. dateType: this.dateSelectIndex,
  482. orgCode: this.companyValue,
  483. startDate: this.time[0] || "",
  484. endDate: this.time[1] || "",
  485. };
  486. this.$api.http.biTopStatisticData(params).then((res) => {
  487. if (res.code == 10000) {
  488. this.caseRankingList.forEach((item) => {
  489. item.resultA = res.data.resultA[item.params];
  490. item.resultB = res.data.resultB[item.params];
  491. });
  492. }
  493. });
  494. },
  495. // 获取案场详情柱状图数据
  496. biRankingData() {
  497. const params = {
  498. dateType: this.dateSelectIndex,
  499. orgCode: this.companyValue,
  500. startDate: this.time[0] || "",
  501. endDate: this.time[1] || "",
  502. orderBy: this.orderBy, // 1 前10,2 后10
  503. dimensionType: this.dimensionType, //1 项目,2 城市,3 区域
  504. };
  505. this.$api.http.biRankingData(params).then((res) => {
  506. if (res.code == 10000) {
  507. this.rankingEchartsBarList.forEach((ob) => {
  508. let object = res.data[ob.params];
  509. console.log(object, ob.params);
  510. let xAxis = object.data.map((item) => {
  511. return item.name;
  512. });
  513. let avgList = [];
  514. let yAxis = {};
  515. if (this.companyValue) {
  516. avgList.push({
  517. yAxis: object.companyAvg,
  518. name: "集团平均",
  519. });
  520. try {
  521. if (
  522. object.data[this.orderBy == 1 ? 0 : object.data.length - 1]
  523. .value < object.companyAvg
  524. ) {
  525. yAxis.max = object.companyAvg;
  526. }
  527. } catch (e) {
  528. console.log(e);
  529. }
  530. } else {
  531. avgList.push({
  532. yAxis: object.allAvg,
  533. name: "行业平均",
  534. });
  535. try {
  536. if (
  537. object.data[this.orderBy == 1 ? 0 : object.data.length - 1]
  538. .value < object.allAvg
  539. ) {
  540. yAxis.max = object.allAvg;
  541. }
  542. } catch (e) {
  543. console.log(e);
  544. }
  545. }
  546. if (ob.unit == "%") {
  547. yAxis = {
  548. max: 100,
  549. };
  550. }
  551. this.$nextTick(() => {
  552. this.creatBar({
  553. id: ob.params,
  554. xAxis: xAxis,
  555. yAxis: yAxis,
  556. series: [
  557. {
  558. type: "bar",
  559. barMaxWidth: "20%",
  560. name: ob.title,
  561. data: object.data || [],
  562. itemStyle: {
  563. normal: {
  564. //柱体的颜色
  565. //右,下,左,上(1,0,0,0)表示从正右开始向左渐变
  566. color: function (params) {
  567. let colorList = [
  568. ["#FF7B96", "#FA3E63"],
  569. ["#FC6128", "#FAB519"],
  570. ["#FBE695", "#FFC536"],
  571. ["#4C83FF", "#2AFADF"],
  572. ];
  573. let colorItem =
  574. colorList[
  575. params.dataIndex > 2 ? 3 : params.dataIndex
  576. ];
  577. return new echarts.graphic.LinearGradient(
  578. 0,
  579. 0,
  580. 0,
  581. 1,
  582. [
  583. {
  584. offset: 0,
  585. color: colorItem[0],
  586. },
  587. {
  588. offset: 1,
  589. color: colorItem[1],
  590. },
  591. ],
  592. false
  593. );
  594. },
  595. },
  596. },
  597. markLine: {
  598. symbol: ["none", "none"], // none为标线两端的样式为无,可更改
  599. lineStyle: {
  600. normal: {
  601. color: "#34DBFC", // 这儿设置安全基线颜色
  602. },
  603. },
  604. data: avgList,
  605. label: {
  606. show: true,
  607. position: "end",
  608. padding: [-13, -20, 15, -85],
  609. formatter: (data) => {
  610. return `${data.name}:${data.value}`;
  611. },
  612. },
  613. },
  614. },
  615. ],
  616. });
  617. });
  618. });
  619. }
  620. });
  621. },
  622. // 下划线
  623. tableRowClassName({ row, rowIndex }) {
  624. if (rowIndex % 2 == 0) {
  625. return "second";
  626. }
  627. },
  628. // 弹窗关闭
  629. handleClose() {
  630. this.dialogVisible = false;
  631. this.current = 1;
  632. this.size = 10;
  633. },
  634. // 弹窗展示
  635. showDialog(data) {
  636. this.showDialogData = data;
  637. const params = {
  638. dataType: data.dataType,
  639. dateType: this.dateSelectIndex,
  640. orgCode: this.companyValue,
  641. startDate: this.time[0] || "",
  642. endDate: this.time[1] || "",
  643. current: this.current,
  644. size: this.size,
  645. };
  646. this.$api.http.biChooseDataTable(params).then((res) => {
  647. if (res.code == 10000) {
  648. let arr = [...this.stayHandleList, ...this.jiedaiList];
  649. let obj = arr.find((item) => item.title == data.title);
  650. this.total = res.data.total;
  651. this.dialogTitle = data.title;
  652. this.tableNameList = dialogConstList[obj.tableListName];
  653. this.tableData = res.data.records;
  654. this.dialogVisible = true;
  655. }
  656. });
  657. },
  658. // 获取页面数据
  659. biDataOverview() {
  660. const params = {
  661. dateType: this.dateSelectIndex,
  662. orgCode: this.companyValue,
  663. startDate: this.time[0] || "",
  664. endDate: this.time[1] || "",
  665. };
  666. this.$api.http.biDataOverview(params).then((res) => {
  667. if (res.code == 10000) {
  668. this.receptionCount = res.data.statisticData.receptionCount || 0;
  669. this.jiedaiList.forEach((item) => {
  670. // 接待趋势
  671. item.data = res.data.statisticData[item.params] || 0;
  672. });
  673. this.stayHandleList.forEach((item) => {
  674. // 销讲趋势
  675. item.data = res.data.statisticData[item.params] || 0;
  676. });
  677. this.allRecSaleList = res.data.tendencyData || []; // 趋势图
  678. //左侧菜单数据填充
  679. this.lsideDataList.forEach((item) => {
  680. this[item.params] = res.data[item.params] || [];
  681. this[item.params1] = res.data[item.params1] || [];
  682. });
  683. //右侧菜单数据填充
  684. this.rsideDataList.forEach((item) => {
  685. this[item.params] = res.data[item.params] || [];
  686. });
  687. this.$nextTick(() => {
  688. this.empityReceptionListSalesExecution();
  689. this.formatLineData();
  690. this.formatterPie();
  691. this.formatterBar();
  692. });
  693. }
  694. });
  695. },
  696. // 获取公司
  697. biGetOrgCodeList() {
  698. this.$api.http.biGetOrgCodeList().then((res) => {
  699. if (res.code == 10000) {
  700. this.companyOptions = res.data;
  701. }
  702. });
  703. },
  704. // 清空存放的series变量
  705. empityReceptionListSalesExecution() {
  706. this.receptionList = [];
  707. this.salesExecution = [];
  708. },
  709. // 处理折线统计图的数据
  710. formatLineData() {
  711. let arr1 = [
  712. {
  713. name: "接待量",
  714. params: "receptionCount",
  715. },
  716. {
  717. name: "有效接待",
  718. params: "activeCustomer",
  719. },
  720. {
  721. params: "prohibitedCustomer",
  722. name: "违禁接待",
  723. },
  724. ];
  725. let obj1 = {
  726. id: "tendencyData1",
  727. xAxis: [],
  728. legend: [],
  729. series: [],
  730. };
  731. arr1.forEach((item, index) => {
  732. let par = {
  733. // 折线图的样式
  734. smooth: true,
  735. name: item.name,
  736. type: "line",
  737. areaStyle: {
  738. normal: {
  739. color: new echarts.graphic.LinearGradient(
  740. 0,
  741. 0,
  742. 1,
  743. 1,
  744. this.lineColorLinear(index),
  745. false
  746. ),
  747. shadowColor: "rgba(44,118,222, 0.1)",
  748. shadowBlur: 10,
  749. },
  750. },
  751. itemStyle: {
  752. normal: {
  753. color: {
  754. type: "linear", // 线性渐变
  755. x: 0,
  756. y: 0,
  757. x2: 1,
  758. y2: 1,
  759. colorStops: this.lineColorLinear(index),
  760. },
  761. },
  762. },
  763. data: [],
  764. };
  765. this.allRecSaleList.forEach((org) => {
  766. par.data.push(org[item.params] || 0);
  767. if (!obj1.xAxis.includes(org.statDate.split(" ")[0])) {
  768. obj1.xAxis.push(org.statDate.split(" ")[0]);
  769. }
  770. if (!obj1.legend.includes(item.name)) {
  771. obj1.legend.push(item.name);
  772. }
  773. });
  774. this.receptionList.push(par);
  775. });
  776. let arr2 = [
  777. {
  778. name: "平均销讲执行率",
  779. params: "fraction",
  780. },
  781. {
  782. name: "平均挖掘执行率",
  783. params: "wordFraction",
  784. },
  785. {
  786. name: "平均挖掘成功率",
  787. params: "wordFinishFraction",
  788. },
  789. ];
  790. let obj2 = {
  791. id: "tendencyData2",
  792. xAxis: [],
  793. legend: [],
  794. series: [],
  795. max: 100,
  796. };
  797. arr2.forEach((item, index) => {
  798. let par = {
  799. // 折线图的样式
  800. smooth: true,
  801. name: item.name,
  802. type: "line",
  803. areaStyle: {
  804. normal: {
  805. color: new echarts.graphic.LinearGradient(
  806. 0,
  807. 0,
  808. 1,
  809. 1,
  810. this.lineColorLinear(index),
  811. false
  812. ),
  813. shadowColor: "rgba(44,118,222, 0.1)",
  814. shadowBlur: 10,
  815. },
  816. },
  817. itemStyle: {
  818. normal: {
  819. color: {
  820. type: "linear", // 线性渐变
  821. x: 0,
  822. y: 0,
  823. x2: 1,
  824. y2: 1,
  825. colorStops: this.lineColorLinear(index),
  826. },
  827. },
  828. },
  829. data: [],
  830. };
  831. this.allRecSaleList.forEach((org) => {
  832. par.data.push(org[item.params] || 0);
  833. if (!obj2.xAxis.includes(org.statDate.split(" ")[0])) {
  834. obj2.xAxis.push(org.statDate.split(" ")[0]);
  835. }
  836. if (!obj2.legend.includes(item.name)) {
  837. obj2.legend.push(item.name);
  838. }
  839. });
  840. this.salesExecution.push(par);
  841. });
  842. obj1.series = this.receptionList;
  843. obj2.series = this.salesExecution;
  844. this.$nextTick(() => {
  845. this.creatLine(obj1);
  846. this.creatLine(obj2);
  847. });
  848. },
  849. // 创建折线图
  850. creatLine(obj) {
  851. // 基于准备好的dom,初始化echarts实例
  852. let myChart = echarts.init(document.getElementById(obj.id));
  853. // this.receptionList
  854. // 指定图表的配置项和数据
  855. let option = {
  856. legend: {
  857. show: true,
  858. bottom: "0",
  859. right: "center",
  860. orient: "horizontal", // 图例列表的布局朝向; horizontal; vertical
  861. data: obj.legend,
  862. icon: "circle",
  863. left: "center", // 距离容器侧边距离
  864. textStyle: {
  865. color: "#fff",
  866. fontSize: 12,
  867. },
  868. },
  869. grid: {
  870. top: "10%",
  871. bottom: "25%",
  872. right: "5%",
  873. left: "15%",
  874. },
  875. tooltip: {
  876. trigger: "axis",
  877. },
  878. xAxis: {
  879. data: obj.xAxis, // x坐标轴集合
  880. axisLabel: {
  881. //X轴标签
  882. show: true,
  883. interval: 0,
  884. rotate: 40,
  885. textStyle: {
  886. color: "#fff", //字体颜色
  887. fontSize: 12, //字体大小
  888. },
  889. interval: obj.xAxis.length > 15 ? 3 : 0, //主要设置其间隔,间隔为3
  890. },
  891. axisLine: {
  892. lineStyle: {
  893. color: "#fff",
  894. },
  895. },
  896. },
  897. yAxis: [
  898. {
  899. type: "value",
  900. nameTextStyle: {
  901. color: "#fff",
  902. fontSize: 12,
  903. },
  904. lineStyle: {
  905. color: "#fff",
  906. },
  907. minInterval: 5,
  908. axisLabel: {
  909. textStyle: {
  910. color: "#fff", //字体颜色
  911. fontSize: 14, //字体大小
  912. },
  913. formatter: (e) => {
  914. return `${e}`;
  915. },
  916. },
  917. axisTick: { show: false },
  918. axisLine: {
  919. show: false,
  920. },
  921. splitLine: {
  922. //Y轴分隔符
  923. show: true,
  924. lineStyle: {
  925. color: "#fff",
  926. type: "dashed",
  927. },
  928. },
  929. },
  930. ],
  931. series: obj.series,
  932. };
  933. if (obj.max) {
  934. option.yAxis[0].max = 100;
  935. }
  936. // 使用刚指定的配置项和数据显示图表。
  937. option && myChart.setOption(option);
  938. window.onresize = function () {
  939. myChart.resize();
  940. };
  941. },
  942. // 格式化饼图数据
  943. formatterPie() {
  944. this.rsideDataList.forEach((list) => {
  945. if (list.params == "visitReceptionDistribute") {
  946. let gentle = 0;
  947. let [arr1, arr2] = [[], []];
  948. this.visitReceptionDistribute.forEach((item) => {
  949. if (item.name != "首次到访") {
  950. gentle += item.value;
  951. } else {
  952. arr1.push(item);
  953. }
  954. arr2.push(item);
  955. });
  956. let series = [
  957. {
  958. name: "到访次数分布",
  959. type: "pie",
  960. selectedMode: "single",
  961. radius: [0, "30%"],
  962. label: {
  963. position: "inner",
  964. fontSize: 14,
  965. },
  966. labelLine: {
  967. show: false,
  968. },
  969. data: arr1,
  970. },
  971. {
  972. name: "到访次数分布",
  973. type: "pie",
  974. radius: ["45%", "60%"],
  975. labelLine: {
  976. length: 30,
  977. },
  978. data: arr2,
  979. },
  980. ];
  981. series[0].data.push({
  982. name: "复访接待",
  983. value: gentle,
  984. });
  985. this.creatPie({
  986. id: list.params,
  987. legend: {
  988. show: false,
  989. },
  990. series: series,
  991. });
  992. } else {
  993. let legend = this[list.params].map((item) => {
  994. return item.name;
  995. });
  996. this.creatPie({
  997. id: list.params,
  998. grid: {
  999. bottom: "20%",
  1000. top: "5%",
  1001. },
  1002. legend: {
  1003. legend: legend,
  1004. show: true,
  1005. orient: "horizontal",
  1006. type: "scroll",
  1007. bottom: "5%",
  1008. textStyle: {
  1009. color: "#fff",
  1010. },
  1011. },
  1012. series: [
  1013. {
  1014. name: list.title,
  1015. type: "pie",
  1016. radius: ["45%", "60%"],
  1017. labelLine: {
  1018. length: 5,
  1019. showAbove: true,
  1020. },
  1021. minAngle: 5,
  1022. avoidLabelOverlap: true,
  1023. data: this[list.params],
  1024. itemStyle: {
  1025. normal: {
  1026. color: function (colors) {
  1027. var colorList = [
  1028. "#D0444D",
  1029. "#376FE3",
  1030. "#E1B31F",
  1031. "#8D25E4",
  1032. "#DF7323",
  1033. "#2ED1EE",
  1034. ];
  1035. return colorList[colors.dataIndex];
  1036. },
  1037. },
  1038. },
  1039. },
  1040. ],
  1041. });
  1042. }
  1043. });
  1044. },
  1045. // 创建饼图
  1046. creatPie(obj) {
  1047. // 基于准备好的dom,初始化echarts实例
  1048. let myChart = echarts.init(document.getElementById(obj.id));
  1049. let option = {
  1050. tooltip: {
  1051. trigger: "item",
  1052. },
  1053. legend: obj.legend,
  1054. series: obj.series,
  1055. };
  1056. option && myChart.setOption(option);
  1057. window.onresize = function () {
  1058. myChart.resize();
  1059. };
  1060. },
  1061. // 重绘echarts
  1062. getFormatter(params, name) {
  1063. let xAxis = this[params].map((item) => {
  1064. return item.name;
  1065. });
  1066. this.$nextTick(() => {
  1067. this.creatBar({
  1068. id: params,
  1069. xAxis: xAxis,
  1070. series: [
  1071. {
  1072. type: "bar",
  1073. barMaxWidth: "20%",
  1074. name: name,
  1075. data: this[params],
  1076. itemStyle: {
  1077. normal: {
  1078. //柱体的颜色
  1079. //右,下,左,上(1,0,0,0)表示从正右开始向左渐变
  1080. color: function (params) {
  1081. let colorList = [
  1082. ["#FF7B96", "#FA3E63"],
  1083. ["#FC6128", "#FAB519"],
  1084. ["#FBE695", "#FFC536"],
  1085. ["#4C83FF", "#2AFADF"],
  1086. ];
  1087. let colorItem =
  1088. colorList[params.dataIndex > 2 ? 3 : params.dataIndex];
  1089. return new echarts.graphic.LinearGradient(
  1090. 0,
  1091. 0,
  1092. 0,
  1093. 1,
  1094. [
  1095. {
  1096. offset: 0,
  1097. color: colorItem[0],
  1098. },
  1099. {
  1100. offset: 1,
  1101. color: colorItem[1],
  1102. },
  1103. ],
  1104. false
  1105. );
  1106. },
  1107. },
  1108. },
  1109. },
  1110. ],
  1111. });
  1112. });
  1113. },
  1114. // 格式化柱状图数据
  1115. formatterBar() {
  1116. this.lsideDataList.forEach((list) => {
  1117. let xAxis = this[list.params].map((item) => {
  1118. return item.name;
  1119. });
  1120. let xAxis1 = this[list.params1].map((item) => {
  1121. return item.name;
  1122. });
  1123. this.$nextTick(() => {
  1124. if (list.activeName == list.params) {
  1125. this.creatBar({
  1126. id: list.params,
  1127. xAxis: xAxis,
  1128. series: [
  1129. {
  1130. type: "bar",
  1131. barMaxWidth: "20%",
  1132. name: list.title,
  1133. data: this[list.params],
  1134. itemStyle: {
  1135. normal: {
  1136. //柱体的颜色
  1137. //右,下,左,上(1,0,0,0)表示从正右开始向左渐变
  1138. color: function (params) {
  1139. let colorList = [
  1140. ["#FF7B96", "#FA3E63"],
  1141. ["#FC6128", "#FAB519"],
  1142. ["#FBE695", "#FFC536"],
  1143. ["#4C83FF", "#2AFADF"],
  1144. ];
  1145. let colorItem =
  1146. colorList[
  1147. params.dataIndex > 2 ? 3 : params.dataIndex
  1148. ];
  1149. return new echarts.graphic.LinearGradient(
  1150. 0,
  1151. 0,
  1152. 0,
  1153. 1,
  1154. [
  1155. {
  1156. offset: 0,
  1157. color: colorItem[0],
  1158. },
  1159. {
  1160. offset: 1,
  1161. color: colorItem[1],
  1162. },
  1163. ],
  1164. false
  1165. );
  1166. },
  1167. },
  1168. },
  1169. },
  1170. ],
  1171. });
  1172. } else {
  1173. this.creatBar({
  1174. id: list.params1,
  1175. xAxis: xAxis1,
  1176. series: [
  1177. {
  1178. type: "bar",
  1179. barMaxWidth: "20%",
  1180. name: list.title,
  1181. data: this[list.params1],
  1182. itemStyle: {
  1183. normal: {
  1184. //柱体的颜色
  1185. //右,下,左,上(1,0,0,0)表示从正右开始向左渐变
  1186. color: function (params) {
  1187. let colorList = [
  1188. ["#FF7B96", "#FA3E63"],
  1189. ["#FC6128", "#FAB519"],
  1190. ["#FBE695", "#FFC536"],
  1191. ["#4C83FF", "#2AFADF"],
  1192. ];
  1193. let colorItem =
  1194. colorList[
  1195. params.dataIndex > 2 ? 3 : params.dataIndex
  1196. ];
  1197. return new echarts.graphic.LinearGradient(
  1198. 0,
  1199. 0,
  1200. 0,
  1201. 1,
  1202. [
  1203. {
  1204. offset: 0,
  1205. color: colorItem[0],
  1206. },
  1207. {
  1208. offset: 1,
  1209. color: colorItem[1],
  1210. },
  1211. ],
  1212. false
  1213. );
  1214. },
  1215. },
  1216. },
  1217. },
  1218. ],
  1219. });
  1220. }
  1221. });
  1222. });
  1223. },
  1224. // 生成柱状图
  1225. creatBar(obj) {
  1226. console.log(obj, obj.id);
  1227. // 基于准备好的dom,初始化echarts实例
  1228. let myChart = echarts.init(document.getElementById(obj.id));
  1229. myChart.clear();
  1230. let option = {};
  1231. if (obj.series[0].data.length > 0) {
  1232. option = {
  1233. tooltip: {
  1234. trigger: "axis",
  1235. axisPointer: {
  1236. type: "shadow",
  1237. },
  1238. },
  1239. grid: {
  1240. left: "3%",
  1241. right: "4%",
  1242. bottom: "3%",
  1243. containLabel: true,
  1244. },
  1245. xAxis: [
  1246. {
  1247. type: "category",
  1248. data: obj.xAxis,
  1249. axisTick: {
  1250. alignWithLabel: true,
  1251. },
  1252. axisLabel: {
  1253. //X轴标签
  1254. show: true,
  1255. interval: 0,
  1256. rotate: 40,
  1257. textStyle: {
  1258. color: "#fff", //字体颜色
  1259. fontSize: 12, //字体大小
  1260. },
  1261. interval: obj.xAxis.length > 15 ? 3 : 0, //主要设置其间隔,间隔为3
  1262. },
  1263. axisLine: {
  1264. lineStyle: {
  1265. color: "#fff",
  1266. },
  1267. },
  1268. },
  1269. ],
  1270. yAxis: [
  1271. {
  1272. ...obj.yAxis,
  1273. type: "value",
  1274. nameTextStyle: {
  1275. color: "#fff",
  1276. fontSize: 12,
  1277. },
  1278. // interval: 20,
  1279. lineStyle: {
  1280. color: "#fff",
  1281. },
  1282. axisLabel: {
  1283. textStyle: {
  1284. color: "#fff", //字体颜色
  1285. fontSize: 14, //字体大小
  1286. },
  1287. formatter: (e) => {
  1288. return `${e}`;
  1289. },
  1290. },
  1291. axisTick: { show: false },
  1292. axisLine: {
  1293. show: false,
  1294. },
  1295. splitLine: {
  1296. //Y轴分隔符
  1297. show: true,
  1298. lineStyle: {
  1299. color: "#fff",
  1300. type: "dashed",
  1301. },
  1302. },
  1303. },
  1304. ],
  1305. series: obj.series,
  1306. };
  1307. } else {
  1308. option = this.setEmpty();
  1309. }
  1310. option && myChart.setOption(option);
  1311. window.onresize = function () {
  1312. myChart.resize();
  1313. };
  1314. },
  1315. // 折线图线的颜色
  1316. lineColorLinear(index) {
  1317. let arr = [
  1318. [
  1319. {
  1320. offset: 0,
  1321. color: "#4C83FF",
  1322. },
  1323. {
  1324. offset: 1,
  1325. color: "#2AFADF",
  1326. },
  1327. ],
  1328. [
  1329. {
  1330. offset: 0,
  1331. color: "#FAB519",
  1332. },
  1333. {
  1334. offset: 1,
  1335. color: "#FC6128",
  1336. },
  1337. ],
  1338. [
  1339. {
  1340. offset: 0,
  1341. color: "#FF7B96",
  1342. },
  1343. {
  1344. offset: 1,
  1345. color: "#FA3E63",
  1346. },
  1347. ],
  1348. ];
  1349. return arr[index];
  1350. },
  1351. // 设置数据为空时展示
  1352. setEmpty() {
  1353. return {
  1354. title: {
  1355. text: " {a|}",
  1356. x: "center",
  1357. y: "center",
  1358. subtext: "糟糕!数据不见了",
  1359. itemGap: -20,
  1360. textStyle: {
  1361. rich: {
  1362. a: {
  1363. color: "#000",
  1364. fontSize: "16",
  1365. height: 80,
  1366. width: 160,
  1367. backgroundColor: {
  1368. image:
  1369. "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNDEiIHZpZXdCb3g9IjAgMCA2NCA0MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxKSIgZmlsbD0ibm9uZSIgZmlsbFJ1bGU9ImV2ZW5vZGQiPg0KICAgIDxlbGxpcHNlIGZpbGw9IiNkZGQiIGN4PSIzMiIgY3k9IjMzIiByeD0iMzIiIHJ5PSI3IiAvPg0KICAgIDxnIGZpbGxSdWxlPSJub256ZXJvIiBzdHJva2U9IiM5OTkiPg0KICAgICAgPHBhdGgNCiAgICAgICAgZD0iTTU1IDEyLjc2TDQ0Ljg1NCAxLjI1OEM0NC4zNjcuNDc0IDQzLjY1NiAwIDQyLjkwNyAwSDIxLjA5M2MtLjc0OSAwLTEuNDYuNDc0LTEuOTQ3IDEuMjU3TDkgMTIuNzYxVjIyaDQ2di05LjI0eiIgLz4NCiAgICAgIDxwYXRoDQogICAgICAgIGQ9Ik00MS42MTMgMTUuOTMxYzAtMS42MDUuOTk0LTIuOTMgMi4yMjctMi45MzFINTV2MTguMTM3QzU1IDMzLjI2IDUzLjY4IDM1IDUyLjA1IDM1aC00MC4xQzEwLjMyIDM1IDkgMzMuMjU5IDkgMzEuMTM3VjEzaDExLjE2YzEuMjMzIDAgMi4yMjcgMS4zMjMgMi4yMjcgMi45Mjh2LjAyMmMwIDEuNjA1IDEuMDA1IDIuOTAxIDIuMjM3IDIuOTAxaDE0Ljc1MmMxLjIzMiAwIDIuMjM3LTEuMzA4IDIuMjM3LTIuOTEzdi0uMDA3eiINCiAgICAgICAgZmlsbD0iI2UxZTFlMSIgLz4NCiAgICA8L2c+DQogIDwvZz4NCjwvc3ZnPg==",
  1370. },
  1371. },
  1372. },
  1373. },
  1374. subtextStyle: {
  1375. fontSize: 16,
  1376. },
  1377. },
  1378. };
  1379. },
  1380. // 公司弹窗修改
  1381. changeCompany() {
  1382. if (this.headIndex == "案场排名" && this.companyValue) {
  1383. let index = this.rankingTypeList.findIndex((item) => item.value == 3);
  1384. this.rankingTypeList[index].disabled = false;
  1385. } else {
  1386. this.dimensionType = 1;
  1387. let index = this.rankingTypeList.findIndex((item) => item.value == 3);
  1388. this.rankingTypeList[index].disabled = true;
  1389. }
  1390. },
  1391. // 返回首页
  1392. backHome() {
  1393. this.$router.go(-1);
  1394. },
  1395. // 选中nav导航
  1396. selectNav(index) {
  1397. this.headIndex = index.title;
  1398. sessionStorage.setItem("BIHeadIndex", this.headIndex);
  1399. this.initPage();
  1400. },
  1401. // 时间类型选项被点击
  1402. timerClick(index) {
  1403. this.time = [];
  1404. this.dateSelectIndex = index;
  1405. this.initPage();
  1406. },
  1407. // 自定义时间改变
  1408. timerChange() {
  1409. this.dateSelectIndex = null;
  1410. this.initPage();
  1411. },
  1412. // To doing
  1413. //
  1414. handleCurrentChange(e) {
  1415. this.current = e;
  1416. this.showDialog(this.showDialogData);
  1417. },
  1418. //
  1419. handleSizeChange(e) {
  1420. this.size = e;
  1421. this.showDialog(this.showDialogData);
  1422. },
  1423. },
  1424. };
  1425. </script>
  1426. <style lang="scss" scoped>
  1427. .pages {
  1428. position: relative;
  1429. width: 100vw;
  1430. height: 100vh;
  1431. min-width: 1200px;
  1432. display: flex;
  1433. flex-direction: column;
  1434. background: url("/img/bidata/ic_bg@2x.png") no-repeat;
  1435. background-size: 1920px 1080px;
  1436. overflow-y: auto;
  1437. // 头部
  1438. .header {
  1439. position: relative;
  1440. width: 100%;
  1441. display: flex;
  1442. flex-direction: column;
  1443. .head-top {
  1444. position: relative;
  1445. width: 100%;
  1446. height: 60px;
  1447. background: url("/img/bidata/head.png") no-repeat;
  1448. background-size: 100% 60px;
  1449. .nav-box {
  1450. position: absolute;
  1451. left: 50%;
  1452. transform: translateX(-50%);
  1453. width: 920px;
  1454. height: 60px;
  1455. display: grid;
  1456. grid-template-columns: repeat(6, 1fr);
  1457. .nav-box-item {
  1458. flex-grow: 1;
  1459. flex-shrink: 0;
  1460. display: flex;
  1461. align-items: center;
  1462. justify-content: center;
  1463. font-size: 16px;
  1464. font-family: PingFangSC-Regular, PingFang SC;
  1465. font-weight: 400;
  1466. color: #ffffff;
  1467. cursor: pointer;
  1468. &.active {
  1469. font-size: 16px;
  1470. font-weight: 600;
  1471. color: #2ed1ee;
  1472. }
  1473. .nav-box-item-img {
  1474. margin: 0 6px;
  1475. width: 22px;
  1476. height: 14px;
  1477. }
  1478. }
  1479. }
  1480. .back {
  1481. position: absolute;
  1482. right: 80px;
  1483. top: 50%;
  1484. transform: translateY(-50%);
  1485. width: 96px;
  1486. height: 36px;
  1487. background: #2671e2;
  1488. border-radius: 6px;
  1489. color: #fff;
  1490. font-weight: 600;
  1491. font-family: PingFangSC-Semibold, PingFang SC;
  1492. font-size: 16px;
  1493. text-align: center;
  1494. line-height: 36px;
  1495. cursor: pointer;
  1496. }
  1497. }
  1498. .head-bottom {
  1499. width: 100%;
  1500. height: 96px;
  1501. display: flex;
  1502. justify-content: center;
  1503. .head-box {
  1504. // width: 936px;
  1505. height: 100%;
  1506. display: flex;
  1507. align-items: center;
  1508. .search {
  1509. margin: 0 0 0 40px;
  1510. }
  1511. .text {
  1512. margin-right: 12px;
  1513. font-size: 14px;
  1514. font-family: PingFangSC-Regular, PingFang SC;
  1515. font-weight: 400;
  1516. color: #ffffff;
  1517. }
  1518. .timer {
  1519. height: 32px;
  1520. display: flex;
  1521. border-radius: 4px;
  1522. overflow: hidden;
  1523. .timer-item {
  1524. margin: 0 1px 0 0;
  1525. padding: 6px 12px;
  1526. font-size: 14px;
  1527. font-family: PingFangSC-Regular, PingFang SC;
  1528. font-weight: 400;
  1529. color: #ffffff;
  1530. text-align: center;
  1531. background: #0a164d;
  1532. cursor: pointer;
  1533. &.active {
  1534. background: #2ed1ee;
  1535. }
  1536. /deep/.little {
  1537. background-color: #0a164d;
  1538. color: #fff;
  1539. border-color: #0a164d;
  1540. }
  1541. }
  1542. }
  1543. }
  1544. }
  1545. }
  1546. // 内容部分
  1547. .bodys {
  1548. padding: 0 0 30px 0;
  1549. width: 100%;
  1550. display: grid;
  1551. grid-template-columns: 460px 936px 460px;
  1552. grid-column-gap: 16px;
  1553. justify-content: center;
  1554. .middle {
  1555. .items-top {
  1556. width: 100%;
  1557. height: 244px;
  1558. background: url("/img/bidata/ic_sssp_bg@2x.png") no-repeat;
  1559. background-size: 100% 100%;
  1560. display: flex;
  1561. flex-direction: column;
  1562. .title {
  1563. flex-shrink: 0;
  1564. margin: 0;
  1565. width: 100%;
  1566. text-align: center;
  1567. line-height: 52px;
  1568. font-size: 18px;
  1569. font-family: PingFangSC-Semibold, PingFang SC;
  1570. font-weight: 600;
  1571. color: #34dbfc;
  1572. }
  1573. .item-box {
  1574. width: 100%;
  1575. flex-grow: 1;
  1576. display: grid;
  1577. justify-content: center;
  1578. grid-template-columns: repeat(5, 1fr);
  1579. grid-column-gap: 14px;
  1580. .item-box-item {
  1581. cursor: pointer;
  1582. .num {
  1583. margin: 40px 0 14px;
  1584. font-size: 36px;
  1585. font-family: DINAlternate-Bold, DINAlternate;
  1586. font-weight: bold;
  1587. text-align: center;
  1588. }
  1589. .item-title {
  1590. text-align: center;
  1591. font-size: 18px;
  1592. font-family: PingFangSC-Regular, PingFang SC;
  1593. font-weight: 400;
  1594. color: #ffffff;
  1595. }
  1596. }
  1597. }
  1598. }
  1599. .item-btm {
  1600. margin-top: 16px;
  1601. width: 100%;
  1602. height: 542px;
  1603. background: url("/img/bidata/ic_map_bg@2x.png") no-repeat;
  1604. background-size: 100% 100%;
  1605. display: flex;
  1606. flex-direction: column;
  1607. .jiedailiang {
  1608. margin: 42px auto 3px;
  1609. display: block;
  1610. width: 135px;
  1611. height: 38px;
  1612. }
  1613. .bgdsada {
  1614. width: 100%;
  1615. height: 24px;
  1616. }
  1617. .numberoftimes {
  1618. width: 100%;
  1619. height: 231px;
  1620. display: flex;
  1621. align-items: center;
  1622. justify-content: center;
  1623. .numberoftimes-img {
  1624. width: 268px;
  1625. height: 146px;
  1626. }
  1627. .numberoftimes-box {
  1628. margin: 0 0 0 12px;
  1629. width: 126px;
  1630. height: 146px;
  1631. background: url("/img/bidata/wei.png") no-repeat;
  1632. background-size: 100% 14px;
  1633. background-position: bottom;
  1634. display: flex;
  1635. align-items: baseline;
  1636. justify-content: center;
  1637. .cishu {
  1638. margin-top: 48px;
  1639. font-size: 56px;
  1640. font-family: HelveticaNeue-BoldItalic, HelveticaNeue;
  1641. font-weight: normal;
  1642. color: #ffffff;
  1643. line-height: 69px;
  1644. background: linear-gradient(180deg, #ffffff 30%, #69efff 100%);
  1645. -webkit-background-clip: text;
  1646. -webkit-text-fill-color: transparent;
  1647. }
  1648. .ci {
  1649. font-size: 24px;
  1650. font-family: PingFangSC-Semibold, PingFang SC;
  1651. font-weight: 600;
  1652. color: #ffffff;
  1653. background: linear-gradient(180deg, #ffffff 30%, #69efff 100%);
  1654. -webkit-background-clip: text;
  1655. -webkit-text-fill-color: transparent;
  1656. }
  1657. }
  1658. }
  1659. .ibox {
  1660. width: 100%;
  1661. height: 156px;
  1662. display: grid;
  1663. justify-content: center;
  1664. grid-template-columns: 148px 148px 236px 148px 148px;
  1665. grid-column-gap: 18px;
  1666. .ibox-item {
  1667. height: 156px;
  1668. display: flex;
  1669. flex-direction: column;
  1670. justify-content: center;
  1671. align-items: center;
  1672. cursor: pointer;
  1673. .num {
  1674. margin: 20px 0 6px;
  1675. display: flex;
  1676. align-items: center;
  1677. justify-content: center;
  1678. font-size: 30px;
  1679. font-family: DINAlternate-Bold, DINAlternate;
  1680. font-weight: bold;
  1681. color: #34dbfc;
  1682. }
  1683. .title {
  1684. justify-self: flex-end;
  1685. font-size: 16px;
  1686. font-family: PingFangSC-Regular, PingFang SC;
  1687. font-weight: 400;
  1688. color: #ffffff;
  1689. }
  1690. }
  1691. }
  1692. }
  1693. .item-mi {
  1694. margin-top: 16px;
  1695. width: 100%;
  1696. // height: 374px;
  1697. display: grid;
  1698. grid-template-columns: repeat(2, 460px);
  1699. grid-column-gap: 16px;
  1700. .item-item {
  1701. width: 100%;
  1702. // height: 374px;
  1703. display: flex;
  1704. flex-direction: column;
  1705. background: #0b1f53;
  1706. border: 1px solid rgba(24, 122, 205, 0.3);
  1707. .echarts {
  1708. width: 100%;
  1709. flex-grow: 1;
  1710. height: 330px;
  1711. }
  1712. }
  1713. }
  1714. }
  1715. .lside {
  1716. .item-item {
  1717. margin-bottom: 16px;
  1718. width: 100%;
  1719. display: flex;
  1720. flex-direction: column;
  1721. background: #0b1f53;
  1722. border: 1px solid rgba(24, 122, 205, 0.3);
  1723. .echarts {
  1724. width: 100%;
  1725. flex-grow: 1;
  1726. height: 238px;
  1727. }
  1728. .rsidebox {
  1729. padding: 0 6px 0 0;
  1730. display: flex;
  1731. align-items: center;
  1732. .asd {
  1733. margin: 0 14px;
  1734. font-size: 16px;
  1735. font-family: PingFangSC-Regular, PingFang SC;
  1736. font-weight: 400;
  1737. color: #ffffff;
  1738. cursor: pointer;
  1739. &.active {
  1740. font-size: 16px;
  1741. font-family: PingFangSC-Medium, PingFang SC;
  1742. font-weight: 500;
  1743. color: #34dbfc;
  1744. }
  1745. }
  1746. }
  1747. }
  1748. }
  1749. .rside {
  1750. .item-item {
  1751. margin-bottom: 16px;
  1752. width: 100%;
  1753. display: flex;
  1754. flex-direction: column;
  1755. background: #0b1f53;
  1756. border: 1px solid rgba(24, 122, 205, 0.3);
  1757. .echarts {
  1758. width: 100%;
  1759. flex-grow: 1;
  1760. height: 238px;
  1761. }
  1762. }
  1763. }
  1764. }
  1765. .caseRanking {
  1766. padding: 0 0 30px 0;
  1767. width: 100%;
  1768. .head-boxs {
  1769. padding: 0 16px;
  1770. width: 100%;
  1771. height: 114px;
  1772. display: grid;
  1773. grid-template-columns: repeat(8, 1fr);
  1774. grid-column-gap: 16px;
  1775. .head-box-items {
  1776. padding: 24px 28px;
  1777. background: url("/img/bidata/itemBg.png") no-repeat;
  1778. background-size: 222px;
  1779. .t {
  1780. font-size: 16px;
  1781. font-family: PingFangSC-Regular, PingFang SC;
  1782. font-weight: 400;
  1783. color: #34dbfc;
  1784. }
  1785. .b {
  1786. display: flex;
  1787. align-items: flex-end;
  1788. .lside {
  1789. margin: 10px 0 0;
  1790. flex-grow: 1;
  1791. display: flex;
  1792. align-items: baseline;
  1793. .resultA {
  1794. margin-right: 4px;
  1795. font-size: 30px;
  1796. font-family: DINAlternate-Bold, DINAlternate;
  1797. font-weight: bold;
  1798. color: #ffffff;
  1799. }
  1800. .unit {
  1801. font-size: 14px;
  1802. font-family: PingFangSC-Regular, PingFang SC;
  1803. font-weight: 400;
  1804. color: #ffffff;
  1805. }
  1806. }
  1807. .rside {
  1808. margin: 10px 0 0;
  1809. flex-shrink: 0;
  1810. span {
  1811. font-size: 14px;
  1812. font-family: PingFangSC-Medium, PingFang SC;
  1813. font-weight: 500;
  1814. color: #fff;
  1815. }
  1816. .up {
  1817. color: #f74e52;
  1818. }
  1819. .down {
  1820. color: #33caae;
  1821. }
  1822. .r-img {
  1823. margin-right: 4px;
  1824. width: 22px;
  1825. height: 12px;
  1826. }
  1827. }
  1828. }
  1829. }
  1830. }
  1831. .body-box {
  1832. margin: 23px 0 0;
  1833. padding: 0 16px;
  1834. width: 100%;
  1835. display: grid;
  1836. grid-template-columns: repeat(4, 1fr);
  1837. grid-gap: 16px;
  1838. .body-box-item {
  1839. background: #0b1f53;
  1840. border: 1px solid rgba(24, 122, 205, 0.3);
  1841. .echarts {
  1842. width: 100%;
  1843. height: 262px;
  1844. }
  1845. }
  1846. }
  1847. }
  1848. }
  1849. .company {
  1850. /deep/.el-input__inner {
  1851. background-color: #0a164d;
  1852. color: #fff;
  1853. border-color: #0a164d;
  1854. }
  1855. }
  1856. /deep/.el-date-editor {
  1857. background-color: #0a164d;
  1858. color: #fff;
  1859. border-color: #0a164d;
  1860. }
  1861. /deep/.el-range-input {
  1862. background-color: #0a164d;
  1863. color: #fff;
  1864. border-color: #0a164d;
  1865. }
  1866. .dialogtips {
  1867. /deep/.el-dialog__header {
  1868. padding: 0 0 0 24px;
  1869. width: 100%;
  1870. height: 46px;
  1871. display: flex;
  1872. justify-content: space-between;
  1873. color: #fff;
  1874. background: linear-gradient(to right, #1568b2 0%, #080935 100%);
  1875. }
  1876. /deep/.el-dialog__title {
  1877. color: #fff;
  1878. line-height: 46px;
  1879. }
  1880. /deep/.el-dialog__headerbtn {
  1881. right: 24px;
  1882. top: 13px;
  1883. }
  1884. /deep/.el-dialog__close {
  1885. color: #fff;
  1886. font-size: 19px;
  1887. }
  1888. /deep/.el-dialog__body {
  1889. padding: 0;
  1890. }
  1891. }
  1892. /deep/.el-table__row {
  1893. background-color: #0b1f53;
  1894. color: #fff;
  1895. font-size: 14px;
  1896. }
  1897. /deep/.second {
  1898. background-color: rgba(24, 122, 205, 0.2);
  1899. color: #fff;
  1900. font-size: 14px;
  1901. }
  1902. /deep/.el-table__row td {
  1903. border: none;
  1904. }
  1905. /deep/.el-table tbody tr:hover > td {
  1906. background-color: unset !important; //修改成自己想要的颜色即可
  1907. }
  1908. /deep/ .el-table::before {
  1909. background: #0b1f53;
  1910. }
  1911. /deep/.el-pagination {
  1912. background: #0b1f53;
  1913. display: flex;
  1914. justify-content: flex-end;
  1915. }
  1916. /deep/.el-pagination__total {
  1917. color: #fff;
  1918. }
  1919. /deep/.el-input__inner {
  1920. background: #0a164d;
  1921. color: #fff;
  1922. }
  1923. /deep/.btn-prev {
  1924. background: #0a164d;
  1925. color: #fff;
  1926. }
  1927. /deep/.el-icon-arrow-left {
  1928. color: #fff;
  1929. }
  1930. /deep/.el-icon-arrow-right {
  1931. color: #fff;
  1932. }
  1933. /deep/.btn-next {
  1934. background: #0a164d;
  1935. color: #fff;
  1936. }
  1937. /deep/.el-pagination button:disabled {
  1938. background: #0a164d;
  1939. }
  1940. /deep/.el-pager {
  1941. background: #0a164d;
  1942. }
  1943. /deep/.number {
  1944. background: transparent;
  1945. }
  1946. /deep/.el-pagination__jump {
  1947. color: #fff;
  1948. }
  1949. ::v-deep .el-table__body-wrapper {
  1950. &::-webkit-scrollbar {
  1951. // 整个滚动条
  1952. width: 0; // 纵向滚动条的宽度
  1953. background: rgba(213, 215, 220, 0.3);
  1954. border: none;
  1955. }
  1956. &::-webkit-scrollbar-track {
  1957. // 滚动条轨道
  1958. border: none;
  1959. }
  1960. }
  1961. ::v-deep .el-table--scrollable-y .el-table__body-wrapper {
  1962. overflow-y: auto;
  1963. }
  1964. ::v-deep .el-table th.gutter {
  1965. display: none;
  1966. width: 0;
  1967. }
  1968. ::v-deep.el-table__header-wrapper colgroup col[name="gutter"] {
  1969. display: none !important;
  1970. width: 0 !important;
  1971. }
  1972. ::v-deep .el-table__body {
  1973. width: 100% !important;
  1974. }
  1975. /deep/.gutter {
  1976. width: 0 !important;
  1977. display: none !important;
  1978. }
  1979. /deep/.search .el-button--primary {
  1980. background-color: #2ed1ee !important;
  1981. }
  1982. </style>
  1983. <style>
  1984. .el-table__header-wrapper colgroup col[name="gutter"] {
  1985. display: none !important;
  1986. width: 0 !important;
  1987. }
  1988. </style>