DashboardView.vue 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333
  1. <script lang="ts" setup>
  2. import { ref, onMounted, reactive } from 'vue'
  3. import QuickCalendarDate from '@/components/DateRange/src/components/QuickCalendarDate.vue'
  4. import { VueDraggable } from 'vue-draggable-plus'
  5. import PieChart from './components/PieChart.vue'
  6. import SellerChart from './components/SellerChart.vue'
  7. import BarChart from './components/BarChart.vue'
  8. import RecentStatus from './components/RecentStatus.vue'
  9. import ScoringSystem from './components/ScoringSystem.vue'
  10. import TopMap from './components/TopMap.vue'
  11. import { useRouter } from 'vue-router'
  12. import { ElMessage } from 'element-plus'
  13. import dayjs from 'dayjs'
  14. const router = useRouter()
  15. const value = ref('All')
  16. const activeName = ref('first')
  17. const SaveVisible = ref(false)
  18. // 可拖拽模块的列表
  19. interface ManagementItem {
  20. title: string
  21. switchValue: boolean
  22. text: string
  23. id: number
  24. title1: string
  25. title2: string
  26. }
  27. const Management = ref<ManagementItem[]>([])
  28. const BookingSearch = ref()
  29. const checkboxGroup1 = ref(['All'])
  30. const changeCheckboxGroup2 = ref('ETD')
  31. const shipper = ref(['All', 'Air', 'Sea', 'Road'])
  32. const shipper_two = ref(['ETD', 'ETA'])
  33. const changeCheckboxGroup1 = (val: any) => {
  34. if (val.length == 3) {
  35. checkboxGroup1.value = ['All']
  36. }
  37. if (val.length == 0) {
  38. checkboxGroup1.value = ['All']
  39. } else if (val.indexOf('All') != -1) {
  40. if (val.indexOf('All') == 1 && val.length == 2) {
  41. checkboxGroup1.value = ['All']
  42. } else {
  43. checkboxGroup1.value.splice(val.indexOf('All'), 1)
  44. }
  45. }
  46. }
  47. const changeCancel = (id: any) => {
  48. Management.value[id - 1].switchValue = false
  49. }
  50. //RecentStatusList
  51. const RecentStatusList = ref()
  52. const pageInfo = ref({ pageNo: 1, pageSize: 10, total: 10000 })
  53. const isShowtitle1 = ref(true)
  54. // 点击tab
  55. const handleTabClick = (tab: any) => {
  56. if (tab.props.name == 'first') {
  57. isShowtitle1.value = true
  58. } else {
  59. isShowtitle1.value = false
  60. }
  61. }
  62. const DashDate = ref([dayjs().startOf('month'), dayjs().endOf('month')])
  63. // 获取首页数据
  64. let dashboardObj: any = {
  65. date_start: DashDate.value[0].format('MM/DD/YYYY'),
  66. date_end: DashDate.value[1].format('MM/DD/YYYY'),
  67. date_type: changeCheckboxGroup2.value
  68. }
  69. const GetDashboardData = (value: any, is_default: any) => {
  70. $api
  71. .GetDashboardData({
  72. cp: pageInfo.value.pageNo,
  73. ps: pageInfo.value.pageSize,
  74. rc: -1,
  75. is_default: is_default,
  76. ...value
  77. })
  78. .then((res: any) => {
  79. if (res.code === 200) {
  80. pageInfo.value.total = Number(res.data.rc)
  81. Management.value = res.data.Management
  82. RecentStatusList.value = res.data.searchData
  83. }
  84. })
  85. }
  86. // 获取表单数据
  87. const getTableData = () => {
  88. let is_default: any = ''
  89. if (Object.keys(dashboardObj).length === 0) {
  90. is_default = 'yes'
  91. } else {
  92. is_default = 'no'
  93. }
  94. $api
  95. .GetDashboardData({
  96. cp: pageInfo.value.pageNo,
  97. ps: pageInfo.value.pageSize,
  98. rc: pageInfo.value.total,
  99. is_default: is_default,
  100. ...dashboardObj
  101. })
  102. .then((res: any) => {
  103. if (res.code === 200) {
  104. Management.value = res.data.Management
  105. RecentStatusList.value = res.data.searchData
  106. }
  107. })
  108. }
  109. const DateChange = (value: any) => {
  110. dashboardObj.date_start = value[0]
  111. dashboardObj.date_end = value[1]
  112. dashboardObj.date_type = changeCheckboxGroup2.value
  113. GetDashboardData(dashboardObj, 'no')
  114. }
  115. // 获取ETD/ETA 图表数据
  116. const ETDobj = reactive({
  117. ETD_Title: '',
  118. ETDList: [],
  119. ETD_Radius: []
  120. })
  121. const GetETDEcharts = () => {
  122. $api
  123. .GetETDEcharts({
  124. b_date: '',
  125. e_date: ''
  126. })
  127. .then((res: any) => {
  128. if (res.code === 200) {
  129. ETDobj.ETD_Title = `{a|${res.data.ETD_Title}}`
  130. ETDobj.ETDList = res.data.ETDList
  131. ETDobj.ETD_Radius = res.data.ETD_Radius
  132. }
  133. })
  134. }
  135. // 获取KPI Departure图表数据
  136. const KPIobj = reactive({
  137. ETD_Title: '',
  138. ETDList: [],
  139. ETD_Radius: []
  140. })
  141. const GetKPIEcharts = () => {
  142. $api
  143. .GetKPIEcharts({
  144. r_type: 'atd_r4'
  145. })
  146. .then((res: any) => {
  147. if (res.code === 200) {
  148. KPIobj.ETD_Title = `{a|${res.data.title1}}{b|${res.data.title2})}`
  149. KPIobj.ETDList = res.data.ETDList
  150. KPIobj.ETD_Radius = res.data.ETD_Radius
  151. }
  152. })
  153. }
  154. // 获取KPI Arrival图表数据
  155. const Arrivalobj = reactive({
  156. ETD_Title: '',
  157. ETDList: [],
  158. ETD_Radius: []
  159. })
  160. const GetKPIArrivalEcharts = () => {
  161. $api
  162. .GetKPIEcharts({
  163. r_type: 'ata_r3'
  164. })
  165. .then((res: any) => {
  166. if (res.code === 200) {
  167. Arrivalobj.ETD_Title = `{a|${res.data.title1}}{b|${res.data.title2})}`
  168. Arrivalobj.ETDList = res.data.ETDList
  169. Arrivalobj.ETD_Radius = res.data.ETD_Radius
  170. }
  171. })
  172. }
  173. // 获取Pending Departure图表数据
  174. const Pendingobj = reactive({
  175. ETD_Title: '',
  176. ETDList: [],
  177. ETD_Radius: []
  178. })
  179. const GetPendingEcharts = () => {
  180. $api
  181. .GetPendingEcharts({
  182. r_type: 'r4'
  183. })
  184. .then((res: any) => {
  185. if (res.code === 200) {
  186. Pendingobj.ETD_Title = `{a|${res.data.title1}}{b|${res.data.title2})}`
  187. Pendingobj.ETDList = res.data.ETDList
  188. Pendingobj.ETD_Radius = res.data.ETD_Radius
  189. }
  190. })
  191. }
  192. // 获取Pending Arrival图表数据
  193. const PendingArrivalobj = reactive({
  194. ETD_Title: '',
  195. ETDList: [],
  196. ETD_Radius: []
  197. })
  198. const GetPendingArrivalEcharts = () => {
  199. $api
  200. .GetPendingEcharts({
  201. r_type: 'r3'
  202. })
  203. .then((res: any) => {
  204. if (res.code === 200) {
  205. PendingArrivalobj.ETD_Title = `{a|${res.data.title1}}{b|${res.data.title2})}`
  206. PendingArrivalobj.ETDList = res.data.ETDList
  207. PendingArrivalobj.ETD_Radius = res.data.ETD_Radius
  208. }
  209. })
  210. }
  211. // 获取ContainerCount
  212. const containerObj = reactive({
  213. bar_title: '',
  214. barList: [],
  215. barSeries: [],
  216. Max: 0,
  217. interval: 0
  218. })
  219. const containerType = ref([])
  220. const GetContainerCountEcharts = (val: any) => {
  221. containerType.value = []
  222. $api
  223. .GetContainerCountEcharts({
  224. b_date: '',
  225. e_date: '',
  226. ...val
  227. })
  228. .then((res: any) => {
  229. if (res.code === 200) {
  230. containerObj.bar_title = res.data.ContainerCount_Title
  231. containerObj.barList = res.data.ContainerCountList
  232. containerObj.barSeries = res.data.ContainerCounSeries
  233. containerObj.Max = res.data.Max
  234. containerObj.interval = res.data.interval
  235. for (let i = 0; i < res.data.ContainerCounSeries.length; i++) {
  236. containerType.value.push(res.data.ContainerCounSeries[i].name)
  237. }
  238. containerType.value.push('All')
  239. }
  240. })
  241. }
  242. //获取CO2 Origin
  243. const EmissionObj = reactive({
  244. bar_title: '',
  245. barList: [],
  246. barSeries: [],
  247. Max: 0,
  248. interval: 0
  249. })
  250. const GetCo2EmissionEcharts = () => {
  251. $api.GetCo2EmissionEcharts({}).then((res: any) => {
  252. if (res.code === 200) {
  253. EmissionObj.bar_title = res.data.ContainerCount_Title
  254. EmissionObj.barList = res.data.ContainerCountList
  255. EmissionObj.barSeries = res.data.ContainerCounSeries
  256. EmissionObj.Max = res.data.Max
  257. EmissionObj.interval = res.data.interval
  258. }
  259. })
  260. }
  261. //获取CO2 Destination
  262. const DestinationObj = reactive({
  263. bar_title: '',
  264. barList: [],
  265. barSeries: [],
  266. Max: 0,
  267. interval: 0
  268. })
  269. const GetCo2DestinationEcharts = () => {
  270. $api.GetCo2DestinationEcharts({}).then((res: any) => {
  271. if (res.code === 200) {
  272. DestinationObj.bar_title = res.data.ContainerCount_Title
  273. DestinationObj.barList = res.data.ContainerCountList
  274. DestinationObj.barSeries = res.data.ContainerCounSeries
  275. DestinationObj.Max = res.data.Max
  276. DestinationObj.interval = res.data.interval
  277. }
  278. })
  279. }
  280. const topdestinationinType = ref()
  281. const toporiginType = ref()
  282. //获取Top10 Origin/Destination
  283. const Top10Obj = reactive({
  284. OriginData: [],
  285. DestinationData: []
  286. })
  287. const Top1OInterval = reactive({
  288. Max: 0,
  289. interval: 0
  290. })
  291. const Top1OInterval_dest = reactive({
  292. Max: 0,
  293. interval: 0
  294. })
  295. const GetTop10ODEcharts = () => {
  296. $api.GetTop10ODEcharts({}).then((res: any) => {
  297. if (res.code === 200) {
  298. Top10Obj.DestinationData = res.data.seller_data_list_destination
  299. Top10Obj.OriginData = res.data.seller_data_list_origin
  300. Top1OInterval.Max = res.data.Max
  301. Top1OInterval.interval = res.data.interval
  302. Top1OInterval_dest.Max = res.data.dest_Max
  303. Top1OInterval_dest.interval = res.data.dest_interval
  304. topdestinationinType.value = res.data.topdestinationinType
  305. toporiginType.value = res.data.toporiginType
  306. }
  307. })
  308. }
  309. onMounted(() => {
  310. GetDashboardData(dashboardObj, 'yes')
  311. GetETDEcharts()
  312. GetKPIEcharts()
  313. GetKPIArrivalEcharts()
  314. GetContainerCountEcharts(container_type)
  315. GetCo2EmissionEcharts()
  316. GetCo2DestinationEcharts()
  317. GetTop10ODEcharts()
  318. GetPendingEcharts()
  319. GetPendingArrivalEcharts()
  320. })
  321. let container_type: any = {
  322. container_type: 'All'
  323. }
  324. const changeType = (val: any) => {
  325. container_type.container_type = val
  326. GetContainerCountEcharts(container_type)
  327. GetDashboardData(dashboardObj, 'no')
  328. }
  329. // Save Layout
  330. const SaveLayout = () => {
  331. SaveVisible.value = false
  332. Management.value.forEach((item: any, index: any) => {
  333. item.id = index + 1
  334. })
  335. $api
  336. .SaveLayout({
  337. management: Management.value
  338. })
  339. .then((res: any) => {
  340. if (res.code == 200) {
  341. ElMessage({
  342. message: res.data.msg,
  343. duration: 3000,
  344. type: 'success'
  345. })
  346. }
  347. })
  348. }
  349. //Save Filters
  350. const SaveFilters = () => {
  351. SaveVisible.value = false
  352. Management.value.forEach((item: any, index: any) => {
  353. item.id = index + 1
  354. })
  355. $api
  356. .SaveLayout({
  357. management: Management.value,
  358. dashboardObj
  359. })
  360. .then((res: any) => {
  361. if (res.code == 200) {
  362. ElMessage({
  363. message: res.data.msg,
  364. duration: 3000,
  365. type: 'success'
  366. })
  367. }
  368. })
  369. }
  370. //输入框失焦时查询数据
  371. const SearchCustomer = () => {
  372. dashboardObj.customer = BookingSearch.value
  373. GetDashboardData(dashboardObj, 'no')
  374. }
  375. //ETD to ETA(DAYS)点击跳转
  376. const pie_chart_ETD = ref()
  377. const pie_chart_pending_arrival = ref()
  378. const pie_chart_pending_departure = ref()
  379. const pie_chart_kpi_departure = ref()
  380. const pie_chart_kpi_arrival = ref()
  381. const seller_chart_top10_origin = ref()
  382. const seller_chart_top10_destination = ref()
  383. const seller_chart_CO2_origin = ref()
  384. const seller_chart_CO2_destination = ref()
  385. const ClickParams = (val: any) => {
  386. const currentDate = new Date()
  387. let tenyear: any = 0
  388. if (currentDate.getMonth() - 11 < 0) {
  389. tenyear = currentDate.getFullYear() - 1
  390. } else {
  391. tenyear = currentDate.getFullYear()
  392. }
  393. const reportList: any = {}
  394. // ETD to ETA(DAYS)点击跳转
  395. if (val == 'ETD to ETA (Days)') {
  396. $api
  397. .ClickEtdToEta({
  398. _reportRef: pie_chart_ETD.value[0].paramsdata.name,
  399. _reportRefe_date: currentDate.getMonth() + 1 + '/' + currentDate.getFullYear(),
  400. _reportRefb_date: currentDate.getMonth() + 3 + '/' + tenyear
  401. })
  402. .then((res: any) => {
  403. if (res.code == 200) {
  404. reportList._reportRef = pie_chart_ETD.value[0].paramsdata.name
  405. reportList._reportRefe_date = currentDate.getMonth() + 1 + '/' + currentDate.getFullYear()
  406. reportList._reportType = 'r1'
  407. reportList._reportRefb_date = currentDate.getMonth() + 3 + '/' + tenyear
  408. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  409. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  410. let obj: any = {}
  411. obj.title = 'ETD to ETA (Days)'
  412. obj.name = pie_chart_ETD.value[0].paramsdata.name
  413. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  414. router.push({
  415. path: '/tracking'
  416. })
  417. }
  418. })
  419. }
  420. // PendingArrival点击跳转
  421. else if (val == 'Pending Departure & Arrival1') {
  422. $api
  423. .ClickPendingArrival({
  424. _reportRef: pie_chart_pending_arrival.value[0].paramsdata.name
  425. })
  426. .then((res: any) => {
  427. if (res.code == 200) {
  428. reportList._reportRef = pie_chart_pending_arrival.value[0].paramsdata.name
  429. reportList._reportType = 'r3'
  430. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  431. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  432. let obj: any = {}
  433. obj.title = 'Pending Arrival'
  434. obj.name = pie_chart_pending_arrival.value[0].paramsdata.name
  435. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  436. router.push({
  437. path: '/tracking'
  438. })
  439. }
  440. })
  441. }
  442. // PendingDeparture点击跳转
  443. else if (val == 'Pending Departure & Arrival0') {
  444. $api
  445. .ClickPendingDeparture({
  446. _reportRef: pie_chart_pending_departure.value[0].paramsdata.name
  447. })
  448. .then((res: any) => {
  449. if (res.code == 200) {
  450. reportList._reportType = 'r4'
  451. reportList._reportRef = pie_chart_pending_departure.value[0].paramsdata.name
  452. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  453. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  454. let obj: any = {}
  455. obj.title = 'Pending Departure'
  456. obj.name = pie_chart_pending_departure.value[0].paramsdata.name
  457. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  458. router.push({
  459. path: '/tracking'
  460. })
  461. }
  462. })
  463. }
  464. // KPIDeparture点击跳转
  465. else if (val == 'KPI0') {
  466. $api
  467. .ClickKPIDeparture({
  468. _reportRef: pie_chart_kpi_departure.value[0].paramsdata.name
  469. })
  470. .then((res: any) => {
  471. if (res.code == 200) {
  472. reportList._reportRef = pie_chart_kpi_departure.value[0].paramsdata.name
  473. reportList._reportType = 'atd_r4'
  474. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  475. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  476. let obj: any = {}
  477. obj.title = 'KPI Departure'
  478. obj.name = pie_chart_kpi_departure.value[0].paramsdata.name
  479. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  480. router.push({
  481. path: '/tracking'
  482. })
  483. }
  484. })
  485. }
  486. // KPIArrival点击跳转
  487. else if (val == 'KPI1') {
  488. $api
  489. .ClickKPIArrival({
  490. _reportRef: pie_chart_kpi_arrival.value[0].paramsdata.name
  491. })
  492. .then((res: any) => {
  493. if (res.code == 200) {
  494. reportList._reportRef = pie_chart_kpi_arrival.value[0].paramsdata.name
  495. reportList._reportType = 'ata_r3'
  496. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  497. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  498. let obj: any = {}
  499. obj.title = 'KPI Arrival'
  500. obj.name = pie_chart_kpi_arrival.value[0].paramsdata.name
  501. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  502. router.push({
  503. path: '/tracking'
  504. })
  505. }
  506. })
  507. }
  508. // Top10 origin点击跳转
  509. else if (val == 'Top 10 Origin') {
  510. $api
  511. .ClickTop10({
  512. _reportRef: seller_chart_top10_origin.value[0].paramsdata,
  513. _reportStationType: toporiginType.value,
  514. _city_name: seller_chart_top10_origin.value[0].paramscityname
  515. })
  516. .then((res: any) => {
  517. if (res.code == 200) {
  518. reportList._reportRef = seller_chart_top10_origin.value[0].paramsdata
  519. reportList._reportType = 'top'
  520. reportList._reportStationType = toporiginType.value
  521. reportList._city_name = seller_chart_top10_origin.value[0].paramscityname
  522. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  523. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  524. let obj: any = {}
  525. obj.title = 'Top 10 Origin'
  526. obj.name = seller_chart_top10_origin.value[0].paramsdata
  527. obj.data = seller_chart_top10_origin.value[0].paramscityname
  528. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  529. router.push({
  530. path: '/tracking'
  531. })
  532. }
  533. })
  534. }
  535. // Top10 destination点击跳转
  536. else if (val == 'Top 10 Destination') {
  537. $api
  538. .ClickTop10({
  539. _reportRef: seller_chart_top10_destination.value[0].paramsdata,
  540. _reportStationType: topdestinationinType.value,
  541. _city_name: seller_chart_top10_destination.value[0].paramscityname
  542. })
  543. .then((res: any) => {
  544. if (res.code == 200) {
  545. reportList._reportRef = seller_chart_top10_destination.value[0].paramsdata
  546. reportList._reportStationType = topdestinationinType.value
  547. reportList._reportType = 'top'
  548. reportList._city_name = seller_chart_top10_destination.value[0].paramscityname
  549. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  550. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  551. let obj: any = {}
  552. obj.title = 'Top 10 Destination'
  553. obj.name = seller_chart_top10_destination.value[0].paramsdata
  554. obj.data = seller_chart_top10_destination.value[0].paramscityname
  555. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  556. router.push({
  557. path: '/tracking'
  558. })
  559. }
  560. })
  561. }
  562. // CO2e Emission by Origin (Top 10)点击跳转
  563. else if (val == 'CO2e Emission by Origin (Top 10)') {
  564. $api
  565. .ClickCO2({
  566. _reportRef: seller_chart_CO2_origin.value[0].paramsdata.name,
  567. _reportDataType: seller_chart_CO2_origin.value[0].paramsdata.type,
  568. _reportStationType: 'origin'
  569. })
  570. .then((res: any) => {
  571. if (res.code == 200) {
  572. reportList._reportRef = seller_chart_CO2_origin.value[0].paramsdata.name
  573. reportList._reportDataType = seller_chart_CO2_origin.value[0].paramsdata.type
  574. reportList._reportStationType = 'origin'
  575. reportList._reportType = 'co2e'
  576. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  577. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  578. let obj: any = {}
  579. obj.title = 'CO2e Emission by Origin (Top 10)'
  580. obj.name = seller_chart_CO2_origin.value[0].paramsdata.name
  581. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  582. router.push({
  583. path: '/tracking'
  584. })
  585. }
  586. })
  587. }
  588. // CO2e Emission by Origin (Top 10)点击跳转
  589. else if (val == 'CO2e Emission by Destination (Top 10)') {
  590. $api
  591. .ClickCO2({
  592. _reportRef: seller_chart_CO2_destination.value[0].paramsdata.name,
  593. _reportDataType: seller_chart_CO2_destination.value[0].paramsdata.type,
  594. _reportStationType: 'agent'
  595. })
  596. .then((res: any) => {
  597. if (res.code == 200) {
  598. reportList._reportRef = seller_chart_CO2_destination.value[0].paramsdata.name
  599. reportList._reportDataType = seller_chart_CO2_destination.value[0].paramsdata.type
  600. reportList._reportType = 'co2e'
  601. reportList._reportStationType = 'agent'
  602. sessionStorage.setItem('clickParams', JSON.stringify(res.data))
  603. sessionStorage.setItem('reportList', JSON.stringify(reportList))
  604. let obj: any = {}
  605. obj.title = 'CO2e Emission by Destination (Top 10)'
  606. obj.name = seller_chart_CO2_destination.value[0].paramsdata.name
  607. sessionStorage.setItem('tagsList', JSON.stringify(obj))
  608. router.push({
  609. path: '/tracking'
  610. })
  611. }
  612. })
  613. }
  614. }
  615. </script>
  616. <template>
  617. <div class="dashboard">
  618. <!-- 评分 -->
  619. <ScoringSystem></ScoringSystem>
  620. <!-- Title -->
  621. <div class="Title">
  622. <div>Dashboard</div>
  623. <div>
  624. <el-popover trigger="click" width="400">
  625. <template #reference>
  626. <el-button class="el-button--default">
  627. <span class="iconfont_icon">
  628. <svg class="iconfont" aria-hidden="true">
  629. <use xlink:href="#icon-icon_view__management_b"></use>
  630. </svg>
  631. </span>
  632. View Management
  633. </el-button>
  634. </template>
  635. <div class="Management">
  636. <div class="title">View Management</div>
  637. <div class="management_content" v-for="(item, index) in Management" :key="index">
  638. <div class="management_flex">
  639. <div class="content_title">{{ item.title }}</div>
  640. <div><el-switch v-model="item.switchValue" /></div>
  641. </div>
  642. <div class="content_text">{{ item.text }}</div>
  643. </div>
  644. <el-divider />
  645. <div class="tips">
  646. <span class="iconfont_icon">
  647. <svg class="iconfont iconfont_tips" aria-hidden="true">
  648. <use xlink:href="#icon-icon_info_b"></use>
  649. </svg>
  650. </span>
  651. <div class="tips_text">
  652. Please remember to click the save button in order to keep the new dashboard layout
  653. and widgets.
  654. </div>
  655. </div>
  656. </div>
  657. </el-popover>
  658. <el-popover
  659. :visible="SaveVisible"
  660. :popper-style="{ display: 'flex', flexDirection: 'column', alignItems: 'center' }"
  661. >
  662. <template #reference>
  663. <el-button
  664. class="el-button--default"
  665. @blur="SaveVisible = false"
  666. @click="SaveVisible = !SaveVisible"
  667. >
  668. <span class="iconfont_icon">
  669. <svg class="iconfont" aria-hidden="true">
  670. <use xlink:href="#icon-icon_save_b"></use>
  671. </svg>
  672. </span>
  673. Save
  674. <span class="iconfont_icon">
  675. <svg class="iconfont" aria-hidden="true">
  676. <use xlink:href="#icon-icon_dropdown_b"></use>
  677. </svg>
  678. </span>
  679. </el-button>
  680. </template>
  681. <div class="Save_filters" @click="SaveFilters">
  682. <span class="iconfont_icon iconfont_icon_save">
  683. <svg class="iconfont" aria-hidden="true">
  684. <use xlink:href="#icon-icon_save_b"></use>
  685. </svg>
  686. </span>
  687. <div>Save Filters</div>
  688. </div>
  689. <div class="Save_filters" @click="SaveLayout">
  690. <span class="iconfont_icon iconfont_icon_save">
  691. <svg class="iconfont" aria-hidden="true">
  692. <use xlink:href="#icon-icon_save_b"></use>
  693. </svg>
  694. </span>
  695. <div>Save Layout</div>
  696. </div>
  697. </el-popover>
  698. </div>
  699. </div>
  700. <!-- 筛选 -->
  701. <div class="filters">
  702. <div style="display: flex; align-items: center">
  703. <div class="tips_filter">
  704. <el-checkbox-group
  705. @change="changeCheckboxGroup1"
  706. v-model="checkboxGroup1"
  707. size="large"
  708. style="height: 32px"
  709. >
  710. <el-checkbox-button v-for="item in shipper" :key="item" :value="item">
  711. {{ item }}
  712. </el-checkbox-button>
  713. </el-checkbox-group>
  714. </div>
  715. <div class="tips_filter">
  716. <el-radio-group v-model="changeCheckboxGroup2">
  717. <el-radio-button v-for="item in shipper_two" :key="item" :value="item" :label="item">
  718. </el-radio-button>
  719. </el-radio-group>
  720. </div>
  721. <div class="tips_filter">
  722. <QuickCalendarDate @DateChange="DateChange" :Date="DashDate"></QuickCalendarDate>
  723. </div>
  724. </div>
  725. <div class="filters_right">
  726. <el-input placeholder="Customer" v-model="BookingSearch" @blur="SearchCustomer">
  727. <template #prefix>
  728. <span class="iconfont_icon">
  729. <svg class="iconfont" aria-hidden="true">
  730. <use xlink:href="#icon-icon_search_b"></use>
  731. </svg>
  732. </span>
  733. </template>
  734. </el-input>
  735. </div>
  736. </div>
  737. <!-- 图表 -->
  738. <div class="echarts">
  739. <VueDraggable
  740. style="
  741. display: flex;
  742. flex-wrap: wrap;
  743. justify-content: space-between;
  744. gap: 8px;
  745. width: 100%;
  746. "
  747. ref="infoContentRef"
  748. ghost-class="ghost-class"
  749. :forceFallback="true"
  750. fallback-class="fallback-class"
  751. v-model="Management"
  752. handle=".handle-draggable"
  753. >
  754. <template v-for="item in Management" :key="item">
  755. <div v-if="item.title === 'KPI' && item.switchValue" class="filters_left">
  756. <!-- KPI -->
  757. <VBox_Dashboard @changeCancel="changeCancel(item.id)">
  758. <template #header>
  759. <div class="Title_flex">
  760. {{ item.title }}
  761. <el-tooltip
  762. effect="dark"
  763. :offset="6"
  764. :content="item.text"
  765. placement="bottom-start"
  766. >
  767. <span class="iconfont_icon iconfont_icon_tip">
  768. <svg class="iconfont" aria-hidden="true">
  769. <use xlink:href="#icon-icon_info_b"></use>
  770. </svg>
  771. </span>
  772. </el-tooltip>
  773. </div>
  774. </template>
  775. <template #content>
  776. <div class="KPI_Pending">
  777. <div class="kpi">
  778. <PieChart
  779. ref="pie_chart_kpi_departure"
  780. @ClickParams="ClickParams(item.title + '0')"
  781. :PieData="KPIobj"
  782. style="height: 300px"
  783. ></PieChart>
  784. </div>
  785. <div class="kpi">
  786. <PieChart
  787. ref="pie_chart_kpi_arrival"
  788. :PieData="Arrivalobj"
  789. @ClickParams="ClickParams(item.title + '1')"
  790. style="height: 300px"
  791. ></PieChart>
  792. </div>
  793. </div>
  794. </template>
  795. </VBox_Dashboard>
  796. </div>
  797. <div
  798. v-else-if="item.title === 'Pending Departure & Arrival' && item.switchValue"
  799. class="filters_left"
  800. >
  801. <!-- Pending -->
  802. <VBox_Dashboard @changeCancel="changeCancel(item.id)">
  803. <template #header>
  804. <div class="Title_flex">
  805. {{ item.title }}
  806. <el-tooltip :offset="6" effect="dark" :content="item.text" placement="bottom">
  807. <span class="iconfont_icon iconfont_icon_tip">
  808. <svg class="iconfont" aria-hidden="true">
  809. <use xlink:href="#icon-icon_info_b"></use>
  810. </svg>
  811. </span>
  812. </el-tooltip>
  813. </div>
  814. </template>
  815. <template #content>
  816. <div class="KPI_Pending">
  817. <div class="kpi">
  818. <PieChart
  819. ref="pie_chart_pending_departure"
  820. :PieData="Pendingobj"
  821. @ClickParams="ClickParams(item.title + '0')"
  822. style="height: 300px"
  823. ></PieChart>
  824. </div>
  825. <div class="kpi">
  826. <PieChart
  827. ref="pie_chart_pending_arrival"
  828. @ClickParams="ClickParams(item.title + '1')"
  829. :PieData="PendingArrivalobj"
  830. style="height: 300px"
  831. ></PieChart>
  832. </div>
  833. </div>
  834. </template>
  835. </VBox_Dashboard>
  836. </div>
  837. <div
  838. v-else-if="
  839. item.title === 'Recent Status' && item.switchValue && RecentStatusList.length != 0
  840. "
  841. class="KPI_Pending"
  842. >
  843. <!-- Recent Status -->
  844. <VBox_Dashboard @changeCancel="changeCancel(item.id)" style="width: 100%">
  845. <template #header>
  846. <div class="Title_flex">
  847. {{ item.title }}
  848. <el-tooltip
  849. :offset="6"
  850. effect="dark"
  851. :content="item.text"
  852. placement="bottom-start"
  853. >
  854. <span class="iconfont_icon iconfont_icon_tip">
  855. <svg class="iconfont" aria-hidden="true">
  856. <use xlink:href="#icon-icon_info_b"></use>
  857. </svg>
  858. </span>
  859. </el-tooltip>
  860. </div>
  861. </template>
  862. <template #content>
  863. <RecentStatus :RecentStatusList="RecentStatusList"></RecentStatus>
  864. <div class="pagination">
  865. <span>Total {{ pageInfo.total }}</span>
  866. <el-pagination
  867. v-model:current-page="pageInfo.pageNo"
  868. v-model:page-size="pageInfo.pageSize"
  869. :page-sizes="[10, 50, 100, 200]"
  870. layout="prev, pager, next"
  871. :pager-count="3"
  872. :total="pageInfo.total"
  873. @size-change="getTableData"
  874. @current-change="getTableData"
  875. />
  876. </div>
  877. </template>
  878. </VBox_Dashboard>
  879. </div>
  880. <!-- ETD to ETA -->
  881. <div
  882. v-else-if="item.title === 'ETD to ETA (Days)' && item.switchValue"
  883. class="filters_left"
  884. >
  885. <VBox_Dashboard @changeCancel="changeCancel(item.id)">
  886. <template #header>
  887. <div class="Title_flex">
  888. {{ item.title }}
  889. <el-tooltip
  890. :offset="6"
  891. effect="dark"
  892. :content="item.text"
  893. placement="bottom-start"
  894. >
  895. <span class="iconfont_icon iconfont_icon_tip">
  896. <svg class="iconfont" aria-hidden="true">
  897. <use xlink:href="#icon-icon_info_b"></use>
  898. </svg>
  899. </span>
  900. </el-tooltip>
  901. </div>
  902. </template>
  903. <template #content>
  904. <PieChart
  905. ref="pie_chart_ETD"
  906. @ClickParams="ClickParams(item.title)"
  907. :PieData="ETDobj"
  908. style="height: 300px"
  909. ></PieChart>
  910. </template>
  911. </VBox_Dashboard>
  912. </div>
  913. <!-- Container Count -->
  914. <div
  915. v-else-if="item.title === 'Container Count' && item.switchValue"
  916. class="filters_left"
  917. >
  918. <VBox_Dashboard @changeCancel="changeCancel(item.id)">
  919. <template #header>
  920. <div class="Title_flex" style="justify-content: space-between">
  921. <div class="Title_flex">
  922. {{ item.title }}
  923. <el-tooltip
  924. :offset="6"
  925. effect="dark"
  926. :content="item.text"
  927. placement="bottom-start"
  928. >
  929. <span class="iconfont_icon iconfont_icon_tip">
  930. <svg class="iconfont" aria-hidden="true">
  931. <use xlink:href="#icon-icon_info_b"></use>
  932. </svg>
  933. </span>
  934. </el-tooltip>
  935. </div>
  936. <div style="margin-right: 50px; display: flex; align-items: center">
  937. <span style="font-weight: 400; font-size: 14px; margin-right: 4px">Type</span>
  938. <el-select
  939. v-model="value"
  940. placeholder="Select"
  941. style="width: 100px"
  942. @change="changeType"
  943. >
  944. <el-option
  945. v-for="item in containerType"
  946. :key="item"
  947. :label="item"
  948. :value="item"
  949. />
  950. </el-select>
  951. </div>
  952. </div>
  953. </template>
  954. <template #content>
  955. <BarChart
  956. ref="seller_chart_Container_count"
  957. :BarData="containerObj"
  958. style="height: 300px"
  959. :barHeight="{ height: '300px' }"
  960. ></BarChart>
  961. </template>
  962. </VBox_Dashboard>
  963. </div>
  964. <!-- Top10 Origin/Top 10 Destination -->
  965. <div
  966. v-else-if="item.title === 'Top 10 Origin/Destination' && item.switchValue"
  967. class="KPI_Pending"
  968. >
  969. <VBox_Dashboard @changeCancel="changeCancel(item.id)" style="width: 100%">
  970. <template #header>
  971. <div class="Title_flex" style="height: 48px">
  972. <el-tabs
  973. v-model="activeName"
  974. class="demo-tabs"
  975. style="height: 48px"
  976. @tab-click="handleTabClick"
  977. >
  978. <el-tab-pane :label="item.title1" name="first"></el-tab-pane>
  979. <el-tab-pane :label="item.title2" name="second"></el-tab-pane>
  980. </el-tabs>
  981. <el-tooltip
  982. :offset="6"
  983. effect="dark"
  984. :content="item.text"
  985. placement="bottom-start"
  986. >
  987. <span class="iconfont_icon iconfont_icon_tip">
  988. <svg class="iconfont" aria-hidden="true" style="vertical-align: 1px">
  989. <use xlink:href="#icon-icon_info_b"></use>
  990. </svg>
  991. </span>
  992. </el-tooltip>
  993. </div>
  994. </template>
  995. <template v-if="isShowtitle1" #content>
  996. <div class="KPI_Pending">
  997. <div class="seller_chart">
  998. <SellerChart
  999. ref="seller_chart_top10_origin"
  1000. @clickParams="ClickParams(item.title1)"
  1001. :SellerData="Top10Obj.OriginData"
  1002. :Interval="Top1OInterval"
  1003. ></SellerChart>
  1004. </div>
  1005. <div class="map">
  1006. <TopMap></TopMap>
  1007. </div>
  1008. </div>
  1009. </template>
  1010. <template v-else #content2>
  1011. <div class="KPI_Pending">
  1012. <div class="seller_chart">
  1013. <SellerChart
  1014. ref="seller_chart_top10_destination"
  1015. @clickParams="ClickParams(item.title2)"
  1016. :SellerData="Top10Obj.DestinationData"
  1017. :Interval="Top1OInterval_dest"
  1018. style="height: 272px"
  1019. ></SellerChart>
  1020. </div>
  1021. <div class="map" style="height: 272px">
  1022. <TopMap></TopMap>
  1023. </div>
  1024. </div>
  1025. </template>
  1026. </VBox_Dashboard>
  1027. </div>
  1028. <!-- CO2e Emission by Origin (Top 10) -->
  1029. <div
  1030. v-else-if="item.title === 'CO2e Emission by Origin (Top 10)' && item.switchValue"
  1031. class="filters_left"
  1032. >
  1033. <VBox_Dashboard @changeCancel="changeCancel(item.id)">
  1034. <template #header>
  1035. <div class="Title_flex">
  1036. {{ item.title }}
  1037. <el-tooltip
  1038. :offset="6"
  1039. effect="dark"
  1040. :content="item.text"
  1041. placement="bottom-start"
  1042. >
  1043. <span class="iconfont_icon iconfont_icon_tip">
  1044. <svg class="iconfont" aria-hidden="true">
  1045. <use xlink:href="#icon-icon_info_b"></use>
  1046. </svg>
  1047. </span>
  1048. </el-tooltip>
  1049. </div>
  1050. </template>
  1051. <template #content>
  1052. <BarChart
  1053. ref="seller_chart_CO2_origin"
  1054. :BarData="EmissionObj"
  1055. @clickParams="ClickParams(item.title)"
  1056. style="height: 250px"
  1057. :barHeight="{ height: '250px' }"
  1058. ></BarChart>
  1059. </template>
  1060. </VBox_Dashboard>
  1061. </div>
  1062. <!-- CO2e Emission by Destination (Top 10) -->
  1063. <div
  1064. v-else-if="item.title === 'CO2e Emission by Destination (Top 10)' && item.switchValue"
  1065. class="filters_left"
  1066. >
  1067. <VBox_Dashboard @changeCancel="changeCancel(item.id)">
  1068. <template #header>
  1069. <div class="Title_flex">
  1070. {{ item.title }}
  1071. <el-tooltip
  1072. :offset="6"
  1073. effect="dark"
  1074. :content="item.text"
  1075. placement="bottom-start"
  1076. >
  1077. <span class="iconfont_icon iconfont_icon_tip">
  1078. <svg class="iconfont" aria-hidden="true">
  1079. <use xlink:href="#icon-icon_info_b"></use>
  1080. </svg>
  1081. </span>
  1082. </el-tooltip>
  1083. </div>
  1084. </template>
  1085. <template #content>
  1086. <BarChart
  1087. ref="seller_chart_CO2_destination"
  1088. :BarData="DestinationObj"
  1089. style="height: 250px"
  1090. @clickParams="ClickParams(item.title)"
  1091. :barHeight="{ height: '250px' }"
  1092. ></BarChart>
  1093. </template>
  1094. </VBox_Dashboard>
  1095. </div>
  1096. </template>
  1097. </VueDraggable>
  1098. </div>
  1099. </div>
  1100. </template>
  1101. <style lang="scss" scoped>
  1102. .Title {
  1103. display: flex;
  1104. height: 68px;
  1105. font-size: var(--font-size-6);
  1106. font-weight: 700;
  1107. padding: 0 24px;
  1108. align-items: center;
  1109. justify-content: space-between;
  1110. }
  1111. .iconfont {
  1112. vertical-align: -2px;
  1113. }
  1114. .Management {
  1115. max-height: 800px;
  1116. overflow-y: auto;
  1117. }
  1118. .title {
  1119. font-weight: 700;
  1120. font-size: var(--font-size-5);
  1121. background-color: var(--color-header-bg);
  1122. height: 48px;
  1123. display: flex;
  1124. align-items: center;
  1125. padding-left: 16px;
  1126. }
  1127. .management_content {
  1128. width: 368px;
  1129. min-height: 54px;
  1130. margin: 10px auto;
  1131. background-color: var(--color-header-bg);
  1132. border-radius: var(--border-radius-6);
  1133. padding: 8px 16px;
  1134. }
  1135. .management_flex {
  1136. display: flex;
  1137. height: 20px;
  1138. justify-content: space-between;
  1139. align-items: center;
  1140. }
  1141. .content_title {
  1142. font-weight: 700;
  1143. font-size: var(--font-size-3);
  1144. }
  1145. .content_text {
  1146. color: var(--color-neutral-2);
  1147. font-size: var(--font-size-2);
  1148. line-height: 16px;
  1149. }
  1150. .tips {
  1151. display: flex;
  1152. justify-content: center;
  1153. }
  1154. .tips_text {
  1155. width: 278.43px;
  1156. text-align: center;
  1157. font-size: var(--font-size-2);
  1158. color: var(--color-neutral-2);
  1159. }
  1160. .el-divider--horizontal {
  1161. margin: 8px 0;
  1162. }
  1163. .Save_filters {
  1164. display: flex;
  1165. align-items: center;
  1166. justify-content: center;
  1167. height: 40px;
  1168. font-size: var(--font-size-3);
  1169. width: 126px;
  1170. margin: 4px 0;
  1171. cursor: pointer;
  1172. }
  1173. .iconfont_icon_save {
  1174. margin-right: 16px;
  1175. }
  1176. .Save_filters:hover {
  1177. border-color: var(--color-btn-default-bg-hover);
  1178. background-color: var(--color-btn-default-bg-hover);
  1179. fill: var(--color-theme);
  1180. div {
  1181. color: var(--color-theme);
  1182. }
  1183. }
  1184. :deep(.el-checkbox-button__inner) {
  1185. color: var(--tag-info-text-color);
  1186. font-size: var(--font-size-3);
  1187. font-weight: 400;
  1188. padding: 0;
  1189. width: 61px;
  1190. height: 32px;
  1191. display: flex;
  1192. align-items: center;
  1193. justify-content: center;
  1194. border: 1px solid var(--color-border);
  1195. margin-bottom: 8px;
  1196. }
  1197. :deep(.el-checkbox-button__inner:hover) {
  1198. color: var(--color-theme);
  1199. background-color: var(--color-btn-default-bg-hover);
  1200. border-color: var(--color-btn-default-bg-hover);
  1201. }
  1202. :deep(.el-checkbox-button.is-focus .el-checkbox-button__inner) {
  1203. border-color: transparent;
  1204. }
  1205. :deep(.el-checkbox-button:first-child .el-checkbox-button__inner) {
  1206. border-left: 1px solid var(--color-border);
  1207. border-top-left-radius: var(--border-radius-6);
  1208. border-bottom-left-radius: var(--border-radius-6);
  1209. }
  1210. :deep(.el-checkbox-button:last-child .el-checkbox-button__inner) {
  1211. border-top-right-radius: var(--border-radius-6);
  1212. border-bottom-right-radius: var(--border-radius-6);
  1213. }
  1214. :deep(.el-checkbox-button.is-checked .el-checkbox-button__inner) {
  1215. color: #ffffff;
  1216. background-color: var(--color-theme);
  1217. border-color: var(--color-theme);
  1218. box-shadow: none;
  1219. font-weight: 700;
  1220. }
  1221. :deep(.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner) {
  1222. border-left-color: var(--color-theme);
  1223. }
  1224. :deep(.el-checkbox-button.is-focus .el-checkbox-button__inner) {
  1225. border-color: var(--color-border);
  1226. }
  1227. .filters {
  1228. display: flex;
  1229. padding: 0 24px;
  1230. height: 32px;
  1231. align-items: center;
  1232. margin-bottom: 8px;
  1233. justify-content: space-between;
  1234. }
  1235. .KPI_Pending {
  1236. display: flex;
  1237. width: 100%;
  1238. }
  1239. .filters_left {
  1240. border-radius: var(--border-radius-6);
  1241. flex: 1 48%;
  1242. }
  1243. .KPI_title {
  1244. border-bottom: 1px solid var(--color-border);
  1245. height: 48px;
  1246. line-height: 48px;
  1247. align-items: center;
  1248. justify-content: space-between;
  1249. display: flex;
  1250. padding-left: 16px;
  1251. font-weight: 700;
  1252. font-size: var(--font-size-5);
  1253. }
  1254. .tips_filter {
  1255. margin-right: 8px;
  1256. height: 32px;
  1257. }
  1258. .filters_right {
  1259. width: 251px;
  1260. height: 32px;
  1261. margin-bottom: 8px;
  1262. }
  1263. :deep(.ETD_title) {
  1264. margin-bottom: 0 !important;
  1265. }
  1266. :deep(:where(.css-dev-only-do-not-override-19iuou).ant-picker-range) {
  1267. height: 32px;
  1268. }
  1269. .echarts {
  1270. padding: 0 22px;
  1271. }
  1272. .kpi {
  1273. width: 50%;
  1274. border-right: 1px solid var(--color-border);
  1275. }
  1276. .kpi:last-child {
  1277. border-right: none;
  1278. }
  1279. .ghost-class {
  1280. opacity: 0;
  1281. }
  1282. .fallback-class {
  1283. opacity: 1 !important;
  1284. background-color: #fff;
  1285. cursor: move !important;
  1286. box-shadow: 4px 4px 32px 0px rgba(0, 0, 0, 0.2);
  1287. border-radius: 12px;
  1288. }
  1289. .pagination {
  1290. display: flex;
  1291. justify-content: space-between;
  1292. align-items: center;
  1293. border-top: 1px solid var(--color-border);
  1294. padding: 4px 8px;
  1295. }
  1296. .container-type {
  1297. font-size: 14px;
  1298. font-weight: 400;
  1299. margin-right: 4px;
  1300. }
  1301. .seller_chart {
  1302. width: 30%;
  1303. border-right: 1px solid var(--color-border);
  1304. }
  1305. .map {
  1306. width: 70%;
  1307. }
  1308. .Title_flex {
  1309. display: flex;
  1310. align-items: center;
  1311. }
  1312. .iconfont_icon_tip {
  1313. margin-left: 8px;
  1314. width: 16px;
  1315. height: 16px;
  1316. display: flex;
  1317. align-items: center;
  1318. }
  1319. .dashboard {
  1320. z-index: 2014;
  1321. position: relative;
  1322. background-color: white;
  1323. padding-bottom: 40px;
  1324. }
  1325. :deep(.el-tabs__header) {
  1326. height: 48px;
  1327. margin-bottom: 0;
  1328. }
  1329. </style>