فهرست منبع

fixed:项目推进

nahida 2 سال پیش
والد
کامیت
0592d5801e
43فایلهای تغییر یافته به همراه4639 افزوده شده و 1370 حذف شده
  1. 1 1
      .env.production
  2. 1 1
      index.html
  3. BIN
      public/favicon.ico
  4. BIN
      public/favicon.png
  5. 49 0
      src/api/basicData/message.js
  6. 49 0
      src/api/basicData/mortgage3.js
  7. 10 0
      src/api/basicData/mostdetail.js
  8. 49 0
      src/api/basicData/reporting.js
  9. 35 2
      src/api/buscmonitoring/index.js
  10. 14 1
      src/api/home/home.js
  11. 14 5
      src/api/visualization/index.js
  12. BIN
      src/assets/images/000.jpg
  13. BIN
      src/assets/images/888.jpg
  14. 2 9
      src/components/baseEcharts/index.vue
  15. 2 1
      src/main.js
  16. 16 1
      src/utils/request.js
  17. 370 138
      src/views/BusDynamics/OPCMonitoring/index.vue
  18. 379 72
      src/views/BusDynamics/TaxMonitoring/index.vue
  19. 375 0
      src/views/BusDynamics/czjsqy/index.vue
  20. 381 0
      src/views/BusDynamics/ssjsqy/index.vue
  21. 2 2
      src/views/CCInformation/GIRelease/index.vue
  22. 1 1
      src/views/CCInformation/HQEReleased/index.vue
  23. 326 0
      src/views/CCInformation/qysbxx/index.vue
  24. 52 24
      src/views/CDCService/COmpService/index.vue
  25. 290 0
      src/views/CDCService/message/index.vue
  26. 29 4
      src/views/CEEnterprise/ARQuery/index.vue
  27. 6 1
      src/views/CEEnterprise/CERating/index.vue
  28. 309 76
      src/views/CEEnterprise/DEInformation/index.vue
  29. 11 4
      src/views/CEEnterprise/companydetail/map/index.js
  30. 179 0
      src/views/CEEnterprise/qydfmx/index.vue
  31. 94 0
      src/views/CEEnterprise/qydfmx/map/index.js
  32. 8 7
      src/views/basicData/OpeCapability/information/index.vue
  33. 1 1
      src/views/basicData/cwxx/cwbbxx/index.vue
  34. 5 5
      src/views/basicData/ggxyjl/jnlyxx/dfqj/index.vue
  35. 5 5
      src/views/basicData/ggxyjl/jnlyxx/sfqj/index.vue
  36. 304 0
      src/views/basicData/ggxyjl/xzjgxx/xzcfxx/dcdy/index.vue
  37. 1 1
      src/views/basicData/qyzjl/shzr/gjjjn/index.vue
  38. 2 2
      src/views/basicData/qyzjl/shzr/sbjn/index.vue
  39. 6 6
      src/views/basicData/qyzjl/shzr/ssjn/index.vue
  40. 8 7
      src/views/home/index.vue
  41. 1 0
      src/views/login.vue
  42. 10 4
      src/views/system/user/index.vue
  43. 1242 989
      src/views/visualization/index.vue

+ 1 - 1
.env.production

@@ -6,7 +6,7 @@ VITE_APP_ENV = 'production'
 
 # 桃江管理系统/生产环境
 VITE_APP_BASE_API = 'http://42.48.99.5:20002'
-
+VITE_APP_BASE_URL = 'http://42.48.99.5:20002'
 
 # 是否在打包时开启压缩,支持 gzip 和 brotli
 VITE_BUILD_COMPRESS = gzip

+ 1 - 1
index.html

@@ -9,7 +9,7 @@
       content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
     />
     <!-- <link rel="icon" href="/src/assets/logo/logo.ico" /> -->
-    <link rel="icon" href="/favicon.png" />
+    <link rel="icon" href="/favicon.ico" />
     <script
       type="text/javascript"
       src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=jWDCUpsk33htQsF6IEwk4ctkERTOFFH0"

BIN
public/favicon.ico


BIN
public/favicon.png


