wuhongbo 1 年間 前
コミット
eaf5d8cf1f

BIN
client/src/assets/imgs/oaView/card-title-lone.png


BIN
client/src/assets/imgs/oaView/jt.png


+ 264 - 0
client/src/views/OaSystem/oaViews/components/cardViewLone.vue

@@ -0,0 +1,264 @@
+<template>
+  <div class="card-view">
+    <div class="card-title">
+      <div class="title-left">
+        <p>{{ props.title }}</p>
+      </div>
+      <div class="title-right">
+        <ul v-if="props.topTabs">
+          <li
+            v-for="(item, index) in props.topTabs"
+            :key="index"
+            :class="index == topTabsIndex ? 'liActive' : ''"
+            @click="topTabsClick(item, index)"
+          >
+            <p>{{ item }}</p>
+          </li>
+        </ul>
+        <el-select
+          v-if="topTabsYear"
+          v-model="yearModel"
+          class="m-2"
+          placeholder="选择年份"
+          style="width: 100px"
+        >
+          <el-option
+            v-for="item in yearOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </div>
+    </div>
+    <div class="tabs-Box" v-if="initTabsShow()">
+      <div class="tabs-left">
+        <ul v-if="props.leftTabs">
+          <el-radio-group v-model="radioModel" @change="radioGroupChange">
+            <el-radio
+              v-for="(item, index) in props.leftTabs"
+              :label="index"
+              :key="index"
+              size="large"
+              >{{ item }}</el-radio
+            >
+          </el-radio-group>
+        </ul>
+      </div>
+      <div class="tabs-right">
+        <ul v-if="props.rightTabs">
+          <li
+            v-for="(item, index) in props.rightTabs"
+            :key="index"
+            :class="index == rightTabsIndex ? 'liActive' : ''"
+            @click="rightTabsClick(item, index)"
+          >
+            <p>{{ item }}</p>
+          </li>
+        </ul>
+      </div>
+    </div>
+    <div class="card-content">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+const props = defineProps({
+  title: String,
+  leftTabs: Array,
+  rightTabs: Array,
+  topTabs: Array,
+  topTabsYear: Boolean
+})
+const emit = defineEmits(['leftClick', 'rightClick', 'topClick'])
+const yearOptions = ref([
+  {
+    label: '2024',
+    value: '2024'
+  },
+  {
+    label: '2023',
+    value: '2023'
+  },
+  {
+    label: '2022',
+    value: '2022'
+  }
+])
+const yearModel = ref('2024')
+const radioModel = ref(0)
+const rightTabsIndex = ref(0)
+const topTabsIndex = ref(0)
+const initTabsShow = () => {
+  if (props.leftTabs || props.rightTabs) {
+    return true
+  } else {
+    return false
+  }
+}
+const rightTabsClick = (item, index) => {
+  rightTabsIndex.value = index
+  emit('rightClick', index)
+}
+
+const topTabsClick = (item, index) => {
+  topTabsIndex.value = index
+  emit('topClick', index)
+}
+const radioGroupChange = (v) => {
+  emit('leftClick', props.leftTabs[v])
+}
+
+/** 初始化 **/
+onMounted(() => {
+  initTabsShow()
+})
+</script>
+<style lang="scss" scoped>
+p,
+span,
+h4,
+h5,
+h6 {
+  font-family: AlibabaPuHuiTiR;
+}
+.card-view {
+  width: 100%;
+  height: auto;
+
+  .card-title {
+    width: 100%;
+    height: 46px;
+    background: url(@/assets/imgs/oaView/card-title-lone.png) no-repeat;
+    background-size: 100% 100%;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-left: 45px;
+    .title-left {
+      p {
+        color: #fff;
+        font-size: 20px;
+        font-family: AlibabaPuHuiTiB;
+        font-weight: 600;
+        color: #ffffff;
+        background: linear-gradient(0deg, #ffff 20%, #def1ff 100%);
+        -webkit-background-clip: text;
+        -webkit-text-fill-color: transparent;
+        margin-top: 8px;
+      }
+    }
+    .title-right {
+      margin-top: 8px;
+      height: 100%;
+      ul {
+        display: flex;
+        align-items: center;
+        height: 100%;
+        li {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          width: 64px;
+          height: 24px;
+          border: 2px solid #0d6795;
+          background-color: transparent;
+          cursor: pointer;
+          margin-right: 5px;
+          p {
+            color: #7ac1ec;
+            font-size: 16px;
+          }
+        }
+        li:last-child {
+          margin-right: 0;
+        }
+        .liActive {
+          background-color: #29a4e4;
+          p {
+            color: #fff;
+          }
+        }
+      }
+    }
+  }
+  .tabs-Box {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 0 10px;
+    height: 40px;
+    padding-right: 0;
+    .tabs-left {
+      ul {
+        display: flex;
+        align-items: center;
+        li {
+        }
+      }
+    }
+    .tabs-right {
+      ul {
+        display: flex;
+        align-items: center;
+        li {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          height: 24px;
+          border: 2px solid #0d6795;
+          background-color: transparent;
+          cursor: pointer;
+          margin-right: 5px;
+          padding: 0 4px;
+          p {
+            color: #7ac1ec;
+            font-size: 16px;
+            white-space: nowrap;
+          }
+        }
+        li:last-child {
+          margin-right: 0;
+        }
+        .liActive {
+          background-color: #29a4e4;
+          p {
+            color: #fff;
+          }
+        }
+      }
+    }
+  }
+  .card-content {
+    width: 100%;
+    height: calc(100% - 86px);
+  }
+}
+:deep(.tabs-left) {
+  .el-radio__label {
+    color: #7ac1ec;
+    font-size: 16px;
+    font-family: AlibabaPuHuiTiR;
+  }
+  .el-radio {
+    margin-right: 15px;
+  }
+}
+:deep(.title-right) {
+  .el-select {
+    .el-input {
+    }
+    .el-input__wrapper {
+      background-color: transparent;
+      border-radius: 0;
+      border-color: #0d6795 !important;
+    }
+    input,
+    span {
+      color: #fff;
+    }
+  }
+}
+</style>

+ 207 - 5
client/src/views/OaSystem/oaViews/financeView/mapView/mapView.vue

@@ -1,13 +1,98 @@
 <template>
   <div class="map-view-com">
-    <div class="map-chart">
-      <MapChart />
-    </div>
+    <CardViewLone
+      class="CardViewC1"
+      :title="'现金收入'"
+      :topTabsYear="true"
+      @topYearClick="topClick1"
+    >
+      <div class="cardBox">
+        <div class="infoBox">
+          <div class="cardT">
+            <div class="cardT1">
+              <img src="@/assets/imgs/oaView/ljsr.png" />
+              <p>开票金额</p>
+            </div>
+            <div class="cardT2">
+              <div class="cardT2L">
+                <div v-for="(l, i) in kpjeValue" :key="i">
+                  <p>{{ l }}</p>
+                </div>
+              </div>
+              <span>万元</span>
+            </div>
+          </div>
+          <div class="cardT">
+            <div class="cardT1">
+              <img src="@/assets/imgs/oaView/ljsr.png" />
+              <p>应收账款</p>
+            </div>
+            <div class="cardT2">
+              <div class="cardT2L">
+                <div v-for="(l, i) in yszkValue" :key="i">
+                  <p>{{ l }}</p>
+                </div>
+              </div>
+              <span>万元</span>
+            </div>
+          </div>
+        </div>
+      </div>
+    </CardViewLone>
+    <CardViewLone
+      class="CardViewC2"
+      :title="'成本预算、支出'"
+      :topTabs="['总览', '按板块']"
+      @topClick="topClick2"
+    >
+      <div class="cardBox">
+        <div class="infoBox">
+          <div class="cardT">
+            <div class="cardT1">
+              <img src="@/assets/imgs/oaView/ljsr.png" />
+              <p>预算规模</p>
+            </div>
+            <div class="cardT2">
+              <div class="cardT2L">
+                <div v-for="(l, i) in ysgmValue" :key="i">
+                  <p>{{ l }}</p>
+                </div>
+              </div>
+              <span>万元</span>
+            </div>
+          </div>
+          <div class="cardT">
+            <div class="cardT1">
+              <img src="@/assets/imgs/oaView/ljsr.png" />
+              <p>累计支出</p>
+            </div>
+            <div class="cardT2">
+              <div class="cardT2L">
+                <div v-for="(l, i) in ljzcValue" :key="i">
+                  <p>{{ l }}</p>
+                </div>
+              </div>
+              <span>万元</span>
+            </div>
+          </div>
+        </div>
+      </div>
+    </CardViewLone>
   </div>
 </template>
 <script setup lang="ts">
 import { onMounted, ref } from 'vue'
-import MapChart from './mapChart.vue'
+import CardViewLone from '../../components/cardViewLone.vue'
+const kpjeValue = ref('14562')
+const yszkValue = ref('14562')
+const ysgmValue = ref('1456')
+const ljzcValue = ref('1456')
+const topClick1 = (value) => {
+  console.log(value)
+}
+const topClick2 = (value) => {
+  console.log(value)
+}
 
 /** 初始化 **/
 onMounted(() => {})
@@ -17,10 +102,127 @@ onMounted(() => {})
 
 .map-view-com {
   position: relative;
-
+  padding: 0 80px;
   .map-chart {
     width: 100%;
     height: calc(100% - 100px);
   }
+
+  .CardViewC1 {
+    height: 60%;
+    .cardBox {
+      height: calc(100% + 36px);
+      padding: 10px;
+      .infoBox {
+        padding: 0 20px;
+        width: 100%;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        .cardT {
+          width: calc(50% - 30px);
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          .cardT1 {
+            display: flex;
+            align-items: center;
+            img {
+              margin-right: 10px;
+            }
+            p {
+              font-size: 18px;
+            }
+          }
+          .cardT2 {
+            display: flex;
+            align-items: center;
+            .cardT2L {
+              display: flex;
+              align-items: center;
+              div {
+                width: 26px;
+                height: 34px;
+                background: rgba(11, 84, 153, 0.53);
+                border: 1px solid #1282bd;
+                border-radius: 4px;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                margin: 0 2px;
+                p {
+                  color: #29d2e4;
+                  font-family: AlibabaPuHuiTiB;
+                  font-size: 24px;
+                }
+              }
+            }
+            span {
+              color: #29d2e4;
+              font-size: 14px;
+            }
+          }
+        }
+      }
+    }
+  }
+  .CardViewC2 {
+    height: 40%;
+    .cardBox {
+      height: calc(100% + 36px);
+      padding: 10px;
+      .infoBox {
+        padding: 0 20px;
+        width: 100%;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        .cardT {
+          width: calc(50% - 30px);
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          .cardT1 {
+            display: flex;
+            align-items: center;
+            img {
+              margin-right: 10px;
+            }
+            p {
+              font-size: 18px;
+            }
+          }
+          .cardT2 {
+            display: flex;
+            align-items: center;
+            .cardT2L {
+              display: flex;
+              align-items: center;
+              div {
+                width: 26px;
+                height: 34px;
+                background: rgba(11, 84, 153, 0.53);
+                border: 1px solid #1282bd;
+                border-radius: 4px;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                margin: 0 2px;
+                p {
+                  color: #29d2e4;
+                  font-family: AlibabaPuHuiTiB;
+                  font-size: 24px;
+                }
+              }
+            }
+            span {
+              color: #29d2e4;
+              font-size: 14px;
+            }
+          }
+        }
+      }
+    }
+  }
 }
 </style>