import React, { useState, useEffect } from 'react'; import { history } from 'umi'; import { getLeftMenu, getBtnText, nextNode, getLeader, finishTurn, openTurn, getGys, finishFlow, getOfferUserId, getSingIds, firstNextNode, queryGys } from './service'; import { Menu, Button, Modal, message, Spin, Transfer, Tooltip, Tag, Select } from 'antd'; import { getRoomId, getSessionUserData, getSessionRoleData } from '@/utils/session'; import './index.less'; import { CarryOutOutlined, DownOutlined, ExclamationCircleOutlined, ReloadOutlined } from '@ant-design/icons'; import { btnAuthority } from '@/utils/authority'; //评审室内流程菜单 const Index: React.FC<{}> = () => { const { confirm } = Modal; const { SubMenu } = Menu; const [data, setData] = React.useState([]); const [spin, spinSet] = useState(false); const [leader, setLeader] = useState(''); const [nodeId, nodeIdSet] = useState('');//节点id const [turnId, turnIdSet] = useState('');//轮次id const [btnText, btnTextSet] = useState(''); //按钮文字 const [firstNextStep, firstNextStepSet] = useState(false); //是否轮次第一个节点 const [instTurnName, instTurnNameSet] = useState(''); //第几轮 const [btnMes, btnMesSet] = useState(''); const [flowFinish, flowFinishSet] = useState(false); //流程是否结束 const [stop, stopSet] = useState(false); //终止流程 按钮显隐 const [finishAllTurn, finishAllTurnSet] = useState(false); //所有轮次是否结束 const [menuShow, menuShowSet] = useState([]); const [count, countSet] = useState(0); //触发useEffect const [chooseGys, chooseGysSet] = useState(false); //选择供应商 const [offerUserId, offerUserIdSet] = useState(''); //评审专家id const [singUserId, singUserIdSet] = useState([]); //评审专家id const userId = getSessionUserData().userId; const role = getSessionRoleData().roleCode; //获取比选一阶段二次项目,自定义流程,当前供应商 const isBxOneSecondCustom = sessionStorage.getItem("isBxOneSecondCustom"); function showConfirm(mes?: any, confirmFlag?: boolean) { //环节流转提示 mes == '是否开启' ? (mes = mes + instTurnName + '?') : mes; confirm({ title: mes, icon: , centered: true, okText: '确定', cancelText: '取消', async onOk() { await handleOk(confirmFlag); }, onCancel() { spinSet(false); }, }); } function overConfirm(mes?: any) { //结束流程提示 confirm({ title: mes, icon: , okText: '确定', cancelText: '取消', centered: true, async onOk() { await finishFlowFc(); }, onCancel() { spinSet(false); }, }); } const handleOk = async (confirmFlag?: boolean) => { if (btnText == '开启') { await getGysData(); } if (btnText == '结束轮次') { await finishTurnFc(confirmFlag); } if (btnText == '下一步') { await nextStep(confirmFlag); } return; }; //下一步方法 async function nextStep(confirmFlag?: boolean) { spinSet(true); if (firstNextStep) { await firstNextNode(turnId, confirmFlag).then((res: any) => { if (res.code === 200) { if (res.data.result) { message.success('成功进入下一节点'); countSet(count + 1); } else { if (res.data.confirmFlag) { showConfirm(res.data.message, true); } } } else { countSet(count + 1); } }); } else { await nextNode(nodeId, confirmFlag).then((res) => { if (res.code === 200) { if (res.data.result) { message.success('成功进入下一节点'); countSet(count + 1); } else { if (res.data.confirmFlag) { showConfirm(res.data.message, true); } } } else { countSet(count + 1); } }); } } //开启轮次方法 async function openTurnFc() { spinSet(true); await openTurn({ assessRoomId: getRoomId(), roundIdList: targetKeys }).then((res) => { if (res.code === 200) { message.success('开启轮次成功'); chooseGysSet(false); } }); countSet(count + 1); //触发useEffect } //结束轮次方法 async function finishTurnFc(confirmFlag?: boolean) { spinSet(true); await finishTurn(turnId, confirmFlag).then((res) => { if (res.code === 200) { if (res.data.result) { message.success('结束轮次成功'); countSet(count + 1); //触发useEffect } else { if (res.data.confirmFlag) { showConfirm(res.data.message, true); } } } else { countSet(count + 1); //触发useEffect } }); } //结束流程方法 async function finishFlowFc() { spinSet(true); await finishFlow(getRoomId()).then((res) => { if (res.code === 200) { message.success('结束流程成功'); } }); countSet(count + 1); //触发useEffect } //取数据 async function getData(leader?: any, offerUserId?: any, ids?: any) { let nowTurn: string[] = []; let name: any = ''; let indexT: any = 0; let url = ''; let nodeIdT = ''; let turnIdT = ''; spinSet(true); await getLeftMenu(getRoomId()).then((res) => { if (res.code == 200) { res.data.map((item: any, index: any) => { //跳转当前节点页面 if (item.status == 1) { turnIdT = item.id; } item.nodeVOList.map((item: any) => { if (item.status == 1 && item.moduleUrl != null) { nodeIdT = item.id; url = makeUrl(item.moduleUrl, leader) + `?turnId=${item.instTurnId}&nodeId=${item.id}&turnSort=${item.instTurnSort}`; if (item.moduleUrl === '/EvaRoom/Eva/BidOffer' && userId != offerUserId) { //报价评审 只有评审分工分到的专家能点 url = ''; } if (item.moduleUrl === '/EvaRoom/Eva/Sing' || item.moduleUrl === '/EvaRoom/Eva/Openning') { //唱价(询价)、唱价 只有可查看报价的专家可看 if (role == 'ebtp-expert' && ids.findIndex((item: any) => item == userId) == -1) { url = ''; } } } }); if (item.status == 1) { nowTurn.push(`${item.instTurnSort}SubMenu`); } //获取要开启的轮次名 if (item.status == 2) { indexT = index + 1; } if (index == indexT) { name = item.instTurnName; } }); menuShowSet(nowTurn); setData(res.data); nodeIdSet(nodeIdT); turnIdSet(turnIdT); instTurnNameSet(name); } else { message.info('请联系管理员'); } }); //取按钮 await getBtnText(getRoomId()).then((res) => { let btntxt = ''; let btnMesT = ''; let flowFinishT = false; let stopT = true; let finishAllTurnT = false; if (res.code == 200) { if (res.data.openTurnButton) { btntxt = '开启'; btnMesT = '是否开启'; stopT = false; } else if (res.data.finishTurnButton) { btntxt = '结束轮次'; btnMesT = '是否结束轮次?'; } else if (res.data.firstNextStepButton) { btntxt = '下一步'; btnMesT = '是否进入下一环节?'; } else if (res.data.nextStepButton) { btntxt = '下一步'; btnMesT = '是否进入下一环节?'; } if (res.data.flowFinish) { flowFinishT = true; } if (res.data.finishAllTurn) { finishAllTurnT = true; stopT = false; } } btnTextSet(btntxt); btnMesSet(btnMesT); firstNextStepSet(res?.data?.firstNextStepButton); flowFinishSet(flowFinishT); finishAllTurnSet(finishAllTurnT); stopSet(stopT); }); spinSet(false); url != '' && history.push(url); } //专家获取数据 async function expertGetData(ids: any) { let leader = ''; let offerUserId = ''; await getLeader(getRoomId(), getSessionUserData().userId).then((res) => { if (res.code == 200) { leader = res.data; setLeader(res.data); } }); await getOfferUserId(getRoomId()).then((res) => { if (res.code == 200) { offerUserId = res.data[0]; offerUserIdSet(res.data[0]); } }); getData(leader, offerUserId, ids); } //处理url function makeUrl(url: any, leader: any) { if ( url == '/EvaRoom/Eva/BidPreliminary' || url == '/EvaRoom/Eva/BidDetailed' || url == '/EvaRoom/Eva/BidOffer' || url == '/EvaRoom/Eva/BidNumber' ) { url = url + leader; } return url; } //初始化 useEffect(() => { spinSet(true); let ids: any; if (getSessionRoleData().roleCode === 'ebtp-expert') { //ebtp-expert //可查看报价专家ids getSingIds(getRoomId()).then((res: any) => { if (res.code == 200) { ids = res.data; singUserIdSet(res.data); } }).then(() => { expertGetData(ids); }) } else { getData(); } }, [count]); //选择供应商 const [gysData, gysDataSet] = useState([]); const [firstRvwScs, firstRvwScsSet] = useState([]);//初审合格的 const [firstRvwFail, firstRvwFailSet] = useState([]);//初审不合格的 const [targetKeys, setTargetKeys] = useState([]); const [firstRvw, firstRvwSet] = useState(false);//是否经历初审 控制显示合格不合格数量显隐 const [targetCount, targetCountSet] = useState({ scsCount: 0, failCount: 0 });//进入下一轮的 合格的数量 不合格的数量 const [selectedKeys, setSelectedKeys] = useState([]); const [selectedKeysTransfer, setSelectedKeysTransfer] = useState([]);//穿梭框用 const [chooseTurn, chooseTurnSet] = useState(false);//查看供应商选择情况vis const modalHeight = (window.innerHeight * 96) / 100; const onChange = (nextTargetKeys: any, direction: any, moveKeys: any) => { if (chooseTurn) return; setTargetKeys(nextTargetKeys); //遍历移动的数据 控制合格不合格显示数量 if (firstRvw) { let scsChange: number = 0; let failChange: number = 0; moveKeys.map((item: any) => { firstRvwScs.includes(item) && scsChange++; firstRvwFail.includes(item) && failChange++; }); if (direction === 'left') { targetCountSet({ scsCount: targetCount.scsCount - scsChange, failCount: targetCount.failCount - failChange }) } else { targetCountSet({ scsCount: targetCount.scsCount + scsChange, failCount: targetCount.failCount + failChange }) } } }; const onSelectChange = (sourceSelectedKeys: any, targetSelectedKeys: any) => { if (chooseTurn) return; setSelectedKeysTransfer([...sourceSelectedKeys, ...targetSelectedKeys]); }; //取当前轮次所有供应商 async function getGysData() { let dataT: any = []; let _scs: any = []; let _fail: any = []; let target: any = []; let firstRvw = false;//是否经历初审 await getGys(getRoomId()).then((res) => { if (res.code == 200) { res.data.map((item: any, index: number) => { let one = { key: item.id, title: item.companyName, firstRvwResult: item.firstRvwResult,//0 未通过 1通过 2没经历初审 } dataT.push(one); item.firstRvwResult === 0 && _fail.push(one.key);//按类别存key item.firstRvwResult === 1 && _scs.push(one.key); item.firstRvwResult !== 0 && target.push(item.id);//右侧数据 index === 1 && item.firstRvwResult < 2 && (firstRvw = true);//是否经历初审 }); } }); gysDataSet(dataT); setTargetKeys(target); firstRvwScsSet(_scs); firstRvwFailSet(_fail); firstRvwSet(firstRvw); targetCountSet({ scsCount: target.length, failCount: 0 }) chooseGysSet(true); countSet(count + 1); //触发useEffect } const { Option } = Select; function returnGysModal() { const select = const footer = chooseTurn ? { footer: } : {}; const closeFc = async () => { chooseGysSet(false); chooseTurnSet(false); gysDataSet([]); firstRvwSet(false); } return ( closeFc()} onOk={() => { if (chooseTurn) { closeFc(); return } if (targetKeys.length > 0) { openTurnFc(); } else { message.error('未选中供应商'); } }} > { chooseTurn ?
查看开启 {select} 时供应商选择情况
:

温馨提示:选择一个或以上的选项后,点击对应的方向键,可以把选中的选项移动到另一栏。

} <> { info.selectedCount != 0 && `${info.selectedCount}/` } {info.totalCount} 项   {firstRvw && <> {targetCount.scsCount > 0 && <>初审合格:{targetCount.scsCount} 家   } {targetCount.failCount > 0 && <>初审不合格:{targetCount.failCount} 家 } } ]} render={(item: any) => { return ( <> {item.firstRvwResult === 1 && 初审合格} {item.firstRvwResult === 0 && 初审不合格} {item.title} ) }} />
); } function onOpenChange(openKeys: any) { menuShowSet([openKeys[openKeys.length - 1]]); } function onSelect({ selectedKeys }: any) { setSelectedKeys(selectedKeys); } return ( <>
} mode="inline" onOpenChange={onOpenChange} selectedKeys={selectedKeys} onSelect={onSelect} className="xsy-menu-style" style={{ height: innerHeight - 325, paddingBottom: '' }} inlineIndent={58} > {data.map((item: any) => ( {item.nodeVOList.map((item2: any, index: any) => { //可查看报价的专家 (唱价节点) let singDis; if (item2.moduleUrl === '/EvaRoom/Eva/Sing') { singDis = item2.moduleUrl === '/EvaRoom/Eva/Sing' && role == 'ebtp-expert' && singUserId.findIndex((item: any) => item == userId) == -1; } if (item2.moduleUrl === '/EvaRoom/Eva/Openning') { singDis = item2.moduleUrl === '/EvaRoom/Eva/Openning' && role == 'ebtp-expert' && singUserId.findIndex((item: any) => item == userId) == -1; } //修改跳转地址并加参数 轮次id 节点id 轮次号 let url = makeUrl(item2.moduleUrl, leader) + `?turnId=${item2.instTurnId}&nodeId=${item2.id}&turnSort=${item2.instTurnSort}`; //报价评审 只有评审分工分到的专家能点 let offerDis = item2.moduleUrl === '/EvaRoom/Eva/BidOffer' && userId != offerUserId; //是否跳过节点 0-不跳过 1-跳过节点 let skipStatus = item2.skipStatus == 1; let disabled = item2.status == 3 || item2.moduleUrl == null || item2.moduleUrl == undefined || offerDis || singDis || skipStatus return ( { let empty = new Promise(function (resolve, reject) { if (makeUrl(item2.moduleUrl, leader) === window.location.pathname && !disabled) { history.push('/EvaRoom/Eva') } resolve(true); }); empty.finally(() => history.push(url)); }} > {item2.instNodeName} ); })} ))}
{/* 选择供应商 */} {returnGysModal()} ); }; export default Index;