周玉环 пре 1 дан
родитељ
комит
249efc0142

+ 1 - 0
xinkeaboard-admin/package.json

@@ -39,6 +39,7 @@
     "classnames": "^2.2.6",
     "dva": "^2.4.0",
     "echarts": "^6.0.0",
+    "echarts-gl": "^2.0.9",
     "enquire-js": "^0.2.1",
     "hash.js": "^1.1.5",
     "jquery": "^3.5.1",

+ 81 - 6
xinkeaboard-admin/pnpm-lock.yaml

@@ -38,6 +38,9 @@ importers:
       echarts:
         specifier: ^6.0.0
         version: 6.0.0
+      echarts-gl:
+        specifier: ^2.0.9
+        version: 2.0.9(echarts@6.0.0)
       enquire-js:
         specifier: ^0.2.1
         version: 0.2.1
@@ -257,7 +260,7 @@ importers:
         version: 1.1.8
       umi-plugin-react:
         specifier: ^1.2.0
-        version: 1.15.9(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react-router@5.1.2(react@16.14.0))(react@16.14.0)(redbox-react@1.6.0(react-dom@16.14.0(react@16.14.0))(react@16.14.0))
+        version: 1.15.9(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react-router@5.1.2(react@16.14.0))(react@16.14.0)(redbox-react@1.6.0(react-dom@16.14.0(react@16.14.0))(react@16.14.0))
     optionalDependencies:
       puppeteer:
         specifier: ^1.10.0
@@ -2736,6 +2739,9 @@ packages:
   classnames@2.5.1:
     resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
 
+  claygl@1.3.0:
+    resolution: {integrity: sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==}
+
   clean-css@4.2.4:
     resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==}
     engines: {node: '>= 4.0'}
@@ -3745,6 +3751,11 @@ packages:
   ecc-jsbn@0.1.2:
     resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
 
+  echarts-gl@2.0.9:
+    resolution: {integrity: sha512-oKeMdkkkpJGWOzjgZUsF41DOh6cMsyrGGXimbjK2l6Xeq/dBQu4ShG2w2Dzrs/1bD27b2pLTGSaUzouY191gzA==}
+    peerDependencies:
+      echarts: ^5.1.2
+
   echarts@6.0.0:
     resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==}
 
@@ -10667,6 +10678,9 @@ packages:
   yup@0.27.0:
     resolution: {integrity: sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==}
 
+  zrender@5.6.1:
+    resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
+
   zrender@6.0.0:
     resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==}
 
@@ -13897,14 +13911,26 @@ snapshots:
 
   babel-plugin-react-require@3.0.0: {}
 
-  babel-plugin-styled-components@2.1.4(@babel/core@7.4.5)(styled-components@4.4.1(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react@16.14.0))(supports-color@5.5.0):
+  babel-plugin-styled-components@2.1.4(@babel/core@7.28.0)(styled-components@4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0))(supports-color@5.5.0):
+    dependencies:
+      '@babel/helper-annotate-as-pure': 7.27.3
+      '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
+      '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0)
+      lodash: 4.17.21
+      picomatch: 2.3.1
+      styled-components: 4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
+    transitivePeerDependencies:
+      - '@babel/core'
+      - supports-color
+
+  babel-plugin-styled-components@2.1.4(@babel/core@7.4.5)(styled-components@4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0))(supports-color@5.5.0):
     dependencies:
       '@babel/helper-annotate-as-pure': 7.27.3
       '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
       '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.4.5)
       lodash: 4.17.21
       picomatch: 2.3.1