+ 49 - 0
src/api/basicData/message.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+// 查询官网留言列表
+export function listMessage(query) {
+    return request({
+        url: '/owLeavingMessage/findByPage',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询官网留言详细
+export function getMessage(id) {
+    return request({
+        url: '/owLeavingMessage/' + id,
+        method: 'get'
+    })
+}
+
+// 新增官网留言
+export function addMessage(data) {
+    return request({
+        url: '/owLeavingMessage',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改官网留言
+export function updateMessage(data) {
+    return request({
+        url: '/owLeavingMessage',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除官网留言
+export function delMessage(id) {
+    return request({
+        url: '/owLeavingMessage/deleteAll',
+        method: 'delete'
+    })
+}
+// 批量删除行政许可
+export function delMessageBatch(ids) {
+    console.log(ids);
+    return request.post('/owLeavingMessage/delete',ids)
+}

+ 49 - 0
src/api/basicData/mortgage3.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+// 查询动产抵押信息列表
+export function listMortgage(query) {
+    return request({
+        url: '/crmMovablePropertyMortgage/findByPage',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询动产抵押信息详细
+export function getMortgage(id) {
+    return request({
+        url: '/crmMovablePropertyMortgage/' + id,
+        method: 'get'
+    })
+}
+
+// 新增动产抵押信息
+export function addMortgage(data) {
+    return request({
+        url: '/crmMovablePropertyMortgage',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改动产抵押信息
+export function updateMortgage(data) {
+    return request({
+        url: '/crmMovablePropertyMortgage',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除动产抵押信息
+export function delMortgage(id) {
+    return request({
+        url: '/crmMovablePropertyMortgage/deleteAll',
+        method: 'delete'
+    })
+}
+// 批量删除行政许可
+export function delMortgageBatch(ids) {
+    console.log(ids);
+    return request.post('/crmMovablePropertyMortgage/delete',ids)
+}

+ 10 - 0
src/api/basicData/mostdetail.js

@@ -0,0 +1,10 @@
+import request from "@/utils/request";
+
+
+export const getMostDetailByUniCode = (code)=>{
+    return request.get('/crmHighTechZoneEnterprises/getCreditScoreMostDetailsByUniCode',{
+        params:{
+            unifiedSocialCreditCode:code
+        }
+    })
+}

+ 49 - 0
src/api/basicData/reporting.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+// 查询官网自主上报列表
+export function listReporting(query) {
+    return request({
+        url: '/owSelfReporting/findByPage',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询官网自主上报详细
+export function getReporting(id) {
+    return request({
+        url: '/owSelfReporting/' + id,
+        method: 'get'
+    })
+}
+
+// 新增官网自主上报
+export function addReporting(data) {
+    return request({
+        url: '/owSelfReporting',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改官网自主上报
+export function updateReporting(data) {
+    return request({
+        url: '/owSelfReporting',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除官网自主上报
+export function delReporting(id) {
+    return request({
+        url: '/owSelfReporting/deleteAll',
+        method: 'delete'
+    })
+}
+// 批量删除行政许可
+export function delReportingBatch(ids) {
+    console.log(ids);
+    return request.post('/owSelfReporting/delete',ids)
+}

+ 35 - 2
src/api/buscmonitoring/index.js

@@ -1,11 +1,44 @@
 import request from '@/utils/request'
 
 // 查询年产值所有数据列表
-export function getOutputValueData(query) {
+export function getData(query) {
   return request({
-    url: '/crmAnnualOutputValueInfo/getList',
+    url: '/crmOutputValue/getList',
     method: 'get',
     params: query
   })
 }
 
+export const getYearTotalData = ()=>{
+  return request({
+    url: '/crmOutputValue/getListYearOrQuarter',
+    method: 'get',
+  })
+}
+
+export const getLastQuarterYoY = (quarter)=>{
+  return request({
+    url:'/crmOutputValue/getListByQuarterYoY',
+    method:'get',
+    params:{
+      quarter
+    }
+  })
+}
+
+export const getYearTotalData2 = ()=>{
+  return request({
+    url: '/crmEnterpriseTaxPaymentInfo/getListYearOrQuarter',
+    method: 'get',
+  })
+}
+
+export const getLastQuarterYoY2 = (quarter)=>{
+  return request({
+    url:'/crmEnterpriseTaxPaymentInfo/getListByQuarterYoY',
+    method:'get',
+    params:{
+      quarter
+    }
+  })
+}

+ 14 - 1
src/api/home/home.js

@@ -7,4 +7,17 @@ export const getHomeList = ()=>{
         method:'get',
         params:likeQueryMethod('unified_social_credit_code','',1,500)
     });
-}
+}
+
+export function getCreditScoreList(data) {
+    return request({
+        url: `/crmHighTechZoneEnterprises/getCreditScoreList`,
+        method: 'get',
+        params: {
+            pageNum:1,
+            pageSize:500,
+            condition:"AAA,AA,A"
+        }
+    })
+}
+

+ 14 - 5
src/api/visualization/index.js

@@ -1,4 +1,5 @@
 import request from '@/utils/request'
+import {likeQueryMethod} from "@/utils/likeQueryMethod";
 
 // 查询所有企业分类
 export function getClassificationValueData(query) {
@@ -80,12 +81,12 @@ export function getNumberOfEnterprises(query) {
 }
 
 
-// 查询上企业
-export function getListedCompanies(query) {
+// 查询上企业
+export function getListedCompanies(str) {
   return request({
-    url: '/crmListedCompany/getList',
+    url: '/crmEnterpriseInformation/getList',
     method: 'get',
-    params: query
+    params: likeQueryMethod('enterprise_type',str,1,999)
   })
 }
 
@@ -118,7 +119,7 @@ export function getPatentInformation(query) {
 // 查询行政处罚
 export function getAdministrativeSanction(query) {
   return request({
-    url: '/crmAdministrativePenalty/getList',
+    url: '/crmHighTechZoneEnterprises/getDeductionPoints',
     method: 'get',
     params: query
   })
@@ -154,4 +155,12 @@ export function getSocialSecurity(query) {
     method: 'get',
     params: query
   })
+}
+
+// 查询税收
+export const getTaxes = ()=>{
+  return request({
+    url:'/crmEnterpriseTaxPaymentInfo/getList',
+    method:'get'
+  })
 }

BIN
src/assets/images/000.jpg


BIN
src/assets/images/888.jpg


+ 2 - 9
src/components/baseEcharts/index.vue

@@ -25,6 +25,7 @@ const props = defineProps({
         default: true
     }
 })
+console.log(props);
 
 let myEchart: EChartsType
 const timeId = ref(Math.floor(new Date().getTime() * Math.random())); // 使该图表保持唯id
@@ -75,19 +76,11 @@ const myEchartData = () => {
             {
                 name: '2023',
                 type: 'bar',
-                stack: 'Ad',
-                emphasis: {
-                    focus: 'series'
-                },
                 data: props.ArrOneData
             },
             {
                 name: '2024',
                 type: 'bar',
-                stack: 'Ad',
-                emphasis: {
-                    focus: 'series'
-                },
                 data: props.ArrTwoData
             }
         ],
@@ -97,7 +90,7 @@ const myEchartData = () => {
                 type: 'slider', // 开启滑动条
                 show: true, // 显示缩放条
                 start: 0,
-                end: 20,
+                end: 100,
                 backgroundColor: '#26CAF026',
                 selectedDataBackground: {
                     lineStyle: {

+ 2 - 1
src/main.js

@@ -17,7 +17,7 @@ import filters from '@/filters'
 
 // 注册指令
 import plugins from './plugins' // plugins
-import { download, downloadExcel } from '@/utils/request'
+import {download, downloadExcel, downloadFileMethod} from '@/utils/request'
 
 // svg图标
 import 'virtual:svg-icons-register'
@@ -49,6 +49,7 @@ const app = createApp(App)
 // 全局方法挂载
 app.config.globalProperties.useDict = useDict
 app.config.globalProperties.download = download
+app.config.globalProperties.downloadFileMethod = downloadFileMethod
 app.config.globalProperties.downloadExcel = downloadExcel
 app.config.globalProperties.parseTime = parseTime
 app.config.globalProperties.resetForm = resetForm

+ 16 - 1
src/utils/request.js

@@ -181,7 +181,22 @@ export function download(url, params, filename) {
       downloadLoadingInstance.close()
     })
 }
-
+export async function downloadFileMethod(url, fileName) {
+    try {
+        const response = await axios.get(url, { responseType: 'blob' }); // 设置响应类型为blob
+        const urlForDownload = window.URL.createObjectURL(new Blob([response.data]));
+        const link = document.createElement('a');
+        link.href = urlForDownload;
+        link.download = fileName; // 指定下载的文件名
+        document.body.appendChild(link);
+        link.click();
+        window.URL.revokeObjectURL(urlForDownload);
+        link.remove(); // 移除创建的a标签
+    } catch (error) {
+        console.error('下载文件时出错:', error);
+        ElMessage.error('下载文件时出错');
+    }
+}
 // excel下载方法 --- charset=utf-8
 export function downloadExcel(url, params, filename) {
   downloadLoadingInstance = ElLoading.service({

+ 370 - 138
src/views/BusDynamics/OPCMonitoring/index.vue

@@ -1,154 +1,386 @@
 <template>
-    <div ref="echartsRef" style="width: 100%; height: 80vh;"></div>
+  <div>
+    <div>
+      <span>请选择季度/年度:</span>
+      <el-select :default-first-option="true" v-model="showIndex">
+        <el-option label="第一季度" :value="1">第一季度</el-option>
+        <el-option label="第二季度" :value="2">第二季度</el-option>
+        <el-option label="第三季度" :value="3">第三季度</el-option>
+        <el-option label="第四季度" :value="4">第四季度</el-option>
+        <el-option label="年度" :value="5" :disabled="isForbidden">年度</el-option>
+      </el-select>
+    </div>
+    <div style="float: right;font-weight: 600">单位/(千元)</div>
+    <div v-show="showIndex == 1" ref="echartsRef" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 2" ref="echartsRef3" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 3" ref="echartsRef4" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 4" ref="echartsRef5" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 5" ref="echartsRef2" style="width: 80vw; height: 80vh;"></div>
+  </div>
 </template>
 
 <script setup>
-import { onMounted, ref } from 'vue';
+import {onMounted, ref} from 'vue';
 import * as echarts from 'echarts';
-import { getOutputValueData } from "@/api/buscmonitoring/index";
+import {getData, getLastQuarterYoY, getYearTotalData} from "@/api/buscmonitoring";
+import {ElMessage} from "element-plus";
 
-const data = reactive({
-    form: {},
-    queryParams: {
-        pageNum: 1,
-        pageSize: 100000,
-        unifiedSocialCreditCode: '',
-        condition: "",
-        grade: null,
-        total: null
-    },
-})
-const { queryParams } = toRefs(data)
+const showIndex = ref(1);
 const echartsRef = ref(null);
-
-const fetchData = async () => {
-    try {
-        const response = await getOutputValueData().then(res => { return res.data })
-        const namesArray = response.map(obj => obj.detailedUnitName);
-        const valuesArray = response.map(obj => obj.industrialOutputValue);
-        const valuesLastArray = response.map(obj => obj.industrialOutputValueLastYear);
-
-        const options = {
-            title: {
-                text: '产值产能检测'
-            },
-            tooltip: {
-                trigger: 'axis',
-                axisPointer: {
-                    type: 'shadow'
-                }
-            },
-            legend: {},
-            grid: {
-                left: '3%',
-                right: '4%',
-                bottom: '3%',
-                containLabel: true
-            },
-            xAxis: {
-                type: 'value',
-                boundaryGap: [0, 0.01]
-            },
-            yAxis: {
-                type: 'category',
-                data: namesArray
-            },
-            series: [
-                {
-                    name: '2023',
-                    type: 'bar',
-                    data: valuesArray
-                },
-                {
-                    name: '2024',
-                    type: 'bar',
-                    data: valuesLastArray
-                }
-            ],
-            dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
-                type: 'slider', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
-                yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
-                start: 10, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
-                end: 30 // 数据窗口范围的结束百分比, 表示到60%的位置结束
-            }]
-        };
-
-        chartInstance.value.setOption(options);
-    } catch (error) {
-        console.error('Error fetching data:', error);
+const echartsRef2 = ref(null);
+const echartsRef3 = ref(null);
+const echartsRef4 = ref(null);
+const echartsRef5 = ref(null);
+const currentYear = new Date().getFullYear();
+const isForbidden = ref(false);
+const lastYear = currentYear - 1;
+const setChartOption1 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
     }
-};
-
-/** 查询社保 */
-function getEchartsData() {
-    getOutputValueData(queryParams.value).then((res) => {
-
-        if(res.data){
-          res.data.forEach(item=>{
-            item.industrialOutputValueLastYear = Number(item.industrialOutputValueLastYear);
-            return item;
-          })
-        }
-        const response = res.data
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef.value);
+  chart.setOption({
+    title: {
+      text: '第一季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
 
-        const namesArray = response.map(obj => obj.detailedUnitName);
-        const valuesArray = response.map(obj => obj.industrialOutputValue);
-        const valuesLastArray = response.map(obj => obj.industrialOutputValueLastYear).sort((a, b) => a-b);
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption3 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef3.value);
+  chart.setOption({
+    title: {
+      text: '第二季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
 
-        console.log(namesArray, valuesArray, valuesLastArray)
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption4 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef4.value);
+  chart.setOption({
+    title: {
+      text: '第三季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
 
-        const chart = echarts.init(echartsRef.value);
-        const option = {
-            title: {
-                text: '产值产能检测'
-            },
-            tooltip: {
-                trigger: 'axis',
-                axisPointer: {
-                    type: 'shadow'
-                }
-            },
-            legend: {},
-            grid: {
-                left: '3%',
-                right: '4%',
-                bottom: '3%',
-                containLabel: true
-            },
-            xAxis: {
-                type: 'value',
-                boundaryGap: [0, 0.01]
-            },
-            yAxis: {
-                type: 'category',
-                data: namesArray
-            },
-            series: [
-                {
-                    name: '2024',
-                    type: 'bar',
-                    data: valuesArray
-                },
-                {
-                    name: '2023',
-                    type: 'bar',
-                    data: valuesLastArray
-                }
-            ],
-            dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
-                type: 'slider', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
-                yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
-                start: 10, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
-                end: 30 // 数据窗口范围的结束百分比, 表示到60%的位置结束
-            }]
-        };
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption5 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  if(currentYearData[0] == null || currentYearData == undefined || currentYearData[0] == 0){
+    isForbidden.value = true;
+  }
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef5.value);
+  chart.setOption({
+    title: {
+      text: '第四季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
 
-        chart.setOption(option);
-    })
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption2 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.currentYearTotal-q.lastYearTotal)/q.lastYearTotal)*100).toFixed(2)+'%'
+    if(q.lastYearTotal == 0|| q.lastYearTotal == null||q.currentYearTotal == 0|| q.currentYearTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearTotalData = res.data.map(q=>q.currentYearTotal?.toFixed(0)).reverse();
+  const lastYearTotalData = res.data.map(q=>q.lastYearTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef2.value);
+  chart.setOption({
+    title: {
+      text: '产值产能监测共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    color: [
+      '#c23531',
+      '#2f4554',
+      '#61a0a8',
+      '#d48265',
+      '#91c7ae',
+      '#749f83',
+      '#ca8622',
+      '#bda29a',
+      '#6e7074',
+      '#546570',
+      '#c4ccd3'
+    ],
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearTotalData
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearTotalData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const getCurrentQuarter = () => {
+  const month = new Date().getMonth() + 1;
+  return Math.ceil(month / 3);
+};
+const init =async () => {
+  const quarterRes1 = await getLastQuarterYoY(1);
+  const quarterRes2 = await getLastQuarterYoY(2);
+  const quarterRes3 = await getLastQuarterYoY(3);
+  const quarterRes4 = await getLastQuarterYoY(4);
+  const yearRes = await getYearTotalData();
+  setChartOption1(quarterRes1);
+  setChartOption2(yearRes);
+  setChartOption3(quarterRes2);
+  setChartOption4(quarterRes3);
+  setChartOption5(quarterRes4);
 }
-onMounted(() => {
-    getEchartsData();
-});
+init();
 </script>
 
 <style>

+ 379 - 72
src/views/BusDynamics/TaxMonitoring/index.vue

@@ -1,84 +1,391 @@
 <template>
-    <div ref="echartsRef" style="width: 100%; height: 80vh;"></div>
+  <div>
+    <div>
+      <span>请选择季度/年度:</span>
+      <el-select :default-first-option="true" v-model="showIndex">
+        <el-option label="第一季度" :value="1">第一季度</el-option>
+        <el-option label="第二季度" :value="2">第二季度</el-option>
+        <el-option label="第三季度" :value="3">第三季度</el-option>
+        <el-option label="第四季度" :value="4">第四季度</el-option>
+        <el-option label="年度" :value="5" :disabled="isForbidden">年度</el-option>
+      </el-select>
+    </div>
+    <div style="float: right;font-weight: 600">单位/(元)</div>
+    <div v-show="showIndex == 1" ref="echartsRef" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 2" ref="echartsRef3" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 3" ref="echartsRef4" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 4" ref="echartsRef5" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 5" ref="echartsRef2" style="width: 80vw; height: 80vh;"></div>
+  </div>
 </template>
-   
+
 <script setup>
-import { onMounted, ref } from 'vue';
+import {onMounted, ref} from 'vue';
 import * as echarts from 'echarts';
-import { getSocialSecurity } from '@/api/visualization/index'
+import {
+  getData,
+  getLastQuarterYoY,
+  getLastQuarterYoY2,
+  getYearTotalData,
+  getYearTotalData2
+} from "@/api/buscmonitoring";
+import {ElMessage} from "element-plus";
 
-const data = reactive({
-    form: {},
-    queryParams: {
-        pageNum: 1,
-        pageSize: 100000,
-        unifiedSocialCreditCode: '',
-        condition: "",
-        grade: null,
-        total: null
-    },
-})
-const { queryParams } = toRefs(data)
+const showIndex = ref(1);
 const echartsRef = ref(null);
+const echartsRef2 = ref(null);
+const echartsRef3 = ref(null);
+const echartsRef4 = ref(null);
+const echartsRef5 = ref(null);
+const isForbidden = ref(false);
+const currentYear = new Date().getFullYear();
+const lastYear = currentYear - 1;
+const setChartOption1 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef.value);
+  chart.setOption({
+    title: {
+      text: '第一季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption3 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef3.value);
+  chart.setOption({
+    title: {
+      text: '第二季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption4 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef4.value);
+  chart.setOption({
+    title: {
+      text: '第三季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption5 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%'
+    if(q.lastQuarterLastTotal == 0|| q.lastQuarterLastTotal == null||q.lastQuarterCurrentTotal == 0|| q.lastQuarterCurrentTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearData = res.data.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  if(currentYearData[0] == null || currentYearData == undefined || currentYearData[0] == 0){
+    isForbidden.value = true;
+  }
+  const lastYearData = res.data.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef5.value);
+  chart.setOption({
+    title: {
+      text: '第四季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption2 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const names = res.data.map(q=>{
+    let str = '  同比率'+(((q.currentYearTotal-q.lastYearTotal)/q.lastYearTotal)*100).toFixed(2)+'%'
+    if(q.lastYearTotal == 0|| q.lastYearTotal == null||q.currentYearTotal == 0|| q.currentYearTotal == null){
+      str = ''
+    }
+    return q.enterpriseName+str;
+  }).reverse();
+  const currentYearTotalData = res.data.map(q=>q.currentYearTotal?.toFixed(0)).reverse();
+  const lastYearTotalData = res.data.map(q=>q.lastYearTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef2.value);
+  chart.setOption({
+    title: {
+      text: '税收监测共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    color: [
+      '#c23531',
+      '#2f4554',
+      '#61a0a8',
+      '#d48265',
+      '#91c7ae',
+      '#749f83',
+      '#ca8622',
+      '#bda29a',
+      '#6e7074',
+      '#546570',
+      '#c4ccd3'
+    ],
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
 
-/** 查询社保 */
-function getEchartsData() {
-    getSocialSecurity(queryParams.value).then((res) => {
-        const response = res.data
-        const namesArray = response.map(obj => obj.enterpriseName);
-        const valuesArray = response.map(obj => obj.avgMonthlyPaymentBand).sort((a, b) => a-b);
-
-        console.log(namesArray, valuesArray)
-
-        const chart = echarts.init(echartsRef.value);
-        const option = {
-            title: {
-                text: '税收检测'
-            },
-            tooltip: {
-                trigger: 'axis',
-                axisPointer: {
-                    type: 'shadow'
-                }
-            },
-            legend: {},
-            grid: {
-                left: '3%',
-                right: '4%',
-                bottom: '3%',
-                containLabel: true
-            },
-            xAxis: {
-                type: 'value',
-                boundaryGap: [0, 0.01]
-            },
-            yAxis: {
-                type: 'category',
-                data: namesArray
-            },
-            series: [
-                {
-                    name: '2023',
-                    type: 'bar',
-                    data: valuesArray
-                }
-            ],
-            dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
-                type: 'slider', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
-                yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
-                start: 10, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
-                end: 30 // 数据窗口范围的结束百分比, 表示到60%的位置结束
-            }]
-        };
-
-        chart.setOption(option);
-    })
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearTotalData
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearTotalData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
 }
-onMounted(() => {
-    getEchartsData();
-});
+const getCurrentQuarter = () => {
+  const month = new Date().getMonth() + 1;
+  return Math.ceil(month / 3);
+};
+const init =async () => {
+  const quarterRes1 = await getLastQuarterYoY2(1);
+  const quarterRes2 = await getLastQuarterYoY2(2);
+  const quarterRes3 = await getLastQuarterYoY2(3);
+  const quarterRes4 = await getLastQuarterYoY2(4);
+  const yearRes = await getYearTotalData2();
+  setChartOption1(quarterRes1);
+  setChartOption2(yearRes);
+  setChartOption3(quarterRes2);
+  setChartOption4(quarterRes3);
+  setChartOption5(quarterRes4);
+}
+init();
 </script>
-   
+
 <style>
 /* 样式内容 */
 </style>

+ 375 - 0
src/views/BusDynamics/czjsqy/index.vue

@@ -0,0 +1,375 @@
+<template>
+  <div>
+    <div>
+      <span>请选择季度/年度:</span>
+      <el-select :default-first-option="true" v-model="showIndex">
+        <el-option label="第一季度" :value="1">第一季度</el-option>
+        <el-option label="第二季度" :value="2">第二季度</el-option>
+        <el-option label="第三季度" :value="3">第三季度</el-option>
+        <el-option label="第四季度" :value="4">第四季度</el-option>
+        <el-option label="年度" :value="5" :disabled="isForbidden">年度</el-option>
+      </el-select>
+    </div>
+    <div style="float: right;font-weight: 600">单位/(千元)</div>
+    <div v-show="showIndex == 1" ref="echartsRef" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 2" ref="echartsRef3" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 3" ref="echartsRef4" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 4" ref="echartsRef5" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 5" ref="echartsRef2" style="width: 80vw; height: 80vh;"></div>
+  </div>
+</template>
+
+<script setup>
+import {onMounted, ref} from 'vue';
+import * as echarts from 'echarts';
+import {getData, getLastQuarterYoY, getYearTotalData} from "@/api/buscmonitoring";
+import {ElMessage} from "element-plus";
+
+const showIndex = ref(1);
+const echartsRef = ref(null);
+const echartsRef2 = ref(null);
+const echartsRef3 = ref(null);
+const echartsRef4 = ref(null);
+const echartsRef5 = ref(null);
+const isForbidden = ref(false);
+const currentYear = new Date().getFullYear();
+const lastYear = currentYear - 1;
+const setChartOption1 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item=>item.lastQuarterCurrentTotal-item.lastQuarterLastTotal<0)
+  const names = a.map(q=>q.enterpriseName+'  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%').reverse();
+  const currentYearData = a.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = a.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef.value);
+  chart.setOption({
+    title: {
+      text: '第一季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 70, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption3 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item=>item.lastQuarterCurrentTotal-item.lastQuarterLastTotal<0)
+  const names = a.map(q=>q.enterpriseName+'  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%').reverse();
+  const currentYearData = a.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = a.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef3.value);
+  chart.setOption({
+    title: {
+      text: '第二季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption4 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item=>item.lastQuarterCurrentTotal-item.lastQuarterLastTotal<0)
+  const names = a.map(q=>q.enterpriseName+'  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%').reverse();
+  const currentYearData = a.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = a.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef4.value);
+  chart.setOption({
+    title: {
+      text: '第三季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption5 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item=>item.lastQuarterCurrentTotal-item.lastQuarterLastTotal<0)
+  const names = a.map(q=>q.enterpriseName+'  同比率'+(((q.lastQuarterCurrentTotal-q.lastQuarterLastTotal)/q.lastQuarterLastTotal)*100).toFixed(2)+'%').reverse();
+  const currentYearData = a.map(q=>q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  if(currentYearData[0] == null || currentYearData == undefined || currentYearData[0] == 0){
+    isForbidden.value = true;
+  }
+  const lastYearData = a.map(q=>q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef5.value);
+  chart.setOption({
+    title: {
+      text: '第四季度     共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption2 = async (res) => {
+  if(res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item=>item.currentYearTotal-item.lastYearTotal<0)
+  const names = a.map(q=>q.enterpriseName+"  同比率"+(((q.currentYearTotal-q.lastYearTotal)/q.lastYearTotal)*100).toFixed(2)+"%").reverse();
+  const currentYearTotalData = res.data.map(q=>q.currentYearTotal?.toFixed(0)).reverse();
+  const lastYearTotalData = res.data.map(q=>q.lastYearTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef2.value);
+  chart.setOption({
+    title: {
+      text: '产值产能减数企业一共:'+names.length+'家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    color: [
+      '#5e518f',
+      '#5367af',
+      '#61a0a8',
+      '#d48265',
+      '#91c7ae',
+      '#749f83',
+      '#ca8622',
+      '#bda29a',
+      '#6e7074',
+      '#546570',
+      '#c4ccd3'
+    ],
+    legend: {
+      data: [lastYear.toString(),currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearTotalData
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearTotalData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 90, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const getCurrentQuarter = () => {
+  const month = new Date().getMonth() + 1;
+  return Math.ceil(month / 3);
+};
+const init =async () => {
+  const quarterRes1 = await getLastQuarterYoY(1);
+  const quarterRes2 = await getLastQuarterYoY(2);
+  const quarterRes3 = await getLastQuarterYoY(3);
+  const quarterRes4 = await getLastQuarterYoY(4);
+  const yearRes = await getYearTotalData();
+  setChartOption1(quarterRes1);
+  setChartOption2(yearRes);
+  setChartOption3(quarterRes2);
+  setChartOption4(quarterRes3);
+  setChartOption5(quarterRes4);
+}
+init();
+</script>
+
+<style>
+/* 样式内容 */
+</style>

+ 381 - 0
src/views/BusDynamics/ssjsqy/index.vue

@@ -0,0 +1,381 @@
+<template>
+  <div>
+    <div>
+      <span>请选择季度/年度:</span>
+      <el-select :default-first-option="true" v-model="showIndex">
+        <el-option label="第一季度" :value="1">第一季度</el-option>
+        <el-option label="第二季度" :value="2">第二季度</el-option>
+        <el-option label="第三季度" :value="3">第三季度</el-option>
+        <el-option label="第四季度" :value="4">第四季度</el-option>
+        <el-option label="年度" :value="5" :disabled="isForbidden">年度</el-option>
+      </el-select>
+    </div>
+    <div style="float: right;font-weight: 600">单位/(元)</div>
+    <div v-show="showIndex == 1" ref="echartsRef" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 2" ref="echartsRef3" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 3" ref="echartsRef4" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 4" ref="echartsRef5" style="width: 80vw; height: 80vh;"></div>
+    <div v-show="showIndex == 5" ref="echartsRef2" style="width: 80vw; height: 80vh;"></div>
+  </div>
+</template>
+
+<script setup>
+import {onMounted, ref} from 'vue';
+import * as echarts from 'echarts';
+import {
+  getData,
+  getLastQuarterYoY,
+  getLastQuarterYoY2,
+  getYearTotalData,
+  getYearTotalData2
+} from "@/api/buscmonitoring";
+import {ElMessage} from "element-plus";
+
+const showIndex = ref(1);
+const echartsRef = ref(null);
+const echartsRef2 = ref(null);
+const echartsRef3 = ref(null);
+const echartsRef4 = ref(null);
+const echartsRef5 = ref(null);
+const isForbidden = ref(false);
+const currentYear = new Date().getFullYear();
+const lastYear = currentYear - 1;
+const setChartOption1 = async (res) => {
+  if (res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item => item.lastQuarterCurrentTotal - item.lastQuarterLastTotal < 0)
+  const names = a.map(q => q.enterpriseName + '  同比率' + (((q.lastQuarterCurrentTotal - q.lastQuarterLastTotal) / q.lastQuarterLastTotal) * 100).toFixed(2) + '%').reverse();
+  const currentYearData = a.map(q => q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = a.map(q => q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef.value);
+  chart.setOption({
+    title: {
+      text: '第一季度     共:' + names.length + '家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(), currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 85, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption3 = async (res) => {
+  if (res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item => item.lastQuarterCurrentTotal - item.lastQuarterLastTotal < 0)
+  const names = a.map(q => q.enterpriseName + '  同比率' + (((q.lastQuarterCurrentTotal - q.lastQuarterLastTotal) / q.lastQuarterLastTotal) * 100).toFixed(2) + '%').reverse();
+  const currentYearData = a.map(q => q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = a.map(q => q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef3.value);
+  chart.setOption({
+    title: {
+      text: '第二季度     共:' + names.length + '家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(), currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 85, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption4 = async (res) => {
+  if (res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item => item.lastQuarterCurrentTotal - item.lastQuarterLastTotal < 0)
+  const names = a.map(q => q.enterpriseName + '  同比率' + (((q.lastQuarterCurrentTotal - q.lastQuarterLastTotal) / q.lastQuarterLastTotal) * 100).toFixed(2) + '%').reverse();
+  const currentYearData = a.map(q => q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  const lastYearData = a.map(q => q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef4.value);
+  chart.setOption({
+    title: {
+      text: '第三季度     共:' + names.length + '家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(), currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 85, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption5 = async (res) => {
+  if (res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item => item.lastQuarterCurrentTotal - item.lastQuarterLastTotal < 0)
+  const names = a.map(q => q.enterpriseName + '  同比率' + (((q.lastQuarterCurrentTotal - q.lastQuarterLastTotal) / q.lastQuarterLastTotal) * 100).toFixed(2) + '%').reverse();
+  const currentYearData = a.map(q => q.lastQuarterCurrentTotal?.toFixed(0)).reverse();
+  if(currentYearData[0] == null || currentYearData == undefined || currentYearData[0] == 0){
+    isForbidden.value = true;
+  }
+  const lastYearData = a.map(q => q.lastQuarterLastTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef5.value);
+  chart.setOption({
+    title: {
+      text: '第四季度     共:' + names.length + '家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    legend: {
+      data: [lastYear.toString(), currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearData,
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearData
+      }
+    ],
+    color: [
+      '#fa8c89',
+      '#6bbefa',
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 85, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const setChartOption2 = async (res) => {
+  if (res.code != 200) ElMessage.error(res.msg);
+  const a = res.data.filter(item => item.currentYearTotal - item.lastYearTotal < 0)
+  const names = a.map(q => q.enterpriseName + "  同比率" + (((q.currentYearTotal - q.lastYearTotal) / q.lastYearTotal) * 100).toFixed(2) + "%").reverse();
+  const currentYearTotalData = res.data.map(q => q.currentYearTotal?.toFixed(0)).reverse();
+  const lastYearTotalData = res.data.map(q => q.lastYearTotal?.toFixed(0)).reverse();
+  const chart = echarts.init(echartsRef2.value);
+  chart.setOption({
+    title: {
+      text: '税收减数企业一共:' + names.length + '家',
+    },
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    color: [
+      '#5e518f',
+      '#5367af',
+      '#61a0a8',
+      '#d48265',
+      '#91c7ae',
+      '#749f83',
+      '#ca8622',
+      '#bda29a',
+      '#6e7074',
+      '#546570',
+      '#c4ccd3'
+    ],
+    legend: {
+      data: [lastYear.toString(), currentYear.toString()]
+    },
+    grid: {
+      left: '3%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    xAxis: {
+      type: 'value',
+      boundaryGap: [0, 0.01]
+    },
+    yAxis: {
+      type: 'category',
+      data: names
+    },
+    series: [
+      {
+        name: lastYear.toString(),
+        type: 'bar',
+        data: lastYearTotalData
+      },
+      {
+        name: currentYear.toString(),
+        type: 'bar',
+        data: currentYearTotalData
+      }
+    ],
+    dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
+      type: 'inside', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
+      yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
+      start: 100, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
+      end: 85, // 数据窗口范围的结束百分比, 表示到60%的位置结束
+      moveOnMouseWheel: true, // 启用滚轮滚动
+      moveOnMouseMove: false,
+      zoomOnMouseWheel: false,
+    }]
+  })
+}
+const getCurrentQuarter = () => {
+  const month = new Date().getMonth() + 1;
+  return Math.ceil(month / 3);
+};
+const init = async () => {
+  const quarterRes1 = await getLastQuarterYoY2(1);
+  const quarterRes2 = await getLastQuarterYoY2(2);
+  const quarterRes3 = await getLastQuarterYoY2(3);
+  const quarterRes4 = await getLastQuarterYoY2(4);
+  const yearRes = await getYearTotalData2();
+  setChartOption1(quarterRes1);
+  setChartOption2(yearRes);
+  setChartOption3(quarterRes2);
+  setChartOption4(quarterRes3);
+  setChartOption5(quarterRes4);
+}
+init();
+</script>
+
+<style>
+/* 样式内容 */
+</style>

+ 2 - 2
src/views/CCInformation/GIRelease/index.vue

@@ -51,7 +51,7 @@
     <el-table v-loading="loading" :data="releaseList" height="650" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
 <!--      <el-table-column label="主键" align="center" prop="id" />-->
-      <el-table-column label="标题" align="center" prop="title" />
+      <el-table-column label="标题" align="center" prop="title" width="200" />
       <el-table-column label="专栏" align="center" prop="specialColumn" >
         <template #default="scope">
           {{dickMapObj[scope.row.specialColumn]}}
@@ -62,7 +62,7 @@
           <span>{{ parseTime(scope.row.date, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="内容" align="center" prop="content" >
+      <el-table-column label="内容" align="center" prop="content" width="500" >
         <template #default="scope">
           {{scope.row.content}}
         </template>

+ 1 - 1
src/views/CCInformation/HQEReleased/index.vue

@@ -67,7 +67,7 @@ const data = reactive({
     unifiedSocialCreditCode: '',
     grade:null,
     total:null,
-    condition:'AAA,AA,A'
+    condition:'AAA,AA'
     // userName: undefined,
     // phonenumber: undefined,
     // status: undefined,

+ 326 - 0
src/views/CCInformation/qysbxx/index.vue

@@ -0,0 +1,326 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="企业代码" prop="unifiedSocialCreditCode" label-width="200">
+        <el-input
+            v-model="queryParams.unifiedSocialCreditCode"
+            placeholder="请输入企业代码"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="企业名称" prop="enterpriseName" label-width="200">
+        <el-input
+            v-model="queryParams.enterpriseName"
+            placeholder="请输入企业名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+<!--      <el-col :span="1.5">-->
+<!--        <el-popconfirm-->
+<!--            title="你确定清除所有数据?"-->
+<!--            confirm-button-text="是的"-->
+<!--            cancel-button-text="不是"-->
+<!--            :icon="InfoFilled"-->
+<!--            icon-color="#626AEF"-->
+<!--            @confirm="handleDelete"-->
+<!--        >-->
+<!--          <template #reference>-->
+<!--            <el-button-->
+<!--                type="danger"-->
+<!--                plain-->
+<!--                icon="Delete"-->
+<!--                v-hasPermi="['basicData:reporting:remove']"-->
+<!--            >清除全表-->
+<!--            </el-button>-->
+<!--          </template>-->
+<!--        </el-popconfirm>-->
+<!--      </el-col>-->
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            @click="batchDelete"
+            v-hasPermi="['basicData:reporting:remove']"
+            :disabled="ids.length === 0"
+        >批量删除
+        </el-button>
+      </el-col>
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--            type="warning"-->
+<!--            plain-->
+<!--            icon="Download"-->
+<!--            @click="handleExport"-->
+<!--            :disabled="!reportingList.length"-->
+<!--            v-hasPermi="['basicData:reporting:export']"-->
+<!--        >导出-->
+<!--        </el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button type="info" plain icon="Upload" @click="handleImport"-->
+<!--                   v-hasPermi="['system:user:import']">导入-->
+<!--        </el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button type="success" plain icon="Download" @click="downloadTemplate">-->
+<!--          下载导入模板-->
+<!--        </el-button>-->
+<!--      </el-col>-->
+    </el-row>
+
+    <el-table v-loading="loading" :data="reportingList" height="650" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="企业代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
+      <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip='true'/>
+      <el-table-column label="联系人" align="center" prop="contacts" :show-overflow-tooltip='true'/>
+      <el-table-column label="联系方式" align="center" prop="contactInformation" :show-overflow-tooltip='true'/>
+      <el-table-column label="上报人身份证号" align="center" prop="complainantIdNumber" :show-overflow-tooltip='true'/>
+      <el-table-column label="操作" align="center">
+<!--        <template #default="scope">-->
+<!--          <el-popover placement="bottom" :width="400" trigger="click">-->
+<!--            <template #reference>-->
+<!--              <el-button style="margin-right: 16px">查看文件</el-button>-->
+<!--            </template>-->
+<!--            <div v-for="(item,index) in scope.row.files" :key="index">-->
+<!--              <div style="display: flex;justify-content: space-between">-->
+<!--                <div style="width: 80%">{{item.fileOriginalName}}</div>-->
+<!--                <div style="cursor: pointer">下载</div>-->
+<!--              </div>-->
+<!--            </div>-->
+<!--          </el-popover>-->
+<!--        </template>-->
+        <template #default="scope">
+          <el-button type="primary" @click="checkDownloadFile(scope.row.files)">查看文件</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog v-model="dialogTableVisible" title="查看文件" width="500px" :align-center="true">
+      <template #default>
+        <el-table :data="downloadFileList" border>
+          <el-table-column prop="fileOriginalName" label="文件名" width="380"/>
+          <el-table-column label="下载" width="80">
+            <template #default="scope">
+              <el-button type="primary" @click="downloadFile(scope.row)" size="small">下载</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </template>
+    </el-dialog>
+
+
+    <div style="position: fixed;bottom: 20px;right: 10px;">
+      <pagination
+          v-show="total>0"
+          :total="total"
+          v-model:page="queryParams.pageNum"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </div>
+
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+                 :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+                 :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+        <el-icon class="el-icon--upload">
+          <upload-filled/>
+        </el-icon>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>仅允许导入xls、xlsx格式文件。</span>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
+          <el-button @click="upload.open = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 添加或修改官网自主上报对话框 -->
+  </div>
+</template>
+
+<script setup name="Reporting">
+import {
+  listReporting,
+  getReporting,
+  delReporting,
+  delReportingBatch
+} from "@/api/basicData/reporting";
+import {reactive, ref, toRaw} from "vue";
+import {getToken} from "@/utils/auth";
+import {ElMessage} from "element-plus";
+import {likeQueryMethod} from "@/utils/likeQueryMethod";
+import {downloadFileMethod} from "@/utils/request";
+
+const {proxy} = getCurrentInstance();
+const downloadFileList = ref([]);
+const dialogTableVisible = ref(false);
+const reportingList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const BASE_URL = import.meta.env.VITE_APP_BASE_URL;
+const checkDownloadFile = (fileList)=>{
+  dialogTableVisible.value = true;
+  downloadFileList.value = fileList;
+}
+const downloadFile = (file)=>{
+  downloadFileMethod(BASE_URL+file.fileUrl,file.fileOriginalName)
+}
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: '',
+  // 是否禁用上传
+  isUploading: false,
+  // 设置上传的请求头部
+  headers: {Authorization: getToken()},
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + '/owSelfReporting/importData'
+})
+const handleFileSuccess = (e) => {
+  if (e.code == 200) {
+    ElMessage({
+      type: "success",
+      message: e.msg
+    })
+    getList()
+    proxy.$refs['uploadRef']?.clearFiles()
+  } else {
+    ElMessage({
+      type: "error",
+      message: e.msg
+    })
+    proxy.$refs['uploadRef']?.clearFiles()
+  }
+}
+
+function submitFileForm() {
+  proxy.$refs['uploadRef']?.submit();
+  upload.open = false;
+}
+
+function handleImport() {
+  upload.open = true
+}
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 20,
+    unifiedSocialCreditCode: '',
+    enterpriseName: null,
+    contacts: null,
+    contactInformation: null,
+    complainantIdNumber: null,
+  },
+  rules: {
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 查询官网自主上报列表 */
+function getList() {
+  loading.value = true;
+  let toServerObj = likeQueryMethod('unified_social_credit_code', queryParams.value.unifiedSocialCreditCode, queryParams.value.pageNum, queryParams.value.pageSize);
+  listReporting(toServerObj).then(response => {
+    reportingList.value = response.records;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    unifiedSocialCreditCode: '',
+    enterpriseName: null,
+    contacts: null,
+    contactInformation: null,
+    complainantIdNumber: null,
+    createTime: null,
+    updateTime: null
+  };
+  proxy.resetForm("reportingRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+
+/** 删除按钮操作 */
+async function handleDelete(row) {
+  const res = await delReporting();
+  if(res.code == 200){
+    ElMessage({
+      type:'success',
+      message:'删除成功'
+    })
+    getList();
+  }
+}
+/** 批量删除*/
+const batchDelete = (row)=>{
+  const idsToS = row.id || ids.value;
+  (proxy.$modal).confirm('是否确认删除这' + idsToS.length+'条的数据项?').then(function() {
+    return delReportingBatch(toRaw(idsToS));
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('owSelfReporting/exportData', {
+    ...queryParams.value
+  }, `官网自主上报_${new Date().getTime()}.xlsx`)
+}
+const downloadTemplate = ()=>{
+  proxy.download('owSelfReporting/getUploadTemplate',{}, `官网自主上报模板.xlsx`)
+}
+
+getList();
+</script>

+ 52 - 24
src/views/CDCService/COmpService/index.vue

@@ -99,6 +99,8 @@
       </el-table-column>
       <el-table-column label="投诉标题" align="center" prop="title" />
       <el-table-column label="投诉内容" align="center" prop="content" />
+      <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip='true'/>
+      <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
       <el-table-column label="投诉人姓名" align="center" prop="name" />
       <el-table-column label="联系方式" align="center" prop="phone" />
       <el-table-column label="身份证号" align="center" prop="card" />
@@ -108,20 +110,25 @@
         </template>
       </el-table-column>
       <el-table-column label="备注" align="center" prop="remark" />
+<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
+<!--        <template #default="scope">-->
+<!--          <el-button-->
+<!--              type="text"-->
+<!--              icon="Edit"-->
+<!--              @click="handleUpdate(scope.row)"-->
+<!--              v-hasPermi="['basicData:complain:edit']"-->
+<!--          >修改</el-button>-->
+<!--          <el-button-->
+<!--              type="text"-->
+<!--              icon="Delete"-->
+<!--              @click="handleDelete(scope.row)"-->
+<!--              v-hasPermi="['basicData:complain:remove']"-->
+<!--          >删除</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
-          <el-button
-              type="text"
-              icon="Edit"
-              @click="handleUpdate(scope.row)"
-              v-hasPermi="['basicData:complain:edit']"
-          >修改</el-button>
-          <el-button
-              type="text"
-              icon="Delete"
-              @click="handleDelete(scope.row)"
-              v-hasPermi="['basicData:complain:remove']"
-          >删除</el-button>
+          <el-button type="primary" icon="Download" @click="exportData(scope.row)">下载</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -157,9 +164,15 @@
         <el-form-item label="投诉人姓名" prop="name">
           <el-input v-model="form.name" placeholder="请输入投诉人姓名" />
         </el-form-item>
-        <el-form-item label="联系方式" prop="phone">
+        <el-form-item label="联系方式" prop="phone"  :rules="phoneRules">
           <el-input v-model="form.phone" placeholder="请输入联系方式" />
         </el-form-item>
+        <el-form-item label="社会工信码" prop="unifiedSocialCreditCode">
+          <el-input v-model="form.unifiedSocialCreditCode" placeholder="请输入联系方式" />
+        </el-form-item>
+        <el-form-item label="企业名称" prop="enterpriseName">
+          <el-input v-model="form.enterpriseName" placeholder="请输入联系方式" />
+        </el-form-item>
         <el-form-item label="身份证号" prop="card" :rules="cardRules">
           <el-input v-model="form.card" placeholder="请输入身份证号" />
         </el-form-item>
@@ -226,10 +239,10 @@
 import {listComplain, getComplain, delComplain, addComplain, updateComplain, getDict} from "@/api/basicData/complain";
 import {Editor} from "@wangeditor/editor-for-vue";
 import {ElMessage} from "element-plus";
-import {computed, reactive, ref} from "vue";
-import {getToken} from "../../../utils/auth";
-import {likeQueryMethod} from "../../../utils/likeQueryMethod";
-import {delImgById} from "../../../api/basicData/complain";
+import {computed, getCurrentInstance, reactive, ref} from "vue";
+import {getToken} from "@/utils/auth";
+import {likeQueryMethod} from "@/utils/likeQueryMethod";
+import {delImgById} from "@/api/basicData/complain";
 
 const baseURL = import.meta.env.VITE_APP_BASE_API
 const { proxy } = getCurrentInstance();
@@ -266,16 +279,16 @@ const handlePictureCardPreview = (uploadFile) => {
   dialogImageUrl.value = uploadFile.url
   dialogVisible.value = true
 }
-
-
-
-
-
 const cardRules = [
     { required: true, message: '请输入身份证号', trigger: 'blur' },
-    { pattern: /^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/, message: '身份证号格式不正确' },
+    //身份证号
+    { pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, message: '身份证号格式不正确' },
   ]
-
+const phoneRules = [
+    { required: true, message: '请输入联系方式', trigger: 'blur' },
+    //电话号码
+    { pattern: /^1[3-9]\d{9}$/, message: '联系方式格式不正确' },
+]
 const handleFileSuccess = (e,v)=>{
   beforeUpdateLimit.value = beforeUpdateLimit.value-1
   console.log(beforeUpdateLimit.value);
@@ -335,6 +348,8 @@ const data = reactive({
     createTime: null,
     updateBy: null,
     updateTime: null,
+    unifiedSocialCreditCode:null,
+    enterpriseName:null,
     remark: null,
     files:[]
   },
@@ -346,6 +361,8 @@ const data = reactive({
     content: null,
     name: null,
     phone: null,
+    unifiedSocialCreditCode:null,
+    enterpriseName:null,
     card: '',
     fileId: null,
     files:[]
@@ -386,6 +403,8 @@ function reset() {
     fileId: null,
     createBy: null,
     createTime: null,
+    unifiedSocialCreditCode:null,
+    enterpriseName:null,
     updateBy: null,
     updateTime: null,
     remark: null,
@@ -479,6 +498,15 @@ function handleExport() {
   }, `complain_${new Date().getTime()}.xlsx`)
 }
 
+const exportData = (row)=>{
+  const idsToS = row.id;
+  proxy.download('/crmComplain/generateVoucher',{
+    name:dickMap.get(row.type),
+    id:idsToS
+  },'投诉信息.pdf');
+}
+
+
 getList();
 init()
 </script>

+ 290 - 0
src/views/CDCService/message/index.vue

@@ -0,0 +1,290 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="企业名称" prop="enterpriseName" label-width="200">
+        <el-input
+            v-model="queryParams.enterpriseName"
+            placeholder="请输入企业名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode" label-width="200">
+        <el-input
+            v-model="queryParams.unifiedSocialCreditCode"
+            placeholder="请输入统一社会信用代码"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-popconfirm
+            title="你确定清除所有数据?"
+            confirm-button-text="是的"
+            cancel-button-text="不是"
+            :icon="InfoFilled"
+            icon-color="#626AEF"
+            @confirm="handleDelete"
+        >
+          <template #reference>
+            <el-button
+                type="danger"
+                plain
+                icon="Delete"
+                v-hasPermi="['basicData:message:remove']"
+            >清除全表
+            </el-button>
+          </template>
+        </el-popconfirm>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            @click="batchDelete"
+            v-hasPermi="['basicData:message:remove']"
+            :disabled="ids.length === 0"
+        >批量删除
+        </el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="messageList" height="650" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="留言类型" align="center" prop="type">
+        <template #default="scope">
+          {{dickMap.get(scope.row.type)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip='true'/>
+      <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
+      <el-table-column label="留言人姓名" align="center" prop="name" :show-overflow-tooltip='true'/>
+      <el-table-column label="联系方式" align="center" prop="phone" :show-overflow-tooltip='true'/>
+      <el-table-column label="身份证号" align="center" prop="card" :show-overflow-tooltip='true'/>
+      <el-table-column label="留言内容" align="center" prop="content"/>
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <el-button type="primary" icon="Download" @click="exportData(scope.row)">下载</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div style="position: fixed;bottom: 20px;right: 10px;">
+      <pagination
+          v-show="total>0"
+          :total="total"
+          v-model:page="queryParams.pageNum"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </div>
+
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+                 :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+                 :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+        <el-icon class="el-icon--upload">
+          <upload-filled/>
+        </el-icon>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>仅允许导入xls、xlsx格式文件。</span>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
+          <el-button @click="upload.open = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 添加或修改官网留言对话框 -->
+  </div>
+</template>
+
+<script setup name="Message">
+import {
+  listMessage,
+  getMessage,
+  delMessage,
+  delMessageBatch
+} from "@/api/basicData/message";
+import {reactive, ref, toRaw} from "vue";
+import {getToken} from "@/utils/auth";
+import {ElMessage} from "element-plus";
+import {likeQueryMethod} from "@/utils/likeQueryMethod";
+import {getDict} from "@/api/basicData/complain";
+import request, {downloadFileMethod} from "@/utils/request";
+
+const {proxy} = getCurrentInstance();
+
+const messageList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const dickArr = ref([]);
+const title = ref("");
+const dickMap = new Map();
+
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: '',
+  // 是否禁用上传
+  isUploading: false,
+  // 设置上传的请求头部
+  headers: {Authorization: getToken()},
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + '/owLeavingMessage/importData'
+})
+const handleFileSuccess = (e) => {
+  if (e.code == 200) {
+    ElMessage({
+      type: "success",
+      message: e.msg
+    })
+    getList()
+    proxy.$refs['uploadRef']?.clearFiles()
+  } else {
+    ElMessage({
+      type: "error",
+      message: e.msg
+    })
+    proxy.$refs['uploadRef']?.clearFiles()
+  }
+}
+
+function submitFileForm() {
+  proxy.$refs['uploadRef']?.submit();
+  upload.open = false;
+}
+
+function handleImport() {
+  upload.open = true
+}
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 20,
+    type: null,
+    enterpriseName: null,
+    unifiedSocialCreditCode: '',
+    name: null,
+    phone: null,
+    card: null,
+    content: null,
+  },
+  rules: {
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 查询官网留言列表 */
+function getList() {
+  loading.value = true;
+  let toServerObj = likeQueryMethod('unified_social_credit_code', queryParams.value.unifiedSocialCreditCode, queryParams.value.pageNum, queryParams.value.pageSize,'enterprise_name',queryParams.value.enterpriseName);
+  listMessage(toServerObj).then(response => {
+    messageList.value = response.records;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+const init = async ()=>{
+  let res = await getDict('message_type');
+  dickArr.value = res.data;
+  dickArr.value.forEach((item)=>{
+    let k = item.dictValue;
+    let v = item.dictLabel;
+    dickMap.set(k,v)
+  })
+}
+init()
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    type: null,
+    enterpriseName: null,
+    unifiedSocialCreditCode: '',
+    name: null,
+    phone: null,
+    card: null,
+    content: null,
+    createTime: null,
+    updateTime: null
+  };
+  proxy.resetForm("messageRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+
+/** 删除按钮操作 */
+async function handleDelete(row) {
+  const res = await delMessage();
+  if(res.code == 200){
+    ElMessage({
+      type:'success',
+      message:'删除成功'
+    })
+    getList();
+  }
+}
+/** 批量删除*/
+const batchDelete = (row)=>{
+  const idsToS = row.id || ids.value;
+  (proxy.$modal).confirm('是否确认删除这' + idsToS.length+'条的数据项?').then(function() {
+    return delMessageBatch(toRaw(idsToS));
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+const exportData = (row)=>{
+  const idsToS = row.id;
+  proxy.download('/owLeavingMessage/generateVoucher',{
+    name:dickMap.get(row.type),
+    id:idsToS
+  },'留言.pdf');
+}
+
+getList();
+</script>

+ 29 - 4
src/views/CEEnterprise/ARQuery/index.vue

@@ -9,6 +9,14 @@
             @keyup.enter="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="企业名称" prop="enterpriseName">
+        <el-input
+            v-model="queryParams.enterpriseName"
+            placeholder="请输入企业名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -19,7 +27,11 @@
       <!--      <el-table-column type="selection" width="55" align="center" />-->
       <!--      <el-table-column label="主键" align="center" prop="id" />-->
       <el-table-column label="企业名称" align="center" prop="enterpriseName" width="260"/>
-      <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
+      <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200">
+        <template #default="scope">
+          <el-link type="primary" @click="toDetailByUniCode(scope.row)">{{ scope.row.unifiedSocialCreditCode }}</el-link>
+        </template>
+      </el-table-column>
       <el-table-column label="企业竞争力得分(满分30分)" align="center" prop="enterpriseCompetitivenessScore" width="220"/>
       <el-table-column label="行政监管、践诺履约得分(满分20分)" align="center" prop="administrativeSupervisionScore" width="240"/>
       <el-table-column label="行政处罚得分(满分20分)" align="center" prop="administrativePenaltyScore" width="220"/>
@@ -78,6 +90,18 @@ const multiple = ref(true);
 const total = ref(0);
 const title = ref("");
 
+const toDetailByUniCode = (rows)=>{
+  proxy.$router.push({
+    path: '/CEEnterprise/qydfmx',
+    query: {
+      unifiedSocialCreditCode: rows.unifiedSocialCreditCode,
+      enterpriseName: rows.enterpriseName,
+      total:rows.total.toFixed(2),
+      grade:rows.grade
+    }
+  })
+}
+
 const handleDownloadReport = (rows) => {
   proxy.download('/crmHighTechZoneEnterprises/download?unifiedSocialCreditCode='+rows.unifiedSocialCreditCode, {
     ...rows.unifiedSocialCreditCode
@@ -89,7 +113,7 @@ const data = reactive({
   queryParams: {
     pageNum: 1,
     pageSize: 20,
-    enterpriseName: null,
+    enterpriseName: '',
     unifiedSocialCreditCode: '',
     enterpriseLeader: null,
     contactPhone: null,
@@ -109,7 +133,8 @@ function getList() {
   let toServerObj = {
     pageNum: queryParams.value.pageNum,
     pageSize: queryParams.value.pageSize,
-    unifiedSocialCreditCode: queryParams.value.unifiedSocialCreditCode
+    unifiedSocialCreditCode: queryParams.value.unifiedSocialCreditCode,
+    enterpriseName: queryParams.value.enterpriseName,
   }
   listEnterprises(toServerObj).then(response => {
     enterprisesList.value = response.data.result;
@@ -128,7 +153,7 @@ function cancel() {
 function reset() {
   form.value = {
     id: null,
-    enterpriseName: null,
+    enterpriseName: '',
     unifiedSocialCreditCode: '',
     enterpriseLeader: null,
     contactPhone: null,

+ 6 - 1
src/views/CEEnterprise/CERating/index.vue

@@ -8,6 +8,10 @@
             <el-input v-model="queryParams.unifiedSocialCreditCode" placeholder="请输入企业信用代码" clearable
               style="width: 240px" />
           </el-form-item>
+          <el-form-item label="企业名称" prop="enterpriseName">
+            <el-input v-model="queryParams.enterpriseName" placeholder="请输入企业名称" clearable
+                      style="width: 240px" />
+          </el-form-item>
           <el-form-item>
             <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
             <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -66,7 +70,8 @@ const data = reactive({
     pageSize: 20,
     unifiedSocialCreditCode: '',
     grade:null,
-    total:null
+    total:null,
+    enterpriseName:'',
     // userName: undefined,
     // phonenumber: undefined,
     // status: undefined,

+ 309 - 76
src/views/CEEnterprise/DEInformation/index.vue

@@ -1,86 +1,319 @@
 <template>
-  <div ref="echartsRef" style="width: 100%; height: 80vh;"></div>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="企业名称" prop="enterpriseName" label-width="200">
+        <el-input
+            v-model="queryParams.enterpriseName"
+            placeholder="请输入企业名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="信用代码" prop="unifiedSocialCreditCode" label-width="200">
+        <el-input
+            v-model="queryParams.unifiedSocialCreditCode"
+            placeholder="请输入信用代码"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+<!--    <el-row :gutter="10" class="mb8">-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-popconfirm-->
+<!--            title="你确定清除所有数据?"-->
+<!--            confirm-button-text="是的"-->
+<!--            cancel-button-text="不是"-->
+<!--            :icon="InfoFilled"-->
+<!--            icon-color="#626AEF"-->
+<!--            @confirm="handleDelete"-->
+<!--        >-->
+<!--          <template #reference>-->
+<!--            <el-button-->
+<!--                type="danger"-->
+<!--                plain-->
+<!--                icon="Delete"-->
+<!--                v-hasPermi="['basicData:executor:remove']"-->
+<!--            >清除全表-->
+<!--            </el-button>-->
+<!--          </template>-->
+<!--        </el-popconfirm>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--            type="danger"-->
+<!--            plain-->
+<!--            icon="Delete"-->
+<!--            @click="batchDelete"-->
+<!--            v-hasPermi="['basicData:executor:remove']"-->
+<!--            :disabled="ids.length === 0"-->
+<!--        >批量删除-->
+<!--        </el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--            type="warning"-->
+<!--            plain-->
+<!--            icon="Download"-->
+<!--            @click="handleExport"-->
+<!--            :disabled="!executorList.length"-->
+<!--            v-hasPermi="['basicData:executor:export']"-->
+<!--        >导出-->
+<!--        </el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button type="info" plain icon="Upload" @click="handleImport"-->
+<!--                   v-hasPermi="['system:user:import']">导入-->
+<!--        </el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button type="success" plain icon="Download" @click="downloadTemplate">-->
+<!--          下载导入模板-->
+<!--        </el-button>-->
+<!--      </el-col>-->
+<!--    </el-row>-->
+
+    <el-table v-loading="loading" :data="executorList" height="650" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip='true'/>
+      <el-table-column label="信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
+      <el-table-column label="行业代码" align="center" prop="industryCode" :show-overflow-tooltip='true'/>
+      <el-table-column label="被执行人名称" align="center" prop="executorName" :show-overflow-tooltip='true'/>
+      <el-table-column label="案号" align="center" prop="caseNumber" :show-overflow-tooltip='true'/>
+      <el-table-column label="执行法院" align="center" prop="enforcementCourt" :show-overflow-tooltip='true'/>
+      <el-table-column label="省份" align="center" prop="province" :show-overflow-tooltip='true'/>
+      <el-table-column label="做出执行依据单位" align="center" prop="basisUnit" :show-overflow-tooltip='true'/>
+      <el-table-column label="执行依据文号" align="center" prop="basisDocumentNumber" :show-overflow-tooltip='true'/>
+      <el-table-column label="立案时间" align="center" prop="filingTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.filingTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="生效法律文书确定的义务" align="center" prop="legalObligation" :show-overflow-tooltip='true'/>
+      <el-table-column label="被执行人的履行情况" align="center" prop="performanceStatus" :show-overflow-tooltip='true'/>
+      <el-table-column label="失信被执行人行为具体情形" align="center" prop="dishonestBehavior" :show-overflow-tooltip='true'/>
+    </el-table>
+
+    <div style="position: fixed;bottom: 20px;right: 10px;">
+      <pagination
+          v-show="total>0"
+          :total="total"
+          v-model:page="queryParams.pageNum"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </div>
+
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+                 :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+                 :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+        <el-icon class="el-icon--upload">
+          <upload-filled/>
+        </el-icon>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>仅允许导入xls、xlsx格式文件。</span>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
+          <el-button @click="upload.open = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 添加或修改司法涉诉-失信被执行人对话框 -->
+  </div>
 </template>
- 
-<script setup>
-import { onMounted, ref } from 'vue';
-import * as echarts from 'echarts';
-import { getDishonestDebtor } from '@/api/visualization/index'
+
+<script setup name="Executor">
+import {
+  listExecutor,
+  getExecutor,
+  delExecutor,
+  delExecutorBatch
+} from "@/api/basicData/executor3";
+import {reactive, ref, toRaw} from "vue";
+import {getToken} from "@/utils/auth";
+import {ElMessage} from "element-plus";
+import {likeQueryMethod} from "@/utils/likeQueryMethod";
+
+const {proxy} = getCurrentInstance();
+
+const executorList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: '',
+  // 是否禁用上传
+  isUploading: false,
+  // 设置上传的请求头部
+  headers: {Authorization: getToken()},
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + '/crmDishonestExecutor/importData'
+})
+const handleFileSuccess = (e) => {
+  if (e.code == 200) {
+    ElMessage({
+      type: "success",
+      message: e.msg
+    })
+    getList()
+    proxy.$refs['uploadRef']?.clearFiles()
+  } else {
+    ElMessage({
+      type: "error",
+      message: e.msg
+    })
+    proxy.$refs['uploadRef']?.clearFiles()
+  }
+}
+
+function submitFileForm() {
+  proxy.$refs['uploadRef']?.submit();
+  upload.open = false;
+}
+
+function handleImport() {
+  upload.open = true
+}
 
 const data = reactive({
   form: {},
   queryParams: {
     pageNum: 1,
-    pageSize: 100000,
+    pageSize: 20,
+    enterpriseName: null,
     unifiedSocialCreditCode: '',
-    condition: "",
-    grade: null,
-    total: null
+    industryCode: null,
+    executorName: null,
+    caseNumber: null,
+    enforcementCourt: null,
+    province: null,
+    basisUnit: null,
+    basisDocumentNumber: null,
+    filingTime: null,
+    legalObligation: null,
+    performanceStatus: null,
+    dishonestBehavior: null
   },
-})
-const { queryParams } = toRefs(data)
-const echartsRef = ref(null);
-
-/** 查询社保 */
-function getEchartsData() {
-  getDishonestDebtor(queryParams.value).then((res) => {
-    console.log(res)
-    const response = res.data
-
-    const namesArray = response.map(obj => obj.enterpriseName);
-    const valuesArray = response.map(obj => obj.avgMonthlyPaymentBand);
-
-    console.log(namesArray, valuesArray)
-
-    const chart = echarts.init(echartsRef.value);
-    const option = {
-      title: {
-        text: '失信企业信息'
-      },
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          type: 'shadow'
-        }
-      },
-      legend: {},
-      grid: {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-      },
-      xAxis: {
-        type: 'value',
-        boundaryGap: [0, 0.01]
-      },
-      yAxis: {
-        type: 'category',
-        data: namesArray
-      },
-      series: [
-        {
-          name: '2023',
-          type: 'bar',
-          data: valuesArray
-        }
-      ],
-      dataZoom: [{ // 这是一个 dataZoom 组件,可以控制 x 轴或 y 轴的区域缩放
-        type: 'slider', // 这里设置为 slider 类型,表示使用滑动条形式的 dataZoom 组件
-        yAxisIndex: 0, // 表示这个 dataZoom 组件控制第一个 y 轴
-        start: 10, // 数据窗口范围的起始百分比, 表示从10%的位置开始显示
-        end: 30 // 数据窗口范围的结束百分比, 表示到60%的位置结束
-      }]
-    };
-
-    chart.setOption(option);
-  })
-}
-onMounted(() => {
-  getEchartsData();
+  rules: {
+    enterpriseName: [
+      {
+        required: true, message: "企业名称不能为空", trigger: "blur" }
+    ],
+    unifiedSocialCreditCode: [
+      {
+        required: true, message: "信用代码不能为空", trigger: "blur" }
+    ],
+  }
 });
-</script>
- 
-<style>
-/* 样式内容 */
-</style>
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 查询司法涉诉-失信被执行人列表 */
+function getList() {
+  loading.value = true;
+  let toServerObj = likeQueryMethod('unified_social_credit_code', queryParams.value.unifiedSocialCreditCode, queryParams.value.pageNum, queryParams.value.pageSize,'enterprise_name',queryParams.value.enterpriseName);
+  listExecutor(toServerObj).then(response => {
+    executorList.value = response.records;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    enterpriseName: null,
+    unifiedSocialCreditCode: '',
+    industryCode: null,
+    executorName: null,
+    caseNumber: null,
+    enforcementCourt: null,
+    province: null,
+    basisUnit: null,
+    basisDocumentNumber: null,
+    filingTime: null,
+    legalObligation: null,
+    performanceStatus: "0",
+    dishonestBehavior: null
+  };
+  proxy.resetForm("executorRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+
+/** 删除按钮操作 */
+async function handleDelete(row) {
+  const res = await delExecutor();
+  if(res.code == 200){
+    ElMessage({
+      type:'success',
+      message:'删除成功'
+    })
+    getList();
+  }
+}
+/** 批量删除*/
+const batchDelete = (row)=>{
+  const idsToS = row.id || ids.value;
+  (proxy.$modal).confirm('是否确认删除这' + idsToS.length+'条的数据项?').then(function() {
+    return delExecutorBatch(toRaw(idsToS));
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('crmDishonestExecutor/exportData', {
+    ...queryParams.value
+  }, `司法涉诉-失信被执行人_${new Date().getTime()}.xlsx`)
+}
+const downloadTemplate = ()=>{
+  proxy.download('crmDishonestExecutor/getUploadTemplate',{}, `司法涉诉-失信被执行人模板.xlsx`)
+}
+
+getList();
+</script>

+ 11 - 4
src/views/CEEnterprise/companydetail/map/index.js

@@ -107,13 +107,13 @@ export const tableMap = {
     crm_other_domain_credit_rating: '其他领域信用等级信息',
     crm_other_penalty_administrative: '其他行政处罚信息表',
     crm_other_punishments: '税务处罚-其他处罚',
-    crm_output_value: '企业产值',
+    crm_output_value: '企业产值(单位:千元)',
     crm_price_penalty: '价格处罚信息表',
     crm_product_recall: '市场监管-产品召回',
     crm_public_security_penalty_information: '公安治安处罚信息',
     crm_punish_public_security_announcement: '公安公告-行政处罚信息',
-    crm_quarterly_electricity_bill: '季度电费信息表',
-    crm_quarterly_water_usage: '季度用水明细表',
+    crm_quarterly_electricity_bill: '季度电费信息表(单位:度)',
+    crm_quarterly_water_usage: '季度用水明细表(单位:吨)',
     crm_rating_agency_info: '评级机构评级信息表',
     crm_sci_edu_culture_penalty: '科教文旅-行政处罚',
     crm_seriously_dishonest_subjects: '严重失信主体信息表',
@@ -129,9 +129,16 @@ export const tableMap = {
     crm_unsatisfactory_supplier_penalty: '不良供应商-政府采购处罚信息表',
     crm_urban_administration_penalty: '城市管理-行政处罚信息表',
     crm_fraudulent_materials: '虚假材料申报信息表',
-    crm_major_work_safety_accidents: '重大安全生产事故通报信息表'
+    crm_major_work_safety_accidents: '重大安全生产事故通报信息表',
+    crm_movable_property_mortgage:'动产抵押信息'
 }
 export const fieldMap = {
+    end_date:'有效期',
+    handlingUnit:'经办单位',
+    creditor:'债权人',
+    mortgageDate:'动产抵押日期',
+    movablePropertyAmount:'抵押动产数额(万元)',
+    mortgageRegistrationNumber:'抵押登记编号',
     notified_entity: '被通报单位',
     notification_authority: '通报单位',
     notification_date: '通报时间',

+ 179 - 0
src/views/CEEnterprise/qydfmx/index.vue

@@ -0,0 +1,179 @@
+<script setup>
+  import {useRoute} from "vue-router";
+  import {getMostDetailByUniCode} from "@/api/basicData/mostdetail";
+  import {onMounted, ref} from "vue";
+  import {fieldMap} from "@/views/CEEnterprise/qydfmx/map";
+
+  import * as echarts from 'echarts';
+  const chartsRef = ref(null);
+  let route = useRoute();
+  const data = ref(new Map);
+  const tempData1 = ref([]);
+  const tempData2 = ref([]);
+  const tempData3 = ref([]);
+  const tempData4 = ref([]);
+  const tempData5 = ref([]);
+  const tempData6 = ref([]);
+  const tableData1 = ref([]);
+  const tableData2 = ref([]);
+  const tableData3 = ref([]);
+  const tableData4 = ref([]);
+  const tableData5 = ref([]);
+  const tableData6 = ref([]);
+  const sum1 = ref(0);
+  const sum2 = ref(0);
+  const sum3 = ref(10);
+  const sum4 = ref(20);
+  const sum5 = ref(20);
+  const sum6 = ref(0);
+  const init = async ()=>{
+    const res = await getMostDetailByUniCode(route.query.unifiedSocialCreditCode);
+    if(res.code == 200){
+      for (const resKey in res.data) {
+        data.value.set(fieldMap[resKey],res.data[resKey]);
+      }
+    }
+    let count = 0;
+    for (const entry of data.value) {
+      if(count<=17){
+        tempData1.value.push(entry);
+        count++
+      }else if (count<=29){
+        tempData2.value.push(entry);
+        count++
+      }else if(count<=34){
+        tempData3.value.push(entry);
+        count++
+      }else if (count<=74){
+        tempData4.value.push(entry);
+        count++
+      }else if (count<=83){
+        tempData5.value.push(entry);
+        count++
+      }else if (count<=91){
+        tempData6.value.push(entry);
+        count++
+      }else {
+        break;
+      }
+    }
+    setTableDataValueAndSum(tableData1,tempData1,sum1);
+    setTableDataValueAndSum(tableData2,tempData2,sum2);
+    setTableDataValueAndSum(tableData3,tempData3,sum3);
+    setTableDataValueAndSum(tableData4,tempData4,sum4);
+    setTableDataValueAndSum(tableData5,tempData5,sum5);
+    setTableDataValueAndSum(tableData6,tempData6,sum6);
+  }
+  const setTableDataValueAndSum = (tableData,tempData,sum)=>{
+    tableData.value = tempData.value.reduce((acc, cur) => {
+      acc[0][cur[0]] = cur[1];
+      return acc;
+    },[{}])
+    for (const k in tableData.value[0]) {
+      sum.value+=tableData.value[0][k];
+    }
+  }
+  init()
+  // onMounted(()=>{
+  //   console.log(chartsRef.value);
+  //
+  //   const chartDom = chartsRef.value;
+  //   const myChart = echarts.init(chartDom);
+  //   let option;
+  //
+  //   option = {
+  //     tooltip: {
+  //       formatter: '{a} <br/>{b} : {c}%'
+  //     },
+  //     series: [
+  //       {
+  //         name: '得分',
+  //         type: 'gauge',
+  //         progress: {
+  //           show: true
+  //         },
+  //         detail: {
+  //           valueAnimation: true,
+  //           formatter: '{value}'
+  //         },
+  //         data: [
+  //           {
+  //             value: route.query.total,
+  //             name: route.query.grade,
+  //           }
+  //         ]
+  //       }
+  //     ]
+  //   };
+  //
+  //   option && myChart.setOption(option);
+  // })
+</script>
+
+<template>
+  <div>
+    <div>企业名称:{{route.query.enterpriseName}}</div>
+    <div>当前查询的社会统一信用代码:{{route.query.unifiedSocialCreditCode}}</div>
+    <div>信用等级为:{{route.query.grade}}</div>
+<!--    <div ref="chartsRef" style="width: 400px;height: 400px"></div>-->
+    <div>总分为:{{route.query.total}}</div>
+      <el-table :data="tableData1" style="width: 100%">
+        <el-table-column :label="'企业竞争力得分详细(满分30分)此项得分为:'+sum1.toFixed(2)">
+          <el-table-column width="150" v-for="(item,index) in tempData1" :key="index" :label="item[0]">
+            <template #default="scope">
+              {{scope.row[item[0]]}}
+            </template>
+          </el-table-column>
+        </el-table-column>
+      </el-table>
+    <el-table :data="tableData2" style="width: 100%">
+      <el-table-column :label="'财务得分详细(满分10分)此项得分为:'+(sum2<=4?4:sum2)">
+        <el-table-column width="150" v-for="(item,index) in tempData2" :key="index" :label="item[0]">
+          <template #default="scope">
+            {{scope.row[item[0]]}}
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+    <el-table :data="tableData3" style="width: 100%">
+      <el-table-column :label="'司法裁判得分详细(满分10分)此项得分为:'+sum3">
+        <el-table-column width="150" v-for="(item,index) in tempData3" :key="index" :label="item[0]">
+          <template #default="scope">
+            {{scope.row[item[0]]?scope.row[item[0]]:0}}
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+    <el-table :data="tableData4" style="width: 100%">
+      <el-table-column :label="'行政处罚得分详细(满分20分)此项得分为:'+sum4">
+        <el-table-column width="150" v-for="(item,index) in tempData4" :key="index" :label="item[0]">
+          <template #default="scope">
+            {{scope.row[item[0]]}}
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+    <el-table :data="tableData5" style="width: 100%">
+      <el-table-column :label="'行政监管、践诺履约得分详细(满分20分)此项得分为:'+sum5">
+        <el-table-column width="150" v-for="(item,index) in tempData5" :key="index" :label="item[0]">
+          <template #default="scope">
+            {{scope.row[item[0]]}}
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+    <el-table :data="tableData6" style="width: 100%">
+      <el-table-column :label="'参考信用评价得分详细(满分10分)此项得分为:'+sum6.toFixed(2)">
+        <el-table-column width="150" v-for="(item,index) in tempData6" :key="index" :label="item[0]">
+          <template #default="scope">
+            {{scope.row[item[0]]}}
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 94 - 0
src/views/CEEnterprise/qydfmx/map/index.js

@@ -0,0 +1,94 @@
+export const fieldMap = {
+    accountsReceivableTurnover: "应收账款周转率得分(最高得0.75分)",
+    adminForcibleExecutionDeduction: "行政强制执行扣分(最高扣10分)",
+    adminSanctionDeduction: "行政处罚扣分(最高扣20分)",
+    adminSupervisionDeduction: "行政监督扣分(最高扣5分)",
+    administrativePenaltiesOtherPenaltiesDeduction: "行政处罚其他处罚扣分(最高扣2分)",
+    administrativePenalty: "行政处罚(最高扣20分)",
+    agricultureFisheriesWaterPenaltiesDeduction: "农渔水利行政处罚扣分(最高扣2分)",
+    arbitrationInfoLaborArbitrationDeduction: "仲裁信息劳动仲裁扣分(最高扣2分)",
+    assetLiabilityRatio: "资产负债率得分(最高得1分)",
+    associationHonorBonus: "协会荣誉得分(最高得1分)",
+    auctionNoticeAuctionDeduction: "拍卖公告司法拍卖扣分(最高扣5分)",
+    badSupplierListCorporateProcurementPenaltyDeduction: "不良供应商名单企业采购处罚扣分(最高扣2分)",
+    badSupplierListGovernmentProcurementPenaltyDeduction: "不良供应商名单政府采购处罚扣分(最高扣2分)",
+    badSupplierListMilitaryProcurementPenaltyDeduction: "不良供应商名单军队采购处罚扣分(最高扣2分)",
+    bankCreditRatingScore: "银行信用评级得分(最高得1分)",
+    brandHonorScore: "品牌荣誉得分(最高得1分)",
+    cashToCurrentLiabilitiesRatio: "现金流动负债比率得分(最高得1分)",
+    charityActivityScore: "慈善活动得分(最高得1分)",
+    civilAffairsManagementPenaltyDeduction: "民政管理处罚扣分(最高扣2分)",
+    commercePenaltiesAdministrativePenaltyDeduction: "商务处罚行政处罚扣分(最高扣2分)",
+    complaDoubleReportDeduction: "投诉举报扣分(最高扣2分)",
+    contractUnfulfilledDeduction: "合同未履行扣分(最高扣3分)",
+    creditPromiseUnfulfilledDeduction: "信用承诺未履行扣分(最高扣3分)",
+    creditRedListBonus: "信用红名单得分(最高得1分)",
+    criminalCaseLitigationDeduction: "检察案件刑事诉讼扣分(最高扣10分)",
+    debtReminderFinancialDebtDeduction: "欠款催告金融欠款扣分(最高扣2分)",
+    educationCultureTourismPenaltiesDeduction: "科教文旅行政处罚扣分(最高扣2分)",
+    emergencySafetySupervisionAdministrativePenaltyDeduction: "应急安监处罚行政处罚扣分(最高扣2分)",
+    energyElectricityElectricalSectorPenaltyDeduction: "能源电力涉电领域处罚扣分(最高扣2分)",
+    enterpriseTechnologyRnDScore: "企业科技研发得分(最高得1分)",
+    environmentalCreditRatingScore: "环保信用评级得分(最高得1分)",
+    environmentalProtectionIllegalSupervisionDeduction: "环保监管违法督办扣分(最高扣2分)",
+    environmentalProtectionKeyPollutionDeduction: "环保监管重点排污扣分(最高扣5分)",
+    environmentalProtectionOtherPenaltiesDeduction: "环保监管其它处罚扣分(最高扣2分)",
+    falseDeclarationMaterialsProvided: "提供虚假申报材料扣分(最高扣2分)",
+    financialSupervisionFinancePenaltyDeduction: "财金监管财政处罚处罚扣分(最高扣2分)",
+    financialSupervisionFinancialBureauPenaltyDeduction: "财金监管财政金融监管局处罚扣分(最高扣2分)",
+    financialSupervisionLocalFinancePenaltyDeduction: "财金监管财政金融地方金融处罚扣分(最高扣2分)",
+    financialSupervisionPBOCPenaltyDeduction: "财金监管人民银行处罚扣分(最高扣2分)",
+    governmentHonorBonus: "政府荣誉得分(最高得2分)",
+    healthAndWellnessAdministrativePenaltiesDeduction: "卫生健康行政处罚扣分(最高扣2分)",
+    highTechEnterpriseScore: "高新技术企业得分(最高得2分)",
+    housingConstructionPenaltyBulletinPenaltyDeduction: "住建处罚通报处罚扣分(最高扣2分)",
+    industryAndInformationTelecomPenaltiesDeduction: "工信邮电行政处罚扣分(最高扣2分)",
+    industryOrganizationSelfDisciplinePenaltyDeduction: "行业组织自律处罚扣分(最高扣2分)",
+    intellectualPropertyScore: "知识产权得分(最高得3分)",
+    inventoryTurnover: "存货周转率得分(最高得0.5分)",
+    judicialExecutionDeduction: "司法涉诉被执行人扣分(最高扣10分)",
+    laborSecurityIllegalLaborSupervisionPenaltyDeduction: "劳动保障违法劳动监察处罚扣分(最高扣2分)",
+    landResourcesAdministrativePenaltiesDeduction: "国土资源行政处罚扣分(最高扣2分)",
+    licensedCreditAgencyScore: "持牌企业征信机构评分得分(最高得1分)",
+    listedCompanySupervisionAccountabilityDeduction: "上市监管监管问责扣分(最高扣2分)",
+    listingScore: "上市得分(最高得1分)",
+    marketRegulatoryEquityFreezeDeduction: "市场监管股权冻结扣分(最高扣2分)",
+    marketRegulatoryEquityPledgeDeduction: "市场监管股权出质扣分(最高扣2分)",
+    marketRegulatoryIntellectualPropertyInfringementDeduction: "市场监管侵犯知产扣分(最高扣2分)",
+    marketRegulatoryMovablePropertyMortgageDeduction: "市场监管动产抵押扣分(最高扣2分)",
+    marketRegulatoryOperationExceptionDeduction: "市场监管经营异常扣分(最高扣5分)",
+    marketRegulatoryOtherPenaltiesDeduction: "市场监管其它处罚扣分(最高扣1分)",
+    marketRegulatoryPriceActionDeduction: "市场监管价格出发扣分(最高扣2分)",
+    marketRegulatoryProductRecallDeduction: "市场监管产品召回扣分(最高扣2分)",
+    marketSupervisionRatingScore: "市场监管信用评级得分(最高得1分)",
+    nationalPublicCreditScore: "国家公共信用得分(最高得2分)",
+    netAssetReturnRate: "净资产收益率得分(最高得1分)",
+    operatingIncomeGrowthRate: "营业总收入增长率得分(最高得0.5分)",
+    operatingProfitMargin: "营业收入利润率得分(最高得1分)",
+    operationalYearsScore: "经营年限得分(最高得1分)",
+    organizationalStructureScore: "组织建设得分(最高得1分)",
+    otherFieldsCreditAppraisalScore: "其他领域信用评价得分(最高得2分)",
+    policeNoticePenaltyDeduction: "公安公告行政处罚扣分(最高扣2分)",
+    qualificationCertificateScore: "资质证书信息得分(最高得2分)",
+    quickRatio: "速动比率得分(最高得1分)",
+    rAndDDeploymentIntensity: "研发经费投入强度(最高得0.75分)",
+    radioTelevisionInformationPenaltiesDeduction: "广电网信行政处罚扣分(最高扣2分)",
+    ratingAgencyCreditRating: "评级机构信用评级得分(最高得1分)",
+    revenueScore: "产值得分(最高得4分)",
+    scienceAndTechnologySME: "科技型中小企业(最高得1分)",
+    socialSecurityArrearsDeduction: "社保欠缴扣分(最高扣5分)",
+    socialSecurityScore: "社保得分(最高得2分)",
+    specializedNewScore: "专精特新得分(最高得1.5分)",
+    surplusCashSecurityRatio: "盈余现金保障倍数(最高得1分)",
+    systemCertificationScore: "体系认证得分(最高得1分)",
+    taxPaymentScore: "纳税额得分(最高得4分)",
+    taxPenaltyOrderForRemovalDeduction: "税务处罚责令整改扣分(最高扣2分)",
+    taxPenaltyOtherPenaltiesDeduction: "税务处罚其他处罚扣分(最高扣1分)",
+    taxPenaltyTaxArrearsAnnouncementDeduction: "税务处罚欠税公告扣分(最高扣2分)",
+    taxPenaltyTaxUrgentNoticeDeduction: "税务处罚税务催告扣分(最高扣2分)",
+    taxRatingScore: "税收评级得分(最高得1分)",
+    totalAssetsTurnover: "总资产周转率得分(最高得0.75分)",
+    totalProfitGrowthRate: "利润总额增长率得分(最高得0.75分)",
+    urbanManagementPenaltiesDeduction: "城市管理行政处罚扣分(最高扣2分)",
+    utilityArrearsDeduction: "欠缴公用事业费扣分(最高扣5分)",
+}

+ 8 - 7
src/views/basicData/OpeCapability/information/index.vue

@@ -129,15 +129,16 @@
 <!--        </template>-->
 <!--      </el-table-column>-->
     </el-table>
-
     <div style="position: fixed;bottom: 20px;right: 10px;">
       <el-pagination
-          v-show="total>0"
+          :page-sizes="[10, 20, 30, 50]"
+          v-model:page-size="queryParams.pageSize"
+          v-model:current-page="queryParams.pageNum"
+          layout="total, sizes, prev, pager, next, jumper"
+          @current-change="getList"
           :total="total"
-          v-model:page="queryParams.pageNum"
-          v-model:limit="queryParams.pageSize"
-          @pagination="getList"
-      />
+      >
+      </el-pagination>
     </div>
 
     <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
@@ -263,7 +264,7 @@ const data = reactive({
   form: {},
   queryParams: {
     pageNum: 1,
-    pageSize: 10,
+    pageSize: 20,
     unifiedSocialCreditCode: '',
     enterpriseName: null,
     isAbnormalTaxpayer: null,

+ 1 - 1
src/views/basicData/cwxx/cwbbxx/index.vue

@@ -85,7 +85,7 @@
       <el-table-column label="期末余额" align="center" prop="endingBalance" :show-overflow-tooltip='true'/>
       <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
       <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip='true'/>
-      <el-table-column label="从业人" align="center" prop="practitioners" :show-overflow-tooltip='true'/>
+      <el-table-column label="从业人" align="center" prop="practitioners" :show-overflow-tooltip='true'/>
     </el-table>
 
     <div style="position: fixed;bottom: 20px;right: 10px;">

+ 5 - 5
src/views/basicData/ggxyjl/jnlyxx/dfqj/index.vue

@@ -83,12 +83,12 @@
       <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip='true'/>
       <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
       <el-table-column label="电网户号" align="center" prop="gridAccountNumber" :show-overflow-tooltip='true'/>
-      <el-table-column label="第一季度" align="center" prop="firstQuarterConsumption" :show-overflow-tooltip='true'/>
-      <el-table-column label="第二季度" align="center" prop="secondQuarterConsumption" :show-overflow-tooltip='true'/>
-      <el-table-column label="第三季度" align="center" prop="thirdQuarterConsumption" :show-overflow-tooltip='true'/>
-      <el-table-column label="第四季度" align="center" prop="fourthQuarterConsumption" :show-overflow-tooltip='true'/>
-      <el-table-column label="年度总" align="center" prop="annualTotalConsumption" :show-overflow-tooltip='true'/>
       <el-table-column label="年度" align="center" prop="year" :show-overflow-tooltip='true'/>
+      <el-table-column label="第一季度(度)" align="center" prop="firstQuarterConsumption" :show-overflow-tooltip='true'/>
+      <el-table-column label="第二季度(度)" align="center" prop="secondQuarterConsumption" :show-overflow-tooltip='true'/>
+      <el-table-column label="第三季度(度)" align="center" prop="thirdQuarterConsumption" :show-overflow-tooltip='true'/>
+      <el-table-column label="第四季度(度)" align="center" prop="fourthQuarterConsumption" :show-overflow-tooltip='true'/>
+      <el-table-column label="年度总(度)" align="center" prop="annualTotalConsumption" :show-overflow-tooltip='true'/>
       <el-table-column label="当前是否欠缴电费" align="center" prop="arrearExists" :show-overflow-tooltip='true'/>
     </el-table>
 

+ 5 - 5
src/views/basicData/ggxyjl/jnlyxx/sfqj/index.vue

@@ -82,12 +82,12 @@
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="单位名称" align="center" prop="unitName" :show-overflow-tooltip='true'/>
       <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
-      <el-table-column label="第一季度" align="center" prop="firstQuarterUsage" :show-overflow-tooltip='true'/>
-      <el-table-column label="第二季度" align="center" prop="secondQuarterUsage" :show-overflow-tooltip='true'/>
-      <el-table-column label="第三季度用" align="center" prop="thirdQuarterUsage" :show-overflow-tooltip='true'/>
-      <el-table-column label="第四季度" align="center" prop="fourthQuarterUsage" :show-overflow-tooltip='true'/>
-      <el-table-column label="合计" align="center" prop="total" :show-overflow-tooltip='true'/>
       <el-table-column label="年度" align="center" prop="annual" :show-overflow-tooltip='true'/>
+      <el-table-column label="第一季度(吨)" align="center" prop="firstQuarterUsage" :show-overflow-tooltip='true'/>
+      <el-table-column label="第二季度(吨)" align="center" prop="secondQuarterUsage" :show-overflow-tooltip='true'/>
+      <el-table-column label="第三季度(吨)" align="center" prop="thirdQuarterUsage" :show-overflow-tooltip='true'/>
+      <el-table-column label="第四季度(吨)" align="center" prop="fourthQuarterUsage" :show-overflow-tooltip='true'/>
+      <el-table-column label="合计(吨)" align="center" prop="total" :show-overflow-tooltip='true'/>
       <el-table-column label="当前是否欠缴水费" align="center" prop="isCurrentlyInArrears" :show-overflow-tooltip='true'/>
     </el-table>
 

+ 304 - 0
src/views/basicData/ggxyjl/xzjgxx/xzcfxx/dcdy/index.vue

@@ -0,0 +1,304 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="动产抵押企业名称" prop="companyName" label-width="200">
+        <el-input
+            v-model="queryParams.companyName"
+            placeholder="请输入动产抵押企业名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode" label-width="200">
+        <el-input
+            v-model="queryParams.unifiedSocialCreditCode"
+            placeholder="请输入统一社会信用代码"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-popconfirm
+            title="你确定清除所有数据?"
+            confirm-button-text="是的"
+            cancel-button-text="不是"
+            :icon="InfoFilled"
+            icon-color="#626AEF"
+            @confirm="handleDelete"
+        >
+          <template #reference>
+            <el-button
+                type="danger"
+                plain
+                icon="Delete"
+                v-hasPermi="['basicData:mortgage:remove']"
+            >清除全表
+            </el-button>
+          </template>
+        </el-popconfirm>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            @click="batchDelete"
+            v-hasPermi="['basicData:mortgage:remove']"
+            :disabled="ids.length === 0"
+        >批量删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            :disabled="!mortgageList.length"
+            v-hasPermi="['basicData:mortgage:export']"
+        >导出
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="info" plain icon="Upload" @click="handleImport"
+                   v-hasPermi="['system:user:import']">导入
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="success" plain icon="Download" @click="downloadTemplate">
+          下载导入模板
+        </el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="mortgageList" height="650" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="动产抵押企业名称" align="center" prop="companyName" :show-overflow-tooltip='true'/>
+      <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
+      <el-table-column label="抵押登记编号" align="center" prop="mortgageRegistrationNumber" :show-overflow-tooltip='true'/>
+      <el-table-column label="抵押动产数额" align="center" prop="movablePropertyAmount" :show-overflow-tooltip='true'/>
+      <el-table-column label="动产抵押日期" align="center" prop="mortgageDate" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.mortgageDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="债权人" align="center" prop="creditor" :show-overflow-tooltip='true'/>
+      <el-table-column label="状态" align="center" prop="status" :show-overflow-tooltip='true'/>
+      <el-table-column label="经办单位" align="center" prop="handlingUnit" :show-overflow-tooltip='true'/>
+    </el-table>
+
+    <div style="position: fixed;bottom: 20px;right: 10px;">
+      <pagination
+          v-show="total>0"
+          :total="total"
+          v-model:page="queryParams.pageNum"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </div>
+
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+                 :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+                 :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+        <el-icon class="el-icon--upload">
+          <upload-filled/>
+        </el-icon>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>仅允许导入xls、xlsx格式文件。</span>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
+          <el-button @click="upload.open = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 添加或修改动产抵押信息对话框 -->
+  </div>
+</template>
+
+<script setup name="Mortgage">
+import {
+  listMortgage,
+  getMortgage,
+  delMortgage,
+  delMortgageBatch
+} from "@/api/basicData/mortgage3";
+import {reactive, ref, toRaw} from "vue";
+import {getToken} from "@/utils/auth";
+import {ElMessage} from "element-plus";
+import {likeQueryMethod} from "@/utils/likeQueryMethod";
+
+const {proxy} = getCurrentInstance();
+
+const mortgageList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+const upload = reactive({
+  // 是否显示弹出层(用户导入)
+  open: false,
+  // 弹出层标题(用户导入)
+  title: '',
+  // 是否禁用上传
+  isUploading: false,
+  // 设置上传的请求头部
+  headers: {Authorization: getToken()},
+  // 上传的地址
+  url: import.meta.env.VITE_APP_BASE_API + '/crmMovablePropertyMortgage/importData'
+})
+const handleFileSuccess = (e) => {
+  if (e.code == 200) {
+    ElMessage({
+      type: "success",
+      message: e.msg
+    })
+    getList()
+    proxy.$refs['uploadRef']?.clearFiles()
+  } else {
+    ElMessage({
+      type: "error",
+      message: e.msg
+    })
+    proxy.$refs['uploadRef']?.clearFiles()
+  }
+}
+
+function submitFileForm() {
+  proxy.$refs['uploadRef']?.submit();
+  upload.open = false;
+}
+
+function handleImport() {
+  upload.open = true
+}
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 20,
+    companyName: null,
+    unifiedSocialCreditCode: '',
+    mortgageRegistrationNumber: null,
+    movablePropertyAmount: null,
+    mortgageDate: null,
+    creditor: null,
+    status: null,
+    handlingUnit: null
+  },
+  rules: {
+    companyName: [
+      {
+        required: true, message: "动产抵押企业名称不能为空", trigger: "blur" }
+    ],
+    unifiedSocialCreditCode: [
+      {
+        required: true, message: "统一社会信用代码不能为空", trigger: "blur" }
+    ],
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 查询动产抵押信息列表 */
+function getList() {
+  loading.value = true;
+  let toServerObj = likeQueryMethod('unified_social_credit_code', queryParams.value.unifiedSocialCreditCode, queryParams.value.pageNum, queryParams.value.pageSize,'company_name',queryParams.value.companyName);
+  listMortgage(toServerObj).then(response => {
+    mortgageList.value = response.records;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    companyName: null,
+    unifiedSocialCreditCode: '',
+    mortgageRegistrationNumber: null,
+    movablePropertyAmount: null,
+    mortgageDate: null,
+    creditor: null,
+    status: "0",
+    handlingUnit: null
+  };
+  proxy.resetForm("mortgageRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+
+/** 删除按钮操作 */
+async function handleDelete(row) {
+  const res = await delMortgage();
+  if(res.code == 200){
+    ElMessage({
+      type:'success',
+      message:'删除成功'
+    })
+    getList();
+  }
+}
+/** 批量删除*/
+const batchDelete = (row)=>{
+  const idsToS = row.id || ids.value;
+  (proxy.$modal).confirm('是否确认删除这' + idsToS.length+'条的数据项?').then(function() {
+    return delMortgageBatch(toRaw(idsToS));
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('crmMovablePropertyMortgage/exportData', {
+    ...queryParams.value
+  }, `动产抵押信息_${new Date().getTime()}.xlsx`)
+}
+const downloadTemplate = ()=>{
+  proxy.download('crmMovablePropertyMortgage/getUploadTemplate',{}, `动产抵押信息模板.xlsx`)
+}
+
+getList();
+</script>

+ 1 - 1
src/views/basicData/qyzjl/shzr/gjjjn/index.vue

@@ -144,7 +144,7 @@
       <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200" />
       <el-table-column label="单位名称" align="center" prop="unitName" :show-overflow-tooltip="true" />
       <el-table-column label="2023年平均每月缴存人数" align="center" prop="avgMonthlyContributors" :show-overflow-tooltip="true" />
-      <el-table-column label="2023年缴存总和" align="center" prop="totalContributions" :show-overflow-tooltip="true" />
+      <el-table-column label="2023年缴存总和(元)" align="center" prop="totalContributions" :show-overflow-tooltip="true" />
       <el-table-column label="最近缴存日期" align="center" prop="lastContributionDate" :show-overflow-tooltip="true" />
       <el-table-column label="开户日期" align="center" prop="accountOpeningDate" width="180" :show-overflow-tooltip="true">
         <template #default="scope">

+ 2 - 2
src/views/basicData/qyzjl/shzr/sbjn/index.vue

@@ -126,8 +126,8 @@
       <!--      <el-table-column label="主键" align="center" prop="id" />-->
       <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200" />
       <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip="true" />
-      <el-table-column label="企业职工基本养老保险近一年月均参保人数分档" align="center" prop="avgInsuredPersonsBand" :show-overflow-tooltip="true" />
-      <el-table-column label="企业职工基本养老保险近一年月均单位缴费金额分档" align="center" prop="avgMonthlyPaymentBand" :show-overflow-tooltip="true" />
+      <el-table-column label="企业职工基本养老保险近一年月均参保人数分档(人)" align="center" prop="avgInsuredPersonsBand" :show-overflow-tooltip="true" />
+      <el-table-column label="企业职工基本养老保险近一年月均单位缴费金额分档(元)" align="center" prop="avgMonthlyPaymentBand" :show-overflow-tooltip="true" />
       <el-table-column label="企业职工基本养老保险最近一次正常缴费月份" align="center" prop="lastNormalPaymentMonth" :show-overflow-tooltip="true" />
       <el-table-column label="备注" align="center" prop="remarks" :show-overflow-tooltip="true" />
       <!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->

+ 6 - 6
src/views/basicData/qyzjl/shzr/ssjn/index.vue

@@ -82,13 +82,13 @@
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" width="200"/>
       <el-table-column label="企业名称" align="center" prop="enterpriseName" :show-overflow-tooltip='true'/>
-      <el-table-column label="第一季度" align="center" prop="firstQuarterAmount" :show-overflow-tooltip='true'/>
-      <el-table-column label="第二季度" align="center" prop="secondQuarterAmount" :show-overflow-tooltip='true'/>
-      <el-table-column label="第三季度" align="center" prop="thirdQuarterAmount" :show-overflow-tooltip='true'/>
-      <el-table-column label="第四季度" align="center" prop="fourthQuarterAmount" :show-overflow-tooltip='true'/>
+      <el-table-column label="第一季度(元)" align="center" prop="firstQuarterAmount" :show-overflow-tooltip='true'/>
+      <el-table-column label="第二季度(元)" align="center" prop="secondQuarterAmount" :show-overflow-tooltip='true'/>
+      <el-table-column label="第三季度(元)" align="center" prop="thirdQuarterAmount" :show-overflow-tooltip='true'/>
+      <el-table-column label="第四季度(元)" align="center" prop="fourthQuarterAmount" :show-overflow-tooltip='true'/>
       <el-table-column label="年度" align="center" prop="annualAmount" :show-overflow-tooltip='true'/>
       <el-table-column label="当前是否欠缴税费" align="center" prop="taxArrearsExist" :show-overflow-tooltip='true'/>
-      <el-table-column label="欠缴税费金额" align="center" prop="arrearsAmount" :show-overflow-tooltip='true'/>
+      <el-table-column label="欠缴税费金额(元)" align="center" prop="arrearsAmount" :show-overflow-tooltip='true'/>
     </el-table>
 
     <div style="position: fixed;bottom: 20px;right: 10px;">
@@ -249,7 +249,7 @@ const {queryParams, form, rules} = toRefs(data);
 /** 查询企业纳税信息列表 */
 function getList() {
   loading.value = true;
-  let toServerObj = likeQueryMethod('unified_social_credit_code', queryParams.value.unifiedSocialCreditCode, queryParams.value.pageNum, queryParams.value.pageSize);
+  let toServerObj = likeQueryMethod('unified_social_credit_code', queryParams.value.unifiedSocialCreditCode, queryParams.value.pageNum, queryParams.value.pageSize,'enterprise_name',queryParams.value.enterpriseName);
   listInfo(toServerObj).then(response => {
     infoList.value = response.records;
     total.value = response.total;

+ 8 - 7
src/views/home/index.vue

@@ -19,7 +19,7 @@
     <div class="listContainer" ref="listContainer" @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave" @wheel.prevent="handleWheel">
       <div class="listContent" ref="listContent" :style="{ transform: 'translateY(' + moveValue + 'px)' }" >
         <div class="lsitItem" v-for="(item, index) in homeList" :key="index" style="position: relative" @click="toDetail(item)">
-          <span style="position: absolute;left: 10px;">{{ index + 1 + '、' }}</span>{{ item.enterpriseName }}
+          <span style="position: absolute;left: 10px;">{{ index + 1 }}<span style="font-weight: bold">.</span></span>{{ item.enterpriseName }}
         </div>
       </div>
     </div>
@@ -34,7 +34,7 @@
               </div>
               <div class="imgContainer" @click="toLink(2)">
                 <img src="@/assets/images/777.jpg" />
-                <div class="textContainer">企业产值产能</div>
+                <div class="textContainer">产值负增长企业</div>
               </div>
               <div class="imgContainer" @click="toLink(3)">
                 <img src="@/assets/images/999.jpg" />
@@ -45,7 +45,7 @@
                 <div class="textContainer">企业税收</div>
               </div>
               <div class="imgContainer" @click="toLink(5)">
-                <img src="@/assets/images/888.jpg" />
+                <img src="@/assets/images/000.jpg" />
                 <div class="textContainer">可视化入口</div>
               </div>
             </div>
@@ -64,7 +64,7 @@
 // const imgUrl = new URL('../../assets/logo/logo.png', import.meta.url).href
 
 import { nextTick, onMounted, onUnmounted, watch } from "vue";
-import { getHomeList } from "../../api/home/home";
+import {getCreditScoreList, getHomeList} from "../../api/home/home";
 
 const router = useRouter()
 const username = localStorage.getItem('username')
@@ -101,7 +101,7 @@ const toLink = (index) => {
       router.push('/CEEnterprise/CERating')
       break;
     case 2:
-      router.push('/basicData/qyjzl/jbsz/qycz')
+      router.push('/BusDynamics/czjsqy')
       break;
     case 3:
       router.push('/BusDynamics/OPCMonitoring')
@@ -132,7 +132,8 @@ const moveValue = ref(0);
 const homeList = ref([]);
 
 onMounted(() => {
-  getHomeList().then(res => {
+  getCreditScoreList().then(res => {
+    // console.log(res);
     if (res.code == 200) {
       homeList.value = res.data.result;
       nextTick(() => {
@@ -175,7 +176,7 @@ onUnmounted(() => {
 
   .title {
     position: absolute;
-    z-index: 9999;
+    z-index: 1;
     left: 51.5vw;
     top: 0;
     background-color: #EEF2FBFF;

+ 1 - 0
src/views/login.vue

@@ -123,6 +123,7 @@
 					})
 					.catch(() => {
 						loading.value = false
+            loginForm.value.code = ''
 						// 重新获取验证码
 						if (captchaOnOff.value) {
 							getCode()

+ 10 - 4
src/views/system/user/index.vue

@@ -567,9 +567,14 @@ const data = reactive({
     password: [
       { required: true, message: '用户密码不能为空', trigger: 'blur' },
       {
-        min: 5,
+        pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,20}/,
+        message: '必须包含一个大写字母小写字母以及一个特殊符号且在8-20位之间',
+        trigger: 'blur'
+      },
+      {
+        min: 8,
         max: 20,
-        message: '用户密码长度必须介于 5 和 20 之间',
+        message: '用户密码长度必须介于 8 和 20 之间',
         trigger: 'blur'
       }
     ],
@@ -702,8 +707,9 @@ function handleResetPwd(row) {
       confirmButtonText: '确定',
       cancelButtonText: '取消',
       closeOnClickModal: false,
-      inputPattern: /^.{5,20}$/,
-      inputErrorMessage: '用户密码长度必须介于 5 和 20 之间'
+      //必须包含一个大写字母小写字母以及一个特殊符号
+      inputPattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,20}$/,
+      inputErrorMessage: '用户密码长度必须介于 8 和 20 之间并且包含大小写字母、数字和特殊字符'
     })
     .then(({ value }) => {
       resetUserPwd(row.userId, value).then((response) => {

+ 1242 - 989
src/views/visualization/index.vue

@@ -1,425 +1,450 @@
 <template>
-    <div class="Vbox">
-        <div class="head">
-            <div class="VisTitle"></div>
-            <div class="Vgradation">
-                <div class="tab" v-for="(item, index) in gradationMun" :key="index" :class="{ active: activeTab === index }"
-                    @click="setActiveTab(index, item)">
-                    {{ item.name }}
+  <div class="Vbox">
+    <div class="head">
+      <div class="VisTitle"></div>
+      <div class="Vgradation">
+        <div class="tab" v-for="(item, index) in gradationMun" :key="index" :class="{ active: activeTab === index }"
+             @click="setActiveTab(index, item)">
+          {{ item.name }}
+        </div>
+      </div>
+    </div>
+    <div class="container">
+      <div class="center">
+        <div ref="mapContainer" class="allmap"></div>
+      </div>
+      <div class="left">
+        <div class="rightParkBox">
+          <div class="rightParkTtile">园区概况</div>
+          <div class="rightParkContent">
+            <div class="RPCBox" v-for="(item, index) in parkData" :key="index">
+              <div class="RPCBImg">
+                <img :src=item.img alt="">
+              </div>
+              <div class="RPCBData">
+                <div class="RPCBDNumber">{{ item.value }}</div>
+                <div class="RPCBDName" v-html="item.title"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="leftTwoBox">
+          <div class="leftGDPTitle">园区生产总值(千元)</div>
+          <div class="leftGDPContent">
+            <baseEcharts :NamechartData="NamechartData" :ArrOneData="ArrOneData" :ArrTwoData="ArrTwoData">
+            </baseEcharts>
+          </div>
+        </div>
+
+
+        <div class="leftThreeBox">
+          <div class="leftTaxationTitle">企业税收TOP10</div>
+          <el-scrollbar height="calc(100% - 40px)">
+            <div class="leftTaxationContent">
+              <div class="LTCKing" v-for="(item, index) in RanKingData" :key="index">
+                <div class="ranking">
+                  <img :src=item.mig alt="">
                 </div>
+                <div class="companyName">{{ item.name }}</div>
+                <div class="companyValue">{{ item.value }}万元</div>
+              </div>
             </div>
+          </el-scrollbar>
         </div>
-        <div class="container">
-            <div class="center">
-                <div ref="mapContainer" class="allmap"></div>
+        <!-- <div>2</div> -->
+      </div>
+
+      <div class="boxBottom">
+        <div class="parkLoan">
+          <div class="PCFLTitle">园区特色融资贷款</div>
+          <div class="PCFLContent">
+            <div class="PCFLNumber">
+              <div class="RPCBData" v-for="(item, index) in sumUsingNumber" :key="index">
+                <div class="RPCBDNumber">{{ item.sum }}(万元)</div>
+                <div class="RPCBDName">{{ item.name }}</div>
+              </div>
             </div>
-            <div class="left">
-                <div class="leftOneBox">
-                    <div class="leftOBTitle">企业评价分析</div>
-                    <div class="leftOBContent">
-                        <PieEcharts :message="PieChartData"></PieEcharts>
-                    </div>
-                </div>
-                <div class="leftTwoBox">
-                    <div class="leftGDPTitle">园区生产总值</div>
-                    <div class="leftGDPContent">
-                        <baseEcharts :NamechartData="NamechartData" :ArrOneData="ArrOneData" :ArrTwoData="ArrTwoData">
-                        </baseEcharts>
-                    </div>
-                </div>
-                <div class="leftThreeBox">
-                    <div class="leftTaxationTitle">企业税收TOP10</div>
-                    <el-scrollbar height="calc(100% - 40px)">
-                        <div class="leftTaxationContent">
-                            <div class="LTCKing" v-for="(item, index) in RanKingData" :key="index">
-                                <div class="ranking">
-                                    <img :src=item.mig alt="">
-                                </div>
-                                <div class="companyName">{{ item.name }}</div>
-                                <div class="companyValue">{{ item.value }}万元</div>
-                            </div>
-                        </div>
-                    </el-scrollbar>
-                </div>
-                <!-- <div>2</div> -->
+            <div class="PCFLImg" style="color:white;text-align:center">
+              <div v-for="(item, index) in sumUsingNumber" :key="index">
+                <div style="width: 7.5vw;"><img style="width: 100%;" :src=item.img></div>
+                <span>贷款企业数:{{ item.number }}</span>
+              </div>
             </div>
-
-            <div class="boxBottom">
-                <div class="parkLoan">
-                    <div class="PCFLTitle">园区特色融资贷款</div>
-                    <div class="PCFLContent">
-                        <div class="PCFLNumber">
-                            <div class="RPCBData" v-for="(item, index) in sumUsingNumber" :key="index">
-                                <div class="RPCBDNumber">{{ item.sum }}(万元)</div>
-                                <div class="RPCBDName">{{ item.name }}</div>
-                            </div>
-                        </div>
-                        <div class="PCFLImg" style="color:white;text-align:center">
-                            <div v-for="(item, index) in sumUsingNumber" :key="index">
-                                <img :src=item.img>
-                                <span>贷款企业数:{{ item.number }}</span>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="boxBttTwo">
-                    <div class="businessManagTitle">企业管理</div>
-                    <div class="businessManagContent">
-                        <div class="RPCBox" v-for="(item, index) in business" :key="index">
-                            <div class="RPCBImg">
-                                <img :src=item.img alt="">
-                            </div>
-                            <div class="RPCBData">
-                                <div class="RPCBDName">{{ item.title }}</div>
-                                <div class="RPCBDNumber">{{ item.value }}(家)</div>
-                                <div class="RPCBDRatio">{{ item.ratio }}</div>
-
-                            </div>
-                        </div>
-                    </div>
-                </div>
+          </div>
+        </div>
+        <div class="boxBttTwo">
+          <div class="businessManagTitle">企业管理</div>
+          <div class="businessManagContent">
+            <div class="RPCBox" v-for="(item, index) in business" :key="index">
+              <div class="RPCBImg">
+                <img :src=item.img alt="">
+              </div>
+              <div class="RPCBData">
+                <div class="RPCBDName">{{ item.title }}</div>
+                <div class="RPCBDNumber">{{ item.value }}(家)</div>
+                <div class="RPCBDRatio">{{ item.ratio }}</div>
+
+              </div>
             </div>
+          </div>
+        </div>
+      </div>
 
-            <div class="right">
-                <div class="rightParkBox">
-                    <div class="rightParkTtile">园区概况</div>
-                    <div class="rightParkContent">
-                        <div class="RPCBox" v-for="(item, index) in parkData" :key="index">
-                            <div class="RPCBImg">
-                                <img :src=item.img alt="">
-                            </div>
-                            <div class="RPCBData">
-                                <div class="RPCBDNumber">{{ item.value }}</div>
-                                <div class="RPCBDName">{{ item.title }}</div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="rightIndustryComplianceBox">
-                    <div class="RICBTitle">行业合规</div>
-                    <div class="RICBTContent">
-                        <div class="RICBTCBoxOne">
-                            <div class="" style="
+      <div class="right">
+
+
+        <div class="leftOneBox">
+          <div class="leftOBTitle">企业评价分析</div>
+          <div class="leftOBContent">
+            <PieEcharts :message="PieChartData"></PieEcharts>
+          </div>
+        </div>
+
+
+
+        <div class="rightIndustryComplianceBox">
+          <div class="RICBTitle">企业经营合规</div>
+          <div class="RICBTContent">
+            <div class="RICBTCBoxOne">
+              <div class="" style="
                             margin-left: 20px;" v-for="(item, index) in hyhgData" :key="index">
-                                <div class="proportion">{{ item.value }}</div>
-                                <div class="administrativeS">{{ item.name }}</div>
-                            </div>
-                        </div>
-                        <div class="RICBTCBoxOne">
-                            <div class="" style="
+                <div class="proportion">{{ item.value }}</div>
+                <div class="administrativeS">{{ item.name }}</div>
+              </div>
+            </div>
+            <div class="RICBTCBoxOne">
+              <div class="" style="
                             margin-left: 20px;" v-for="(item, index) in xzqzzxData" :key="index">
-                                <div class="proportion">{{ item.value }}</div>
-                                <div class="administrativeS">{{ item.name }}</div>
-                            </div>
-                        </div>
-                        <!-- <div class="RICBTCBoxTwo"></div> -->
+                <div class="proportion">{{ item.value }}</div>
+                <div class="administrativeS">{{ item.name }}</div>
+              </div>
+            </div>
+            <!-- <div class="RICBTCBoxTwo"></div> -->
+          </div>
+        </div>
+        <div class="leftOneBox">
+          <div class="leftOBTitle">风险预警</div>
+          <el-scrollbar height="calc(100% - 40px)">
+            <div class="leftOBContent">
+              <div class="HTB_CB_List">
+                <div class="HTBCBL_table" v-for="(itemss, index) in ssyjList" :key="index"
+                     :style="{ backgroundImage: 'url(' + itemss.img + ')' }">
+                  <div class="HTBTCL_data">
+                    <div class="HTBTCLD_text"
+                         :style="{ color: itemss.state == 0 ? '#FF0000' : itemss.state == 1 ? '#D9AF36' : '', }">
+                      {{ itemss.name }}
                     </div>
+                  </div>
+                  <div class="HTBTCL_time">
+                    <div>
+                      {{ itemss.time }}
+                    </div>
+                  </div>
                 </div>
-                <div class="leftOneBox">
-                    <div class="leftOBTitle">风险预警</div>
-                    <el-scrollbar height="calc(100% - 40px)">
-                        <div class="leftOBContent">
-                            <div class="HTB_CB_List">
-                                <div class="HTBCBL_table" v-for="(itemss, index) in ssyjList" :key="index"
-                                    :style="{ backgroundImage: 'url(' + itemss.img + ')' }">
-                                    <div class="HTBTCL_data">
-                                        <div class="HTBTCLD_text"
-                                            :style="{ color: itemss.state == 0 ? '#FF0000' : itemss.state == 1 ? '#D9AF36' : '', }">
-                                            {{ itemss.name }}
-                                        </div>
-                                    </div>
-                                    <div class="HTBTCL_time">
-                                        <div>
-                                            {{ itemss.time }}
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                            <!-- <baseEcharts></baseEcharts> -->
-                        </div>
-                    </el-scrollbar>
-                </div>
+              </div>
+              <!-- <baseEcharts></baseEcharts> -->
             </div>
+          </el-scrollbar>
         </div>
+      </div>
     </div>
+  </div>
 </template>
-  
+
 <script setup>
-import { ref, onMounted, computed } from 'vue';
+import one from '@/assets/visualizationimg/one.png';
+import two from '@/assets/visualizationimg/two.png';
+import three from '@/assets/visualizationimg/three.png';
+import four from '@/assets/visualizationimg/four.png';
+import five from '@/assets/visualizationimg/five.png';
+import six from '@/assets/visualizationimg/six.png';
+import seven from '@/assets/visualizationimg/seven.png';
+import eight from '@/assets/visualizationimg/eight.png';
+import nine from '@/assets/visualizationimg/nine.png';
+import ten from '@/assets/visualizationimg/ten.png';
+import {ref, onMounted, computed, reactive} from 'vue';
 import baseEcharts from '@/components/baseEcharts/index.vue'
 import PieEcharts from '@/components/baseEcharts/pieChart.vue'
+import sumUsingNumberOne from '@/assets/visualizationimg/onepick.png';
+import sumUsingNumberTwo from '@/assets/visualizationimg/twopack.png';
+import sumUsingNumberthree from '@/assets/visualizationimg/threepick.png';
 import {
-    getClassificationValueData
-    , getLngLatValueData
-    , getCreditScoreList
-    , getTrossDomesticProduct
-    , getTopTenTaxation
-    , getXiaoxiangCaiyinLoan
-    , getTechnologyLoan
-    , getHuiyuanLoan
-    , getNumberOfEnterprises
-    , getListedCompanies
-    , getHighTechEnterprises
-    , getTechnologySmallAndmediumSizedEnterprises
-    , getPatentInformation
-    , getAdministrativeSanction
-    , getAdministrativeEnforcement
-    , getBusinessAdnormalities
-    , getDishonestDebtor
-    , getSocialSecurity
-} from '@/api/visualization/index'
+  getClassificationValueData
+  , getLngLatValueData
+  , getCreditScoreList
+  , getTrossDomesticProduct
+  , getTopTenTaxation
+  , getXiaoxiangCaiyinLoan
+  , getTechnologyLoan
+  , getHuiyuanLoan
+  , getNumberOfEnterprises
+  , getListedCompanies
+  , getHighTechEnterprises
+  , getTechnologySmallAndmediumSizedEnterprises
+  , getPatentInformation
+  , getAdministrativeSanction
+  , getAdministrativeEnforcement
+  , getBusinessAdnormalities
+  , getDishonestDebtor
+  , getSocialSecurity, getTaxes
+} from '@/api/visualization'
+
+import parkOne from '@/assets/visualizationimg/parkOne.png';
+import parktwo from '@/assets/visualizationimg/parktwo.png';
+import parkthree from '@/assets/visualizationimg/parkthree.png';
+import parkfour from '@/assets/visualizationimg/parkfour.png';
+import parkfive from '@/assets/visualizationimg/parkfive.png';
+import parksix from '@/assets/visualizationimg/parksix.png';
+import gaojingkuang from '@/assets/visualizationimg/gaojingkuang.png';
+import zhuyikuang from '@/assets/visualizationimg/zhuyikuang.png';
+import {onBeforeUnmount} from 'vue';
+import {getLastQuarterYoY2} from '@/api/buscmonitoring';
 
 const mapContainer = ref(null);
 let map = null;
 let marker = null
+const companyNumber = ref();
 
 const data = reactive({
-    form: {},
-    queryParams: {
-        pageNum: 1,
-        pageSize: 100000,
-        unifiedSocialCreditCode: '',
-        condition: "",
-        grade: null,
-        total: null
-    },
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 100000,
+    unifiedSocialCreditCode: '',
+    condition: "",
+    grade: null,
+    total: null
+  },
+})
+const {queryParams} = toRefs(data)
+const getCurrentQuarter = () => {
+  const month = new Date().getMonth() + 1;
+  return Math.ceil(month / 3);
+};
+const specialQuarter = computed(() => {
+  let a = getCurrentQuarter()-2;
+  if(a == 0){
+    a = 4
+  }else if(a == -1){
+    a = 3
+  }
+  return a;
 })
-const { queryParams } = toRefs(data)
+const RanKingData = ref([]);
+const rankImgIconArr = [one, two, three, four, five, six, seven, eight, nine, ten];
+const getTaxTop10 = async () => {
+  const res = await getLastQuarterYoY2(specialQuarter.value);
+  console.log(res,7777);
+  if (res.code == 200) {
+    res.data = res.data.slice(0, 10);
+    res.data.forEach(w => w.lastQuarterCurrentTotal = (w.lastQuarterCurrentTotal / 10000).toFixed(2));
+    res.data.sort((a, b) => b.lastQuarterCurrentTotal - a.lastQuarterCurrentTotal)
+    RanKingData.value = res.data.map((q, index) => ({
+      name: q.enterpriseName,
+      value: q.lastQuarterCurrentTotal,
+      mig: rankImgIconArr[index]
+    }))
+  }
+}
+getTaxTop10();
 
-const RanKingData = [{
-    name: '湖南正清制药集团股份有限公司',
-    value: '6506.4',
-    mig: one
-}, {
-    name: '怀化金弘再生资源有限公司',
-    value: '5835.6',
-    mig: two
-}, {
-    name: '湖南骏泰新材料科技有限责任公司',
-    value: '5581.5',
-    mig: three
-}, {
-    name: '金升阳(怀化)科技有限公司',
-    value: '5276.0',
-    mig: four
-}, {
-    name: '怀化恒枫饮料有限公司',
-    value: '4000',
-    mig: five
-}, {
-    name: '湖南诚路管业科技有限公司',
-    value: '2417.3',
-    mig: six
-}, {
-    name: '湖南红宝科技开发有限公司',
-    value: '158.6',
-    mig: seven
-}, {
-    name: '湖南乔伟生态科技新材料股份有限公司',
-    value: '562.2',
-    mig: eight
-}, {
-    name: '湖南昱烯瓴新材料有限公司',
-    value: '525.7',
-    mig: nine
-}, {
-    name: '湖南千源铝业有限公司',
-    value: '378.9',
-    mig: ten
-}]
 const gradationMun = [{
-    name: "3A级企业",
-    state: 3,
-    type: 'AAA'
+  name: "3A级企业",
+  state: 3,
+  type: 'AAA'
 }, {
-    name: "2A级企业",
-    state: 2,
-    type: 'AA'
+  name: "2A级企业",
+  state: 2,
+  type: 'AA'
 }, {
-    name: "1A级企业",
-    state: 1,
-    type: 'A'
+  name: "1A级企业",
+  state: 1,
+  type: 'A'
 }, {
-    name: "B级企业",
-    state: 4,
-    type: 'B'
+  name: "B级企业",
+  state: 4,
+  type: 'B'
 }, {
-    name: "C级企业",
-    state: 5,
-    type: 'C'
+  name: "C级企业",
+  state: 5,
+  type: 'C'
 }, {
-    name: "D级企业",
-    state: 6,
-    type: 'D'
+  name: "D级企业",
+  state: 6,
+  type: 'D'
 }, {
-    name: "全部企业",
-    state: 0,
-    type: ''
+  name: "全部企业",
+  state: 0,
+  type: ''
 }]
 const activeTab = ref(6); // 默认激活第一个tab  
 // const resultArray = ref;
 
 onMounted(async () => {
-    // 初始化地图
-    map = new BMapGL.Map(mapContainer.value);
-    var point = new BMapGL.Point(109.94211746215822, 27.377939585109653);
-    map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别
-    map.enableScrollWheelZoom(true);
-    map.setMinZoom(15);
-    map.setMaxZoom(19);
-    map.setMapStyleV2({
-        styleId: '62ce43ad2a1362c23e612b783d7406e7'
-    });
-    map.setTilt(50);
-    map.disableInertialDragging();
-
-    // 定义允许的拖拽范围
-    const allowedBounds = new BMapGL.Bounds(
-        new BMapGL.Point(109.90207672119142, 27.365250190931242), // 西南角
-        new BMapGL.Point(109.97014045715333, 27.422461872492594)  // 东北角
-    );
-
-    // 监听拖拽结束事件
-    map.addEventListener('dragend', function () {
-        // 获取当前地图的中心点
-        const center = map.getCenter();
-        // 检查中心点是否在允许的范围内
-        if (!allowedBounds.containsPoint(center)) {
-            // 如果不在范围内,将地图中心调整回允许范围的中心点
-            const adjustCenter = allowedBounds.getCenter();
-            map.panTo(adjustCenter);
-        }
-    });
-    // 导入JSON文件
-    try {
-        var path = [];
-        // await Promise.all(
-        // 假设你有一个json文件,里面包含了管辖区域的边界数据
-        fetch('jwdata.json').then(response => response.json()).then(data => {
-            var points = data
-            for (var j = 0; j < points.length; j++) {
-                var lng = points[j].split(',')[0];
-                var lat = points[j].split(',')[1];
-                path.push(new BMapGL.Point(lng, lat));
-            }
-
-            var prism = new BMapGL.Prism(path, 10, {
-                topFillColor: '#5679ea',
-                topFillOpacity: 0.5,
-                sideFillColor: '#5679ea',
-                sideFillOpacity: 0.5
-            });
-            map.addOverlay(prism);
-        })
-
-    } catch (error) {
-        console.error('Error loading JSON data:', error);
+  // 初始化地图
+  map = new BMapGL.Map(mapContainer.value);
+  var point = new BMapGL.Point(109.94211746215822, 27.377939585109653);
+  map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别
+  map.enableScrollWheelZoom(true);
+  map.setMinZoom(15);
+  map.setMaxZoom(19);
+  map.setMapStyleV2({
+    styleId: '62ce43ad2a1362c23e612b783d7406e7'
+  });
+  map.setTilt(50);
+  map.disableInertialDragging();
+
+  // 定义允许的拖拽范围
+  const allowedBounds = new BMapGL.Bounds(
+      new BMapGL.Point(109.90207672119142, 27.365250190931242), // 西南角
+      new BMapGL.Point(109.97014045715333, 27.422461872492594)  // 东北角
+  );
+
+  // 监听拖拽结束事件
+  map.addEventListener('dragend', function () {
+    // 获取当前地图的中心点
+    const center = map.getCenter();
+    // 检查中心点是否在允许的范围内
+    if (!allowedBounds.containsPoint(center)) {
+      // 如果不在范围内,将地图中心调整回允许范围的中心点
+      const adjustCenter = allowedBounds.getCenter();
+      map.panTo(adjustCenter);
     }
+  });
+  // 导入JSON文件
+  try {
+    var path = [];
+    // await Promise.all(
+    // 假设你有一个json文件,里面包含了管辖区域的边界数据
+    fetch('jwdata.json').then(response => response.json()).then(data => {
+      var points = data
+      for (var j = 0; j < points.length; j++) {
+        var lng = points[j].split(',')[0];
+        var lat = points[j].split(',')[1];
+        path.push(new BMapGL.Point(lng, lat));
+      }
+
+      var prism = new BMapGL.Prism(path, 10, {
+        topFillColor: '#5679ea',
+        topFillOpacity: 0.5,
+        sideFillColor: '#5679ea',
+        sideFillOpacity: 0.5
+      });
+      map.addOverlay(prism);
+    })
+
+  } catch (error) {
+    // console.error('Error loading JSON data:', error);
+  }
 });
 
 // );
 /** 查询用户列表 */
 function getClassificationList() {
-    getLngLatValueData(queryParams.value).then((res) => {
-        const LNgLatData = res.data;
-        // console.log("外层", res.data)
-        getclassData(LNgLatData)
-    })
+  getLngLatValueData(queryParams.value).then((res) => {
+    const LNgLatData = res.data;
+    // console.log("外层", res.data)
+    getclassData(LNgLatData)
+  })
 }
+
 function getclassData(lngLat) {
 
-    getClassificationValueData(queryParams.value).then((res) => {
-        const array1 = lngLat;
-        const array2 = res.data.result;
+  getClassificationValueData(queryParams.value).then((res) => {
+    const array1 = lngLat;
+    const array2 = res.data.result;
 
-        const mergedData = {};
-        array1.forEach(item => {
-            mergedData[item.unifiedSocialCreditCode] = { ...item };
-        });
-        array2.forEach(item => {
-            if (mergedData[item.unifiedSocialCreditCode]) {
-                mergedData[item.unifiedSocialCreditCode] = { ...mergedData[item.unifiedSocialCreditCode], ...item };
-            } else {
-                mergedData[item.unifiedSocialCreditCode] = { ...item };
-            }
+    const mergedData = {};
+    array1.forEach(item => {
+      mergedData[item.unifiedSocialCreditCode] = {...item};
+    });
+    array2.forEach(item => {
+      if (mergedData[item.unifiedSocialCreditCode]) {
+        mergedData[item.unifiedSocialCreditCode] = {...mergedData[item.unifiedSocialCreditCode], ...item};
+      } else {
+        mergedData[item.unifiedSocialCreditCode] = {...item};
+      }
+    });
+    const resultArray = Object.values(mergedData);
+
+    resultArray.forEach(item => {
+      if (item.grade) {
+        const markers = new BMapGL.Point(item.longitude, item.latitude)
+        marker = new BMapGL.Marker(markers)
+        map.addOverlay(marker);
+        // 创建信息窗口
+        var opts = {
+          width: 300,
+          // height: 100,
+          title: item.enterpriseName
+        };
+        var infoWindow = new BMapGL.InfoWindow("等级:" + item.grade + "<br/>"
+            + "统一信用代码:" + item.unifiedSocialCreditCode + "<br/>"
+            + "总分:" + item.total + "<br/>"
+            + "负责人:" + item.enterpriseLeader + "<br/>"
+            + "联系方式:" + item.contactPhone, opts);
+        // 点标记添加点击事件
+        marker.addEventListener('click', function () {
+          map.openInfoWindow(infoWindow, markers); // 开启信息窗口
         });
-        const resultArray = Object.values(mergedData);
-
-        resultArray.forEach(item => {
-            if (item.grade) {
-                const markers = new BMapGL.Point(item.longitude, item.latitude)
-                marker = new BMapGL.Marker(markers)
-                map.addOverlay(marker);
-                // 创建信息窗口
-                var opts = {
-                    width: 300,
-                    // height: 100,
-                    title: item.enterpriseName
-                };
-                var infoWindow = new BMapGL.InfoWindow("等级:" + item.grade + "<br/>"
-                    + "统一信用代码:" + item.unifiedSocialCreditCode + "<br/>"
-                    + "总分:" + item.total + "<br/>"
-                    + "负责人:" + item.enterpriseLeader + "<br/>"
-                    + "联系方式:" + item.contactPhone, opts);
-                // 点标记添加点击事件
-                marker.addEventListener('click', function () {
-                    map.openInfoWindow(infoWindow, markers); // 开启信息窗口
-                });
-            }
-        })
+      }
     })
+  })
 }
+
 const setActiveTab = (index, value) => {
-    //获取地图上所有的覆盖物
-    var allOverlay = map.getOverlays();
-    for (var i = 0; i < allOverlay.length; i++) {
-        console.log(11, allOverlay[i].toString())
-        if (allOverlay[i].toString() == "Marker") {
-            map.removeOverlay(allOverlay[i]);
-        }
+  //获取地图上所有的覆盖物
+  var allOverlay = map.getOverlays();
+  for (var i = 0; i < allOverlay.length; i++) {
+    // console.log(11, allOverlay[i].toString())
+    if (allOverlay[i].toString() == "Marker") {
+      map.removeOverlay(allOverlay[i]);
     }
-    queryParams.value.condition = value.type;
-    getClassificationList();
-    activeTab.value = index;
+  }
+  queryParams.value.condition = value.type;
+  getClassificationList();
+  activeTab.value = index;
 };
 getClassificationList()
 
 
 /** 查询评价分析 */
 const PieChartData = ref([]);
-function obtainCreditScoreList() {
-    getCreditScoreList(queryParams.value).then((res) => {
-        const state1Array = [];
-        const state2Array = [];
-        const state3Array = [];
-        const state4Array = [];
-        const state5Array = [];
-        const state6Array = [];
-        res.data.result.forEach(item => {
-            if (item.grade === 'AAA') {
-                state1Array.push(item);
-            } else if (item.grade === 'AA') {
-                state2Array.push(item);
-            } else if (item.grade === 'A') {
-                state3Array.push(item);
-            } else if (item.grade === 'B') {
-                state4Array.push(item);
-            } else if (item.grade === 'C') {
-                state5Array.push(item);
-            } else if (item.grade === 'D') {
-                state6Array.push(item);
-            }
 
-            PieChartData.value = [
-                { value: state1Array.length, name: 'AAA' },
-                { value: state2Array.length, name: 'AA' },
-                { value: state3Array.length, name: 'A' },
-                { value: state4Array.length, name: 'B' },
-                { value: state5Array.length, name: 'C' },
-                { value: state6Array.length, name: 'D' },
-            ]
-        });
-    })
+function obtainCreditScoreList() {
+  getCreditScoreList(queryParams.value).then((res) => {
+    const state1Array = [];
+    const state2Array = [];
+    const state3Array = [];
+    const state4Array = [];
+    const state5Array = [];
+    const state6Array = [];
+    res.data.result.forEach(item => {
+      if (item.grade === 'AAA') {
+        state1Array.push(item);
+      } else if (item.grade === 'AA') {
+        state2Array.push(item);
+      } else if (item.grade === 'A') {
+        state3Array.push(item);
+      } else if (item.grade === 'B') {
+        state4Array.push(item);
+      } else if (item.grade === 'C') {
+        state5Array.push(item);
+      } else if (item.grade === 'D') {
+        state6Array.push(item);
+      }
+
+      PieChartData.value = [
+        {value: state1Array.length, name: 'AAA'},
+        {value: state2Array.length, name: 'AA'},
+        {value: state3Array.length, name: 'A'},
+        {value: state4Array.length, name: 'B'},
+        {value: state5Array.length, name: 'C'},
+        {value: state6Array.length, name: 'D'},
+      ]
+    });
+  })
 }
 
 /** 查询产值 */
@@ -430,765 +455,993 @@ const currentDate = ref(new Date());//获取季度值
 
 //当前季度
 const currentQuarter = computed(() => {
-    const month = currentDate.value.getMonth();
-    return Math.floor(month / 3) + 1;
+  const month = currentDate.value.getMonth();
+  return Math.floor(month / 3) + 1;
 });
 //上一个季度
 const previousQuarter = computed(() => {
-    return currentQuarter.value <= 1 ? 4 : currentQuarter.value - 1;
+  return currentQuarter.value <= 1 ? 4 : currentQuarter.value - 1;
 });
 //当前年份
 const currentYear = computed(() => currentDate.value.getFullYear());
 // 上一年
 const lastYear = computed(() => currentDate.value.getFullYear() - 1);
 const quarterToAmountMap = {
-    '1': 'firstQuarterAmount',
-    '2': 'secondQuarterAmount',
-    '3': 'thirdQuarterAmount',
-    '4': 'fourthQuarterAmount'
+  '1': 'firstQuarterAmount',
+  '2': 'secondQuarterAmount',
+  '3': 'thirdQuarterAmount',
+  '4': 'fourthQuarterAmount'
 };
+
 function obtaingetTrossDomesticProduct() {
-    getTrossDomesticProduct(queryParams.value).then((res) => {
-        const state2023Array = [];
-        const state2024Array = [];
-        const name = [];
-
-        res.forEach(item => {
-            if (item.annualAmount == lastYear.value) {
-                if (quarterToAmountMap.hasOwnProperty(previousQuarter.value)) {
-                    const amountProperty = quarterToAmountMap[previousQuarter.value];
-                    state2023Array.push(item[amountProperty]);
-                } else {
-                    console.error(`Invalid quarter: ${previousQuarter.value}`);
-                }
-                name.push(item.enterpriseName)
-            } else if (item.annualAmount == currentYear.value) {
-                if (quarterToAmountMap.hasOwnProperty(previousQuarter.value)) {
-                    const amountProperty = quarterToAmountMap[previousQuarter.value];
-                    state2024Array.push(item[amountProperty]);
-                } else {
-                    console.error(`Invalid quarter: ${previousQuarter.value}`);
-                }
-            }
-            NamechartData.value = name
-            ArrOneData.value = state2023Array
-            ArrTwoData.value = state2024Array
-        })
-        // console.log(state2023Array,state2024Array)
-    })
+  getTrossDomesticProduct(queryParams.value).then((res) => {
+    const state2023Array = res.reduce((container, item)=>{
+      if(item.annualAmount == lastYear.value){
+        container[0] += item.firstQuarterAmount*1;
+        container[1] += item.secondQuarterAmount*1;
+        container[2] += item.thirdQuarterAmount*1;
+        container[3] += item.fourthQuarterAmount*1;
+        container[4] = container[0] + container[1] + container[2] + container[3];
+      }
+      return container;
+    },[0,0,0,0,0])
+    const state2024Array = res.reduce((container, item)=>{
+      if(item.annualAmount == currentYear.value){
+        container[0] += item.firstQuarterAmount*1;
+        container[1] += item.secondQuarterAmount*1;
+        container[2] += item.thirdQuarterAmount*1;
+        container[3] += item.fourthQuarterAmount*1;
+        container[4] = container[0] + container[1] + container[2] + container[3];
+      }
+      return container;
+    },[0,0,0,0,0])
+    const name = ['第一季度', '第二季度', '第三季度', '第四季度','年度'];
+    NamechartData.value = name;
+    ArrOneData.value = state2023Array.map(q=>q.toFixed(2))
+    ArrTwoData.value = state2024Array.map(q=>q.toFixed(2))
+    // res.forEach(item => {
+    //   if (item.annualAmount == lastYear.value) {
+    //     if (quarterToAmountMap.hasOwnProperty(previousQuarter.value)) {
+    //       const amountProperty = quarterToAmountMap[previousQuarter.value];
+    //       state2023Array.push(item[amountProperty]);
+    //     } else {
+    //       // console.error(`Invalid quarter: ${previousQuarter.value}`);
+    //     }
+    //     name.push(item.enterpriseName)
+    //   } else if (item.annualAmount == currentYear.value) {
+    //     if (quarterToAmountMap.hasOwnProperty(previousQuarter.value)) {
+    //       const amountProperty = quarterToAmountMap[previousQuarter.value];
+    //       state2024Array.push(item[amountProperty]);
+    //     } else {
+    //       // console.error(`Invalid quarter: ${previousQuarter.value}`);
+    //     }
+    //   }
+    //   NamechartData.value = name
+    //   ArrOneData.value = state2023Array
+    //   ArrTwoData.value = state2024Array
+    // })
+    // console.log(state2023Array,state2024Array)
+  })
 }
 
-import one from '@/assets/visualizationimg/one.png';
-import two from '@/assets/visualizationimg/two.png';
-import three from '@/assets/visualizationimg/three.png';
-import four from '@/assets/visualizationimg/four.png';
-import five from '@/assets/visualizationimg/five.png';
-import six from '@/assets/visualizationimg/six.png';
-import seven from '@/assets/visualizationimg/seven.png';
-import eight from '@/assets/visualizationimg/eight.png';
-import nine from '@/assets/visualizationimg/nine.png';
-import ten from '@/assets/visualizationimg/ten.png';
+
 const RanKingDatas = ref([])
+
 /** 查询纳税Top10 */
 function obtaingetTopTenTaxation() {
-    getTopTenTaxation(queryParams.value).then((res) => {
-        if (quarterToAmountMap.hasOwnProperty(previousQuarter.value)) {
-            const amountProperty = quarterToAmountMap[previousQuarter.value];
-
-            const sortedItems = computed(() => {
-                return [...res].sort((a, b) => b[amountProperty] - a[amountProperty]);
-            });
-            for(var i = 0;i < 10; i++){
-                RanKingDatas.value.push({
-                    name:sortedItems.value[i].enterpriseName,
-                    value:sortedItems.value[i].amountProperty
-                })
-            }
-            console.log("查询纳税Top10:", sortedItems,RanKingDatas)
+  getTopTenTaxation(queryParams.value).then((res) => {
+    if (quarterToAmountMap.hasOwnProperty(previousQuarter.value)) {
+      const amountProperty = quarterToAmountMap[previousQuarter.value];
+
+      const sortedItems = computed(() => {
+        return [...res].sort((a, b) => b[amountProperty] - a[amountProperty]);
+      });
+      for (var i = 0; i < 10; i++) {
+        RanKingDatas.value.push({
+          name: sortedItems.value[i].enterpriseName,
+          value: sortedItems.value[i].amountProperty
+        })
+      }
+      // console.log("查询纳税Top10:", sortedItems, RanKingDatas)
 
-        } else {
-            console.error(`Invalid quarter: ${previousQuarter.value}`);
-        }
-    })
+    } else {
+      // console.error(`Invalid quarter: ${previousQuarter.value}`);
+    }
+  })
 }
 
-import sumUsingNumberOne from '@/assets/visualizationimg/onepick.png';
-import sumUsingNumberTwo from '@/assets/visualizationimg/twopack.png';
-import sumUsingNumberthree from '@/assets/visualizationimg/threepick.png';
 
 const sumUsingNumber = [
-    {
-        sum: '0',
-        name: '潇湘财银贷',
-        img: sumUsingNumberOne,
-        number: ''
-    }, {
-        sum: '0',
-        name: '科技贷',
-        img: sumUsingNumberTwo,
-        number: ''
-    }, {
-        sum: '0',
-        name: '惠园贷',
-        img: sumUsingNumberthree,
-        number: ''
-    }
+  {
+    sum: '0',
+    name: '潇湘财银贷',
+    img: sumUsingNumberOne,
+    number: ''
+  }, {
+    sum: '0',
+    name: '科技贷',
+    img: sumUsingNumberTwo,
+    number: ''
+  }, {
+    sum: '0',
+    name: '惠园贷',
+    img: sumUsingNumberthree,
+    number: ''
+  }
 ];
+
 /** 查询潇湘财银贷 */
 function obtaingetXiaoxiangCaiyinLoan() {
-    getXiaoxiangCaiyinLoan(queryParams.value).then((res) => {
-        const state1Array = [];
-        res.data.forEach(item => {
-            state1Array.push(item.currentLoanBalance);
-        })
-        console.log("xxdd", res)
-
-        // const sum = state1Array.reduce((accumulator, currentValue) => {
-        //     return accumulator + Number(currentValue);
-        // }, 0);
-        sumUsingNumber[0].sum = 7305;
-        sumUsingNumber[0].number = state1Array.length;
+  getXiaoxiangCaiyinLoan(queryParams.value).then((res) => {
+    const state1Array = [];
+    res.data.forEach(item => {
+      state1Array.push(item.currentLoanBalance);
     })
+    // console.log("xxdd", res)
+
+    // const sum = state1Array.reduce((accumulator, currentValue) => {
+    //     return accumulator + Number(currentValue);
+    // }, 0);
+    sumUsingNumber[0].sum = 7305;
+    sumUsingNumber[0].number = state1Array.length;
+  })
 }
+
 /** 查询评科技贷: */
 function obtaingetTechnologyLoan() {
-    getTechnologyLoan(queryParams.value).then((res) => {
-        const state1Array = [];
-        res.forEach(item => {
-            state1Array.push(item.loanAmount);
-        })
-        const sum = state1Array.reduce((accumulator, currentValue) => {
-            return accumulator + Number(currentValue);
-        }, 0);
-        sumUsingNumber[1].sum = sum;
-        sumUsingNumber[1].number = state1Array.length;
-
+  getTechnologyLoan(queryParams.value).then((res) => {
+    const state1Array = [];
+    res.forEach(item => {
+      state1Array.push(item.loanAmount);
     })
+    const sum = state1Array.reduce((accumulator, currentValue) => {
+      return accumulator + Number(currentValue);
+    }, 0);
+    sumUsingNumber[1].sum = sum;
+    sumUsingNumber[1].number = state1Array.length;
+
+  })
 }
+
 /** 惠园贷: */
 function obtaingetHuiyuanLoan() {
-    getHuiyuanLoan(queryParams.value).then((res) => {
-        const state1Array = [];
-        res.forEach(item => {
-            state1Array.push(item.loanAmount);
-        })
-        const sum = state1Array.reduce((accumulator, currentValue) => {
-            return accumulator + Number(currentValue);
-        }, 0);
-        sumUsingNumber[2].sum = sum;
-        sumUsingNumber[2].number = state1Array.length;
-
+  getHuiyuanLoan(queryParams.value).then((res) => {
+    const state1Array = [];
+    res.forEach(item => {
+      state1Array.push(item.loanAmount);
     })
+    const sum = state1Array.reduce((accumulator, currentValue) => {
+      return accumulator + Number(currentValue);
+    }, 0);
+    sumUsingNumber[2].sum = sum;
+    sumUsingNumber[2].number = state1Array.length;
+
+  })
 }
 
 
 const business = [{
-    title: '园区纳税企业',
-    value: 96,
-    ratio: '80.67%',
-    state: 1,
-    img: parkOne
+  title: '园区纳税企业',
+  value: 96,
+  ratio: '80.67%',
+  state: 1,
+  img: parkOne
 }, {
-    title: '园区缴纳社保企业',
-    value: '',
-    ratio: '',
-    state: 0,
-    img: parktwo
+  title: '园区缴纳社保企业',
+  value: '',
+  ratio: '',
+  state: 0,
+  img: parktwo
 }]
+
 /** 查询社保 */
 function obtaingetSocialSecurity() {
-    getSocialSecurity(queryParams.value).then((res) => {
-        business[1].value = res.data.length;
-        business[1].ratio = (res.data.length / 119 * 100).toFixed(2) + '%';
-    })
+  getSocialSecurity(queryParams.value).then((res) => {
+    res.data = res.data.filter(q=>q.remarks.includes(currentYear.value-1));
+    business[1].value = res.data.length;
+    business[1].ratio = (res.data.length / companyNumber.value * 100).toFixed(2) + '%';
+  })
+  getTaxes().then((res) => {
+    let result;
+    let a;
+    if(res){
+      a = res.filter(q=>{
+        return  q.annualAmount == currentYear.value-1
+      })
+      if(a.length>0){
+        result = a.length/companyNumber.value*100;
+      }
+    }
+    business[0].value = a.length
+    business[0].ratio = result.toFixed(2)+'%'
+  })
 }
 
-import parkOne from '@/assets/visualizationimg/parkOne.png';
-import parktwo from '@/assets/visualizationimg/parktwo.png';
-import parkthree from '@/assets/visualizationimg/parkthree.png';
-import parkfour from '@/assets/visualizationimg/parkfour.png';
-import parkfive from '@/assets/visualizationimg/parkfive.png';
-import parksix from '@/assets/visualizationimg/parksix.png';
 
 const parkData = ref([{
-    title: '占地面积',
-    value: 14070 + '亩',
-    img: parksix
-}, {
-    title: '入驻企业',
-    value: '',
-    img: ''
+  title: "(平方公里)<br>占地面积",
+  value: '11.83',
+  img: parksix
 }])
+
 /** 查询入驻企业、企业数量 */
-function obtaingetNumberOfEnterprises() {
-    getNumberOfEnterprises(queryParams.value).then((res) => {
-        // const ObjectValue = {
-        //     title: '入驻企业',
-        //     value: res.data.length,
-        //     img: parkOne
-        // }
-        parkData.value[1] = {
-            title: '入驻企业',
-            value: res.data.length,
-            img: parkOne
-        }
-    })
+const obtaingetNumberOfEnterprises = async () => {
+  const res = await getNumberOfEnterprises(queryParams.value);
+  parkData.value.push({
+    title: '入驻企业',
+    // todo 暂时先写死
+    // value: res.data.length,
+    value: 121,
+    img: parkOne
+  })
+  // todo 暂时先写死
+  companyNumber.value = 121;
+  // companyNumber.value = res.data.length;
 }
+
 /** 查询上市企业 */
 function obtaingetListedCompanies() {
-    getListedCompanies(queryParams.value).then((res) => {
-        const ObjectValue = {
-            title: '上市企业',
-            value: res.length,
-            img: parktwo
-        }
-        parkData.value.push(ObjectValue)
-    })
+  getListedCompanies('规上').then((res) => {
+    res.data = [...new Set(res.data.map(item => item.enterpriseName))]
+        .map(name => res.data.find(item => item.enterpriseName === name))
+    const ObjectValue = {
+      title: '规上工业<br>企业数量',
+      value: res.data.length,
+      img: parktwo
+    }
+    parkData.value.push(ObjectValue)
+  })
 }
+
 /** 查询高新技术企业 */
 function obtaingetHighTechEnterprises() {
-    getHighTechEnterprises(queryParams.value).then((res) => {
-        const ObjectValue = {
-            title: '高新技术企业',
-            value: res.data.length,
-            img: parkthree
-        }
-        parkData.value.push(ObjectValue)
-    })
+  getHighTechEnterprises(queryParams.value).then((res) => {
+    const ObjectValue = {
+      title: '高新技术企业',
+      value: res.data.length,
+      img: parkthree
+    }
+    parkData.value.push(ObjectValue)
+  })
 }
+
 /** 查询科技中小型企业 */
 function obtaingetTechnologySmallAndmediumSizedEnterprises() {
-    getTechnologySmallAndmediumSizedEnterprises(queryParams.value).then((res) => {
-        const ObjectValue = {
-            title: '科技型中小企业',
-            value: res.data.length,
-            img: parkfour
-        }
-        parkData.value.push(ObjectValue)
-    })
+  getTechnologySmallAndmediumSizedEnterprises(queryParams.value).then((res) => {
+    const ObjectValue = {
+      title: '科技型中小企业',
+      value: res.data.length,
+      img: parkfour
+    }
+    parkData.value.push(ObjectValue)
+  })
 }
+
 /** 查询专利信息 */
 function obtaingetPatentInformation() {
-    getPatentInformation(queryParams.value).then((res) => {
-        const ObjectValue = {
-            title: '园区企业专利数',
-            value: res.data.length,
-            img: parkfive
-        }
-        parkData.value.push(ObjectValue)
-    })
+  getPatentInformation(queryParams.value).then((res) => {
+    const ObjectValue = {
+      title: '园区企业专利数',
+      value: res.data.length,
+      img: parkfive
+    }
+    parkData.value.push(ObjectValue)
+  })
 }
 
 const hyhgData = ref([])
+
 /** 查询行业合规 */
 function obtaingetAdministrativeSanction() {
-    getAdministrativeSanction(queryParams.value).then((res) => {
-        hyhgData.value = [{
-            name: '企业数量',
-            value: 119
-        }, {
-            name: '行政处罚',
-            value: (res.data.length / 119).toFixed(2) * 100 + '%'
-        }, {
-            name: '被处罚企业数',
-            value: res.data.length
-        }, {
-            name: '行政处罚条数',
-            value: res.data.length
-        }]
-        // 企业数量 被处罚企业数  行政处罚条数
-    })
+  getAdministrativeSanction(queryParams.value).then((res) => {
+    hyhgData.value = [{
+      name: '企业数量',
+      value: companyNumber.value
+    }, {
+      name: '行政处罚',
+      value: ([...new Set(res.data)].length / companyNumber.value).toFixed(2) * 100 + '%'
+    }, {
+      name: '被处罚企业数',
+      value: [...new Set(res.data)].length
+    }, {
+      name: '行政处罚条数',
+      value: res.data.length
+    }]
+    // 企业数量 被处罚企业数  行政处罚条数
+  })
 }
+
 const xzqzzxData = ref([])
 
 /** 查询行政强制执行 */
 function obtaingetAdministrativeEnforcement() {
-    getAdministrativeEnforcement(queryParams.value).then((res) => {
-        xzqzzxData.value = [{
-            name: '企业数量',
-            value: 119
-        }, {
-            name: '行政强制执行',
-            value: (res.data.length / 119).toFixed(2) * 100 + '%'
-        }, {
-            name: '被处罚企业数',
-            value: res.data.length
-        }, {
-            name: '行政处罚条数',
-            value: res.data.length
-        }]
-    })
+  getAdministrativeEnforcement(queryParams.value).then((res) => {
+    xzqzzxData.value = [{
+      name: '企业数量',
+      value: companyNumber.value
+    }, {
+      name: '行政强制执行',
+      value: ([...new Set(res.data.map(item => item.unifiedSocialCreditCode))]
+          .map(code => res.data.find(item => item.unifiedSocialCreditCode === code)).length / companyNumber.value).toFixed(2) * 100 + '%'
+    }, {
+      name: '被执行企业数',
+      value: [...new Set(res.data.map(item => item.unifiedSocialCreditCode))]
+          .map(code => res.data.find(item => item.unifiedSocialCreditCode === code)).length
+    }, {
+      name: '行政执行条数',
+      value: res.data.length
+    }]
+  })
 }
 
-import gaojingkuang from '@/assets/visualizationimg/gaojingkuang.png';
-import zhuyikuang from '@/assets/visualizationimg/zhuyikuang.png';
-
 
 const ssyjList = ref([])
+
 /** 查询经营异常 */
 function obtaingetBusinessAdnormalities() {
-    getBusinessAdnormalities(queryParams.value).then((res) => {
-        console.log("查询经营异常:", res)
-        res.forEach(item => {
-            const ObjectValue = {
-                name: item.enterpriseName,
-                time: '经营异常',
-                state: 0,
-                img: gaojingkuang
-            }
-            ssyjList.value.push(ObjectValue)
-        })
+  getBusinessAdnormalities(queryParams.value).then((res) => {
+    // console.log("查询经营异常:", res)
+    res.forEach(item => {
+      const ObjectValue = {
+        name: item.enterpriseName,
+        time: '经营异常',
+        state: 0,
+        img: gaojingkuang
+      }
+      ssyjList.value.push(ObjectValue)
     })
+  })
 }
+
 /** 查询失信被执行人 */
 function obtaingetDishonestDebtor() {
-    getDishonestDebtor(queryParams.value).then((res) => {
-        console.log("查询失信被执行人:", res)
-        res.forEach(item => {
-            const ObjectValue = {
-                name: item.enterpriseName,
-                time: '失信被执行人',
-                state: 1,
-                img: zhuyikuang
-            }
-            ssyjList.value.push(ObjectValue)
-        })
+  getDishonestDebtor(queryParams.value).then((res) => {
+    // console.log("查询失信被执行人:", res)
+    res.forEach(item => {
+      const ObjectValue = {
+        name: item.enterpriseName,
+        time: '失信被执行人',
+        state: 1,
+        img: zhuyikuang
+      }
+      ssyjList.value.push(ObjectValue)
     })
+  })
 }
 
-obtainCreditScoreList();
-obtaingetTrossDomesticProduct();
-obtaingetTopTenTaxation();
-// obtaingetXiaoxiangCaiyinLoan();
-// obtaingetTechnologyLoan();
-// obtaingetHuiyuanLoan();
-// obtaingetNumberOfEnterprises();
-// obtaingetListedCompanies();
-// obtaingetHighTechEnterprises();
-// obtaingetTechnologySmallAndmediumSizedEnterprises();
-// obtaingetPatentInformation();
-// obtaingetAdministrativeSanction();
-// obtaingetAdministrativeEnforcement();
-// obtaingetBusinessAdnormalities();
-// obtaingetDishonestDebtor();
-// obtaingetSocialSecurity();
+const init = async () => {
+  await obtaingetNumberOfEnterprises();
+  obtainCreditScoreList();
+  obtaingetTrossDomesticProduct();
+  obtaingetTopTenTaxation();
+  obtaingetXiaoxiangCaiyinLoan();
+  obtaingetTechnologyLoan();
+  obtaingetHuiyuanLoan();
+  obtaingetListedCompanies();
+  obtaingetHighTechEnterprises();
+  obtaingetTechnologySmallAndmediumSizedEnterprises();
+  obtaingetPatentInformation();
+  obtaingetAdministrativeSanction();
+  obtaingetAdministrativeEnforcement();
+  obtaingetBusinessAdnormalities();
+  obtaingetDishonestDebtor();
+  obtaingetSocialSecurity();
+}
+init();
 
 
 // 如果需要的话,在beforeUnmount中清理资源
-import { onBeforeUnmount } from 'vue';
+
 onBeforeUnmount(() => {
-    if (map) {
-        // 清理地图资源
-        map.dispose();
-        map = null;
-    }
+  if (map) {
+    // 清理地图资源
+    map.dispose();
+    map = null;
+  }
 });
 </script>
-  
+
 <style scoped lang="scss">
 .Vbox {
-    height: 100vh;
-    overflow: hidden;
+  height: 100vh;
+  overflow: hidden;
+
+  .head {
+    height: 120px;
+    top: 0;
+    width: 100%;
+    position: absolute;
+    z-index: 999;
+    // background-color: rgba($color: #0e2a41, $alpha: .5);
+
+    .VisTitle {
+      height: 60px;
+      background-image: url("../../assets/visualizationimg/title.png");
+    }
 
-    .head {
-        height: 120px;
-        top: 0;
-        width: 100%;
-        position: absolute;
-        z-index: 999;
-        // background-color: rgba($color: #0e2a41, $alpha: .5);
+    .Vgradation {
+      height: 60px;
+      width: 40vw;
+      margin-left: 30vw;
+      display: flex;
+      //justify-content: center;
+      align-items: center;
+
+      .tab {
+        width: 100px;
+        height: 40px;
+        margin: 0 10px;
+        text-align: center;
+        line-height: 40px;
+        color: white;
+        font-weight: 500;
+        font-size: 0.9vw;
+        background-image: url("../../assets/visualizationimg/headg.png");
+        background-size: 100% 100%;
+      }
+
+      .active {
+        background-image: url("../../assets/visualizationimg/headgactive.png");
+        background-size: 100% 100%;
+      }
+    }
+  }
+
+  .container {
+    height: 100%;
+    position: relative;
+
+    .left {
+      left: 20px;
+      float: left;
+      position: relative;
+      margin-left: -100%;
+      width: 26vw;
+      // background-color: rgba($color: #000000, $alpha: 0.2);
+      height: 100%;
+      top: 60px;
+      z-index: 999;
+
+      .rightParkBox {
+        height: 30%;
+        background-color: rgba($color: #000000, $alpha: .6);
+        margin-bottom: 14px;
+
+        .leftOBTitle,
+        .rightParkTtile,
+        .RICBTitle {
+          height: 40px;
+          color: white;
+          line-height: 40px;
+          padding-left: 60px;
+          font-weight: bold;
+          background-image: url("../../assets/visualizationimg/centertitle.png");
+          background-size: 100% 100%;
+        }
+
+        .leftOBContent {
+          height: calc(100% - 40px);
+
+          .HTB_CB_List {
+            width: 100%;
 
-        .VisTitle {
-            height: 60px;
-            background-image: url("../../assets/visualizationimg/title.png");
+            .HTBCBL_table {
+              margin-top: 5px;
+              // border-radius: 10px;
+              height: 34px;
+              padding: 0 10px;
+              background-size: 100% 100%;
+              display: flex;
+              align-items: center;
+              justify-content: space-between;
+
+              .HTBTCL_data {
+                display: flex;
+                align-items: center;
+                margin-top: 5px;
+
+                img {
+                  width: 16px;
+                  height: 14px;
+                  margin-right: 5px;
+                }
+
+                .HTBTCLD_text {
+                  font-size: 19px;
+                }
+              }
+
+              .HTBTCL_time {
+                font-size: 15px;
+                display: flex;
+                margin-top: 2px;
+
+                img {
+                  width: 100px;
+                }
+
+                div {
+                  color: #ddd;
+                }
+              }
+            }
+          }
         }
 
-        .Vgradation {
-            height: 60px;
+        .rightParkContent {
+          height: calc(100% - 40px);
+          display: grid;
+          grid-template-columns: repeat(3, 33.33%);
+          grid-template-rows: repeat(2, 50%);
+          align-items: center;
+
+          .RPCBox {
+            width: 100%;
+            height: 70%;
             display: flex;
-            justify-content: center;
             align-items: center;
+            // justify-content: center;
 
-            .tab {
-                width: 100px;
-                height: 40px;
-                margin: 0 10px;
-                text-align: center;
-                line-height: 40px;
-                color: white;
+            .RPCBImg {
+              width: 60px;
+              height: 60px;
+            }
+
+            .RPCBData {
+              margin-left: 10px;
+
+              .RPCBDNumber {
+                font-weight: normal;
+                font-size: 1.2vw;
+                color: #21F2FF;
+              }
+
+              .RPCBDName {
                 font-weight: 500;
-                background-image: url("../../assets/visualizationimg/headg.png");
-                background-size: 100% 100%;
+                font-size: 0.7vw;
+                color: #C9E2FF;
+              }
             }
+          }
+        }
 
-            .active {
-                background-image: url("../../assets/visualizationimg/headgactive.png");
-                background-size: 100% 100%;
+        .RICBTContent {
+          height: calc(100% - 40px);
+          display: grid;
+          grid-template-columns: repeat(1, 100%);
+          grid-template-rows: repeat(2, 50%);
+          align-items: center;
+          justify-content: center;
+
+          .RICBTCBoxOne {
+            width: 100%;
+            height: 100%;
+            background-image: url("../../assets/visualizationimg/imdustryCompliance.png");
+            background-size: 100% 100%;
+            display: flex;
+            justify-content: space-around;
+            align-items: center;
+
+            .proportion {
+              font-weight: bold;
+              font-size: 34px;
+              color: #3BA9FF;
+              line-height: 25px;
+            }
+
+            .administrativeS {
+              font-weight: normal;
+              font-size: 14px;
+              color: #F8FEFF;
+              line-height: 25px;
             }
+          }
+        }
+      }
+
+
+      .leftTwoBox {
+        height: 30%;
+        background-color: rgba($color: #000000, $alpha: .6);
+        margin-bottom: 14px;
+
+        .leftOBTitle,
+        .leftGDPTitle,
+        .leftTaxationTitle {
+          height: 40px;
+          color: white;
+          line-height: 40px;
+          padding-left: 60px;
+          font-weight: bold;
+          background-image: url("../../assets/visualizationimg/centertitle.png");
+          background-size: 100% 100%;
         }
+
+        .leftOBContent,
+        .leftGDPContent,
+        .leftTaxationContent {
+          height: calc(100% - 40px);
+
+          .LTCKing {
+            display: flex;
+            color: white;
+            // justify-content: space-between;
+            align-items: center;
+            background-image: url("../../assets/visualizationimg/rankingbu.png");
+            background-size: 100% 100%;
+            padding: 10px 10px;
+
+            .ranking {
+              width: 25px;
+              height: 25px;
+              margin-right: 10px;
+
+              img {
+                width: 25px;
+                height: 25px;
+              }
+            }
+
+            .companyName {
+              flex: 1;
+              font-size: 1vw;
+              font-weight: 500;
+            }
+
+            .companyValue {
+              color: #DFD92C;
+            }
+          }
+        }
+      }
+
+      .leftOneBox,
+      .leftThreeBox {
+        height: 30%;
+        background-color: rgba($color: #000000, $alpha: .6);
+        margin-bottom: 14px;
+
+        .leftOBTitle,
+        .leftGDPTitle,
+        .leftTaxationTitle {
+          height: 40px;
+          color: white;
+          line-height: 40px;
+          padding-left: 60px;
+          font-weight: bold;
+          background-image: url("../../assets/visualizationimg/centertitle.png");
+          background-size: 100% 100%;
+        }
+
+        .leftOBContent,
+        .leftGDPContent,
+        .leftTaxationContent {
+          height: calc(100% - 40px);
+
+          .LTCKing {
+            display: flex;
+            color: white;
+            // justify-content: space-between;
+            align-items: center;
+            background-image: url("../../assets/visualizationimg/rankingbu.png");
+            background-size: 100% 100%;
+            padding: 10px 10px;
+
+            .ranking {
+              width: 25px;
+              height: 25px;
+              margin-right: 10px;
+
+              img {
+                width: 25px;
+                height: 25px;
+              }
+            }
+
+            .companyName {
+              flex: 1;
+              font-size: 1vw;
+              font-weight: 500;
+            }
+
+            .companyValue {
+              color: #DFD92C;
+            }
+          }
+        }
+      }
     }
 
-    .container {
+    .boxBottom {
+      position: absolute;
+      z-index: 999;
+      height: 150px;
+      bottom: 0;
+      width: 45vw;
+      left: 27.5vw;
+      display: flex;
+
+      .parkLoan {
+        width: 50%;
         height: 100%;
-        position: relative;
-
-        .left {
-            left: 20px;
-            float: left;
-            position: relative;
-            margin-left: -100%;
-            width: 500px;
-            // background-color: rgba($color: #000000, $alpha: 0.2);
-            height: 100%;
-            top: 60px;
-            z-index: 999;
-
-            .leftOneBox,
-            .leftTwoBox,
-            .leftThreeBox {
-                height: 30%;
-                background-color: rgba($color: #000000, $alpha: .6);
-                margin-bottom: 14px;
-
-                .leftOBTitle,
-                .leftGDPTitle,
-                .leftTaxationTitle {
-                    height: 40px;
-                    color: white;
-                    line-height: 40px;
-                    padding-left: 60px;
-                    font-weight: bold;
-                    background-image: url("../../assets/visualizationimg/centertitle.png");
-                    background-size: 100% 100%;
-                }
+        background-color: rgba($color: #000000, $alpha: .6);
+
+        .PCFLTitle {
+          height: 40px;
+          color: white;
+          line-height: 40px;
+          padding-left: 60px;
+          font-weight: bold;
+          background-image: url("../../assets/visualizationimg/centertitle.png");
+          background-size: 100% 100%;
+        }
 
-                .leftOBContent,
-                .leftGDPContent,
-                .leftTaxationContent {
-                    height: calc(100% - 40px);
-
-                    .LTCKing {
-                        display: flex;
-                        color: white;
-                        // justify-content: space-between;
-                        align-items: center;
-                        background-image: url("../../assets/visualizationimg/rankingbu.png");
-                        background-size: 100% 100%;
-                        padding: 10px 10px;
-
-                        .ranking {
-                            width: 25px;
-                            height: 25px;
-                            margin-right: 10px;
-
-                            img {
-                                width: 25px;
-                                height: 25px;
-                            }
-                        }
-
-                        .companyName {
-                            flex: 1;
-                            font-size: 16px;
-                            font-weight: 500;
-                        }
-
-                        .companyValue {
-                            color: #DFD92C;
-                        }
-                    }
-                }
+        .PCFLContent {
+          height: calc(100% - 40px);
+
+          .PCFLNumber {
+            height: 50%;
+            display: flex;
+            justify-content: space-around;
+            align-items: center;
+            margin: 0 10px;
+
+            .RPCBData {
+              width: 100%;
+
+              .RPCBDNumber {
+                font-weight: normal;
+                font-size: 1.1vw;
+                color: #21F2FF;
+                text-align: center;
+              }
+
+              .RPCBDName {
+                font-weight: 500;
+                font-size: 14px;
+                text-align: center;
+                color: #C9E2FF;
+              }
             }
+          }
+
+          .PCFLImg {
+            margin-top: -50px;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+          }
         }
+      }
+
+      .boxBttTwo {
+        width: 50%;
+        height: 100%;
+        margin-left: 10px;
+        background-color: rgba($color: #000000, $alpha: .6);
+
+        .businessManagTitle {
+          height: 40px;
+          color: white;
+          line-height: 40px;
+          padding-left: 60px;
+          font-weight: bold;
+          background-image: url("../../assets/visualizationimg/centertitle.png");
+          background-size: 100% 100%;
+        }
+
+        .businessManagContent {
+          height: calc(100% - 40px);
+          display: flex;
+          justify-content: center;
+          align-items: center;
 
-        .boxBottom {
-            position: absolute;
-            z-index: 999;
-            height: 150px;
-            bottom: 0;
-            width: 860px;
-            left: 530px;
+          .RPCBox {
+            width: 100%;
+            height: 70%;
             display: flex;
+            align-items: center;
+            justify-content: center;
+
+            .RPCBImg {
+              width: 60px;
+              height: 60px;
+            }
+
+            .RPCBData {
+              margin-left: 10px;
+
+              .RPCBDNumber {
+                font-weight: normal;
+                font-size: 1vw;
+                color: #21F2FF;
+              }
+
+              .RPCBDName {
+                font-weight: 500;
+                font-size: 0.8vw;
+                color: #C9E2FF;
+              }
 
-            .parkLoan {
-                width: 50%;
-                height: 100%;
-                background-color: rgba($color: #000000, $alpha: .6);
-
-                .PCFLTitle {
-                    height: 40px;
-                    color: white;
-                    line-height: 40px;
-                    padding-left: 60px;
-                    font-weight: bold;
-                    background-image: url("../../assets/visualizationimg/centertitle.png");
-                    background-size: 100% 100%;
+              .RPCBDRatio {
+                font-weight: 500;
+                font-size: 0.8vw;
+                color: #C9E2FF;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    .center {
+      float: left;
+      height: 100%;
+      width: 100%;
+      background-color: green;
+
+      .allmap {
+        /* // 注意给dom宽高,不然地图不出来 */
+        width: 100%;
+        height: 100%;
+        margin: auto;
+        padding: 0;
+      }
+    }
+
+    .right {
+      //right: 20px;
+      left: 73vw;
+      float: left;
+      position: absolute;
+      //margin-left: -500px;
+      width: 26.5vw;
+      // background-color: rgba($color: #000000, $alpha: 0.2);
+      height: 100%;
+      top: 60px;
+      z-index: 999;
+
+
+      .leftOneBox,
+      .rightParkBox,
+      .rightIndustryComplianceBox {
+        height: 30%;
+        background-color: rgba($color: #000000, $alpha: .6);
+        margin-bottom: 14px;
+
+        .leftOBTitle,
+        .rightParkTtile,
+        .RICBTitle {
+          height: 40px;
+          color: white;
+          line-height: 40px;
+          padding-left: 60px;
+          font-weight: bold;
+          background-image: url("../../assets/visualizationimg/centertitle.png");
+          background-size: 100% 100%;
+        }
+
+        .leftOBContent {
+          height: calc(100% - 40px);
+
+          .HTB_CB_List {
+            width: 100%;
+
+            .HTBCBL_table {
+              margin-top: 5px;
+              // border-radius: 10px;
+              height: 34px;
+              padding: 0 10px;
+              background-size: 100% 100%;
+              display: flex;
+              align-items: center;
+              justify-content: space-between;
+
+              .HTBTCL_data {
+                display: flex;
+                align-items: center;
+                margin-top: 5px;
+
+                img {
+                  width: 16px;
+                  height: 14px;
+                  margin-right: 5px;
                 }
 
-                .PCFLContent {
-                    height: calc(100% - 40px);
-
-                    .PCFLNumber {
-                        height: 50%;
-                        display: flex;
-                        justify-content: space-around;
-                        align-items: center;
-                        margin: 0 10px;
-
-                        .RPCBData {
-                            width: 100%;
-
-                            .RPCBDNumber {
-                                font-weight: normal;
-                                font-size: 24px;
-                                color: #21F2FF;
-                                text-align: center;
-                            }
-
-                            .RPCBDName {
-                                font-weight: 500;
-                                font-size: 14px;
-                                text-align: center;
-                                color: #C9E2FF;
-                            }
-                        }
-                    }
-
-                    .PCFLImg {
-                        margin-top: -50px;
-                        display: flex;
-                        justify-content: center;
-                        align-items: center;
-                    }
+                .HTBTCLD_text {
+                  font-size: 1.05vw;
                 }
-            }
+              }
+
+              .HTBTCL_time {
+                font-size: 15px;
+                display: flex;
+                margin-top: 2px;
 
-            .boxBttTwo {
-                width: 50%;
-                height: 100%;
-                margin-left: 10px;
-                background-color: rgba($color: #000000, $alpha: .6);
-
-                .businessManagTitle {
-                    height: 40px;
-                    color: white;
-                    line-height: 40px;
-                    padding-left: 60px;
-                    font-weight: bold;
-                    background-image: url("../../assets/visualizationimg/centertitle.png");
-                    background-size: 100% 100%;
+                img {
+                  width: 100px;
                 }
 
-                .businessManagContent {
-                    height: calc(100% - 40px);
-                    display: flex;
-                    justify-content: center;
-                    align-items: center;
-
-                    .RPCBox {
-                        width: 100%;
-                        height: 70%;
-                        display: flex;
-                        align-items: center;
-                        justify-content: center;
-
-                        .RPCBImg {
-                            width: 60px;
-                            height: 60px;
-                        }
-
-                        .RPCBData {
-                            margin-left: 10px;
-
-                            .RPCBDNumber {
-                                font-weight: normal;
-                                font-size: 24px;
-                                color: #21F2FF;
-                            }
-
-                            .RPCBDName {
-                                font-weight: 500;
-                                font-size: 14px;
-                                color: #C9E2FF;
-                            }
-
-                            .RPCBDRatio {
-                                font-weight: 500;
-                                font-size: 14px;
-                                color: #C9E2FF;
-                            }
-                        }
-                    }
+                div {
+                  color: #ddd;
                 }
+              }
             }
+          }
+
         }
 
-        .center {
-            float: left;
-            height: 100%;
+        .rightParkContent {
+          height: calc(100% - 40px);
+          display: grid;
+          grid-template-columns: repeat(3, 33.33%);
+          grid-template-rows: repeat(2, 50%);
+          align-items: center;
+
+          .RPCBox {
             width: 100%;
-            background-color: green;
-
-            .allmap {
-                /* // 注意给dom宽高,不然地图不出来 */
-                width: 100%;
-                height: 100%;
-                margin: auto;
-                padding: 0;
+            height: 70%;
+            display: flex;
+            align-items: center;
+            // justify-content: center;
+
+            .RPCBImg {
+              width: 60px;
+              height: 60px;
             }
-        }
 
-        .right {
-            right: 20px;
-            float: left;
-            position: relative;
-            margin-left: -500px;
-            width: 500px;
-            // background-color: rgba($color: #000000, $alpha: 0.2);
-            height: 100%;
-            top: 60px;
-            z-index: 999;
-
-            .leftOneBox,
-            .rightParkBox,
-            .rightIndustryComplianceBox {
-                height: 30%;
-                background-color: rgba($color: #000000, $alpha: .6);
-                margin-bottom: 14px;
-
-                .leftOBTitle,
-                .rightParkTtile,
-                .RICBTitle {
-                    height: 40px;
-                    color: white;
-                    line-height: 40px;
-                    padding-left: 60px;
-                    font-weight: bold;
-                    background-image: url("../../assets/visualizationimg/centertitle.png");
-                    background-size: 100% 100%;
-                }
+            .RPCBData {
+              margin-left: 10px;
 
-                .leftOBContent {
-                    height: calc(100% - 40px);
-
-                    .HTB_CB_List {
-                        width: 100%;
-
-                        .HTBCBL_table {
-                            margin-top: 5px;
-                            // border-radius: 10px;
-                            height: 34px;
-                            padding: 0 10px;
-                            background-size: 100% 100%;
-                            display: flex;
-                            align-items: center;
-                            justify-content: space-between;
-
-                            .HTBTCL_data {
-                                display: flex;
-                                align-items: center;
-                                margin-top: 5px;
-
-                                img {
-                                    width: 16px;
-                                    height: 14px;
-                                    margin-right: 5px;
-                                }
-
-                                .HTBTCLD_text {
-                                    font-size: 19px;
-                                }
-                            }
-
-                            .HTBTCL_time {
-                                font-size: 15px;
-                                display: flex;
-                                margin-top: 2px;
-
-                                img {
-                                    width: 100px;
-                                }
-
-                                div {
-                                    color: #ddd;
-                                }
-                            }
-                        }
-                    }
+              .RPCBDNumber {
+                font-weight: normal;
+                font-size: 1vw;
+                color: #21F2FF;
+              }
 
-                }
+              .RPCBDName {
+                font-weight: 500;
+                font-size: 0.8vw;
+                color: #C9E2FF;
+              }
+            }
+          }
+        }
 
-                .rightParkContent {
-                    height: calc(100% - 40px);
-                    display: grid;
-                    grid-template-columns: repeat(3, 33.33%);
-                    grid-template-rows: repeat(2, 50%);
-                    align-items: center;
-
-                    .RPCBox {
-                        width: 100%;
-                        height: 70%;
-                        display: flex;
-                        align-items: center;
-                        // justify-content: center;
-
-                        .RPCBImg {
-                            width: 60px;
-                            height: 60px;
-                        }
-
-                        .RPCBData {
-                            margin-left: 10px;
-
-                            .RPCBDNumber {
-                                font-weight: normal;
-                                font-size: 24px;
-                                color: #21F2FF;
-                            }
-
-                            .RPCBDName {
-                                font-weight: 500;
-                                font-size: 14px;
-                                color: #C9E2FF;
-                            }
-                        }
-                    }
-                }
+        .RICBTContent {
+          height: calc(100% - 40px);
+          display: grid;
+          grid-template-columns: repeat(1, 100%);
+          grid-template-rows: repeat(2, 50%);
+          align-items: center;
+          justify-content: center;
 
-                .RICBTContent {
-                    height: calc(100% - 40px);
-                    display: grid;
-                    grid-template-columns: repeat(1, 100%);
-                    grid-template-rows: repeat(2, 50%);
-                    align-items: center;
-                    justify-content: center;
-
-                    .RICBTCBoxOne {
-                        width: 100%;
-                        height: 100%;
-                        background-image: url("../../assets/visualizationimg/imdustryCompliance.png");
-                        background-size: 100% 100%;
-                        display: flex;
-                        justify-content: space-around;
-                        align-items: center;
-
-                        .proportion {
-                            font-weight: bold;
-                            font-size: 34px;
-                            color: #3BA9FF;
-                            line-height: 25px;
-                        }
-
-                        .administrativeS {
-                            font-weight: normal;
-                            font-size: 14px;
-                            color: #F8FEFF;
-                            line-height: 25px;
-                        }
-                    }
-                }
+          .RICBTCBoxOne {
+            width: 100%;
+            height: 100%;
+            background-image: url("../../assets/visualizationimg/imdustryCompliance.png");
+            background-size: 100% 100%;
+            display: flex;
+            justify-content: space-around;
+            align-items: center;
+
+            .proportion {
+              font-weight: bold;
+              font-size: 1.6vw;
+              color: #3BA9FF;
+              line-height: 25px;
+            }
+
+            .administrativeS {
+              font-weight: normal;
+              font-size: 14px;
+              color: #F8FEFF;
+              line-height: 25px;
             }
+          }
         }
+      }
     }
+  }
 }
 </style>