refactor: CompanyOverview 组件 TypeScript 拆分

- 新增 index.tsx: 主组件(组合层,50 行)
- 新增 CompanyHeaderCard.tsx: 头部卡片组件(168 行)
- 新增 hooks/useCompanyOverviewData.ts: 数据加载 Hook
- 删除 index.js: 原 330 行代码精简 85%
- 修复 Company/index.js: 恢复 CompanyTabs 渲染

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-12-10 11:21:02 +08:00
parent bf8847698b
commit 9a77bb6f0b
5 changed files with 378 additions and 330 deletions

View File

@@ -0,0 +1,167 @@
// src/views/Company/components/CompanyOverview/CompanyHeaderCard.tsx
// 公司头部信息卡片组件
import React from "react";
import {
VStack,
HStack,
Text,
Badge,
Card,
CardBody,
Heading,
SimpleGrid,
Divider,
Icon,
Grid,
GridItem,
Stat,
StatLabel,
StatNumber,
Circle,
Link,
} from "@chakra-ui/react";
import {
FaBuilding,
FaMapMarkerAlt,
FaUserShield,
FaBriefcase,
FaCalendarAlt,
FaGlobe,
FaEnvelope,
FaPhone,
FaCrown,
} from "react-icons/fa";
import { ExternalLinkIcon } from "@chakra-ui/icons";
import type { CompanyHeaderCardProps } from "./types";
import { formatRegisteredCapital, formatDate } from "./utils";
/**
* 公司头部信息卡片组件
*/
const CompanyHeaderCard: React.FC<CompanyHeaderCardProps> = ({ basicInfo }) => {
return (
<Card
bg="white"
shadow="lg"
borderTop="4px solid"
borderTopColor="blue.500"
>
<CardBody>
<Grid templateColumns="repeat(12, 1fr)" gap={6}>
{/* 左侧:公司基本信息 */}
<GridItem colSpan={{ base: 12, lg: 8 }}>
<VStack align="start" spacing={4}>
{/* 公司名称和代码 */}
<HStack spacing={4}>
<Circle size="60px" bg="blue.500">
<Icon as={FaBuilding} color="white" boxSize={8} />
</Circle>
<VStack align="start" spacing={1}>
<HStack>
<Heading size="lg" color="blue.600">
{basicInfo.ORGNAME || basicInfo.SECNAME}
</Heading>
<Badge colorScheme="blue" fontSize="md" px={2} py={1}>
{basicInfo.SECCODE}
</Badge>
</HStack>
<HStack spacing={2}>
<Badge colorScheme="purple" fontSize="xs">
{basicInfo.sw_industry_l1}
</Badge>
<Badge colorScheme="orange" fontSize="xs">
{basicInfo.sw_industry_l2}
</Badge>
{basicInfo.sw_industry_l3 && (
<Badge colorScheme="green" fontSize="xs">
{basicInfo.sw_industry_l3}
</Badge>
)}
</HStack>
</VStack>
</HStack>
<Divider />
{/* 管理层信息 */}
<SimpleGrid columns={{ base: 1, md: 2 }} spacing={3} w="full">
<HStack>
<Icon as={FaUserShield} color="gray.500" boxSize={4} />
<Text fontSize="sm">
<Text as="span" color="gray.500"></Text>
<Text as="span" fontWeight="bold">{basicInfo.legal_representative}</Text>
</Text>
</HStack>
<HStack>
<Icon as={FaCrown} color="gray.500" boxSize={4} />
<Text fontSize="sm">
<Text as="span" color="gray.500"></Text>
<Text as="span" fontWeight="bold">{basicInfo.chairman}</Text>
</Text>
</HStack>
<HStack>
<Icon as={FaBriefcase} color="gray.500" boxSize={4} />
<Text fontSize="sm">
<Text as="span" color="gray.500"></Text>
<Text as="span" fontWeight="bold">{basicInfo.general_manager}</Text>
</Text>
</HStack>
<HStack>
<Icon as={FaCalendarAlt} color="gray.500" boxSize={4} />
<Text fontSize="sm">
<Text as="span" color="gray.500"></Text>
<Text as="span" fontWeight="bold">{formatDate(basicInfo.establish_date)}</Text>
</Text>
</HStack>
</SimpleGrid>
{/* 公司简介 */}
<Text fontSize="sm" color="gray.600" noOfLines={2}>
{basicInfo.company_intro}
</Text>
</VStack>
</GridItem>
{/* 右侧:注册资本和联系方式 */}
<GridItem colSpan={{ base: 12, lg: 4 }}>
<VStack spacing={3} align="stretch">
<Stat>
<StatLabel></StatLabel>
<StatNumber fontSize="2xl" color="blue.500">
{formatRegisteredCapital(basicInfo.reg_capital)}
</StatNumber>
</Stat>
<Divider />
<VStack align="stretch" spacing={1}>
<HStack fontSize="sm">
<Icon as={FaMapMarkerAlt} color="gray.500" boxSize={3} />
<Text noOfLines={1}>{basicInfo.province} {basicInfo.city}</Text>
</HStack>
<HStack fontSize="sm">
<Icon as={FaGlobe} color="gray.500" boxSize={3} />
<Link href={basicInfo.website} isExternal color="blue.500" noOfLines={1}>
{basicInfo.website} <ExternalLinkIcon mx="2px" />
</Link>
</HStack>
<HStack fontSize="sm">
<Icon as={FaEnvelope} color="gray.500" boxSize={3} />
<Text noOfLines={1}>{basicInfo.email}</Text>
</HStack>
<HStack fontSize="sm">
<Icon as={FaPhone} color="gray.500" boxSize={3} />
<Text>{basicInfo.tel}</Text>
</HStack>
</VStack>
</VStack>
</GridItem>
</Grid>
</CardBody>
</Card>
);
};
export default CompanyHeaderCard;