Files
fe_service_ebtp_frontend/src/pages/PartyMemberTopic/Home/index.tsx

534 lines
24 KiB
TypeScript
Raw Normal View History

2022-06-26 10:42:10 +08:00
import React, { useEffect, useRef, useState } from 'react';
2022-06-23 08:42:54 +08:00
import './index.less';
2022-06-27 15:22:15 +08:00
import { Button, Carousel, Col, Divider, Input, List, message, Modal, Radio, RadioChangeEvent, Row, Spin, Tooltip } from 'antd';
2022-06-23 08:42:54 +08:00
import * as echarts from 'echarts';
2022-06-26 10:42:10 +08:00
import Marquee from 'react-fast-marquee';
2022-06-23 08:42:54 +08:00
import topic_header from '@/assets/topic/topic_header.jpg'
import topic_activity_logo from '@/assets/topic/topic_activity_logo.png'
import topic_red_flag from '@/assets/topic/topic_red_flag.png'
import topic_other from '@/assets/topic/topic_other.png'
import topic_project_picture from '@/assets/topic/topic_project_picture.jpg'
import topic_bottom_button from '@/assets/topic/topic_bottom_button.png'
import topic_right_material from '@/assets/topic/topic_right_material.png'
import topic_partymember from '@/assets/topic/topic_partymember.png'
import topic_partybranch from '@/assets/topic/topic_partybranch.png'
import topic_totalamount from '@/assets/topic/topic_totalamount.png'
import topic_totalnumber from '@/assets/topic/topic_totalnumber.png'
import topic_commodity from '@/assets/topic/topic_commodity.png'
import topic_protocol from '@/assets/topic/topic_protocol.png'
2022-06-26 10:42:10 +08:00
import topic_header_img from '@/assets/topic/topic_header_img.png'
2022-06-27 15:22:15 +08:00
import topic_banner_default from '@/assets/topic/topic_banner_default.jpg'
import topic_activity_default from '@/assets/topic/topic_activity_default.jpg'
2022-06-26 10:42:10 +08:00
import { getHomeActivity, getHomeBanner, getHomeContact, getHomeGraceful, getHomeProject, getHomeRight, submitAdvice } from './service';
2022-06-28 16:48:36 +08:00
import { formatTime, getImageUrl, isEmpty, isNotEmpty } from '../utils';
2022-06-23 08:42:54 +08:00
2022-06-28 16:48:36 +08:00
//卡片头
2022-06-23 08:42:54 +08:00
const LeftCardTop = (props: any) => {
return (
<>
<div className='left-card-top'>
<div>
<span className='left-card-title'>{props.title}</span>
<img src={topic_red_flag} className='left-card-flag' />
</div>
2022-06-27 15:22:15 +08:00
{props.url && <div onClick={() => window.open(props.url)}>
2022-06-23 08:42:54 +08:00
<span className='left-card-other'></span>
<img src={topic_other} className='left-card-otherimg' />
2022-06-27 15:22:15 +08:00
</div>}
2022-06-23 08:42:54 +08:00
</div>
<Divider className='left-card-divider' />
</>
)
}
2022-06-28 16:48:36 +08:00
//右侧专业线标题
2022-06-23 08:42:54 +08:00
const RightDisplayTitle = (props: any) => {
return (
<div className='right-display-title'>
{props.title}
</div>
)
}
2022-06-28 16:48:36 +08:00
//右侧专业线内容
2022-06-23 08:42:54 +08:00
const RightDisplayContent = (props: any) => {
2022-06-28 16:48:36 +08:00
const displayContentClick = () => {
2022-07-01 10:43:11 +08:00
if (props.index == 0 || props.index == 1) {//党员数量 //党支部数量
2022-06-28 16:48:36 +08:00
window.open("/partyMemberTopic/partyBranch");
}
}
2022-06-23 08:42:54 +08:00
return (
2022-06-26 10:42:10 +08:00
props.data?.length > 0 ? (
2022-06-28 16:48:36 +08:00
<div className={props.index == 0 || props.index == 1 ? 'right-display-content right-display-content-pointer' : 'right-display-content'} onClick={() => displayContentClick()}>
2022-06-26 10:42:10 +08:00
<img src={props.img} className='right-display-content-img' />
<div className='right-display-content-right'>
<div className='right-display-content-title'>
<span>{props.data[props.index].dataName}</span>
2022-07-01 10:43:11 +08:00
{/* {props.data[props.index].dataCompare != null && <span className='right-display-content-percentage'>
2022-06-26 10:42:10 +08:00
<span></span>
{props.data[props.index].dataCompare[0] == '+' ? (
<span className='right-display-content-percentage-increase'>{props.data[props.index].dataCompare} </span>
) : (
<span className='right-display-content-percentage-reduce'>{props.data[props.index].dataCompare} </span>
)}
2022-07-01 10:43:11 +08:00
</span>} */}
2022-06-26 10:42:10 +08:00
</div>
<div className='right-display-content-content'>
<span className={`right-display-content-number ${props.color}`}>{props.data[props.index].dataValue}</span>
<span className='right-display-content-unit'>{props.data[props.index].dataType}</span>
</div>
2022-06-23 08:42:54 +08:00
</div>
</div>
2022-06-26 10:42:10 +08:00
) : null
2022-06-23 08:42:54 +08:00
)
}
2022-06-28 16:48:36 +08:00
//右侧图表内容
2022-06-23 08:42:54 +08:00
const RightGraphContent = (props: any) => {
const random = Math.random().toString();
useEffect(() => {
type EChartsOption = echarts.EChartsOption;
const chartDom = document.getElementById(random)!;
const myChart = echarts.init(chartDom);
const option: EChartsOption = {
tooltip: {
trigger: 'item'
},
series: [
{
name: props.name,
type: 'pie',
radius: '90%',
2022-06-26 10:42:10 +08:00
color: ['#EE6666', '#FAC858', '#73C0DE', '#91CC75', '#5470C6', '#FC8452', '#9A60B4', '#3BA272'],
2022-06-23 08:42:54 +08:00
data: props.data,
label: {
2022-06-26 10:42:10 +08:00
formatter: props.type != null ? `{b}\n\n{c}${props.type} {d}%` : '{b}',
2022-06-28 16:48:36 +08:00
fontSize: '90%',
2022-06-23 08:42:54 +08:00
color: '#fff',
position: 'inner',
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myChart.setOption(option);
}, [])
return (
<div id={random} style={{ width: '100%', height: '100%' }}></div>
)
}
2022-06-28 16:48:36 +08:00
//活动联系人卡片内容
2022-06-26 10:42:10 +08:00
const BottomCardContent = (props: any) => {
2022-06-23 08:42:54 +08:00
2022-06-26 10:42:10 +08:00
return (
<Col span={6}>
<div className='bottom-card'>
<div className='bottom-card-flex'>
<div className='bottom-card-title'>
2022-06-29 11:21:02 +08:00
<span>{props.data.contactName}</span>
2022-06-26 10:42:10 +08:00
</div>
<img src={topic_bottom_button} onClick={() => props.onClick()} />
</div>
2022-06-29 11:21:02 +08:00
<div className='bottom-card-remark'>
<Tooltip placement="topLeft" title={props.data.remark}>
<span className='bottom-card-remark-text'>{props.data.remark}</span>
</Tooltip>
</div>
2022-06-26 10:42:10 +08:00
<div className='bottom-card-content'>
<div>{props.data.contactEmail}</div>
<div>{props.data.contactMobiphone}</div>
<div>{props.data.contactDepartment}</div>
</div>
</div>
</Col>
)
}
2022-06-28 16:48:36 +08:00
//活动联系人-我要提意见Modal
2022-06-26 10:42:10 +08:00
const CommentModal = (props: any) => {
const { TextArea } = Input;
const [modalLoading, setModalLoading] = useState<boolean>(false);
const textRef = useRef<any>(null);
const radioRef = useRef<any>(null);
2022-06-23 08:42:54 +08:00
2022-06-26 10:42:10 +08:00
const onRadioChange = (e: RadioChangeEvent) => {
radioRef.current = e.target.value;
};
2022-06-23 08:42:54 +08:00
2022-06-26 10:42:10 +08:00
const onTextChange = (e: any) => {
textRef.current = e.target.value;
};
const onCancel = () => {
props.closeModal();
textRef.current = null;
radioRef.current = null;
}
const onSubmit = async () => {
2022-06-28 16:48:36 +08:00
if (isEmpty(textRef.current)) {
2022-06-27 09:12:56 +08:00
message.info("请先输入意见内容");
return;
}
2022-06-26 10:42:10 +08:00
setModalLoading(true);
const params = {
contactName: props.data?.contactName,
contactId: props.data?.contactId,
suggestionType: radioRef.current,
suggestionContent: textRef.current,
}
await submitAdvice(params).then(res => {
if (res?.code == 200) {
message.success("提交成功");
onCancel();
}
}).finally(() => {
setModalLoading(false);
})
}
return (
<Modal
className='topic-home-modal'
title={
<div className='bottom-modal-header'>
<img src={topic_header_img} />
<div className='bottom-modal-headertext'>
<span></span>
</div>
</div>
}
visible={props.visible}
onCancel={onCancel}
destroyOnClose
closable={false}
footer={null}
centered
maskStyle={{ backgroundColor: 'rgba(0, 0, 0, 0.3)' }}
2022-06-28 16:48:36 +08:00
width={450}
2022-06-26 10:42:10 +08:00
>
<Spin spinning={modalLoading}>
<div className='bottom-modal-body'>
<div className='radio-group'>
<Radio.Group onChange={onRadioChange} defaultValue={"1"}>
2022-07-01 10:43:11 +08:00
<Radio value="网络运营" className="radio-content"></Radio>
<Radio value="IT" className="radio-content">IT</Radio>
<Radio value="市场" className="radio-content"></Radio>
<Radio value="综合行政" className="radio-content"></Radio>
<Radio value="其他" className="radio-content"></Radio>
2022-06-26 10:42:10 +08:00
</Radio.Group>
</div>
<TextArea
2022-06-28 16:48:36 +08:00
rows={11}
2022-06-26 10:42:10 +08:00
className='bottom-modal-textarea'
2022-06-27 15:22:15 +08:00
maxLength={50}
2022-06-26 10:42:10 +08:00
defaultValue={''}
onChange={onTextChange}
2022-06-28 16:48:36 +08:00
placeholder="在这里输入我要提出的意见最多输入50字"
2022-06-26 10:42:10 +08:00
/>
<div className='bottom-modal-submit'>
<span className='submit-text'>{props.data?.contactDepartment}{props.data?.contactName}</span>
2022-06-28 16:48:36 +08:00
<div>
<Button className='submit-cancelbutton' onClick={onCancel}>
</Button>
<Button type='primary' className='submit-button' onClick={onSubmit}>
</Button>
</div>
2022-06-26 10:42:10 +08:00
</div>
</div>
</Spin>
</Modal>
)
}
2022-06-23 08:42:54 +08:00
const Home: React.FC<{}> = () => {
2022-06-26 10:42:10 +08:00
//banner data
const [bannerList, setBannerList] = useState<any[]>([]);
//graceful data
const [gracefulList, setGracefulList] = useState<any[]>([]);
//activity data
const [activityList, setActivityList] = useState<any[]>([]);
//project data
const [projectList, setProjectList] = useState<any[]>([]);
//right data
const [rightList, setRightList] = useState<any[]>([]);
//right data
const [rightGraphList, setRightGraphList] = useState<any[]>([]);
2022-06-27 15:22:15 +08:00
//right local data
const [contactData, setContactData] = useState<any[]>([]);
//right total data
const totalContactData = useRef<any>(null);
2022-06-26 10:42:10 +08:00
//bottom advice modalvisible
const [adviceVisible, setAdviceVisible] = useState<boolean>(false);
//bottom advice modal data
const [adviceItemData, setAdviceItemData] = useState<Object>({});
const openModal = (item: any) => {
setAdviceItemData(item);
setAdviceVisible(true);
}
const closeModal = () => {
setAdviceVisible(false);
setAdviceItemData({});
}
//get banner
const getBannerList = () => {
getHomeBanner().then(async res => {
if (res?.code == 200) {
2022-06-27 15:22:15 +08:00
const data = await getImageUrl(res?.data, 'titleImage', topic_banner_default);
2022-06-26 10:42:10 +08:00
setBannerList(data);
}
})
}
//get activity
const getActivityList = () => {
getHomeActivity().then(res => {
if (res?.code == 200) {
setActivityList(res?.data);
}
})
}
//get graceful
const getGracefulList = () => {
getHomeGraceful().then(async res => {
if (res?.code == 200) {
let data: any[] = [];
if (res?.data.length > 6) {
2022-06-27 15:22:15 +08:00
data = await getImageUrl(res?.data.slice(0, 6), 'image', topic_activity_default);
2022-06-26 10:42:10 +08:00
} else {
2022-06-27 15:22:15 +08:00
data = await getImageUrl(res?.data, 'image', topic_activity_default);
2022-06-26 10:42:10 +08:00
}
setGracefulList(data);
}
})
}
//get project
const getProjectList = () => {
getHomeProject().then(res => {
if (res?.code == 200) {
let data: any[] = [];
if (res?.data.length > 12) {
data = res?.data.slice(0, 12);
} else {
data = res?.data;
}
setProjectList(data);
}
})
}
//get right
const getRightList = () => {
getHomeRight().then(res => {
if (res?.code == 200) {
if (res?.data.length > 0) {
setRightList(res?.data.slice(0, 6));
setRightGraphList(res?.data.slice(6, 9));
}
}
})
}
//get contact
const getContactList = () => {
getHomeContact().then(res => {
if (res?.code == 200) {
2022-06-27 15:22:15 +08:00
const data = Object.entries(res?.data);
if (data.length > 3) {
2022-06-28 16:48:36 +08:00
setContactData(data.slice(0, 3));
2022-06-27 15:22:15 +08:00
totalContactData.current = data;
} else {
setContactData(data);
}
2022-06-26 10:42:10 +08:00
}
})
}
2022-06-27 09:12:56 +08:00
//to hard project
const hardProjectClick = (data: any) => {
sessionStorage.setItem("detailData", JSON.stringify(data));
window.open("/partyMemberTopic/hardDetail");
}
//to hard project
const newsDetailClick = (data: any) => {
sessionStorage.setItem("detailData", JSON.stringify(data));
window.open("/partyMemberTopic/newsDetail");
}
2022-06-28 16:48:36 +08:00
//other buttom onclick
const bottomOtherClick = (param: string) => {
if (param == '0') {
setContactData([...totalContactData.current]);
} else {
setContactData([...totalContactData.current.slice(0, 3)]);
}
}
2022-06-26 10:42:10 +08:00
useEffect(() => {
getBannerList();
getGracefulList();
getActivityList();
getProjectList();
getRightList();
getContactList();
}, [])
2022-06-23 08:42:54 +08:00
return (
<div className="topic-global">
<div className="topic-background">
<div className="top-picture">
<img src={topic_header} />
</div>
<div className="top-global">
<div className='left-global'>
2022-06-26 10:42:10 +08:00
<Carousel className='left-carousel' autoplay>
{bannerList?.length > 0 && bannerList.map(item => (
<div key={item.id}>
2022-06-28 16:48:36 +08:00
<div className='carousel-content' style={{ backgroundImage: `url(${item.imageUrl})` }} onClick={() => newsDetailClick(item)}>
2022-06-26 10:42:10 +08:00
<div className='carousel-textbg'>
<div className='carousel-text'>
<span className='carousel-text-content'>{item.imageWord}</span>
2022-06-28 16:48:36 +08:00
<span className='carousel-text-click'></span>
2022-06-26 10:42:10 +08:00
</div>
</div>
</div>
</div>
))}
2022-06-23 08:42:54 +08:00
</Carousel>
<div className='left-activity'>
<img src={topic_activity_logo} />
2022-06-26 10:42:10 +08:00
<div className='left-activity-marquee'>
<Marquee pauseOnHover gradient={false}>
<div className='left-activity-scroll'>
{activityList.length > 0 && activityList.map((item, index) => (
index % 2 == 0 && <div className='left-activity-scroll-content' key={index}>
<div>
<span className='left-activity-scroll-name'>{item.name}</span>
<span>{item.text}</span>
</div>
2022-06-27 15:22:15 +08:00
{(index != activityList.length - 1) && (
2022-06-26 10:42:10 +08:00
<div className='left-activity-scroll-end'>
2022-06-27 15:22:15 +08:00
<span className='left-activity-scroll-name'>{activityList[index + 1]?.name}</span>
<span>{activityList[index + 1]?.text}</span>
2022-06-26 10:42:10 +08:00
</div>
)}
</div>
))}
</div>
</Marquee>
</div>
2022-06-23 08:42:54 +08:00
</div>
<div className='left-card'>
<div className='left-graceful'>
2022-06-27 09:12:56 +08:00
<LeftCardTop title="活动风采" url="/partyMemberTopic/activityStyle" />
2022-06-23 08:42:54 +08:00
<div>
<Row gutter={[20, 31]}>
2022-06-26 10:42:10 +08:00
{gracefulList?.length > 0 && gracefulList.map((item, index) => (
2022-06-23 08:42:54 +08:00
<Col span={8} key={index}>
2022-06-27 09:12:56 +08:00
<div className='left-graceful-bg' style={{ backgroundImage: `url(${item.imageUrl})` }} onClick={() => newsDetailClick(item)}>
2022-06-23 08:42:54 +08:00
<div className='left-graceful-textbg'>
2022-06-28 16:48:36 +08:00
<span className='left-graceful-text'>{item.title}</span>
2022-06-23 08:42:54 +08:00
</div>
</div>
</Col>
))}
</Row>
</div>
</div>
<div className='left-project'>
2022-06-27 09:12:56 +08:00
<LeftCardTop title="攻坚克难项目" url="/partyMemberTopic/overDifficult" />
2022-06-23 08:42:54 +08:00
<div className='left-project-content'>
<img src={topic_project_picture} />
<div className='left-project-content-list'>
<List
size='small'
split={false}
2022-06-26 10:42:10 +08:00
dataSource={projectList}
2022-06-23 08:42:54 +08:00
renderItem={item => (
<List.Item>
<div className='left-project-content-item'>
2022-06-27 09:12:56 +08:00
<a onClick={() => hardProjectClick(item)} className='left-project-content-item-title'>{item.title}</a>
<span className='left-project-content-item-time'>{formatTime(item.createTime, 'MM-DD HH:mm')}</span>
2022-06-23 08:42:54 +08:00
</div>
</List.Item>
)}
>
</List>
</div>
</div>
</div>
</div>
</div>
<div className='right-global'>
<div>
2022-06-27 09:12:56 +08:00
<img src={topic_right_material} className='right-material' onClick={() => window.open("/partyMemberTopic/partyBranch")} />
2022-06-23 08:42:54 +08:00
</div>
<div className='right-display'>
<RightDisplayTitle title="党员及支部数量情况" />
2022-06-26 10:42:10 +08:00
<RightDisplayContent index={1} data={rightList} img={topic_partybranch} color="number-blue" />
2022-07-01 10:43:11 +08:00
<RightDisplayContent index={0} data={rightList} img={topic_partymember} color="number-blue" />
2022-06-23 08:42:54 +08:00
</div>
<Divider className='right-divider' />
<div className='right-display'>
<RightDisplayTitle title="2022年订单交易情况" />
2022-06-26 10:42:10 +08:00
<RightDisplayContent index={2} data={rightList} img={topic_totalamount} color="number-orange" />
<RightDisplayContent index={3} data={rightList} img={topic_totalnumber} color="number-orange" />
<RightDisplayContent index={4} data={rightList} img={topic_commodity} color="number-orange" />
<RightDisplayContent index={5} data={rightList} img={topic_protocol} color="number-orange" />
2022-06-23 08:42:54 +08:00
</div>
<Divider className='right-divider' />
2022-06-26 10:42:10 +08:00
{rightGraphList.length > 0 && rightGraphList.map(item => (
<div className='right-graph' key={item.dataClass}>
2022-06-23 08:42:54 +08:00
<div className='right-graph-title'>
2022-06-26 10:42:10 +08:00
{item.dataClass}
2022-06-23 08:42:54 +08:00
</div>
<div className='right-graph-subtitle'>
2022-06-28 16:48:36 +08:00
{isNotEmpty(item.dataName) && `${item.dataName}${item.dataValue}${item.dataType}`}
2022-06-23 08:42:54 +08:00
</div>
<div className='right-graph-content'>
2022-06-26 10:42:10 +08:00
<RightGraphContent name={item.dataClass} type={item.dataType} data={item.data} />
2022-06-23 08:42:54 +08:00
</div>
</div>
))}
</div>
</div>
<div className='bottom-global'>
2022-07-01 10:43:11 +08:00
<LeftCardTop title="我要提意见" />
2022-06-27 15:22:15 +08:00
{contactData.length > 0 && contactData.map(([name, value], index) => (
2022-06-26 10:42:10 +08:00
<div key={index}>
<div className='bottom-title'>{name}</div>
2022-06-23 08:42:54 +08:00
<div className='bottom-content'>
<Row gutter={[20, 20]}>
2022-06-26 10:42:10 +08:00
{value.map((item: any) => (
2022-06-27 09:12:56 +08:00
<BottomCardContent data={item} onClick={() => openModal(item)} key={item.id} />
2022-06-23 08:42:54 +08:00
))}
</Row>
</div>
</div>
))}
2022-06-28 16:48:36 +08:00
{contactData.length != 0 && contactData.length > 2 && (
2022-06-27 15:22:15 +08:00
<div className='bottom-other'>
<div>
2022-06-28 16:48:36 +08:00
<span className='bottom-other-text' onClick={() => bottomOtherClick(contactData.length > 3 ? '1' : '0')}>{contactData.length > 3 ? '收起' : '更多'}</span>
<img src={topic_other} className={contactData.length > 3 ? 'bottom-close-icon' : 'bottom-other-icon'} />
2022-06-27 15:22:15 +08:00
</div>
2022-06-23 08:42:54 +08:00
</div>
2022-06-27 15:22:15 +08:00
)}
2022-06-23 08:42:54 +08:00
</div>
2022-06-26 10:42:10 +08:00
<CommentModal visible={adviceVisible} closeModal={() => closeModal()} data={adviceItemData} />
2022-06-23 08:42:54 +08:00
</div>
</div>
);
};
2022-06-26 10:42:10 +08:00
export default Home;