DashboardView.vue 44 KB

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