diff --git a/src/assets/images/V-2504/female.png b/src/assets/images/V-2504/female.png
new file mode 100644
index 0000000000000000000000000000000000000000..934b6365e4719e81aec99f845e9e5a291a4eb13a
Binary files /dev/null and b/src/assets/images/V-2504/female.png differ
diff --git a/src/assets/images/V-2504/femaleActive.png b/src/assets/images/V-2504/femaleActive.png
new file mode 100644
index 0000000000000000000000000000000000000000..11f2a3ca7ca8e8defd9949a18b32a54498d0d24b
Binary files /dev/null and b/src/assets/images/V-2504/femaleActive.png differ
diff --git a/src/assets/images/V-2504/male.png b/src/assets/images/V-2504/male.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5282269ee0af17770a22db363cc36c013139b86
Binary files /dev/null and b/src/assets/images/V-2504/male.png differ
diff --git a/src/assets/images/V-2504/maleActive.png b/src/assets/images/V-2504/maleActive.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed8c487b7b2539c3d1b02e37cf71015427924760
Binary files /dev/null and b/src/assets/images/V-2504/maleActive.png differ
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent.less
deleted file mode 100644
index 7770540ff68aa737199bb26b2a430374b2c203fe..0000000000000000000000000000000000000000
--- a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent.less
+++ /dev/null
@@ -1,42 +0,0 @@
-.container {
- width: 100%;
- height: 100%;
- display: flex;
- flex-direction: column;
-}
-
-.header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 24px;
-}
-
-.content {
- flex: 1;
- background: rgba(7, 28, 67, 0.5);
- border-radius: 12px;
- border: 1px solid rgba(24, 144, 255, 0.3);
- padding: 20px;
- display: flex;
- flex-direction: column;
- gap: 20px;
-}
-
-.placeholder {
- width: 100%;
- height: 100%;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- color: #fff;
- font-size: 24px;
- text-align: center;
-
- p {
- margin-top: 20px;
- font-size: 16px;
- color: rgba(255, 255, 255, 0.7);
- }
-}
\ No newline at end of file
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersAge/index.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersAge/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersAge/index.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersAge/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7fc264b2e5af55b8e1dc190c4cf651178f3e7c81
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersAge/index.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+import './index.less'
+import HncyCard from '@/pages/Home_v_2504/components/common/Card'
+
+export default function WorkersAge() {
+ return (
+
+ <>>
+
+ )
+}
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersArea/index.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersArea/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersArea/index.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersArea/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8b1e2868a177ca827cec7a3f595e855b55dc5668
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersArea/index.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+import './index.less'
+import HncyCard from '@/pages/Home_v_2504/components/common/Card'
+
+export default function WorkersArea() {
+ return (
+
+ <>>
+
+ )
+}
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderPieChart/index.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderPieChart/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderPieChart/index.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderPieChart/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1ffd869265a7b8d8322b3b562f6398cafe0b8640
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderPieChart/index.tsx
@@ -0,0 +1,126 @@
+import React, { useEffect, useRef } from 'react'
+import * as echarts from 'echarts';
+import './index.less'
+
+export default function GenderPieChart() {
+
+ const chartRef = useRef(null);
+
+ useEffect(() => {
+ if (chartRef.current) {
+ const myChart = echarts.init(chartRef.current);
+
+ const option = {
+ // title: {
+ // // text: `{a|总共}\n{b|${5.8}}{c|万人}`,
+ // formatter: [
+ // '{a|总共}',
+ // `{b|${5.8}}这段用默认样式{x|万人}`
+ // ].join('\n'),
+ // left: 'center',
+ // top: 'center',
+ // // textStyle.rich()
+ // textStyle: {
+ // a: {
+ // fontSize: 16,
+ // fontWeight: 400,
+ // color: '#BCCEE9',
+ // },
+ // b: {
+ // fontSize: 24,
+ // fontWeight: 700,
+ // color: '#FFFFFF'
+ // },
+ // c: {
+ // fontSize: 14,
+ // fontWeight: 400,
+ // color: '#BCCEE9',
+ // }
+ // }
+ // },
+ label: {
+ formatter: [
+ '{a|总共}',
+ `{b|${5.8}}{x|万人}`
+ ].join('\n'),
+ rich: {
+ a: {
+ fontFamily: '微软雅黑',
+ fontSize: 16,
+ fontWeight: 400,
+ color: '#BCCEE9',
+ },
+ b: {
+ fontFamily: 'D-DIN',
+ fontSize: 24,
+ fontWeight: 700,
+ color: '#FFFFFF',
+ padding: [8, 8, 0, 0]
+ },
+ x: {
+ fontFamily: '微软雅黑',
+ fontSize: 14,
+ fontWeight: 400,
+ color: '#BCCEE9',
+ padding: [10, 0, 0, 0]
+ },
+ }
+ },
+ series: [
+
+ {
+ type: 'pie',
+ radius: ['65%', '70%'],
+ padAngle: 1,
+ silent: true, // 禁用交互
+ itemStyle: {
+ borderRadius: 0
+ },
+ label: {
+ show: true,
+ position: 'center'
+ },
+ labelLine: {
+ show: false
+ },
+ data: [
+ { value: 1048, name: 'Search Engine', itemStyle: { color: '#26D5FF' } },
+ { value: 735, name: 'Direct', itemStyle: { color: '#FF9155' } }
+ ]
+ },
+ {
+ type: 'pie',
+ radius: ['45%', '70%'],
+ padAngle: 1,
+ silent: true, // 禁用交互
+ label: {
+ show: false,
+ position: 'center'
+ },
+ labelLine: {
+ show: false
+ },
+ data: [
+ {
+ value: 1048,
+ name: 'Search Engine',
+ itemStyle: { color: 'rgb(38, 213, 255, .2)' }
+ },
+ {
+ value: 735,
+ name: 'Direct',
+ itemStyle: { color: 'rgb(255, 145, 85, .2)' }
+ }
+ ]
+ }
+ ]
+ };
+ myChart.setOption(option);
+ }
+ }, []);
+
+
+ return (
+
+ )
+}
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderProportion/index.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderProportion/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..fd9d52ed2c6b947efc643ea7cdc07919187e3602
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderProportion/index.less
@@ -0,0 +1,15 @@
+.percentage {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ margin-top: 15px;
+ margin-bottom: 11px;
+
+ .male,
+ .female {
+ img {
+ width: 10px;
+ height: 25px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderProportion/index.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderProportion/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..77268a0746bf76d36bc5232373837c8c356b0a37
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/components/GenderProportion/index.tsx
@@ -0,0 +1,85 @@
+import React, { useMemo } from 'react'
+import DescriptionItem from '@/components/DescriptionItem'
+import male from '@/assets/images/V-2504/male.png'
+import female from '@/assets/images/V-2504/female.png'
+import maleActive from '@/assets/images/V-2504/maleActive.png'
+import femaleActive from '@/assets/images/V-2504/femaleActive.png'
+import './index.less'
+
+type GenderProportionProps = {
+ value: number,
+ percentage: number,
+ type: 'male' | 'female'
+}
+
+export default function GenderProportion({
+ value,
+ percentage,
+ type
+}: GenderProportionProps) {
+
+ const activeNums = useMemo(() => {
+ return Math.ceil(percentage / 100 * 7)
+ }, [percentage])
+
+
+ return (
+
+
+
+ {/* 根据activeNums 和 type 类型,渲染高亮的 maleActive 或者 femaleActive 的图片数量 */}
+ {
+ Array.from({ length: 7 }).map((_, index) => {
+ return (
+
+ {
+ index < activeNums ? (
+

+ ) : (
+

+ )
+ }
+
+ )
+ })
+ }
+
+
+
+ )
+}
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/index.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..8530073bba0274b71e3bf2cf47d813e8114454c7
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/index.less
@@ -0,0 +1,34 @@
+
+
+.gender-wrapper {
+ display: flex;
+ align-items: center;
+ gap: 13px;
+ padding-right: 26px;
+
+ div {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ .dot {
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ }
+
+ .blue {
+ background-image: linear-gradient(to bottom, #33FFDC, #0095FF);
+ }
+
+ .yellow {
+ background-image: linear-gradient(to bottom, #FF9494, #FFCC7A);
+ }
+ }
+}
+
+.children {
+ display: flex;
+ align-items: center;
+ gap: 34px;
+}
\ No newline at end of file
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/index.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..f606f137ee4b06239227d91578ae21f1b249a916
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersGender/index.tsx
@@ -0,0 +1,46 @@
+import React from 'react'
+import './index.less'
+import ModuleTitleWithTabs from '@/pages/Home_v_2504/components/common/ModuleTitleWithTabs'
+import HncyCard from '@/pages/Home_v_2504/components/common/Card'
+import GenderProportion from './components/GenderProportion'
+import GenderPieChart from './components/GenderPieChart'
+
+export default function WorkersGender() {
+ return (
+
+
+
+
+ }
+ >
+
+
+ )
+}
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersType/index.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersType/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersType/index.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersType/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3ca3950b0a0fc5b3e1c3782fabebd5f9af446544
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/components/WorkersType/index.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+import './index.less'
+import HncyCard from '@/pages/Home_v_2504/components/common/Card'
+
+export default function WorkersType() {
+ return (
+
+ <>>
+
+ )
+}
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/index.less b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..b06b11c10131c0e1b0575a63174f38676f362577
--- /dev/null
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/index.less
@@ -0,0 +1,25 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ background: rgba(7, 28, 67, 0.5);
+}
+
+.header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // margin-bottom: 24px;
+}
+
+.content {
+ // flex: 1;
+ border-radius: 12px;
+ // border: 1px solid rgba(24, 144, 255, 0.3);
+ padding: 15px;
+ display: flex;
+ flex-wrap: wrap;
+ // flex-direction: column;
+ gap: 15px;
+}
\ No newline at end of file
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/index.tsx
similarity index 66%
rename from src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent.tsx
rename to src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/index.tsx
index 61e33089ea628979edfd8e85553a6dad8a8aab95..31399f66edaedb6a68fcb57c55b63e6af06d0bbf 100644
--- a/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent.tsx
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/components/LeftContent/index.tsx
@@ -1,7 +1,11 @@
import React from 'react';
import PanelTitle from '@/pages/Home_v_2504/components/common/PanelTitle';
import DateSelector from '@/components/V2504/DateSelector';
-import styles from './LeftContent.less';
+import styles from './index.less';
+import WorkersGender from './components/WorkersGender';
+import WorkersType from './components/WorkersType';
+import WorkersArea from './components/WorkersArea';
+import WorkersAge from './components/WorkersAge';
/**
* 环卫行业子页面 - 左侧内容组件
@@ -17,19 +21,19 @@ const LeftContent: React.FC = () => {
{/* 标题 */}
-
- 环卫行业左侧内容
-
这是一个示例组件,实际使用时需要根据业务需求实现
-
+
+
+
+
);
diff --git a/src/pages/Home_v_2504/components/SubPages/Environment/index.tsx b/src/pages/Home_v_2504/components/SubPages/Environment/index.tsx
index 741c63188ca58c0fc6b2c702588ca5a37e888b71..bfc7f56e32c6c3809d3ebee0e883fec3b9241839 100644
--- a/src/pages/Home_v_2504/components/SubPages/Environment/index.tsx
+++ b/src/pages/Home_v_2504/components/SubPages/Environment/index.tsx
@@ -3,7 +3,7 @@ import SubPageTemplate from '../SubPageTemplate';
import { INDUSTRY_PAGE_IDS } from '@/constants/dataTypes';
// 引入业务组件
-import LeftContent from './components/LeftContent';
+import LeftContent from './components/LeftContent/LeftContent';
import RightContent from './components/RightContent';
interface EnvironmentProps {
diff --git a/src/pages/Home_v_2504/components/SubPages/RestaurantOil/index.tsx b/src/pages/Home_v_2504/components/SubPages/RestaurantOil/index.tsx
index 761c61e76e3f974a6b2409074bff74fd3733187c..b50291622dd9173c840972817422e5f6a6a8b372 100644
--- a/src/pages/Home_v_2504/components/SubPages/RestaurantOil/index.tsx
+++ b/src/pages/Home_v_2504/components/SubPages/RestaurantOil/index.tsx
@@ -1,7 +1,8 @@
import React from 'react';
import SubPageTemplate from '../SubPageTemplate';
import RightContent from './components/RightContent';
-import LeftContent from './components/LeftContent';
+// import LeftContent from './components/LeftContent';
+import LeftContent from '../Environment/components/LeftContent';
import { INDUSTRY_PAGE_IDS } from '@/constants/dataTypes';
interface RestaurantOilProps {
diff --git a/src/pages/Home_v_2504/components/common/Card/index.less b/src/pages/Home_v_2504/components/common/Card/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..c325758e334822c77bde3afd57bc2bc5bbe5b8b8
--- /dev/null
+++ b/src/pages/Home_v_2504/components/common/Card/index.less
@@ -0,0 +1,11 @@
+.workers-wrapper {
+ width: 530px;
+ min-height: 192px;
+ background: linear-gradient(180.00deg, rgba(77, 107, 178, 0.3), rgba(8, 153, 255, 0.01) 100%);
+ border-radius: 15px;
+}
+
+.content {
+ height: calc(100% - 52px);
+ padding: 0px 36px 20px 36px;
+}
\ No newline at end of file
diff --git a/src/pages/Home_v_2504/components/common/Card/index.tsx b/src/pages/Home_v_2504/components/common/Card/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8d61a0478069a88c56fca5b7ab732d92908b1a11
--- /dev/null
+++ b/src/pages/Home_v_2504/components/common/Card/index.tsx
@@ -0,0 +1,34 @@
+import React, { Children, CSSProperties, ReactNode } from 'react'
+import './index.less'
+import ModuleTitleWithTabs from '../ModuleTitleWithTabs'
+
+type CardProps ={
+ title: string,
+ extra?: ReactNode,
+ children: ReactNode,
+ style?: CSSProperties
+}
+export default function HncyCard({
+ title,
+ extra,
+ children,
+ style
+}: CardProps) {
+ return (
+
+
+
+ {extra}
+
+
+ {children}
+
+
+ )
+}