-      styled-components: 4.4.1(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
+      styled-components: 4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
     transitivePeerDependencies:
       - '@babel/core'
       - supports-color
@@ -14737,6 +14763,8 @@ snapshots:
 
   classnames@2.5.1: {}
 
+  claygl@1.3.0: {}
+
   clean-css@4.2.4:
     dependencies:
       source-map: 0.6.1
@@ -15922,6 +15950,12 @@ snapshots:
       jsbn: 0.1.1
       safer-buffer: 2.1.2
 
+  echarts-gl@2.0.9(echarts@6.0.0):
+    dependencies:
+      claygl: 1.3.0
+      echarts: 6.0.0
+      zrender: 5.6.1
+
   echarts@6.0.0:
     dependencies:
       tslib: 2.3.0
@@ -23225,13 +23259,33 @@ snapshots:
 
   style-utils@0.2.1: {}
 
+  styled-components@4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0):
+    dependencies:
+      '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
+      '@babel/traverse': 7.28.0(supports-color@5.5.0)
+      '@emotion/is-prop-valid': 0.8.8
+      '@emotion/unitless': 0.7.5
+      babel-plugin-styled-components: 2.1.4(@babel/core@7.28.0)(styled-components@4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0))(supports-color@5.5.0)
+      css-to-react-native: 2.3.2
+      memoize-one: 5.2.1
+      merge-anything: 2.4.4
+      prop-types: 15.8.1
+      react: 16.14.0
+      react-dom: 16.14.0(react@16.14.0)
+      react-is: 16.13.1
+      stylis: 3.5.4
+      stylis-rule-sheet: 0.0.10(stylis@3.5.4)
+      supports-color: 5.5.0
+    transitivePeerDependencies:
+      - '@babel/core'
+
   styled-components@4.4.1(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react@16.14.0):
     dependencies:
       '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0)
       '@babel/traverse': 7.28.0(supports-color@5.5.0)
       '@emotion/is-prop-valid': 0.8.8
       '@emotion/unitless': 0.7.5
-      babel-plugin-styled-components: 2.1.4(@babel/core@7.4.5)(styled-components@4.4.1(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react@16.14.0))(supports-color@5.5.0)
+      babel-plugin-styled-components: 2.1.4(@babel/core@7.4.5)(styled-components@4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0))(supports-color@5.5.0)
       css-to-react-native: 2.3.2
       memoize-one: 5.2.1
       merge-anything: 2.4.4
@@ -24110,7 +24164,7 @@ snapshots:
       umi-utils: 1.4.2
       url-polyfill: 1.1.3
 
