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/public/Weboffice4Path.html b/public/Weboffice4Path.html index 2b9d61f..aa62682 100644 --- a/public/Weboffice4Path.html +++ b/public/Weboffice4Path.html @@ -11,6 +11,7 @@ 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/Promenu/index.tsx b/src/components/Promenu/index.tsx index 0d73ea8..0615e2c 100644 --- a/src/components/Promenu/index.tsx +++ b/src/components/Promenu/index.tsx @@ -5,7 +5,7 @@ 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 { menuList } from './service/service'; +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'; @@ -35,7 +35,7 @@ function getUrlRelativePath() { const Promenu: React.FC<{}> = () => { //获取采购方式 - const MethodDict = getProMethod(); + const MethodDict = getProMethod(); const classes = useStyles(); //流程数据 const [data, setData] = React.useState([]); @@ -51,6 +51,12 @@ const Promenu: React.FC<{}> = () => { const defId = getDefId(); //项目名称 const [proName, setProName] = useState(""); + //收藏状态 0-已收藏 d-未收藏 + const [subStatus, setSubStatus] = useState(null); + //收藏数据 + const [subData, setSubData] = useState(); + //收藏loading + const [subLoading, setSubLoading] = useState(false); const [anchorEl, setAnchorEl] = React.useState(null); @@ -68,6 +74,17 @@ const Promenu: React.FC<{}> = () => { 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()); }, []); /** @@ -84,6 +101,27 @@ const Promenu: React.FC<{}> = () => { 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)) { @@ -163,12 +201,17 @@ const Promenu: React.FC<{}> = () => { title="项目名称" subTitle={proName} extra={[ + (randerRole == 'ebtp-supervision' && subStatus == "0") + ? : null, + (randerRole == 'ebtp-supervision' && (subStatus == "d" || subStatus == "")) + ? : null, (randerRole == 'ebtp-agency-project-manager' || randerRole == 'ebtp-purchase' || randerRole == 'ebtp-supervision') ? : null, (randerRole == 'ebtp-agency-project-manager' || randerRole == 'ebtp-purchase' || randerRole == 'ebtp-supervision') && defId != 'inquiry' - ? : null, + setButtonValue(stepButtonClick(data?.[data?.length - 1])) + }}>项目归档 : null, ((randerRole == 'ebtp-agency-project-manager' || randerRole == 'ebtp-purchase' || randerRole == 'ebtp-supervision') && MethodDict != "procurement_mode_7") ? : null, (randerRole == 'ebtp-supplier' && MethodDict != "procurement_mode_7") diff --git a/src/components/Promenu/service/service.ts b/src/components/Promenu/service/service.ts index e938aef..8a31df6 100644 --- a/src/components/Promenu/service/service.ts +++ b/src/components/Promenu/service/service.ts @@ -15,4 +15,26 @@ export async function menuList(params: any) { method: 'GET', params: { ...params } }); +} +/** + * 收藏用-查询收藏信息(项目id或收藏id) + * @param params + * @returns + */ +export async function getReadInfo(params: any) { + return request('/api/biz-service-ebtp-project/v1/notification/getReading', { + method: 'POST', + data: { ...params }, + }); +} +/** + * 收藏用-变更收藏状态(0-已收藏 d-未收藏) + * @param params + * @returns + */ +export async function updateReadStatus(params: any) { + return request('/api/biz-service-ebtp-project/v1/notification/addOrUpdate', { + method: 'POST', + data: { ...params }, + }); } \ No newline at end of file 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 ( + +