| | |
| | | <template> |
| | | <div class="panel-header"> |
| | | <div |
| | | class="panel-header" |
| | | :class="{ clickable: !!to }" |
| | | @click="handleClick" |
| | | > |
| | | <span class="panel-title">{{ title }}</span> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | defineProps({ |
| | | import { useRouter } from 'vue-router' |
| | | |
| | | const props = defineProps({ |
| | | title: { |
| | | type: String, |
| | | required: true, |
| | | default: '' |
| | | }, |
| | | to: { |
| | | type: String, |
| | | default: '' |
| | | } |
| | | }) |
| | | |
| | | const router = useRouter() |
| | | |
| | | const handleClick = () => { |
| | | if (props.to) { |
| | | router.push(props.to) |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | |
| | | padding-left: 46px; |
| | | line-height: 36px; |
| | | } |
| | | |
| | | .panel-header.clickable { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .panel-header.clickable:hover .panel-title { |
| | | color: #43e8fc; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div> |
| | | <PanelHeader title="åºå
¥åºè¶å¿" /> |
| | | <PanelHeader title="åºå
¥åºè¶å¿" to="/inventoryManagement/receiptManagement" /> |
| | | <div class="main-panel panel-item-customers"> |
| | | <div class="filters-row"> |
| | | |
| | |
| | | <div> |
| | | <!-- 设å¤ç»è®¡ --> |
| | | <div class="equipment-stats"> |
| | | <div class="equipment-header"> |
| | | <div class="equipment-header clickable" @click="handleNavigate"> |
| | | <img |
| | | src="@/assets/BI/shujutongjiicon@2x.png" |
| | | alt="徿 " |
| | |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, inject, watch } from 'vue' |
| | | import { useRouter } from 'vue-router' |
| | | import Echarts from '@/components/Echarts/echarts.vue' |
| | | import { productTurnoverDays } from '@/api/viewIndex.js' |
| | | import { getPsiRoute } from '../psiNavigation.js' |
| | | |
| | | const router = useRouter() |
| | | |
| | | const handleNavigate = () => { |
| | | const path = getPsiRoute('产åå¨è½¬å¤©æ°') |
| | | if (path) { |
| | | router.push(path) |
| | | } |
| | | } |
| | | |
| | | const chartStyle = { width: '100%', height: '100%' } |
| | | const grid = { left: '3%', right: '4%', bottom: '3%', top: '4%', containLabel: true } |
| | |
| | | padding-bottom: 2px; |
| | | } |
| | | |
| | | .equipment-header.clickable { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .equipment-header.clickable:hover .equipment-title { |
| | | opacity: 0.85; |
| | | } |
| | | |
| | | .equipment-title { |
| | | font-weight: 500; |
| | | font-size: 18px; |
| | |
| | | v-for="item in statItems" |
| | | :key="item.name" |
| | | class="stat-card" |
| | | :class="{ clickable: !!getStatRoute(item.name) }" |
| | | @click="handleStatClick(item.name)" |
| | | > |
| | | <img src="@/assets/BI/icon@2x.png" alt="徿 " class="card-icon" /> |
| | | <div class="card-content"> |
| | |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, inject, watch } from 'vue' |
| | | import { useRouter } from 'vue-router' |
| | | import { salesPurchaseStorageProductCount } from '@/api/viewIndex.js' |
| | | import { getPsiRoute } from '../psiNavigation.js' |
| | | |
| | | const router = useRouter() |
| | | const statItems = ref([]) |
| | | |
| | | const getStatRoute = (name) => getPsiRoute(name) |
| | | |
| | | const handleStatClick = (name) => { |
| | | const path = getStatRoute(name) |
| | | if (path) { |
| | | router.push(path) |
| | | } |
| | | } |
| | | |
| | | const formatPercent = (val) => { |
| | | const num = Number(val) || 0 |
| | |
| | | height: 142px; |
| | | } |
| | | |
| | | .stat-card.clickable { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .stat-card.clickable:hover .card-label { |
| | | color: #43e8fc; |
| | | } |
| | | |
| | | .card-icon { |
| | | width: 100px; |
| | | height: 100px; |
| | |
| | | <template> |
| | | <div> |
| | | <PanelHeader title="éè´ååå¸" /> |
| | | <PanelHeader title="éè´ååå¸" to="/procurementManagement/paymentLedger" /> |
| | | <div class="main-panel panel-item-customers"> |
| | | <CarouselCards :items="cardItems" :visible-count="3" /> |
| | | <div class="pie-chart-wrapper" ref="pieWrapperRef"> |
| | |
| | | <template> |
| | | <div> |
| | | <PanelHeader title="éå®ååå¸" /> |
| | | <PanelHeader title="éå®ååå¸" to="/salesManagement/receiptPaymentLedger" /> |
| | | <div class="main-panel panel-item-customers"> |
| | | <CarouselCards :items="cardItems" :visible-count="3" /> |
| | | <div class="pie-chart-wrapper" ref="pieWrapperRef"> |
| | |
| | | |
| | | <!-- å³ä¾§åºå --> |
| | | <div class="right-panel"> |
| | | <RightBottom /> |
| | | <RightTop /> |
| | | <RightBottom header-to="/salesManagement/receiptPaymentLedger" /> |
| | | <RightTop header-to="/procurementManagement/paymentLedger" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | export const PSI_ROUTE_MAP = { |
| | | éå®ååå¸: '/salesManagement/receiptPaymentLedger', |
| | | éè´ååå¸: '/procurementManagement/paymentLedger', |
| | | éå®äº§åæ°: '/salesManagement/salesLedger', |
| | | éè´äº§åæ°: '/procurementManagement/procurementLedger', |
| | | å¨åäº§åæ°: '/inventoryManagement/stockManagement', |
| | | 客æ·è´¡ç®æå: '/salesManagement/receiptPaymentLedger', |
| | | ä¾åºåéè´æå: '/procurementManagement/paymentLedger', |
| | | åºå
¥åºè¶å¿: '/inventoryManagement/receiptManagement', |
| | | 产åå¨è½¬å¤©æ°: '/inventoryManagement/stockManagement', |
| | | } |
| | | |
| | | export function getPsiRoute(name) { |
| | | return PSI_ROUTE_MAP[name] || '' |
| | | } |
| | |
| | | <template> |
| | | <div class="panel-header"> |
| | | <div |
| | | class="panel-header" |
| | | :class="{ clickable: !!to }" |
| | | @click="handleClick" |
| | | > |
| | | <span class="panel-title">{{ title }}</span> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | defineProps({ |
| | | import { useRouter } from 'vue-router' |
| | | |
| | | const props = defineProps({ |
| | | title: { |
| | | type: String, |
| | | required: true, |
| | | default: '' |
| | | }, |
| | | to: { |
| | | type: String, |
| | | default: '' |
| | | } |
| | | }) |
| | | |
| | | const router = useRouter() |
| | | |
| | | const handleClick = () => { |
| | | if (props.to) { |
| | | router.push(props.to) |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | |
| | | padding-left: 46px; |
| | | line-height: 36px; |
| | | } |
| | | |
| | | .panel-header.clickable { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .panel-header.clickable:hover .panel-title { |
| | | color: #43e8fc; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div> |
| | | <PanelHeader title="客æ·è´¡ç®æå" /> |
| | | <PanelHeader title="客æ·è´¡ç®æå" :to="headerTo" /> |
| | | <div class="panel-item-customers"> |
| | | <div class="switch-container"> |
| | | <DateTypeSwitch v-model="dateType" @change="handleDateTypeChange" /> |
| | |
| | | import DateTypeSwitch from '../DateTypeSwitch.vue' |
| | | import { customerContributionRanking } from '@/api/viewIndex.js' |
| | | |
| | | defineProps({ |
| | | headerTo: { |
| | | type: String, |
| | | default: '' |
| | | } |
| | | }) |
| | | |
| | | const chartStyle = { |
| | | width: '100%', |
| | | height: '100%', |
| | |
| | | <template> |
| | | <div> |
| | | <PanelHeader title="ä¾åºåéè´æå" /> |
| | | <PanelHeader title="ä¾åºåéè´æå" :to="headerTo" /> |
| | | <div class="panel-item-customers"> |
| | | <div class="switch-container"> |
| | | <DateTypeSwitch v-model="radio1" @change="handleDateTypeChange" /> |
| | |
| | | import DateTypeSwitch from '../DateTypeSwitch.vue' |
| | | import { supplierPurchaseRanking } from '@/api/viewIndex.js' |
| | | |
| | | defineProps({ |
| | | headerTo: { |
| | | type: String, |
| | | default: '' |
| | | } |
| | | }) |
| | | |
| | | const chartStyle = { |
| | | width: '100%', |
| | | height: '100%', |