diff --git a/config/config.UAT.ts b/config/config.UAT.ts index de9d1a0..6fce63b 100644 --- a/config/config.UAT.ts +++ b/config/config.UAT.ts @@ -18,7 +18,9 @@ export default defineConfig({ START_ENV:'UAT', //询价查看报价跳转地址 - REACT_APP_XUNJIA_REDIRECT: 'http://10.0.204.215:8280/provider_uat', + // REACT_APP_XUNJIA_REDIRECT: 'http://10.0.204.215:8280/provider_uat', + //询价-查看报价详情-虚拟用户uid + REACT_APP_XUNJIA_UID: 'admin_entrance', //智慧客服ws地址 REACT_APP_CUSTOMERSERVICE_WS_REDIRECT: 'ws://10.242.31.158:18022/api/api/biz-customer-service', diff --git a/config/config.dev.ts b/config/config.dev.ts index 574135e..723cdb8 100644 --- a/config/config.dev.ts +++ b/config/config.dev.ts @@ -18,8 +18,9 @@ export default defineConfig({ START_ENV: 'DEV', //询价查看报价跳转地址 - REACT_APP_XUNJIA_REDIRECT: 'http://10.0.204.215:8080/provider_dev', - + // REACT_APP_XUNJIA_REDIRECT: 'http://10.0.204.215:8080/provider_dev', + //询价-查看报价详情-虚拟用户uid + REACT_APP_XUNJIA_UID: 'admin_entrance', //智慧客服ws地址 REACT_APP_CUSTOMERSERVICE_WS_REDIRECT: 'ws://10.242.37.148:18022/api/api/biz-customer-service', diff --git a/config/config.prod.ts b/config/config.prod.ts index c81cdac..067ee29 100644 --- a/config/config.prod.ts +++ b/config/config.prod.ts @@ -18,7 +18,9 @@ export default defineConfig({ START_ENV:'PROD', //询价查看报价跳转地址 - REACT_APP_XUNJIA_REDIRECT: 'https://60.10.26.178/provider', + // REACT_APP_XUNJIA_REDIRECT: 'https://60.10.26.178/provider', + //询价-查看报价详情-虚拟用户uid + REACT_APP_XUNJIA_UID: 'admin_entrance', //智慧客服ws地址 REACT_APP_CUSTOMERSERVICE_WS_REDIRECT: 'ws://uscm.unicom.local:18022/api/api/biz-customer-service', diff --git a/config/config.sim.ts b/config/config.sim.ts index 9117142..8be6ed2 100644 --- a/config/config.sim.ts +++ b/config/config.sim.ts @@ -18,7 +18,9 @@ export default defineConfig({ START_ENV: 'sim', //询价查看报价跳转地址 - REACT_APP_XUNJIA_REDIRECT: 'http://10.0.204.215:8080/provider', + // REACT_APP_XUNJIA_REDIRECT: 'http://10.0.204.215:8080/provider', + //询价-查看报价详情-虚拟用户uid + REACT_APP_XUNJIA_UID: 'admin_entrance', //智慧客服ws地址 REACT_APP_CUSTOMERSERVICE_WS_REDIRECT: 'ws://10.242.31.54:18022/api/api/biz-customer-service', diff --git a/config/router.config.ts b/config/router.config.ts index a63478c..b4159e9 100644 --- a/config/router.config.ts +++ b/config/router.config.ts @@ -71,6 +71,10 @@ export default [ }, ], }, + {//公共服务平台 + path: '/PublicPlatform', + component: './Bid/BiddingAnnouncement/components/PublicPlatform', + }, //==============================================================引入的业务路由 ...approvalForm,//审批单 @@ -227,6 +231,11 @@ export default [ name: 'Supervision', path: '/Supervision', component: './Project/ProjectManage/Supervision' + }, + {//审查人员 项目管理页 + name: 'Examination', + path: '/Examination', + component: './Project/ProjectManage/Examination' }, {//招标项目评审-评委 path: '/ExpertReview/Review', diff --git a/src/components/BiddingRoom/index.js b/src/components/BiddingRoom/index.js index aa1832f..0a8ef57 100644 --- a/src/components/BiddingRoom/index.js +++ b/src/components/BiddingRoom/index.js @@ -35,7 +35,7 @@ const BiddingRoom = (props) => { const roomId = getRoomId(); const [list, setList] = useState(); const [selectedPath, setSelectedPath] = useState(window.location.pathname.replace('ReviewResults/Jury', 'ReviewResults').replace('ReviewResults/GroupLeader', 'ReviewResults')); - const [risky, riskySet] = useState(); + // const [risky, riskySet] = useState(); //字段类型(两种) 评标,评审 let sectionTypeTwo = MethodDict == "procurement_mode_1" || MethodDict == "procurement_mode_2" ? "评标" : "评审" //字段类型(三种) 评标,评审,谈判 @@ -156,19 +156,19 @@ const BiddingRoom = (props) => { }, []) //风险点展示获取是否有风险 - async function isRisky() { - await getRiskStatus({ assessRoomId: roomId, tpId: tpId }).then((res) => { - if (res.code == 200) { - if (res?.data) { - riskySet( - - - - ) - } - } - }) - } + // async function isRisky() { + // await getRiskStatus({ assessRoomId: roomId, tpId: tpId }).then((res) => { + // if (res.code == 200) { + // if (res?.data) { + // riskySet( + // + // + // + // ) + // } + // } + // }) + // } //评审结果页签点击事件 const onclick = async (path, id) => { @@ -285,7 +285,7 @@ const BiddingRoom = (props) => { //初始化数据 const listRender = async () => { - await isRisky(); + // await isRisky(); //供应商是否用ipass解密判断 IPassDecode == 0 ? null : supplierList.splice(2, 1) //供应商是否显示评审进展判断(招标类不显示) diff --git a/src/components/Upload/react-resumable.js b/src/components/Upload/react-resumable.js index ebf50d2..8848f1d 100644 --- a/src/components/Upload/react-resumable.js +++ b/src/components/Upload/react-resumable.js @@ -5,6 +5,7 @@ import Resumablejs from "./resumable"; import SparkMD5 from "./spark-md5"; import './style.css'; import { getCurrentTime, getTendererFileStatus } from './service'; +import { getProId } from '@/utils/session'; function getUuid() { return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { @@ -39,7 +40,8 @@ export default class ReactResumableJs extends React.Component { }, timer: 0,// 计时器 redText: false, - btnHide: false + btnHide: false, + projectId: getProId(), }; this.resumable = null; this.timerInterval; @@ -253,7 +255,8 @@ export default class ReactResumableJs extends React.Component { let data = { "tdocCatalogId": this.props.currentDate.tdocCatalogId, "tdocId": this.props.currentDate.tdocId, - "tendererId": this.props.currentDate.tendererId + "tendererId": this.props.currentDate.tendererId, + "tpId": this.state.projectId, } getTendererFileStatus(data).then((res) => { // 判断是否已投标 if (res.code == 200) { diff --git a/src/images/stamp/stamp_example.png b/src/images/stamp/stamp_example.png new file mode 100644 index 0000000..d81cbb7 Binary files /dev/null and b/src/images/stamp/stamp_example.png differ diff --git a/src/pages/Bid/BiddingAnnouncement/components/BiddingAnnouncementList.tsx b/src/pages/Bid/BiddingAnnouncement/components/BiddingAnnouncementList.tsx index fc23162..f54b13a 100644 --- a/src/pages/Bid/BiddingAnnouncement/components/BiddingAnnouncementList.tsx +++ b/src/pages/Bid/BiddingAnnouncement/components/BiddingAnnouncementList.tsx @@ -18,6 +18,8 @@ import { history } from "umi"; import { btnAuthority } from "@/utils/authority"; import { getApprProcessList } from "@/utils/SeleApprovalProcess/service" import SeleApprovalProcess from "@/utils/SeleApprovalProcess" +import { isEmpty } from "@/utils/CommonUtils" +import { checkObjectId } from "@/utils/DownloadUtils" /* * 招标公告开始 @@ -157,42 +159,47 @@ const BiddingAnnouncementList: React.FC<{}> = (props) => { <> + ); let btn2 = ( <> - + ); let btn3 = ( <> - + ); let btn4 = ( <> - + ); let btn5 = ( <> - + ); @@ -201,9 +208,10 @@ const BiddingAnnouncementList: React.FC<{}> = (props) => { - + ); @@ -271,51 +279,57 @@ const BiddingAnnouncementList: React.FC<{}> = (props) => { <> + ); let btn2 = ( <> - + ); let btn3 = ( <> - + ); let btn4 = ( <> - + ); let btn5 = ( <> - + ); let btn6 = ( <> - + ); diff --git a/src/pages/Bid/BiddingAnnouncement/components/BiddingDocument.tsx b/src/pages/Bid/BiddingAnnouncement/components/BiddingDocument.tsx index 88793e0..f16a050 100644 --- a/src/pages/Bid/BiddingAnnouncement/components/BiddingDocument.tsx +++ b/src/pages/Bid/BiddingAnnouncement/components/BiddingDocument.tsx @@ -12,6 +12,7 @@ import { getProMethod } from "@/utils/session"; import WebOffice0609, { WebOfficeRefProps } from "@/pages/webOffice/weboffice0609"; import moment from "moment"; import { AnnouncementGetMsg1, AnnouncementGetMsg2, AnnouncementGetMsg3, AnnouncementGetMsg4 } from "@/utils/AboutAnnouncementHelp"; +import { trim } from "@/utils/CommonUtils"; interface BiddingDocumentProps { modalVisible: boolean; @@ -213,7 +214,7 @@ const BiddingDocument: React.FC = (props) => { let fromData = { "tpId": tpId, - "documentName": form.getFieldValue("documentName"), + "documentName": trim(form.getFieldValue("documentName")), "documentSetId": form.getFieldValue("documentSetId"), "sections": packageMsg, "contentFileId": ref.current?.DocFileCode, @@ -285,6 +286,7 @@ const BiddingDocument: React.FC = (props) => { message: '当前项不可为空', }, ]} + normalize={(value) => trim(value)} > diff --git a/src/pages/Bid/BiddingAnnouncement/components/BiddingInvitationList.tsx b/src/pages/Bid/BiddingAnnouncement/components/BiddingInvitationList.tsx index 59482e0..2d6153a 100644 --- a/src/pages/Bid/BiddingAnnouncement/components/BiddingInvitationList.tsx +++ b/src/pages/Bid/BiddingAnnouncement/components/BiddingInvitationList.tsx @@ -19,6 +19,7 @@ import { getProId, getProMethod, getSessionProjectData } from '@/utils/session'; import { btnAuthority } from '@/utils/authority'; import { getApprProcessList } from '@/utils/SeleApprovalProcess/service'; import SeleApprovalProcess from '@/utils/SeleApprovalProcess'; +import { checkObjectId } from '@/utils/DownloadUtils'; /* * 招标公告开始 @@ -157,7 +158,7 @@ const BiddingInvitationList: React.FC<{}> = (props) => { - @@ -175,7 +176,7 @@ const BiddingInvitationList: React.FC<{}> = (props) => { - @@ -197,7 +198,7 @@ const BiddingInvitationList: React.FC<{}> = (props) => { > 提交审批 - = (props) => { - @@ -238,7 +239,7 @@ const BiddingInvitationList: React.FC<{}> = (props) => { - diff --git a/src/pages/Bid/BiddingAnnouncement/components/Medias.tsx b/src/pages/Bid/BiddingAnnouncement/components/Medias.tsx index b110980..653564d 100644 --- a/src/pages/Bid/BiddingAnnouncement/components/Medias.tsx +++ b/src/pages/Bid/BiddingAnnouncement/components/Medias.tsx @@ -1,4 +1,5 @@ -import { Checkbox, Col, Form, Row } from "antd"; +import { getDefId } from "@/utils/session"; +import { Checkbox, Col, Form, Row, Typography } from "antd"; import React, { useEffect, useState } from "react" import { getMediaService } from "../service"; @@ -26,7 +27,8 @@ const Media: React.FC = (props) => { } = props; //============================================================state const [medias, mediasSet] = useState([]); - + const { Text } = Typography + const defId = getDefId(); //流程id //mediaReleases: [{mediaId: "9", status: 1}] 9-无需推送外网; 0:没发 1:发布成功 2发布失败 let mediaStatus = {};//媒体对应发布状态 mediaReleases?.length > 0 && mediaReleases.map((item: any) => { @@ -81,7 +83,19 @@ const Media: React.FC = (props) => { { medias?.length != 0 && medias.map((item: any) => { - return ( + return defId == "recruit_multi" ? ( + item.id != "6" && + + {item.webName} + + { + mediaReleases?.length > 0 && mediaStatus[item.id] != undefined && item.id != '9' && + `(${mediaStatus[item.id]})` + } + + + + ) : ( {item.webName} @@ -99,6 +113,7 @@ const Media: React.FC = (props) => { + {defId != "recruit_multi" && 如选择发布到【中国招标投标公共服务平台】,在发布前需填写【公共服务平台】信息} ) } diff --git a/src/pages/Bid/BiddingAnnouncement/components/PublicPlatform.tsx b/src/pages/Bid/BiddingAnnouncement/components/PublicPlatform.tsx new file mode 100644 index 0000000..e5612b1 --- /dev/null +++ b/src/pages/Bid/BiddingAnnouncement/components/PublicPlatform.tsx @@ -0,0 +1,406 @@ +import React, { useEffect, useState } from 'react'; +import logo from '@/images/opening/logo.svg'; +import styles from './style.less'; +import './style.less'; +import { Anchor, BackTop, Button, Collapse, Descriptions, Form, Input, message, Modal, PageHeader, Space, Spin, Tooltip, Typography } from 'antd'; +import { btnAuthority } from '@/utils/authority'; +import { ArrowUpOutlined, CaretRightOutlined, InfoCircleOutlined } from '@ant-design/icons'; +import { getURLInformation, isNotEmpty, returnDictVal } from '@/utils/CommonUtils'; +import ExtendUpload from '@/utils/ExtendUpload'; +import { getPublicData, savePublicData } from '../service'; +import { getDefId, getDicData, getProMethod } from '@/utils/session'; +import { getAllFlowNameByRoomType } from '@/utils/FlowUtils'; +import exampleImg from '@/images/stamp/stamp_example.png' + +const layout = { + labelCol: { + span: 6, + }, + wrapperCol: { + span: 17, + }, +}; + +const validateMessages = { + required: '请填写当前项内容', +}; + +const PublicPlatform: React.FC<{}> = () => { + //loading + const [loading, setLoading] = useState(false); + //右侧浮动层监听Dom + const [container, setContainer] = useState(null); + //初始数据 + const [initialData, setInitialData] = useState({}); + //只读状态readOnly 默认只读 + const [readOnly, setReadOnly] = useState(true); + //公示or公告 true-公示 false-公告 + const [annoType, setAnnoType] = useState(false); + //示例弹窗Example + const [exampleVisible, setExampleVisible] = useState(false); + //annoId 公告公示id + const annoId = getURLInformation("id"); + //资审流程所处阶段 (roomType 2是后审,1是预审) + const roomType = getURLInformation('roomType') === null ? '2' : getURLInformation('roomType'); + //采购方式 + const proMethod = getProMethod(); + //所有流程名 + const flowName = getAllFlowNameByRoomType(proMethod, roomType); + //流程id + const defId = getDefId(); + //获取字典 + const getDict: any = getDicData(); + const dictData = JSON.parse(getDict); + + const { TextArea } = Input; + const { Panel } = Collapse; + const { Text } = Typography; + const { Link } = Anchor; + const [form] = Form.useForm(); + //Input + function returnInput(name: string | string[], label: string, readonly: boolean, initialValue: string | number | null, rules?: any[], placeholder?: string, maxLength?: number, extra?: React.ReactNode, width?: string | number, type?: string, suffix?: React.ReactNode) { + return ( + + + + ) + } + //TextArea + function returnArea(name: string | string[], label: string, readonly: boolean, initialValue: string | null, rules?: any[], placeholder?: string, extra?: React.ReactNode, maxLength?: number) { + return ( + +