|
|
|
@ -1,13 +1,10 @@
|
|
|
|
import React, { useEffect, useRef } from 'react';
|
|
|
|
import React, { useEffect, useRef } from 'react';
|
|
|
|
import { Card, Input, Select, Button, Table, Tag, Space, Typography } from 'antd';
|
|
|
|
import { Card, Table, Tag, Space, Typography, Progress, Row, Col, Button } from 'antd';
|
|
|
|
import { SearchOutlined, PlusOutlined } from '@ant-design/icons';
|
|
|
|
|
|
|
|
import * as echarts from 'echarts';
|
|
|
|
import * as echarts from 'echarts';
|
|
|
|
import styles from './LicenseManagement.less';
|
|
|
|
import styles from './LicenseManagement.less';
|
|
|
|
import icon_echart from '@/assets/business_basic/icon_echart.svg';
|
|
|
|
import icon_echart from '@/assets/business_basic/icon_echart.svg';
|
|
|
|
|
|
|
|
|
|
|
|
const { Title } = Typography;
|
|
|
|
const { Title } = Typography;
|
|
|
|
const { Search } = Input;
|
|
|
|
|
|
|
|
const { Option } = Select;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const LicenseManagement = () => {
|
|
|
|
const LicenseManagement = () => {
|
|
|
|
const chartRef = useRef(null);
|
|
|
|
const chartRef = useRef(null);
|
|
|
|
@ -26,7 +23,7 @@ const LicenseManagement = () => {
|
|
|
|
useEffect(() => {
|
|
|
|
useEffect(() => {
|
|
|
|
if (chartRef.current) {
|
|
|
|
if (chartRef.current) {
|
|
|
|
const chart = echarts.init(chartRef.current);
|
|
|
|
const chart = echarts.init(chartRef.current);
|
|
|
|
|
|
|
|
|
|
|
|
const option = {
|
|
|
|
const option = {
|
|
|
|
tooltip: {
|
|
|
|
tooltip: {
|
|
|
|
trigger: 'item',
|
|
|
|
trigger: 'item',
|
|
|
|
@ -204,8 +201,8 @@ const LicenseManagement = () => {
|
|
|
|
key: 'status',
|
|
|
|
key: 'status',
|
|
|
|
width: 120,
|
|
|
|
width: 120,
|
|
|
|
render: (text, record) => (
|
|
|
|
render: (text, record) => (
|
|
|
|
<Tag color={record.statusType === 'success' ? 'green' :
|
|
|
|
<Tag color={record.statusType === 'success' ? 'green' :
|
|
|
|
record.statusType === 'warning' ? 'orange' : 'red'}>
|
|
|
|
record.statusType === 'warning' ? 'orange' : 'red'}>
|
|
|
|
{text}
|
|
|
|
{text}
|
|
|
|
</Tag>
|
|
|
|
</Tag>
|
|
|
|
),
|
|
|
|
),
|
|
|
|
@ -226,59 +223,176 @@ const LicenseManagement = () => {
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
return (
|
|
|
|
<div className={styles.licenseManagementContainer}>
|
|
|
|
<div className={styles.licenseManagementContainer}>
|
|
|
|
<div className={styles.topSectionContainer}>
|
|
|
|
<div className={styles.topSectionContainer}>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.firstBlock}>
|
|
|
|
|
|
|
|
<div className={styles.chartHeader}>
|
|
|
|
|
|
|
|
<div className={styles.colorBlock}></div>
|
|
|
|
|
|
|
|
<span className={styles.chartTitle}>证件类型分布</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.chartContainer}>
|
|
|
|
|
|
|
|
<div ref={chartRef} className={styles.chart}></div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.firstBlock}>
|
|
|
|
<div className={styles.secondBlock}>
|
|
|
|
<div className={styles.chartHeader}>
|
|
|
|
<div className={styles.chartHeader}>
|
|
|
|
<div className={styles.colorBlock}></div>
|
|
|
|
<div className={styles.colorBlock}></div>
|
|
|
|
<span className={styles.chartTitle}>证件类型分布</span>
|
|
|
|
<span className={styles.chartTitle}>证件类型分布</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className={styles.chartContainer}>
|
|
|
|
<div className={styles.chartContainer}>
|
|
|
|
<div ref={chartRef} className={styles.chart}></div>
|
|
|
|
{/* 上半部分:进度条和百分比 */}
|
|
|
|
|
|
|
|
<div className={styles.progressSection}>
|
|
|
|
|
|
|
|
<div className={styles.progressItem}>
|
|
|
|
|
|
|
|
<div className={styles.progressLabel}>有效证照</div>
|
|
|
|
|
|
|
|
<div className={styles.progressWrapper}>
|
|
|
|
|
|
|
|
<Progress
|
|
|
|
|
|
|
|
percent={50}
|
|
|
|
|
|
|
|
strokeColor="#3C7DFF"
|
|
|
|
|
|
|
|
trailColor="#F0F0F0"
|
|
|
|
|
|
|
|
showInfo={false}
|
|
|
|
|
|
|
|
className={styles.customProgress}
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
<span className={styles.progressPercent}>50%</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.progressItem}>
|
|
|
|
|
|
|
|
<div className={styles.progressLabel}>即将到期</div>
|
|
|
|
|
|
|
|
<div className={styles.progressWrapper}>
|
|
|
|
|
|
|
|
<Progress
|
|
|
|
|
|
|
|
percent={15}
|
|
|
|
|
|
|
|
strokeColor="#FFC403"
|
|
|
|
|
|
|
|
trailColor="#F0F0F0"
|
|
|
|
|
|
|
|
showInfo={false}
|
|
|
|
|
|
|
|
className={styles.customProgress}
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
<span className={styles.progressPercent}>15%</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.progressItem}>
|
|
|
|
|
|
|
|
<div className={styles.progressLabel}>已过期</div>
|
|
|
|
|
|
|
|
<div className={styles.progressWrapper}>
|
|
|
|
|
|
|
|
<Progress
|
|
|
|
|
|
|
|
percent={20}
|
|
|
|
|
|
|
|
strokeColor="#FF3E48"
|
|
|
|
|
|
|
|
trailColor="#F0F0F0"
|
|
|
|
|
|
|
|
showInfo={false}
|
|
|
|
|
|
|
|
className={styles.customProgress}
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
<span className={styles.progressPercent}>20%</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.progressItem}>
|
|
|
|
|
|
|
|
<div className={styles.progressLabel}>待审核材料</div>
|
|
|
|
|
|
|
|
<div className={styles.progressWrapper}>
|
|
|
|
|
|
|
|
<Progress
|
|
|
|
|
|
|
|
percent={15}
|
|
|
|
|
|
|
|
strokeColor="#FF8800"
|
|
|
|
|
|
|
|
trailColor="#F0F0F0"
|
|
|
|
|
|
|
|
showInfo={false}
|
|
|
|
|
|
|
|
className={styles.customProgress}
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
<span className={styles.progressPercent}>15%</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{/* 下半部分:数字统计 */}
|
|
|
|
|
|
|
|
<div className={styles.statsSection}>
|
|
|
|
|
|
|
|
<Row gutter={[16, 16]}>
|
|
|
|
|
|
|
|
<Col span={6}>
|
|
|
|
|
|
|
|
<div className={styles.statItem}>
|
|
|
|
|
|
|
|
<div className={styles.statNumber} style={{color: '#3C7DFF'}}>42</div>
|
|
|
|
|
|
|
|
<div className={styles.statLabel}>总证照数</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</Col>
|
|
|
|
|
|
|
|
<Col span={6}>
|
|
|
|
|
|
|
|
<div className={styles.statItem}>
|
|
|
|
|
|
|
|
<div className={styles.statNumber} style={{color: '#FFC403'}}>8</div>
|
|
|
|
|
|
|
|
<div className={styles.statLabel}>即将过期</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</Col>
|
|
|
|
|
|
|
|
<Col span={6}>
|
|
|
|
|
|
|
|
<div className={styles.statItem}>
|
|
|
|
|
|
|
|
<div className={styles.statNumber} style={{color: '#FF3E48'}}>6</div>
|
|
|
|
|
|
|
|
<div className={styles.statLabel}>已过期</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</Col>
|
|
|
|
|
|
|
|
<Col span={6}>
|
|
|
|
|
|
|
|
<div className={styles.statItem}>
|
|
|
|
|
|
|
|
<div className={styles.statNumber} style={{color: '#FF8800'}}>6</div>
|
|
|
|
|
|
|
|
<div className={styles.statLabel}>待审核材料</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</Col>
|
|
|
|
|
|
|
|
</Row>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.secondBlock}>
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.thirdBlock}>
|
|
|
|
<div className={styles.chartHeader}>
|
|
|
|
<div className={styles.chartHeader}>
|
|
|
|
<div className={styles.colorBlock}></div>
|
|
|
|
<div className={styles.colorBlock}></div>
|
|
|
|
<span className={styles.chartTitle}>证件类型分布</span>
|
|
|
|
<span className={styles.chartTitle}>临期预警</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className={styles.chartContainer}>
|
|
|
|
<div className={styles.chartContainer}>
|
|
|
|
需求
|
|
|
|
{/* 透明块容器 */}
|
|
|
|
|
|
|
|
<div className={styles.transparentBlock}>
|
|
|
|
|
|
|
|
{/* 四个垂直分布的卡片 */}
|
|
|
|
|
|
|
|
<div className={styles.licenseCard}>
|
|
|
|
|
|
|
|
<div className={styles.cardContent}>
|
|
|
|
|
|
|
|
<div className={styles.licenseName}>安全生产许可证</div>
|
|
|
|
|
|
|
|
<div className={styles.licenseNumber}>编号: AQXK-2023-0582</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.expiryTag}>
|
|
|
|
|
|
|
|
<span className={styles.expiryText}>15天后到期</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.licenseCard}>
|
|
|
|
|
|
|
|
<div className={styles.cardContent}>
|
|
|
|
|
|
|
|
<div className={styles.licenseName}>安全评估报告</div>
|
|
|
|
|
|
|
|
<div className={styles.licenseNumber}>编号: AQPG-2023-0125</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.expiryTag}>
|
|
|
|
|
|
|
|
<span className={styles.expiryText}>30天后到期</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.licenseCard}>
|
|
|
|
|
|
|
|
<div className={styles.cardContent}>
|
|
|
|
|
|
|
|
<div className={styles.licenseName}>施工资质证书</div>
|
|
|
|
|
|
|
|
<div className={styles.licenseNumber}>编号: SGZZ-2023-0089</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.expiryTag} style={{backgroundColor: '#FFE0E2'}}>
|
|
|
|
|
|
|
|
<span className={styles.expiryText} style={{color: '#FF2526'}}>7天后到期</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.licenseCard}>
|
|
|
|
|
|
|
|
<div className={styles.cardContent}>
|
|
|
|
|
|
|
|
<div className={styles.licenseName}>应急预案</div>
|
|
|
|
|
|
|
|
<div className={styles.licenseNumber}>编号: YJYA-2023-0045</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className={styles.expiryTag} style={{backgroundColor: '#FFE0E2'}}>
|
|
|
|
|
|
|
|
<span className={styles.expiryText} style={{color: '#FF2526'}}>4天后到期</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className={styles.thirdBlock}>
|
|
|
|
|
|
|
|
待开发
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{/* 证照列表区域 */}
|
|
|
|
{/* 证照列表区域 */}
|
|
|
|
<Card className={styles.listCard}>
|
|
|
|
<div className={styles.listCard}>
|
|
|
|
<Title level={4} className={styles.listTitle}>证照列表</Title>
|
|
|
|
<div className={styles.chartHeader}>
|
|
|
|
<div className={styles.listToolbar}>
|
|
|
|
<div className={styles.colorBlock}></div>
|
|
|
|
<Search
|
|
|
|
<span className={styles.chartTitle}>证照列表</span>
|
|
|
|
placeholder="搜索证照名称或编号..."
|
|
|
|
|
|
|
|
className={styles.searchInput}
|
|
|
|
|
|
|
|
prefix={<SearchOutlined />}
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
<Select
|
|
|
|
|
|
|
|
defaultValue="all"
|
|
|
|
|
|
|
|
className={styles.typeFilter}
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<Option value="all">全部类型</Option>
|
|
|
|
|
|
|
|
<Option value="qualification">资质证书</Option>
|
|
|
|
|
|
|
|
<Option value="safety">安全三同时</Option>
|
|
|
|
|
|
|
|
<Option value="emergency">应急预案</Option>
|
|
|
|
|
|
|
|
</Select>
|
|
|
|
|
|
|
|
<Button type="primary" icon={<PlusOutlined />} className={styles.addButton}>
|
|
|
|
|
|
|
|
新增证照
|
|
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Table
|
|
|
|
<Table
|
|
|
|
columns={columns}
|
|
|
|
columns={columns}
|
|
|
|
@ -293,7 +407,7 @@ const LicenseManagement = () => {
|
|
|
|
}}
|
|
|
|
}}
|
|
|
|
className={styles.licenseTable}
|
|
|
|
className={styles.licenseTable}
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</Card>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|