Merge branch 'master' of http://10.124.128.2:8888/eshop/fe_service_ebtp_frontend into master_jnryy_customerservice
This commit is contained in:
16
package.json
16
package.json
@ -4,14 +4,14 @@
|
||||
"private": true,
|
||||
"description": "An out-of-box UI solution for enterprise applications",
|
||||
"scripts": {
|
||||
"start-dev": "cross-env UMI_UI=none UMI_ENV=dev LOGIN_PATH=login umi dev --port=3000",
|
||||
"start-UAT": "cross-env UMI_UI=none UMI_ENV=UAT LOGIN_PATH=login umi dev --port=3000",
|
||||
"start-sim": "cross-env UMI_UI=none UMI_ENV=sim LOGIN_PATH=login umi dev --port=3000",
|
||||
"start-prod": "cross-env UMI_UI=none UMI_ENV=prod LOGIN_PATH=prod/login umi dev --port=3000",
|
||||
"build-dev": "cross-env UMI_ENV=dev LOGIN_PATH=login umi build",
|
||||
"build-UAT": "cross-env UMI_ENV=UAT LOGIN_PATH=login umi build",
|
||||
"build-sim": "cross-env UMI_ENV=sim LOGIN_PATH=login umi build",
|
||||
"build-prod": "cross-env UMI_ENV=prod LOGIN_PATH=prod/login umi build",
|
||||
"start-dev": "cross-env UMI_UI=none UMI_ENV=dev LOGIN_PATH=ebtp-frontend umi dev --port=3000",
|
||||
"start-UAT": "cross-env UMI_UI=none UMI_ENV=UAT LOGIN_PATH=ebtp-frontend umi dev --port=3000",
|
||||
"start-sim": "cross-env UMI_UI=none UMI_ENV=sim LOGIN_PATH=ebtp-frontend umi dev --port=3000",
|
||||
"start-prod": "cross-env UMI_UI=none UMI_ENV=prod LOGIN_PATH=prod/ebtp-frontend umi dev --port=3000",
|
||||
"build-dev": "cross-env UMI_ENV=dev LOGIN_PATH=ebtp-frontend umi build",
|
||||
"build-UAT": "cross-env UMI_ENV=UAT LOGIN_PATH=ebtp-frontend umi build",
|
||||
"build-sim": "cross-env UMI_ENV=sim LOGIN_PATH=ebtp-frontend umi build",
|
||||
"build-prod": "cross-env UMI_ENV=prod LOGIN_PATH=prod/ebtp-frontend umi build",
|
||||
"analyze": "cross-env ANALYZE=1 umi build",
|
||||
"build": "umi build",
|
||||
"deploy": "npm run site && npm run gh-pages",
|
||||
|
@ -12,7 +12,7 @@ import { ConnectState } from '@/models/connect';
|
||||
import { getMatchMenu } from '@umijs/route-utils';
|
||||
import { getMenu } from './services'
|
||||
import logo from '../assets/logo.svg';
|
||||
import { getSessionRoleData } from '@/utils/session';
|
||||
import { getSessionRoleData, getSessionUserData } from '@/utils/session';
|
||||
|
||||
import {
|
||||
HomeOutlined,
|
||||
@ -140,6 +140,8 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
|
||||
const [menuData, setMenuData] = React.useState<any>();
|
||||
const [menuShow, setmenuShow] = React.useState<any>(false);
|
||||
const menuDataRef = useRef<MenuDataItem[]>([]);
|
||||
const mall3_token: any = sessionStorage.getItem('Authorization');//当前登录token
|
||||
const userData: any = getSessionUserData();//当前登录人信息
|
||||
useEffect(() => {
|
||||
if (getSessionRoleData()?.roleId) {
|
||||
let params = {
|
||||
@ -206,7 +208,9 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
|
||||
} else if (menuItemProps.frame && menuItemProps.frame == 'Y') {
|
||||
return <Link onClick={() => window.open(menuItemProps.path)} to="#">{defaultDom}</Link>;
|
||||
} else if (menuItemProps.frame && menuItemProps.frame == 'S') {
|
||||
return <Link onClick={() => window.open(menuItemProps.path + '&mall3_token=' + sessionStorage.getItem('Authorization'))} to="#">{defaultDom}</Link>;
|
||||
const initPath = menuItemProps.path;
|
||||
const rePath = initPath?.replace("{mall3_token}", mall3_token).replace("{loginName}", userData.loginName).replace("{organizationId}", userData.organizationId);
|
||||
return <Link onClick={() => window.open(rePath)} to="#">{defaultDom}</Link>;
|
||||
} else {
|
||||
return <Link to={menuItemProps.path}>{defaultDom}</Link>;
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ import {
|
||||
Radio,
|
||||
Row,
|
||||
Spin, Tabs,
|
||||
Typography,
|
||||
Upload
|
||||
} from "antd"
|
||||
import '@/assets/ld_style.less'
|
||||
@ -25,7 +26,7 @@ import {
|
||||
creatNotice,
|
||||
getChooseRoom,
|
||||
getPackageAndSupplierList,
|
||||
chooseSupplier, deleteSupplier, updateSupplierUser, checkConflict
|
||||
chooseSupplier, deleteSupplier, updateSupplierUser, saveAnno
|
||||
} from '../service'
|
||||
import moment from "moment";
|
||||
import TabPane from "@ant-design/pro-card/lib/components/TabPane";
|
||||
@ -46,6 +47,8 @@ import BraftText from "@/components/richText/wang"
|
||||
import RiskPrevention from "@/utils/RiskPrevention"
|
||||
import Dating from '@/images/招标公告/dating.jpg';
|
||||
import './style.less';
|
||||
import TextArea from "antd/lib/input/TextArea"
|
||||
import RiskPreventionSoft from "@/utils/RiskPreventionSoft"
|
||||
|
||||
interface BiddingInvitation {
|
||||
type: string;
|
||||
@ -104,6 +107,11 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
const [riskVisible, setRiskVisible] = useState<boolean>(false);//风控弹窗 2021.9.7 zhoujianlong
|
||||
const [riskData, setRiskData] = useState<any[]>([]);//风控数据 2021.9.7 zhoujianlong
|
||||
const WebofficeRef = useRef<Weboffice>(null);
|
||||
const [memoVisible, setMemoVisible] = useState<boolean>(false);//说明弹窗
|
||||
/*weboffic end*/
|
||||
const [UploadMemoID, setUploadMemoID] = useState<any>("empty"); //upload 业务id
|
||||
|
||||
const { Text } = Typography;
|
||||
const onRef = (ref) => {
|
||||
/* this.child= ref;*/
|
||||
}
|
||||
@ -182,6 +190,7 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
setDocSaveBtn("compact");
|
||||
setDocBtnName("新建");
|
||||
setSping(false);
|
||||
setUploadMemoID("");
|
||||
}
|
||||
});
|
||||
} else if (type == "edit") {//==========================================================编辑
|
||||
@ -211,6 +220,7 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
"openhallId": data.openhallId,
|
||||
"annoTitle": data.annoTitle,
|
||||
"sectionIds": defPak,
|
||||
"reasonMemo": data.reasonMemo,
|
||||
});
|
||||
echoSet(data.contentWithStyle);
|
||||
setUploadID(data.attDatasetId);
|
||||
@ -220,6 +230,7 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
setDocReadOnly("false");
|
||||
setDocSaveBtn("compact");
|
||||
setDocBtnName("编辑");
|
||||
setUploadMemoID(data.reasonMemoAttrId);
|
||||
}
|
||||
});
|
||||
|
||||
@ -256,6 +267,7 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
setDocReadOnly("ture");
|
||||
setDocSaveBtn("none");
|
||||
setDocBtnName("查看");
|
||||
setUploadMemoID(data.reasonMemoAttrId);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -318,7 +330,15 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
} else if (TpPackageName == "谈判") {
|
||||
if (form.getFieldValue("docStartTime") < moment().startOf('day')) {
|
||||
message.warn('采购文件获取开始时间需晚于当前时间');
|
||||
} else if (moment(form.getFieldValue("docEndTime")).startOf('day').diff(moment(form.getFieldValue("docStartTime")).startOf('day'), "days") < 3) {
|
||||
} else if (proDict == "procurement_mode_6" && moment(form.getFieldValue("docEndTime")).startOf('day').diff(moment(form.getFieldValue("docStartTime")).startOf('day'), "days") < 1) {
|
||||
message.warn('采购文件获取截止时间需与采购文件获取开始时间间隔不少于1天');
|
||||
} else if (proDict == "procurement_mode_6" && moment(form.getFieldValue("docEndTime")).startOf('day').diff(moment(form.getFieldValue("docStartTime")).startOf('day'), "days") < 3) {
|
||||
if(form.getFieldValue("reasonMemo") !== null && form.getFieldValue("reasonMemo") !== undefined){
|
||||
msg = "true"
|
||||
}else{
|
||||
setMemoVisible(true);
|
||||
}
|
||||
} else if (moment(form.getFieldValue("docEndTime")).startOf('day').diff(moment(form.getFieldValue("docStartTime")).startOf('day'), "days") < 3) {
|
||||
message.warn('采购文件获取截止时间需与采购文件获取开始时间间隔不少于3天');
|
||||
} else if (form.getFieldValue("replyEndTime").format('YYYY-MM-DD HH:mm:ss') < form.getFieldValue("docEndTime").format('YYYY-MM-DD HH:mm:ss')) {
|
||||
message.warn('应答截止时间需晚于或等于采购文件获取截止时间');
|
||||
@ -442,12 +462,16 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
// "contentHtmlId": WebofficeRef.current!.HTMLfileCode,//html id
|
||||
"sections": packageMsg,
|
||||
"medias": "9",
|
||||
"roomType": "2"
|
||||
"roomType": "2",
|
||||
"reasonMemoAttrId": form.getFieldValue("reasonMemoAttrId"),
|
||||
"reasonMemo": form.getFieldValue("reasonMemo")
|
||||
}
|
||||
creatNotice(type, fromData).then(res => {
|
||||
if (res?.code == 4004 && res?.success == false) { //2021.9.7 zhoujianlong 新增和修改邀请函增加风控
|
||||
const data = res?.data?.result == undefined ? [] : res?.data?.result
|
||||
setRiskData(data)
|
||||
const data = res?.data== undefined ? [] : res?.data
|
||||
let thisData = [];
|
||||
thisData.push(data);
|
||||
setRiskData(thisData)
|
||||
setRiskVisible(true)
|
||||
}
|
||||
if (res.code == 200) {
|
||||
@ -458,6 +482,48 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
setTimeout(() => setSping(false), 1000)
|
||||
});
|
||||
}
|
||||
const saveAfterRisk = () => {
|
||||
const packageMsg = [];
|
||||
for (const item of TpPackageId) {//包数据
|
||||
for (const item1 of form.getFieldValue("sectionIds")) {
|
||||
if (item.value == item1) {
|
||||
packageMsg.push({ "bsId": item.value, "bsName": item.label })
|
||||
}
|
||||
}
|
||||
}
|
||||
setSping(true);
|
||||
const fromData = {
|
||||
"id": pkId,
|
||||
"annoNature": 101,//邀请函
|
||||
"tpId": tpId,
|
||||
"csAnnoId": pkId,
|
||||
"attDatasetId": form.getFieldValue("attDatasetId"),
|
||||
"openhallTitle": form.getFieldValue("openhallIdTime"),//开标大厅 时间段
|
||||
"source": 21,//来源(1:预审公告;2:预审公示;11:资审公告;12资审公示;21:邀请函)
|
||||
"annoTitle": form.getFieldValue("annoTitle"),
|
||||
"contentWithStyle": braftRef.current.getHtml().replace(/<table border="0"/, '<table border="1"'),//富文本正文
|
||||
"docStartTime": form.getFieldValue("docStartTime").format("yyyy-MM-DD HH:mm:ss"),
|
||||
"replyEndTime": form.getFieldValue("replyEndTime").format("yyyy-MM-DD HH:mm:ss"),
|
||||
"openingTime": form.getFieldValue("openingTime").format("yyyy-MM-DD HH:mm:ss"),
|
||||
"docEndTime": form.getFieldValue("docEndTime").format("yyyy-MM-DD HH:mm:ss"),
|
||||
"openhallId": form.getFieldValue("openhallId"),
|
||||
// "contentFileId": WebofficeRef.current!.DocfileCode,//office id
|
||||
// "contentHtmlId": WebofficeRef.current!.HTMLfileCode,//html id
|
||||
"sections": packageMsg,
|
||||
"medias": "9",
|
||||
"roomType": "2",
|
||||
"reasonMemoAttrId": form.getFieldValue("reasonMemoAttrId"),
|
||||
"reasonMemo": form.getFieldValue("reasonMemo")
|
||||
}
|
||||
saveAnno(fromData).then(res => {
|
||||
if (res.code == 200) {
|
||||
setAnnoId(res?.data);
|
||||
message.success("成功");
|
||||
setTabsKeys("2");
|
||||
}
|
||||
setTimeout(() => setSping(false), 1000)
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
const columns1: ProColumns<{}>[] = [
|
||||
@ -828,6 +894,45 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
</div>
|
||||
</Card> */}
|
||||
<BraftText braftRef={braftRef} echo={echo} disabled={editInformation} />
|
||||
<Modal
|
||||
destroyOnClose
|
||||
title="原因说明"
|
||||
visible={memoVisible}
|
||||
width={'40%'}
|
||||
onCancel={() => {
|
||||
setMemoVisible(false)
|
||||
}}
|
||||
onOk={() => {setMemoVisible(false);onFinshInvitation();}}
|
||||
footer={[
|
||||
<Button key="back" onClick={() => setMemoVisible(false)}>
|
||||
取消
|
||||
</Button>,
|
||||
<Button key="save" type="primary" onClick={() => {setMemoVisible(false);onFinshInvitation();}}>
|
||||
确定
|
||||
</Button>,
|
||||
]}
|
||||
centered
|
||||
>
|
||||
|
||||
<Text style={{ color: '#b30000' }}>提示:当前采购文件获取截止时间与采购文件获取开始时间间隔少于3天,请填写原因说明!</Text>
|
||||
<Form.Item
|
||||
label="原因说明"
|
||||
name="reasonMemo"
|
||||
rules={[
|
||||
{ required: true },
|
||||
{ max: 500, message: '原因说明不能超过500字' },
|
||||
]}
|
||||
>
|
||||
<TextArea rows={4} style={{ resize: 'vertical'}} />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="附件文件"
|
||||
name="reasonMemoAttrId"
|
||||
extra="单个附件最大30MB"
|
||||
>
|
||||
{UploadMemoID != "empty" ? <ExtendUpload uploadProps={UploadProps} maxCount={1} bid={UploadMemoID} /> : null}
|
||||
</Form.Item>
|
||||
</Modal>
|
||||
</Form>
|
||||
{editInformation ? null :
|
||||
<div style={{ textAlign: "right", marginTop: " 26px" }}>
|
||||
@ -885,14 +990,16 @@ const BiddingInvitation: React.FC<BiddingInvitation> = (props) => {
|
||||
</TabPane>
|
||||
</Tabs>
|
||||
{/**风控组件 */}
|
||||
{riskVisible && <RiskPrevention
|
||||
{riskVisible && <RiskPreventionSoft
|
||||
modalVisible={riskVisible}
|
||||
onCancel={() => {
|
||||
setRiskVisible(false)
|
||||
setRiskData([])
|
||||
}}
|
||||
data={riskData}
|
||||
onSubmit={() => saveAfterRisk()}
|
||||
/>}
|
||||
|
||||
</Spin>
|
||||
|
||||
)
|
||||
|
@ -20,6 +20,7 @@ import { btnAuthority } from '@/utils/authority';
|
||||
import { getApprProcessList } from '@/utils/SeleApprovalProcess/service';
|
||||
import SeleApprovalProcess from '@/utils/SeleApprovalProcess';
|
||||
import { checkObjectId } from '@/utils/DownloadUtils';
|
||||
import ReasonMemo from './ReasonMemo';
|
||||
|
||||
/*
|
||||
* 招标公告开始
|
||||
@ -50,6 +51,7 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
const [approvalVisible, setApprovalVisible] = useState<boolean>(false);//选择流程弹窗控制参数
|
||||
const [approvalData, setApprovalData] = useState<any[]>([]);//选择流程数据存储
|
||||
|
||||
const [memoVisible, setMemoVisible] = useState<boolean>(false);//说明弹窗
|
||||
let proName = ''; //名称
|
||||
let pktittle = '';
|
||||
let proDict = getProMethod();
|
||||
@ -129,6 +131,13 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
onClick={() => toEdit(record)}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])|| record.reasonMemo== null ||record.reasonMemo==undefined}
|
||||
type="text"
|
||||
onClick={() => toEditReasonMemo(record,"edit")}
|
||||
>
|
||||
原因说明
|
||||
</Button>
|
||||
<Button
|
||||
hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])}
|
||||
@ -158,6 +167,13 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
<Button type="text" onClick={() => toRead(record)}>
|
||||
查看
|
||||
</Button>
|
||||
<Button
|
||||
hidden={ record.reasonMemo== null ||record.reasonMemo==undefined}
|
||||
type="text"
|
||||
onClick={() => toEditReasonMemo(record,"read")}
|
||||
>
|
||||
原因说明
|
||||
</Button>
|
||||
<Button type="text" key="9" hidden={!record.approvalInstanceId || !checkObjectId(record.id)} onClick={() => toApprovalFor(record)}>
|
||||
查看审批流程
|
||||
</Button>
|
||||
@ -176,6 +192,13 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
<Button type="text" onClick={() => toRead(record)}>
|
||||
查看
|
||||
</Button>
|
||||
<Button
|
||||
hidden={record.reasonMemo== null ||record.reasonMemo==undefined}
|
||||
type="text"
|
||||
onClick={() => toEditReasonMemo(record,"read")}
|
||||
>
|
||||
原因说明
|
||||
</Button>
|
||||
<Button type="text" key="9" hidden={!record.approvalInstanceId || !checkObjectId(record.id)} onClick={() => toApprovalFor(record)}>
|
||||
查看审批流程
|
||||
</Button>
|
||||
@ -190,6 +213,13 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])|| record.reasonMemo== null ||record.reasonMemo==undefined}
|
||||
type="text"
|
||||
onClick={() => toEditReasonMemo(record,"edit")}
|
||||
>
|
||||
原因说明
|
||||
</Button>
|
||||
<Button
|
||||
hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])}
|
||||
type="text"
|
||||
@ -221,6 +251,13 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
<Button type="text" onClick={() => toRead(record)}>
|
||||
查看
|
||||
</Button>
|
||||
<Button
|
||||
hidden={record.reasonMemo== null ||record.reasonMemo==undefined}
|
||||
type="text"
|
||||
onClick={() => toEditReasonMemo(record,"read")}
|
||||
>
|
||||
原因说明
|
||||
</Button>
|
||||
<Button type="text" key="9" hidden={!record.approvalInstanceId || !checkObjectId(record.id)} onClick={() => toApprovalFor(record)}>
|
||||
查看审批流程
|
||||
</Button>
|
||||
@ -239,6 +276,13 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
<Button type="text" onClick={() => toRead(record)}>
|
||||
查看
|
||||
</Button>
|
||||
<Button
|
||||
hidden={record.reasonMemo== null ||record.reasonMemo==undefined}
|
||||
type="text"
|
||||
onClick={() => toEditReasonMemo(record,"read")}
|
||||
>
|
||||
原因说明
|
||||
</Button>
|
||||
<Button type="text" key="9" hidden={!record.approvalInstanceId || !checkObjectId(record.id)} onClick={() => toApprovalFor(record)}>
|
||||
查看审批流程
|
||||
</Button>
|
||||
@ -434,7 +478,15 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/*编辑原因说明*/
|
||||
const toEditReasonMemo = (props: any,type: any) => {
|
||||
setPkId(props.id);
|
||||
setType(type);
|
||||
setMemoVisible(true);
|
||||
};
|
||||
const Proref = useRef<ActionType>();
|
||||
|
||||
return (
|
||||
<div style={{ height: '100%', position: 'relative' }}>
|
||||
<Spin spinning={spin}>
|
||||
@ -511,6 +563,16 @@ const BiddingInvitationList: React.FC<{}> = (props) => {
|
||||
setRefresh(Math.random() + 1)
|
||||
}} data={approvalData} annoId={recordData?.id} />
|
||||
) : null}
|
||||
{memoVisible ? (
|
||||
<ReasonMemo
|
||||
modalVisible={memoVisible}
|
||||
id={pkId}
|
||||
type={type}
|
||||
onCancel={() => {
|
||||
setMemoVisible(false)
|
||||
}}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
129
src/pages/Bid/BiddingAnnouncement/components/ReasonMemo.tsx
Normal file
129
src/pages/Bid/BiddingAnnouncement/components/ReasonMemo.tsx
Normal file
@ -0,0 +1,129 @@
|
||||
import { Button, Form, message, Modal, Typography, Spin } from 'antd';
|
||||
import TextArea from 'antd/lib/input/TextArea';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { GetNoticeMsg, updateMemo } from '../service';
|
||||
import { UploadProps } from "antd/lib/upload/interface";
|
||||
import ExtendUpload from '@/utils/ExtendUpload';
|
||||
/*说明原因 组件*/
|
||||
type Props = {
|
||||
id: string;
|
||||
type: string;
|
||||
onCancel: () => void;
|
||||
modalVisible: boolean; //弹窗visible
|
||||
}
|
||||
const Index: React.FC<Props> = (props) => {
|
||||
const { type, id ,modalVisible,onCancel} = props;
|
||||
const [spinning, setSping] = useState<boolean>(false);//加载遮罩
|
||||
const [UploadMemoID, setUploadMemoID] = useState<any>("empty"); //upload 业务id
|
||||
const [disableStatus, setDisableStatus] = useState<boolean>(false);//是否只读
|
||||
const [form] = Form.useForm();
|
||||
const { Text } = Typography;
|
||||
useEffect(() => {
|
||||
Int();
|
||||
form.resetFields();//清除form中数据
|
||||
}, [id, type]);
|
||||
|
||||
const UploadProps: UploadProps = {
|
||||
name: "file",
|
||||
disabled: disableStatus
|
||||
}
|
||||
|
||||
const layout = {
|
||||
labelCol: { span: 7 },
|
||||
wrapperCol: { span: 10 },
|
||||
};
|
||||
|
||||
const Int = async () => {
|
||||
setSping(true);
|
||||
await GetNoticeMsg(id).then(res => {
|
||||
if (res.code == 200) {
|
||||
const data = res.data;
|
||||
let defPak = [];
|
||||
for (const item of data.sections) {
|
||||
defPak.push(item.bsId);
|
||||
}
|
||||
form.setFieldsValue({
|
||||
"reasonMemo": data.reasonMemo,
|
||||
"reasonMemoAttrId": data.reasonMemoAttrId,
|
||||
});
|
||||
setUploadMemoID(data.reasonMemoAttrId);
|
||||
}
|
||||
});
|
||||
if (type == "read") {//==========================================================查看
|
||||
setDisableStatus(true);//不可编辑
|
||||
}
|
||||
setSping(false);
|
||||
};
|
||||
const submit = () => {
|
||||
setSping(true);
|
||||
const fromData = {
|
||||
"id": id,
|
||||
"reasonMemoAttrId": form.getFieldValue("reasonMemoAttrId"),
|
||||
"reasonMemo": form.getFieldValue("reasonMemo")
|
||||
}
|
||||
updateMemo(fromData).then(res => {
|
||||
if (res.code == 200) {
|
||||
message.success("成功");
|
||||
onCancel();
|
||||
setSping(false);
|
||||
} else {
|
||||
message.success("失败");
|
||||
}
|
||||
});
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<Spin spinning={spinning}>
|
||||
|
||||
<Modal
|
||||
destroyOnClose
|
||||
visible={modalVisible}
|
||||
title="原因说明"
|
||||
width={'40%'}
|
||||
onCancel={() => {
|
||||
onCancel();
|
||||
}}
|
||||
onOk={() => { submit();}}
|
||||
footer={[
|
||||
disableStatus ? null : <Button key="back" onClick={() => onCancel()}>
|
||||
取消
|
||||
</Button>,
|
||||
disableStatus ? null : <Button key="save" type="primary" onClick={() => { submit(); }}>
|
||||
确定
|
||||
</Button>,
|
||||
]}
|
||||
centered
|
||||
>
|
||||
|
||||
<Text style={{ color: '#b30000' }}>提示:当前采购文件获取截止时间与采购文件获取开始时间间隔少于3天,请填写原因说明!</Text>
|
||||
<Form
|
||||
{...layout}
|
||||
name="basic"
|
||||
form={form}
|
||||
component={false}
|
||||
>
|
||||
|
||||
<Form.Item
|
||||
label="原因说明"
|
||||
name="reasonMemo"
|
||||
rules={[
|
||||
{ required: true },
|
||||
{ max: 500, message: '原因说明不能超过500字' },
|
||||
]}
|
||||
>
|
||||
<TextArea rows={4} style={{ resize: 'vertical' }} disabled={disableStatus} />
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="附件文件"
|
||||
name="reasonMemoAttrId"
|
||||
extra="单个附件最大30MB"
|
||||
>
|
||||
{UploadMemoID != "empty" ? <ExtendUpload uploadProps={UploadProps} maxCount={1} bid={UploadMemoID} /> : null}
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Modal>
|
||||
</Spin>
|
||||
</>
|
||||
)
|
||||
}
|
||||
export default Index;
|
@ -222,4 +222,22 @@ export async function savePublicData(params: any) {
|
||||
method: "POST",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
/*修改说明*/
|
||||
export async function updateMemo(params?: any) {
|
||||
return request("/api/biz-service-ebtp-bid/v1/anno/updateMemo", {
|
||||
method: "post",
|
||||
data: {
|
||||
...params
|
||||
},
|
||||
})
|
||||
}
|
||||
/*风控后的保存公告*/
|
||||
export async function saveAnno(params?: any) {
|
||||
return request("/api/biz-service-ebtp-bid/v1/anno/saveAnno", {
|
||||
method: "post",
|
||||
data: {
|
||||
...params
|
||||
},
|
||||
})
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
import React, { useEffect, useRef, useState } from 'react';
|
||||
import { Button, Table, Tabs, Space, Progress, Radio, Input, Checkbox, Select, Modal, Menu, Pagination, Spin, Form, message, Collapse, Upload, Tooltip } from 'antd';
|
||||
import { getTabList, getProgress, getScoreDetail, getRegister, submitDetail, updateJudgesStatus, findPriceScoreList, getMemberInfo, getEval, getUnlock, getCheckData, isStatus, getFile, calculationPriceScore, saveOffer, getPage, getProjectById, getOfferUrl } from './service';
|
||||
import { getTabList, getProgress, getScoreDetail, getRegister, submitDetail, updateJudgesStatus, findPriceScoreList, getMemberInfo, getEval, getUnlock, getCheckData, isStatus, getFile, calculationPriceScore, saveOffer, getPage, getProjectById, getOfferUrl, beforeRiskControl } from './service';
|
||||
import '@/assets/ld_style.less'
|
||||
import FirstTrialTableDetailed from '../BidDetailedManager/module/FirstTrialTableDetailed';
|
||||
import { getExperts } from '../BidDetailedManager/service';
|
||||
@ -12,6 +12,7 @@ import { getProId, getProMethod, getRoomId, getSectionQuot, getSessionRoleData,
|
||||
import FileDown from '@/utils/Download';
|
||||
import { getURLInformation, isEmpty } from '@/utils/CommonUtils';
|
||||
import { btnAuthority } from '@/utils/authority';
|
||||
import RiskPreventionSoft from '@/utils/RiskPreventionSoft';
|
||||
|
||||
const { TabPane } = Tabs;
|
||||
const { Option } = Select;
|
||||
@ -75,6 +76,11 @@ const Index: React.FC<{}> = () => {
|
||||
const proMethod = getProMethod();//获取采购方式
|
||||
const [hightSorce, setHightSorce] = useState<any>(''); // 自动报价最高分
|
||||
|
||||
//风控弹窗 2022.8.17 zhoujianlong
|
||||
const [riskVisible, setRiskVisible] = useState<boolean>(false);
|
||||
//风控数据 2022.8.17 zhoujianlong
|
||||
const [riskData, setRiskData] = useState<any[]>([]);
|
||||
|
||||
//获取数据的参数
|
||||
const [findScoreRecordData, setFindScoreRecordData] = useState<any>();
|
||||
//所有人员详审表数据
|
||||
@ -1614,6 +1620,28 @@ const Index: React.FC<{}> = () => {
|
||||
|
||||
}, [count]);
|
||||
|
||||
/**
|
||||
* 风控中心校验
|
||||
* @param params
|
||||
*/
|
||||
const verificationRiskControl = () => {
|
||||
let submitData = {
|
||||
reviewStatus: '2',
|
||||
reviewTurnId: getURLInformation("turnId"),
|
||||
reviewType: '2',
|
||||
}
|
||||
beforeRiskControl(submitData).then(res => {
|
||||
if (res?.code == 200) {
|
||||
if (res?.data.length > 0) {
|
||||
setRiskData(res?.data);
|
||||
setRiskVisible(true);
|
||||
} else {
|
||||
submitClick();
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Spin spinning={spinVisible || submitLoading}>
|
||||
@ -1720,7 +1748,7 @@ const Index: React.FC<{}> = () => {
|
||||
{reviewStatus == 2 || reviewStatus == 3 ? null : (
|
||||
<div>
|
||||
{tableDisplay == true ? (
|
||||
<Button hidden={btnAuthority(['ebtp-expert'])} type="primary" size="small" className="fr ml10 mb10" onClick={submitClick} loading={submitLoading}>提交汇总</Button>
|
||||
<Button hidden={btnAuthority(['ebtp-expert'])} type="primary" size="small" className="fr ml10 mb10" onClick={verificationRiskControl} loading={submitLoading}>提交汇总</Button>
|
||||
) : null}
|
||||
<Button hidden={btnAuthority(['ebtp-expert'])} onClick={getLock} type="primary" size="small" className="fr mb10">评审解锁</Button>
|
||||
</div>
|
||||
@ -1835,6 +1863,16 @@ const Index: React.FC<{}> = () => {
|
||||
modalVisible={checkVisible}
|
||||
values={checkData}
|
||||
/>
|
||||
{/**风控组件 */}
|
||||
{riskVisible && <RiskPreventionSoft
|
||||
modalVisible={riskVisible}
|
||||
onCancel={() => {
|
||||
setRiskVisible(false);
|
||||
setRiskData([]);
|
||||
}}
|
||||
onSubmit={() => submitClick()}
|
||||
data={riskData}
|
||||
/>}
|
||||
</Spin>
|
||||
</>
|
||||
)
|
||||
|
@ -238,4 +238,15 @@ export function getOfferUrl(params: any) {
|
||||
method: 'GET',
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 提交前风险防控校验接口
|
||||
* @param data
|
||||
*/
|
||||
export function beforeRiskControl(data: any) {
|
||||
return request("/api/biz-service-ebtp-rsms/v1/riskcenter/getRemindSummary", {
|
||||
method: 'post',
|
||||
data: data,
|
||||
});
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
import React, { useState, useEffect, useRef } from 'react';
|
||||
import { Button, Table, Tabs, Space, Progress, Radio, Modal, Menu, Checkbox, Pagination, Input, message, Upload, Spin, Form, Collapse } from 'antd';
|
||||
import { getTabList, getProgress, getScoreDetail, getRegister, submitDetail, updateJudgesStatus, getMemberInfo, getEval, getUnlock, isStatus, checkShowData, getFile, submitSummary, submQualified } from './service';
|
||||
import { getTabList, getProgress, getScoreDetail, getRegister, submitDetail, updateJudgesStatus, getMemberInfo, getEval, getUnlock, isStatus, checkShowData, getFile, submitSummary, submQualified, beforeRiskControl } from './service';
|
||||
import '@/assets/ld_style.less'
|
||||
import BidPreliminarySpeed from './components/BidPreliminarySpeed';
|
||||
import BidPreliminarySummary from './components/BidPreliminarySummary';
|
||||
@ -12,6 +12,7 @@ import { getURLInformation, isEmpty } from '@/utils/CommonUtils';
|
||||
import ExtendUpload from '@/utils/ExtendUpload';
|
||||
import { btnAuthority } from '@/utils/authority';
|
||||
import MACAddressPrompt from '../../BidControl/BidControlManager/components/MACAddressPrompt';
|
||||
import RiskPreventionSoft from '@/utils/RiskPreventionSoft';
|
||||
|
||||
const { TabPane } = Tabs;
|
||||
const { SubMenu } = Menu;
|
||||
@ -55,6 +56,10 @@ const Index: React.FC<{}> = () => {
|
||||
const [dateLength, setDateLength] = useState<any>([]); // tab签长度
|
||||
const [isModalVisible, setIsModalVisible] = useState(false); // 全局全部合格弹窗
|
||||
const [submitLoading, setSubmitLoading] = useState<boolean>(false); // 提交汇总loading
|
||||
//风控弹窗 2022.8.17 zhoujianlong
|
||||
const [riskVisible, setRiskVisible] = useState<boolean>(false);
|
||||
//风控数据 2022.8.17 zhoujianlong
|
||||
const [riskData, setRiskData] = useState<any[]>([]);
|
||||
|
||||
//获取数据的参数
|
||||
const [findScoreRecordData, setFindScoreRecordData] = useState<any>();
|
||||
@ -879,6 +884,31 @@ const Index: React.FC<{}> = () => {
|
||||
})
|
||||
}, [count]);
|
||||
|
||||
/**
|
||||
* 风控中心校验
|
||||
* @param params
|
||||
*/
|
||||
const verificationRiskControl = () => {
|
||||
const remarkList = getRemarkList(ref.current);
|
||||
console.log(remarkList);
|
||||
let submitData = {
|
||||
reviewStatus: '2',
|
||||
reviewTurnId: getURLInformation("turnId"),
|
||||
reviewType: '1',
|
||||
remarkList: remarkList,
|
||||
}
|
||||
beforeRiskControl(submitData).then(res => {
|
||||
if (res?.code == 200) {
|
||||
if (res?.data.length > 0) {
|
||||
setRiskData(res?.data);
|
||||
setRiskVisible(true);
|
||||
} else {
|
||||
finalSubmit();
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Spin spinning={spinVisible || submitLoading}>
|
||||
@ -905,7 +935,7 @@ const Index: React.FC<{}> = () => {
|
||||
{reviewStatus == 2 || reviewStatus == 3 ? null : (
|
||||
<div>
|
||||
{tableDisplay == true ? (
|
||||
<Button hidden={btnAuthority(['ebtp-expert'])} type="primary" size="small" className="fr ml10 mb10" onClick={() => finalSubmit()} loading={submitLoading}>提交汇总</Button>
|
||||
<Button hidden={btnAuthority(['ebtp-expert'])} type="primary" size="small" className="fr ml10 mb10" onClick={() => verificationRiskControl()} loading={submitLoading}>提交汇总</Button>
|
||||
) : null}
|
||||
<Button hidden={btnAuthority(['ebtp-expert'])} onClick={getLock} type="primary" size="small" className="fr mb10">评审解锁</Button>
|
||||
</div>
|
||||
@ -1067,6 +1097,16 @@ const Index: React.FC<{}> = () => {
|
||||
<Modal title="全部合格" visible={isModalVisible} onOk={() => makeQualified()} onCancel={() => setIsModalVisible(false)}>
|
||||
<p>此操作会删除原有数据,是否继续?</p>
|
||||
</Modal>
|
||||
{/**风控组件 */}
|
||||
{riskVisible && <RiskPreventionSoft
|
||||
modalVisible={riskVisible}
|
||||
onCancel={() => {
|
||||
setRiskVisible(false);
|
||||
setRiskData([]);
|
||||
}}
|
||||
onSubmit={() => finalSubmit()}
|
||||
data={riskData}
|
||||
/>}
|
||||
</Spin>
|
||||
</>
|
||||
)
|
||||
|
@ -188,4 +188,15 @@ export async function getFile(id: any) { // 查找是否有应答文件
|
||||
return request('/api/biz-service-ebtp-rsms/v1/review/config/detail/doc/list?detailId='+id, {
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 提交前风险防控校验接口
|
||||
* @param data
|
||||
*/
|
||||
export function beforeRiskControl(data: any) {
|
||||
return request("/api/biz-service-ebtp-rsms/v1/riskcenter/getRemindEarlySummary", {
|
||||
method: 'post',
|
||||
data: data,
|
||||
});
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import React from 'react';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { Modal, Tag } from 'antd';
|
||||
import { ExclamationCircleOutlined } from '@ant-design/icons';
|
||||
import type { ProColumns } from '@ant-design/pro-table';
|
||||
@ -21,6 +21,7 @@ const modalHeight = window.innerHeight * 96 / 100;
|
||||
*/
|
||||
const RiskPreventionSoft: React.FC<RiskPreventionSoftProps> = (props) => {
|
||||
const { modalVisible, onCancel, onSubmit, data } = props;
|
||||
const [confirmButtonVisible, setConfirmButtonVisible] = useState<boolean>(true);//是否显示确定按钮
|
||||
|
||||
const columns: ProColumns<any[]>[] = [
|
||||
{
|
||||
@ -53,6 +54,23 @@ const RiskPreventionSoft: React.FC<RiskPreventionSoftProps> = (props) => {
|
||||
title: '规则相应内容',
|
||||
},
|
||||
];
|
||||
useEffect(()=>{
|
||||
setConfirmButtonVisible(getButtonVisible());
|
||||
},[])
|
||||
|
||||
const getButtonVisible = () => {
|
||||
console.log(data);
|
||||
for (const risk of data) {
|
||||
for (const result of risk.result) {
|
||||
for (const regulationData of result.regulationData) {
|
||||
if(regulationData.regulationStrategy=="hard"){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return (
|
||||
<Modal
|
||||
@ -64,6 +82,7 @@ const RiskPreventionSoft: React.FC<RiskPreventionSoftProps> = (props) => {
|
||||
bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto', padding: '8px 24px 16px' }}
|
||||
centered
|
||||
onCancel={() => onCancel()}
|
||||
okButtonProps={{hidden: confirmButtonVisible}}
|
||||
onOk={() => {
|
||||
onSubmit();
|
||||
onCancel();
|
||||
|
Reference in New Issue
Block a user