Files
fe_service_ebtp_frontend/src/components/Promenu/index.tsx
2022-07-20 10:35:04 +08:00

327 lines
12 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useEffect, useState } from 'react';
import { makeStyles, Theme } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Tabs from '@material-ui/core/Tabs';
import { PageHeader, Button, message, Steps, Space, Card, Dropdown, Menu } from 'antd';
import { Link, history } from 'umi';
import './index.less';
import { getReadInfo, menuList, updateReadStatus } from './service/service';
import { getProName, getSessionRoleData, getProTypeCode, getDefId, getPurchaseCanOperate, getReturnURL, getProId, getProMethod } from '@/utils/session';
import { Step, StepButton, StepLabel, Stepper, Toolbar, Popover, Typography } from '@material-ui/core';
import { isEmpty } from '@/utils/CommonUtils';
import { CustomerServiceTwoTone } from '@ant-design/icons';
const useStyles = makeStyles((theme: Theme) => ({
root: {
flexGrow: 1,
width: '100%',
backgroundColor: theme.palette.background.paper,
},
popover: {
pointerEvents: 'none',
},
paper: {
padding: theme.spacing(1),
},
}));
function getUrlRelativePath() {
let url = document.location.toString();
let arrUrl = url.split("//");
let start = arrUrl[1].indexOf("/");
let relUrl = arrUrl[1].substring(start);
return relUrl;
}
const Promenu: React.FC<{}> = () => {
//获取采购方式
const MethodDict = getProMethod();
const classes = useStyles();
//流程数据
const [data, setData] = React.useState<any>([]);
//角色
const randerRole = getSessionRoleData().roleCode;
//总步骤条数
const [progress, setProgress] = useState<any>();
//当前步骤条数
const [current, setCurrent] = useState<any>();
const [buttonValue, setButtonValue] = useState<any>();
const url = getUrlRelativePath();
const projectId = getProId();
const defId = getDefId();
//项目名称
const [proName, setProName] = useState<string>("");
//收藏状态 0-已收藏 d-未收藏
const [subStatus, setSubStatus] = useState<string | null>(null);
//收藏数据
const [subData, setSubData] = useState<any>();
//收藏loading
const [subLoading, setSubLoading] = useState<boolean>(false);
const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);
const [anchorName, setAnchorName] = useState<string>("");
const scrollButtonsDesktop = document.getElementsByClassName("MuiTabs-scrollButtonsDesktop").length;
const open = Boolean(anchorEl);
useEffect(() => {
menuList({ defId: defId, projectId: projectId }).then(res => {
if (res.code === 200) {
let data = res.data;
setData(data);
setProgress(data.length);
setCurrent(getCurrentLinks(data) + 1);
setButtonValue(stepButtonClick(findURL(data)));
}
})
getReadInfo({ projectId: projectId }).then(res => {
if (res?.code == 200) {
const data = res?.data;
if (data) {
setSubStatus(data.status);
setSubData(data);
} else {
setSubStatus("");
}
}
})
setProName(getProName());
}, []);
/**
* 获取当前环节
*/
const getCurrentLinks = (data: any) => {
let num = -1;
for (let i = 0; i < data.length; i++) {
//1、已进行2、当前环节3、未开启
if (data[i].taskStatus === 1) {
num = i;
}
}
return num;
}
/**
* 变更收藏状态
* @param status
* @returns
*/
const changeSubStatus = (data: any, status: string) => {
const params = {
id: data ? data?.id : null,
projectId: projectId,
status
}
setSubLoading(true);
updateReadStatus(params).then(res => {
if (res?.code == 200) {
setSubStatus(status);
message.success(status == '0' ? '添加收藏成功' : '移除收藏成功')
}
}).finally(() => {
setSubLoading(false);
})
}
const stepButtonClick = (data: any) => {
if (isEmpty(data) || isEmpty(data.funcList)) {
return null;
}
const funcList = data.funcList;
return loadFuncList(funcList);
}
/**
* 生成button数据
* @param funcList
* @returns
*/
const loadFuncList = (funcList: any[]) => {
let arr: JSX.Element[] = [];
if (isEmpty(funcList)) {
return arr;
}
const url = getUrlRelativePath();
arr = funcList.map((item: any, index: number) =>
<Button key={index} size="small" onClick={() => clickEnter(funcList, item.funcUrl)} type={url === item.funcUrl ? "primary" : "default"}>
{item.funcName}
</Button>
);
return arr;
}
/**
* 进入页面
* @param funcList
* @param funcUrl
*/
const clickEnter = (funcList: any[], funcUrl: string) => {
history.push(funcUrl);
setButtonValue(loadFuncList(funcList));
}
/**
* 查找跟当前页面匹配的值url
* @param data
* @returns
*/
const findURL = (data: any[]) => {
if (isEmpty(data)) {
return null;
}
for (const item of data) {
for (const i of item.funcList) {
if (i.funcUrl === url) {
return item;
}
}
}
return null;
}
const getFuncName = (data: any) => {
const funcList = data.funcList;
if (isEmpty(funcList)) {
return "";
}
const names = funcList.map((item: any) => item.funcName);
return names.join(" | ");
}
const handlePopoverOpen = (event: React.MouseEvent<HTMLElement, MouseEvent>, data: any) => {
setAnchorName(getFuncName(data));
setAnchorEl(event.currentTarget);
};
const handlePopoverClose = () => {
setAnchorEl(null);
};
const initChatUI = () => { //智慧客服
if(MethodDict!='procurement_mode_6' && MethodDict!='procurement_mode_7' && window.location.pathname.indexOf('BidEvaluation')!=-1){
message.warn('非谈判类项目【评标】阶段禁止沟通')
}else{
var tempForm = document.getElementById('tempForm_CustomerService') as HTMLFormElement
if(tempForm){
var hideInput = document.getElementById('tempInput_CustomerService') as HTMLInputElement
if(hideInput){
hideInput.value= window.location.pathname
}else{
hideInput = document.createElement("input")
hideInput.id = 'tempInput_CustomerService'
hideInput.type="hidden"
hideInput.name= 'sceneUrl'
hideInput.value= window.location.pathname
tempForm.appendChild(hideInput)
}
tempForm.submit();
}
}
}
return (
<div key='promenuDiv1' style={{ borderRadius: "6px", overflow: "hidden" }}>
<div key='promenuDiv2' className="site-page-header-ghost-wrapper" style={{ background: '#ffffff' }}>
<PageHeader
title="项目名称"
subTitle={proName}
extra={[
(randerRole == 'ebtp-supervision' && subStatus == "0")
? <Button key="qxdy" disabled={subLoading} onClick={() => changeSubStatus(subData, "d")}></Button> : null,
(randerRole == 'ebtp-supervision' && (subStatus == "d" || subStatus == ""))
? <Button key="daiyue" disabled={subLoading} onClick={() => changeSubStatus(subData, "0")}></Button> : null,
(randerRole == 'ebtp-agency-project-manager' || randerRole == 'ebtp-purchase' || randerRole == 'ebtp-supervision')
? <Button key="jiandang" onClick={() => history.push("/Project/ProjectManage/ProjectManager/ProjectInformationManagement")}></Button> : null,
(randerRole == 'ebtp-agency-project-manager' || randerRole == 'ebtp-purchase' || randerRole == 'ebtp-supervision') && defId != 'inquiry'
? <Button key="guidang" onClick={() => {
history.push("/ProjectLayout/Archive/projectArchive")
setButtonValue(stepButtonClick(data?.[data?.length - 1]))
}}></Button> : null,
<Button key="customerservice" onClick={() =>{
initChatUI() //智慧客服
}} icon={<CustomerServiceTwoTone />}></Button>,
((randerRole == 'ebtp-agency-project-manager' || randerRole == 'ebtp-purchase' || randerRole == 'ebtp-supervision') && MethodDict != "procurement_mode_7")
? <Button key="manageyiyi" onClick={() => history.push("/Project/ProjectManage/ProjectManager/ObjectionComplaint")}></Button> : null,
(randerRole == 'ebtp-supplier' && MethodDict != "procurement_mode_7")
? <Button key="supplieryiyi" onClick={() => history.push("/Project/ProjectManage/Supplier/ObjectionComplaint")}></Button> : null,
<Button key="fanhui1" type="primary" onClick={() => history.push(getReturnURL())}></Button>
// randerRole == 'ebtp-agency-project-manager' ? <Button key="fanhui1" type="primary"><Link to={`/BidManage/ProjectList?proTypeCode=${getProTypeCode()}`}>返回</Link></Button> : null,
// randerRole == 'ebtp-purchase' ? (getPurchaseCanOperate() != null && getPurchaseCanOperate() != undefined ? <Button key="fanhui1" type="primary"><Link to={`/Project/EntrustAssign/ProjectManager/PurchasingManagerEnquiries`}>返回</Link></Button>
// : <Button key="fanhui1" type="primary"><Link to={`/BidManage/ProjectList?proTypeCode=${getProTypeCode()}`}>返回</Link></Button>) : null,
// randerRole == 'ebtp-supplier' ? <Button key="fanhui2" type="primary"><Link to={`/BidManage/ProjectsInvolvedList?proTypeCode=${getProTypeCode()}`}>返回</Link></Button> : null,
// randerRole == 'ebtp-auction-manager' ? <Button key="fanhui3" type="primary"><Link to={`/Auction/AuctionManagerProject`}>返回</Link></Button> : null
]}
>
</PageHeader>
</div>
<div key='promenuDiv3' className={classes.root}>
<AppBar position="static" color="default" style={{ background: '#ffffff', boxShadow: 'none' }}>
<Tabs
variant="scrollable"
scrollButtons="auto"
indicatorColor="primary"
// textColor="primary"
value={false}
key='promenuTab'
>
<Stepper
className="horizontal-stepper"
activeStep={current}
style={{
width: progress > 10 ? "" : '100%',
marginLeft: scrollButtonsDesktop === 0 ? '24px' : void 0,
// paddingTop: '34px'
}}
>
{data.map((item: any, index: number) =>
<Step
key={index + 'Step'}
onMouseEnter={(e) => handlePopoverOpen(e, item)}
onMouseLeave={handlePopoverClose}
>
<StepButton
disabled={false}
key={index + 'StepButton'}
onClick={() => setButtonValue(stepButtonClick(item))}
>
{item.taskName}
</StepButton>
</Step>
)}
</Stepper>
</Tabs>
<Space
style={{
paddingLeft: scrollButtonsDesktop === 0 ? '24px' : '50px',
paddingBottom: '8px'
}}
>
{buttonValue}
</Space>
</AppBar>
<Popover
id="mouse-over-popover"
className={classes.popover}
classes={{
paper: classes.paper,
}}
open={open}
anchorEl={anchorEl}
anchorOrigin={{
vertical: 'top',
horizontal: 'center',
}}
transformOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
onClose={handlePopoverClose}
>
{anchorName}
</Popover>
</div>
</div>
);
}
export default Promenu;