-  umi-plugin-react@1.15.9(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react-router@5.1.2(react@16.14.0))(react@16.14.0)(redbox-react@1.6.0(react-dom@16.14.0(react@16.14.0))(react@16.14.0)):
+  umi-plugin-react@1.15.9(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react-router@5.1.2(react@16.14.0))(react@16.14.0)(redbox-react@1.6.0(react-dom@16.14.0(react@16.14.0))(react@16.14.0)):
     dependencies:
       antd: 3.26.20(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
       antd-mobile: 2.3.4(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
@@ -24127,7 +24181,7 @@ snapshots:
       umi-plugin-locale: 2.11.7(react@16.14.0)
       umi-plugin-polyfills: 1.4.2
       umi-plugin-routes: 1.8.9
-      umi-plugin-ui: 1.5.3(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
+      umi-plugin-ui: 1.5.3(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
       umi-utils: 1.7.3
       webpack: 4.41.1
       workbox-webpack-plugin: 3.6.3(webpack@4.41.1)
@@ -24147,6 +24201,23 @@ snapshots:
 
   umi-plugin-routes@1.8.9: {}
 
+  umi-plugin-ui@1.5.3(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0):
+    dependencies:
+      got: 9.6.0
+      immer: 5.3.6
+      is-mobile: 2.1.0
+      mkdirp: 0.5.6
+      sockjs-client: 1.3.0(supports-color@6.1.0)
+      styled-components: 4.4.1(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
+      umi-ui-tasks: 1.3.12
+    transitivePeerDependencies:
+      - '@babel/core'
+      - bufferutil
+      - react
+      - react-dom
+      - supports-color
+      - utf-8-validate
+
   umi-plugin-ui@1.5.3(@babel/core@7.4.5)(react-dom@16.14.0(react@16.14.0))(react@16.14.0):
     dependencies:
       got: 9.6.0
@@ -25270,6 +25341,10 @@ snapshots:
       synchronous-promise: 2.0.17
       toposort: 2.0.2
 
+  zrender@5.6.1:
+    dependencies:
+      tslib: 2.3.0
+
   zrender@6.0.0:
     dependencies:
       tslib: 2.3.0

+ 30 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/components/DistributorEnquireLocation.js

@@ -0,0 +1,30 @@
+import React from "react";
+import { Spin } from "antd";
+import { connect } from "dva";
+import PanelNav from "./PanelNav";
+import EnquirePieChart from "./EnquirePieChart";
+import styles from "../styles/distributor_enquire_location.less";
+
+const DistributorEnquire = ({ data, loading, dispatch }) => {
+  const parsedata = (pieData) => {
+    return pieData.map((item) => ({
+      value: item.storeNum,
+      name: item.provinceName,
+    }));
+  };
+  return (
+    <div className={styles.distributor}>
+      <div className={styles.distributor_header}>
+        <PanelNav title="供应链企业地区分布" />
+      </div>
+      <div className={styles.distributor_content}>
+        <EnquirePieChart data={parsedata(data)} />
+      </div>
+    </div>
+  );
+};
+
+export default connect(({ bigscreen }) => ({
+  data: bigscreen.distributorEnquireLocationData.data,
+  loading: bigscreen.distributorEnquireLocationData.loading,
+}))(DistributorEnquire);

+ 86 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/components/Enquire.js

@@ -0,0 +1,86 @@
+import React from "react";
+import { Spin } from "antd";
+import { connect } from "dva";
+import RadioButtonGroup from "./RadioButtonGroup";
+import TrafficLineChart from "./TrafficLineChart";
+import PanelNav from "./PanelNav";
+import styles from "../styles/enquire.less";
+
+const relation = {
+  enquiryTrendList: {
+    name: "海外门户询盘数",
+    color: "#7ECEF4",
+    index: "viewNum",
+  },
+  enquiryTrendCNList: {
+    name: "分销门户询盘数",
+    color: "#036EB8",
+    index: "viewNum",
+  },
+};
+
+const EnquireBasic = ({ data, options, current, loading, dispatch }) => {
+  const onChange = (val) => {
+    dispatch({
+      type: "bigscreen/setEnquireData",
+      payload: { current: val },
+    });
+    dispatch({
+      type: "bigscreen/load_enquire_data",
+    });
+  };
+
+  const parseEnquireData = (lineData) => {
+    const legendData = [];
+    let xAxisData = [];
+    const seriesData = [];
+    Object.keys(relation).forEach((key) => {
+      if (lineData[key]) {
+        legendData.push(relation[key].name);
+        xAxisData = lineData[key].map((item) => item.statsTime);
+        seriesData.push({
+          name: relation[key].name,
+          type: "line",
+          smooth: false,
+          showSymbol: true,
+          symbolSize: 10,
+          symbol: "circle",
+          itemStyle: { color: relation[key].color },
+          lineStyle: { width: 2 },
+          data: lineData[key].map((item) => item[relation[key].index]),
+        });
+      }
+    });
+
+    return {
+      legendData,
+      xAxisData,
+      seriesData,
+    };
+  };
+
+  return (
+    <div className={styles.enquire}>
+      <div className={styles.enquire_header}>
+        <PanelNav title="询盘概况" />
+        <div className={styles.enquire_header_conditions}>
+          <RadioButtonGroup
+            options={options}
+            label={current}
+            onChange={onChange}
+          />
+        </div>
+      </div>
+      <div className={styles.enquire_content}>
+        <TrafficLineChart {...parseEnquireData(data)} />
+      </div>
+    </div>
+  );
+};
+
+export default connect(({ bigscreen }) => ({
+  data: bigscreen.enquireData.data,
+  options: bigscreen.enquireData.options,
+  current: bigscreen.enquireData.current,
+  loading: bigscreen.enquireData.loading,
+}))(EnquireBasic);

+ 77 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/components/EnquirePieChart.js

@@ -0,0 +1,77 @@
+import React from "react";
+import * as echarts from "echarts";
+import styles from "../styles/enquire_pie_chart.less";
+import "echarts-gl"; // 如果要用真正的3D图
+
+class Pie3DChart extends React.Component {
+  constructor(props) {
+    super(props);
+    this.chartRef = React.createRef();
+    this.chartInstance = null;
+  }
+
+  componentDidMount() {
+    this.initChart();
+  }
+
+  componentDidUpdate(prevProps) {
+    this.initChart();
+  }
+
+  componentWillUnmount() {
+    if (this.chartInstance) {
+      this.chartInstance.dispose();
+    }
+  }
+
+  initChart() {
+    if (!this.chartInstance) {
+      this.chartInstance = echarts.init(this.chartRef.current);
+    }
+    const option = {
+      color: ["#7ECEF4", "#2EA7E0", "#036EB8", "#004E9D"], // 统一调色板
+      legend: {
+        itemGap: 30,
+        bottom: 0,
+        textStyle: { color: "#fff" },
+      },
+      series: [
+        {
+        //   name: "访问来源",
+          type: "pie",
+          radius: ["0", "60%"],
+          center: ["50%", "45%"],
+          avoidLabelOverlap: false,
+          itemStyle: {
+            borderRadius: 5,
+            borderColor: "#0b0c1b",
+            borderWidth: 3,
+            // shadowBlur: 20,
+            // shadowColor: "rgba(0, 0, 0, 0.5)",
+          },
+          label: {
+            show: false,
+            position: "center",
+          },
+          emphasis: {
+            label: {
+              show: true,
+              fontSize: "16",
+              fontWeight: "bold",
+            },
+          },
+          //   labelLine: { show: false },
+          data: this.props.data
+        },
+      ],
+    };
+
+    this.chartInstance.setOption(option);
+  }
+
+  render() {
+    return <div ref={this.chartRef} className={styles.enquire_pie} />;
+  }
+}
+
+export default Pie3DChart;

+ 31 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/components/OverseasEnquireLocation.js

@@ -0,0 +1,31 @@
+import React from "react";
+import { Spin } from "antd";
+import { connect } from "dva";
+import PanelNav from "./PanelNav";
+import EnquirePieChart from "./EnquirePieChart";
+import styles from "../styles/overseas_enquire_location.less";
+
+const OverSeasEnquire = ({ data, loading, dispatch }) => {
+  const parsedata = (pieData) => {
+    return pieData.map((item) => ({
+      value: item.enquiryNum,
+      name: item.country,
+    }));
+  };
+
+  return (
+    <div className={styles.overseas}>
+      <div className={styles.overseas_header}>
+        <PanelNav title="海外询盘地区分布" />
+      </div>
+      <div className={styles.overseas_content}>
+        <EnquirePieChart data={parsedata(data)} />
+      </div>
+    </div>
+  );
+};
+
+export default connect(({ bigscreen }) => ({
+  data: bigscreen.overseasEnquireLocationData.data,
+  loading: bigscreen.overseasEnquireLocationData.loading,
+}))(OverSeasEnquire);

+ 0 - 12
xinkeaboard-admin/src/pages/statistics/bigscreen/components/PortalTraffic.js

@@ -63,15 +63,6 @@ const PortalTraffic = ({ data, options, current, loading, dispatch }) => {
       }
     });
 
-    console.log(
-      "seriesData",
-      seriesData,
-      "legendData",
-      legendData,
-      "xAxisData",
-      xAxisData
-    );
-
     return {
       legendData,
       xAxisData,
@@ -93,9 +84,6 @@ const PortalTraffic = ({ data, options, current, loading, dispatch }) => {
       </div>
       <div className={styles.traffic_content}>
         <TrafficLineChart {...parseTrafficData(data)} />
-        {/* <Spin spinning={loading}>
-          
-        </Spin> */}
       </div>
     </div>
   );

+ 11 - 6
xinkeaboard-admin/src/pages/statistics/bigscreen/components/TrafficLineChart.js

@@ -13,6 +13,10 @@ class LineChart extends React.Component {
     this.initChart();
   }
 
+  componentDidUpdate(prevProps) {
+    this.initChart();
+  }
+
   componentWillUnmount() {
     if (this.chartInstance) {
       this.chartInstance.dispose();
@@ -20,8 +24,9 @@ class LineChart extends React.Component {
   }
 
   initChart() {
-    this.chartInstance = echarts.init(this.chartRef.current);
-    console.log('this.props', this.props);
+    if (!this.chartInstance) {
+      this.chartInstance = echarts.init(this.chartRef.current);
+    }
     const option = {
       backgroundColor: "transparent",
       tooltip: { trigger: "axis" },
@@ -29,7 +34,7 @@ class LineChart extends React.Component {
         top: 10,
         itemGap: 30,
         textStyle: { color: "#fff" },
-        data: this.props.legendData
+        data: this.props.legendData,
       },
       grid: {
         left: "5%",
@@ -50,7 +55,7 @@ class LineChart extends React.Component {
             color: "#ccc",
           },
         },
-        data: this.props.xAxisData
+        data: this.props.xAxisData,
       },
       yAxis: {
         type: "value",
@@ -65,9 +70,9 @@ class LineChart extends React.Component {
           },
         },
       },
-      series: this.props.seriesData
+      series: this.props.seriesData,
     };
-    console.log('option', option);
+    console.log("option", option);
     this.chartInstance.setOption(option);
   }
 

+ 15 - 3
xinkeaboard-admin/src/pages/statistics/bigscreen/index.js

@@ -6,6 +6,9 @@ import HeaderContent from "./components/HeadContent";
 import WordCloud from "@/components/WordCloud";
 import OverView from "./components/Overview";
 import PortalTraffic from "./components/PortalTraffic";
+import Enquire from "./components/Enquire";
+import OverseasEnquireLocation from "./components/OverseasEnquireLocation";
+import DistributorEnquireLocation from './components/DistributorEnquireLocation';
 
 @connect(({ bigscreen }) => ({
   bigscreen,
@@ -145,10 +148,19 @@ class BigScreen extends React.Component {
             <div className={styles.contentPanelLeft}>
               {/* <PanelBlock height="200px" /> */}
               <PanelBlock>
-                <PortalTraffic></PortalTraffic>
+                <PortalTraffic />
+              </PanelBlock>
+              <PanelBlock>
+                <Enquire />
+              </PanelBlock>
+              <PanelBlock flexDirection='row'>
+                <PanelBlock>
+                  <OverseasEnquireLocation></OverseasEnquireLocation>
+                </PanelBlock>
+                <PanelBlock>
+                  <DistributorEnquireLocation></DistributorEnquireLocation>
+                </PanelBlock>
               </PanelBlock>
-              <PanelBlock />
-              <PanelBlock />
             </div>
 
             {/* 中间 */}

+ 33 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/styles/distributor_enquire_location.less

@@ -0,0 +1,33 @@
+.distributor {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.distributor_header {
+  position: relative;
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 52px;
+  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+
+  &::after {
+    content: "";
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 255px;
+    height: 4px;
+    background: #06f7ff;
+  }
+}
+
+.distributor_content {
+  flex: 1;
+  width: 100%;
+  height: 100%;
+  padding: 20px;
+}

+ 37 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/styles/enquire.less

@@ -0,0 +1,37 @@
+.enquire {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.enquire_header {
+  position: relative;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  height: 52px;
+  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+
+  &::after {
+    content: "";
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 112px;
+    height: 4px;
+    background: #06f7ff;
+  }
+}
+
+.enquire_header_conditions {
+}
+
+.enquire_content {
+  flex: 1;
+  width: 100%;
+  height: 100%;
+  padding: 20px;
+}

+ 4 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/styles/enquire_pie_chart.less

@@ -0,0 +1,4 @@
+.enquire_pie {
+  width: 100%;
+  height: 100%;
+}

+ 33 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/styles/overseas_enquire_location.less

@@ -0,0 +1,33 @@
+.overseas {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.overseas_header {
+  position: relative;
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 52px;
+  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+
+  &::after {
+    content: "";
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 225px;
+    height: 4px;
+    background: #06f7ff;
+  }
+}
+
+.overseas_content {
+  flex: 1;
+  width: 100%;
+  height: 100%;
+  padding: 20px;
+}

+ 1 - 0
xinkeaboard-admin/src/pages/statistics/bigscreen/styles/portal_traffic.less

@@ -1,4 +1,5 @@
 .traffic {
+  position: relative;
   width: 100%;
   height: 100%;
   display: flex;

+ 156 - 6
xinkeaboard-admin/src/pages/statistics/models/bigscreen.js

@@ -42,6 +42,47 @@ export default {
       ],
       current: "近7日",
     },
+    enquireData: {
+      loading: false,
+      data: {},
+      options: [
+        {
+          label: "近7日",
+          value: {
+            startTime:
+              moment()
+                .subtract(7, "days")
+                .format("YYYY-MM-DD") + " 00:00:00",
+            endTime:
+              moment()
+                .subtract(1, "days")
+                .format("YYYY-MM-DD") + " 23:59:59:999",
+          },
+        },
+        {
+          label: "近30日",
+          value: {
+            startTime:
+              moment()
+                .subtract(30, "days")
+                .format("YYYY-MM-DD") + " 00:00:00",
+            endTime:
+              moment()
+                .subtract(1, "days")
+                .format("YYYY-MM-DD") + " 23:59:59:999",
+          },
+        },
+      ],
+      current: "近7日",
+    },
+    overseasEnquireLocationData: {
+      loading: false,
+      data: [],
+    },
+    distributorEnquireLocationData: {
+      loading: false,
+      data: [],
+    },
   },
 
   effects: {
@@ -65,8 +106,12 @@ export default {
 
     // 门户流量
     *load_portal_traffic({ payload }, { call, put, select }) {
-      const current = yield select((state) => state.bigscreen.portalTrafficData.current);
-      const options = yield select((state) => state.bigscreen.portalTrafficData.options);
+      const current = yield select(
+        (state) => state.bigscreen.portalTrafficData.current
+      );
+      const options = yield select(
+        (state) => state.bigscreen.portalTrafficData.options
+      );
       const condition = options.filter((item) => item.label == current)[0]
         .value;
       payload = { ...payload, ...condition };
@@ -86,6 +131,69 @@ export default {
       });
     },
 
+    // 询盘概况
+    *load_enquire_data({ payload }, { call, put, select }) {
+      const current = yield select(
+        (state) => state.bigscreen.enquireData.current
+      );
+      const options = yield select(
+        (state) => state.bigscreen.enquireData.options
+      );
+      const condition = options.filter((item) => item.label == current)[0]
+        .value;
+      payload = { ...payload, ...condition };
+      yield put({
+        type: "setEnquireData",
+        payload: { loading: true },
+      });
+      const response = yield call(
+        sldCommonService,
+        payload,
+        "get",
+        "v3/statistics/screen/analysis/enquiryTrend"
+      );
+      yield put({
+        type: "setEnquireData",
+        payload: { data: response.data, loading: false },
+      });
+    },
+
+    // 海外询盘地区分布
+    *load_overseas_enquire_location({ payload }, { call, put, select }) {
+      yield put({
+        type: "setOverseasEnquireLocation",
+        payload: { loading: true },
+      });
+      const response = yield call(
+        sldCommonService,
+        payload,
+        "get",
+        "v3/statistics/screen/analysis/enquiryDistribution"
+      );
+      yield put({
+        type: "setOverseasEnquireLocation",
+        payload: { data: response.data, loading: false },
+      });
+    },
+
+    // 供应链企业地区分布
+    *load_distributor_enquire_location({ payload }, { call, put, select }) {
+      yield put({
+        type: "setDistributorEnquireLocation",
+        payload: { loading: true },
+      });
+      const response = yield call(
+        sldCommonService,
+        payload,
+        "get",
+        "v3/statistics/screen/analysis/regionDistribution"
+      );
+      yield put({
+        type: "setDistributorEnquireLocation",
+        payload: { data: response.data, loading: false },
+      });
+    },
+
     // 初始化数据
     *load_data({ payload }, { put, call }) {
       // 调用 load_data
@@ -97,6 +205,21 @@ export default {
       yield put.resolve({
         type: "load_portal_traffic",
       });
+
+      // 调用询盘概况
+      yield put.resolve({
+        type: "load_enquire_data",
+      });
+
+      // 海外询盘地区分布
+      yield put.resolve({
+        type: "load_overseas_enquire_location",
+      });
+
+      // 供应链询盘地区分布
+      yield put.resolve({
+        type: "load_distributor_enquire_location",
+      });
     },
   },
 
@@ -105,8 +228,8 @@ export default {
       return {
         ...state,
         overviewData: {
-          ...state.overviewData, // 保留 config 里其他字段
-          ...payload, // 覆盖需要更新的字段
+          ...state.overviewData,
+          ...payload,
         },
       };
     },
@@ -114,8 +237,35 @@ export default {
       return {
         ...state,
         portalTrafficData: {
-          ...state.portalTrafficData, // 保留 config 里其他字段
-          ...payload, // 覆盖需要更新的字段
+          ...state.portalTrafficData,
+          ...payload,
+        },
+      };
+    },
+    setEnquireData(state, { payload }) {
+      return {
+        ...state,
+        enquireData: {
+          ...state.enquireData,
+          ...payload,
+        },
+      };
+    },
+    setOverseasEnquireLocation(state, { payload }) {
+      return {
+        ...state,
+        overseasEnquireLocationData: {
+          ...state.overseasEnquireLocationData,
+          ...payload,
+        },
+      };
+    },
+    setDistributorEnquireLocation(state, { payload }) {
+      return {
+        ...state,
+        distributorEnquireLocationData: {
+          ...state.distributorEnquireLocationData,
+          ...payload,
         },
       };
     },