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/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/pages/Evaluation/ReportPrint/index.tsx b/src/pages/Evaluation/ReportPrint/index.tsx index 31191d8..b55f1d9 100644 --- a/src/pages/Evaluation/ReportPrint/index.tsx +++ b/src/pages/Evaluation/ReportPrint/index.tsx @@ -34,7 +34,7 @@ const ReportPrint: React.FC<{}> = () => { , - , - , - ]; - }, - }} - columns={columns} - options={false} - request={(params) => - getAgencyAdminGetPagelist({ ...params, pageNo: params.current }).then((res: any) => { - const result = { - data: res.data?.records, - total: res.data?.total, - success: res.success, - pageSize: res.data?.size, - current: res.data?.current - } - return result; - }) - } - pagination={{ defaultPageSize: 10, showSizeChanger: false }} - /> - + return [ + , + , + , + ]; + }, + }} + columns={columns} + options={false} + loading={false} + request={(params) => { + setLoading(true); + return getAgencyAdminGetPagelist({ ...params, pageNo: params.current }).then((res: any) => { + const result = { + data: res.data?.records, + total: res.data?.total, + success: res.success, + pageSize: res.data?.size, + current: res.data?.current + } + return result; + }).finally(() => { + setLoading(false); + }) + }} + pagination={{ defaultPageSize: 10, showSizeChanger: false }} + /> + + { viewInvoiceValues ? ( diff --git a/src/pages/Invoice/Manager/index.tsx b/src/pages/Invoice/Manager/index.tsx index 0b8f7a9..c7a77c8 100644 --- a/src/pages/Invoice/Manager/index.tsx +++ b/src/pages/Invoice/Manager/index.tsx @@ -1,5 +1,5 @@ import React, { useRef, useState } from 'react'; -import { Button, Popconfirm, Card } from 'antd'; +import { Button, Popconfirm, Card, Spin } from 'antd'; import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table'; import FileDown from '@/utils/Download'; @@ -14,13 +14,18 @@ const Invoice: React.FC = (props) => { const [viewInvoiceFormVisible, setViewInvoiceFormVisible] = useState(false); //查看详情窗口record const [viewInvoiceValues, setViewInvoiceValues] = useState({}); + //loading + const [loading, setLoading] = useState(false); const viewDetail = (invoiceId: String) => { + setLoading(true); getInSingleInvoiceRecord(invoiceId).then((res: any) => { if (res?.success === true && res.data?.id !== null) { setViewInvoiceFormVisible(true); setViewInvoiceValues(res?.data); } + }).finally(() => { + setLoading(false); }) } @@ -187,68 +192,74 @@ const Invoice: React.FC = (props) => { return ( <> -
- { - let params = '' - for (const key in form?.getFieldsValue()) { - let element = form?.getFieldsValue()[key]; - if (element != undefined) { - params = params + '&' + key + '=' + element + +
+ { + let params = '' + for (const key in form?.getFieldsValue()) { + let element = form?.getFieldsValue()[key]; + if (element != undefined) { + params = params + '&' + key + '=' + element + } } - } - return [ - , - , - , - ]; - }, - }} - columns={columns} - options={false} - request={(params) => - getAgencyGetPagelist({ ...params, pageNo: params.current }).then((res: any) => { - const result = { - data: res.data?.records, - total: res.data?.total, - success: res.success, - pageSize: res.data?.size, - current: res.data?.current - } - return result; - }) - } - pagination={{ defaultPageSize: 10, showSizeChanger: false }} - /> -
+ return [ + , + , + , + ]; + }, + }} + columns={columns} + options={false} + loading={false} + request={(params) => { + setLoading(true); + return getAgencyGetPagelist({ ...params, pageNo: params.current }).then((res: any) => { + const result = { + data: res.data?.records, + total: res.data?.total, + success: res.success, + pageSize: res.data?.size, + current: res.data?.current + } + return result; + }).finally(() => { + setLoading(false); + }) + }} + pagination={{ defaultPageSize: 10, showSizeChanger: false }} + /> +
+
{ viewInvoiceValues ? ( diff --git a/src/pages/MainPage/ProjectManager/manager.js b/src/pages/MainPage/ProjectManager/manager.js index 6728594..a9ed872 100644 --- a/src/pages/MainPage/ProjectManager/manager.js +++ b/src/pages/MainPage/ProjectManager/manager.js @@ -14,8 +14,9 @@ import { getURLInformation } from '@/utils/CommonUtils'; import MessageDetail from '@/pages/SystemMessage/message/components/messageDetail' import NoticeDetail from '@/pages/notice/noticeList/components/NoticeDetail' import QuestDetail from '@/pages/SystemMessage/message/components/questDetail' -import ChatUI from '@/pages/customerservice/support/conversation' import { getQuestList } from '@/pages/SystemMessage/message/service' +import ApprovalDetail from '@/pages/SystemMessage/message/components/approvalDetail' +import ChatUI from '@/pages/customerservice/support/conversation' //智慧客服 @connect(({ dashboard, loading }) => ({ ...dashboard, downlistLoading: loading.effects['dashboard/fetchDowntlist'], @@ -30,7 +31,8 @@ class manager extends PureComponent { detailId: '1', // 公告id noticeDetail: false, // 公告弹窗 questData: {},//问卷数据 - questVisible: false, //问卷弹窗 + questVisible: false,//问卷弹窗 + mainDetail: false, // 审批单消息弹窗 isModalVisible: false, //智慧客服 isFlash: false, //智慧客服 isCloseWs: true, //智慧客服 @@ -65,6 +67,10 @@ class manager extends PureComponent { type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 } }) + this.props.dispatch({ + type: "dashboard/fetchtClarify", + payload: { authorizestate: '0', templatetype: '4', size: 6 } + }) NTKF_PARAM = { siteid: "bl_1000",                    //企业ID,,为固定值 settingid: "bl_1000_1492484340268",           //接待组ID,为固定值,必填 @@ -80,6 +86,7 @@ class manager extends PureComponent { this.setState({staffId: userData.userId}) this.setState({staffName: userData.fullName}) this.setState({supplierNumber: userData? userData.organizationId: 'EMPTY'}) + this.approvalDetail() } onChange = (date, dateString) => { this.setState({ @@ -106,7 +113,8 @@ class manager extends PureComponent { } closeModel = () => { // 关闭消息弹窗 this.setState({ - messageDetail: false + messageDetail: false, + mainDetail: false, }) } lookInfo = (id) => { // 公告查看 @@ -120,17 +128,22 @@ class manager extends PureComponent { noticeDetail: false }) } + approvalDetail = () => { // 审批单消息查看详情 + this.setState({ + mainDetail: true + }) + } toParticipate = async (servicecode) => {//问卷调查弹窗 const { questId } = JSON.parse(servicecode); await getQuestList({ id: questId }).then(res => { - if (res?.code == 200 && res?.success) { - this.setState({ - questData: res?.data, - questVisible: true, - }) - } + if (res?.code == 200 && res?.success) { + this.setState({ + questData: res?.data, + questVisible: true, + }) + } }) - } + } closeParticipate = () => { // 关闭问卷调查弹窗 this.setState({ questVisible: false @@ -159,26 +172,27 @@ class manager extends PureComponent { history.push('/ProjectLayout/Manager/HomePageSectionList'); }; render() { - const { downlist, projectlist, staloading, tlist, trelist } = this.props; - const { datevalue, messId, messageDetail, detailId, noticeDetail, questData, questVisible, isModalVisible, isCloseWs, optionsModal, projectModal, supplierNumber, staffId, staffName,} = this.state; //智慧客服 + const { downlist, projectlist, staloading, tlist, trelist, idList, dateNum } = this.props; + const { datevalue, messId, messageDetail, detailId, noticeDetail, questData, questVisible, mainDetail, isModalVisible, isCloseWs, optionsModal, projectModal, supplierNumber, staffId, staffName, } = this.state; return ( <> { - START_ENV == 'UAT' || START_ENV == 'DEV' || START_ENV == 'sim' ? '' : - this.talkXy()}>咨询服务︵8:30|12:3013:00|17:00 + START_ENV == 'UAT' || START_ENV == 'DEV' || START_ENV == 'sim' ? '' : + this.talkXy()}>咨询服务︵8:30|12:3013:00|17:00 }
- { - /*history.push('/SystemMessage/message')*/ - if(isCloseWs){ + { + //history.push('/SystemMessage/message') + //智慧客服 + if(isCloseWs){ this.setState({optionsModal: true}) }else{ this.setState({isModalVisible: true}) this.setState({isCloseWs: false}) this.setState({isFlash :false}) } - }}>更多
}> + }}>更多}> {trelist != [] && trelist.map((item, index) => { return (
{ item.templatetype == '3' ? this.toParticipate(item.servicecode) : this.lookDetail(item.msgId) }} className="messagetre" key={item.id}> @@ -295,11 +309,14 @@ class manager extends PureComponent { />
- {messageDetail ? { this.closeModel(), this.props.dispatch({type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 }}) }} modalVisible={messageDetail} /> : null} - {questVisible ? { this.closeParticipate(), this.props.dispatch({type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 }}) }} modalVisible={questVisible} /> : null} + {messageDetail ? { this.closeModel(), this.props.dispatch({ type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 } }) }} modalVisible={messageDetail} /> : null} + {questVisible ? { this.closeParticipate(), this.props.dispatch({ type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 } }) }} modalVisible={questVisible} /> : null} {noticeDetail && { this.noticeModel() }} modalVisible={noticeDetail} />} - {/*智慧客服*/} - 0 ? { this.closeModel(), this.props.dispatch({ type: "dashboard/fetchtClarify", payload: { authorizestate: '0', templatetype: '4', size: 6 } }) }} modalVisible={mainDetail} /> : null + } + {/*智慧客服*/} + { this.setState({projectModal: true}) }} diff --git a/src/pages/MainPage/ProjectManager/purchaseManager.js b/src/pages/MainPage/ProjectManager/purchaseManager.js index 61177a3..1ffb5e3 100644 --- a/src/pages/MainPage/ProjectManager/purchaseManager.js +++ b/src/pages/MainPage/ProjectManager/purchaseManager.js @@ -15,6 +15,7 @@ import MessageDetail from '@/pages/SystemMessage/message/components/messageDetai import NoticeDetail from '@/pages/notice/noticeList/components/NoticeDetail' import QuestDetail from '@/pages/SystemMessage/message/components/questDetail' import { getQuestList } from '@/pages/SystemMessage/message/service' +import ApprovalDetail from '@/pages/SystemMessage/message/components/approvalDetail' @connect(({ dashboard, loading }) => ({ ...dashboard, @@ -30,7 +31,8 @@ class manager extends PureComponent { detailId: '1', // 公告id noticeDetail: false, // 公告弹窗 questData: {},//问卷数据 - questVisible: false //问卷弹窗 + questVisible: false, //问卷弹窗 + mainDetail: false, // 审批单消息弹窗 } componentDidMount() { this.props.dispatch({ @@ -49,6 +51,10 @@ class manager extends PureComponent { type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 } }) + this.props.dispatch({ + type: "dashboard/fetchtClarify", + payload: { authorizestate: '0', templatetype: '4', size: 6 } + }) NTKF_PARAM = { siteid: "bl_1000",                    //企业ID,,为固定值 settingid: "bl_1000_1492484340268",           //接待组ID,为固定值,必填 @@ -58,6 +64,7 @@ class manager extends PureComponent { userlevel: "1",                       //网站自定义会员级别,1-N,可根据选择判断,取值显示到小能客户端 erpparam: "abc"                          //erpparam为erp功能的扩展字段,可选,购买erp功能后用于erp功能集成 } + this.approvalDetail() } onChange = (date, dateString) => { this.setState({ @@ -84,7 +91,8 @@ class manager extends PureComponent { } closeModel = () => { // 关闭消息弹窗 this.setState({ - messageDetail: false + messageDetail: false, + mainDetail: false, }) } lookInfo = (id) => { // 公告查看 @@ -98,17 +106,22 @@ class manager extends PureComponent { noticeDetail: false }) } + approvalDetail = () => { // 审批单消息查看详情 + this.setState({ + mainDetail: true + }) + } toParticipate = async (servicecode) => {//问卷调查弹窗 const { questId } = JSON.parse(servicecode); await getQuestList({ id: questId }).then(res => { - if (res?.code == 200 && res?.success) { - this.setState({ - questData: res?.data, - questVisible: true, - }) - } + if (res?.code == 200 && res?.success) { + this.setState({ + questData: res?.data, + questVisible: true, + }) + } }) - } + } closeParticipate = () => { // 关闭问卷调查弹窗 this.setState({ questVisible: false @@ -119,20 +132,20 @@ class manager extends PureComponent { history.push('/ProjectLayout/Manager/HomePageSectionList'); }; talkXy = () => { - if(NTKF){ + if (NTKF) { NTKF.im_openInPageChat('bl_1000_1492484340268'); } else { message.warn('小优客服初始化失败,请联系系统管理员!') } } render() { - const { downlist, projectlist, staloading, tlist, trelist } = this.props; - const { datevalue, messId, messageDetail, detailId, noticeDetail, questData, questVisible } = this.state; + const { downlist, projectlist, staloading, tlist, trelist, idList, dateNum } = this.props; + const { datevalue, messId, messageDetail, detailId, noticeDetail, questData, questVisible, mainDetail } = this.state; return ( <> { START_ENV == 'UAT' || START_ENV == 'DEV' || START_ENV == 'sim' ? '' : - this.talkXy()}>咨询服务︵8:30|12:3013:00|17:00 + this.talkXy()}>咨询服务︵8:30|12:3013:00|17:00 }
@@ -249,9 +262,12 @@ class manager extends PureComponent { />
- {messageDetail ? { this.closeModel(), this.props.dispatch({type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 }}) }} modalVisible={messageDetail} /> : null } - {questVisible ? { this.closeParticipate(), this.props.dispatch({type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 }}) }} modalVisible={questVisible} /> : null} + {messageDetail ? { this.closeModel(), this.props.dispatch({ type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 } }) }} modalVisible={messageDetail} /> : null} + {questVisible ? { this.closeParticipate(), this.props.dispatch({ type: "dashboard/fetchtlistre", payload: { pageNo: 1, pageSize: 7 } }) }} modalVisible={questVisible} /> : null} {noticeDetail && { this.noticeModel() }} modalVisible={noticeDetail} />} + { + idList.length > 0 ? { this.closeModel(), this.props.dispatch({ type: "dashboard/fetchtClarify", payload: { authorizestate: '0', templatetype: '4', size: 6 } }) }} modalVisible={mainDetail} /> : null + } ) } diff --git a/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectDocumentation.tsx b/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectDocumentation.tsx index 29107d0..a1bd77b 100644 --- a/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectDocumentation.tsx +++ b/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectDocumentation.tsx @@ -57,6 +57,8 @@ const ProjectDocumentation: React.FC = () => { render: (_: any, record: any) => { //标段信息 let sectionFirst = record?.sectionFirst; + //获取字段名称 + let openingName = openingTimeText(record?.bidMethodDict, record?.examinationMethodDict); return ( <> @@ -73,7 +75,10 @@ const ProjectDocumentation: React.FC = () => {

{sectionFirst.bidSectName}

- {createSection(record)} + {createSection(record, openingName)} +
+ {openingName}时间:{isEmpty(sectionFirst.sectionOpenTime) ? '-' : sectionFirst.sectionOpenTime} +
) } @@ -154,7 +159,7 @@ const ProjectDocumentation: React.FC = () => { * @param record * @returns */ - const createSection = (record: any) => { + const createSection = (record: any, openingName: string) => { //标段信息 let sectionFirst = record?.sectionFirst; //是否异常 @@ -222,7 +227,7 @@ const ProjectDocumentation: React.FC = () => { sectionFirst.sectionCount > 1 && ( + )} trigger="hover" overlayStyle={{ width: "45%" }} @@ -236,7 +241,36 @@ const ProjectDocumentation: React.FC = () => { ) } - + /** + * 开标时间,评审开始时间字段显示 + * @param bidMethod + * @param examinationMethod + */ + const openingTimeText = (bidMethod: string, examinationMethod: string | null) => { + const bid = '开标'; + const bid_pre = '资审开标'; + const comparison = '开启'; + const comparison_pre = '资审开启'; + const negotiation = '谈判开始'; + const review = '评审开始'; + if (bidMethod == 'procurement_mode_1' || bidMethod == 'procurement_mode_2') { + if (examinationMethod == 'examination_method_1') { //预审 + return bid_pre; + } else { + return bid; + } + } else if (bidMethod == 'procurement_mode_5' || bidMethod == 'procurement_mode_6') { + return negotiation; + } else if (bidMethod == 'procurement_mode_3') { + if (examinationMethod == 'examination_method_1') { //预审 + return comparison_pre; + } else { + return comparison; + } + } else { + return review; + } + }; /** * 项目跟进 diff --git a/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectSectionInfo.tsx b/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectSectionInfo.tsx index 80e7a6f..811f35b 100644 --- a/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectSectionInfo.tsx +++ b/src/pages/Project/ProjectManage/ProjectManager/ProjectDocumentation/components/ProjectSectionInfo.tsx @@ -8,14 +8,15 @@ import { getBusinessModuleName, getSectionBybidMethodDict, getTagColor } from ". interface ProjectSectionInfoItem { projectId: string, - bidMethodDict: string + bidMethodDict: string, + openingName: string, } //进度条长度 const progressWidth = { width: '180px' } const ProjectSectionInfo: React.FC = (props) => { - const { projectId, bidMethodDict } = props; + const { projectId, bidMethodDict, openingName } = props; const [listData, setListData] = useState([]); const [loading, setLoading] = useState(false); //获取字典 @@ -48,6 +49,9 @@ const ProjectSectionInfo: React.FC = (props) => { {createSection(record)} +
+ {openingName}时间:{isEmpty(record.sectionOpenTime) ? '-' : record.sectionOpenTime} +
) @@ -108,7 +112,7 @@ const ProjectSectionInfo: React.FC = (props) => { archiveStatus ? 已归档 - + : {getBusinessModuleName(dictData, bidMethodDict, sectionFirst?.businessModule)} @@ -120,7 +124,7 @@ const ProjectSectionInfo: React.FC = (props) => { 异常 } - 报名人数:{isEmpty(sectionFirst.applyCount) ? "0" : sectionFirst.applyCount} + 报名人数:{isEmpty(sectionFirst.applyCount) ? "0" : sectionFirst.applyCount} ) } diff --git a/src/pages/Project/ProjectManage/Supervision/components/FavoritesList.tsx b/src/pages/Project/ProjectManage/Supervision/components/FavoritesList.tsx new file mode 100644 index 0000000..14c24fe --- /dev/null +++ b/src/pages/Project/ProjectManage/Supervision/components/FavoritesList.tsx @@ -0,0 +1,206 @@ +import { getUrlRelativePath, isEmpty, isNotEmpty, proTableValueEnum } from '@/utils/CommonUtils'; +import { followUpAProjectManager, getDicData, setPurchaseCanOperate } from '@/utils/session'; +import ProTable, { ActionType, ProColumns } from '@ant-design/pro-table'; +import { Button, message, Popconfirm, Spin } from 'antd'; +import React, { useRef, useState } from 'react'; +import { useHistory } from 'umi'; +import { getFavoritesList, updateReadStatus } from '../service'; + +interface FavoritesListProps { + projectName?: string | null, + bidMethodDict?: string | null, + current?: string | null, + tabs: string | null, +} +/** + * 监督项目收藏列表 + * @param props + * @returns + */ +const FavoritesList: React.FC = (props) => { + const { projectName, bidMethodDict, current, tabs } = props + + const [spin, spinSet] = useState(false); + //查询分页数据 + const [pageData, pageDataSet] = useState({ + pageNo: tabs === 'favoritesList' ? isNotEmpty(current) ? Number(current) : 1 : 1, + pageSize: 10 + }); + //项目列表参数 + const [projectParams, setProjectParams] = useState(""); + //获取字典 + const getDict: any = getDicData(); + const dictData = JSON.parse(getDict); + //标的类型 + const procurementTypeEntrust = 'procurement_type=entrust'; + //采购方式 + const procurementModeEntrust = 'procurement_mode=entrust'; + const history = useHistory(); + const ref = useRef(); + const columns: ProColumns[] = [ + { + title: '序号', + valueType: 'index', + width: 50, + }, + { + title: '采购方式', + dataIndex: 'bidMethodDict', + width: '8%', + valueEnum: proTableValueEnum(dictData[procurementModeEntrust]), + initialValue: tabs === 'favoritesList' ? isNotEmpty(bidMethodDict) ? bidMethodDict : null : null, + }, + { + title: '项目名称', + dataIndex: 'projectName', + initialValue: tabs === 'favoritesList' ? isNotEmpty(projectName) ? projectName : null : null, + }, + { + title: '项目编号', + dataIndex: 'ebpProjectNumber', + search: false, + width: '10%', + }, + { + title: '采购人', + dataIndex: 'tendereeOrgName', + search: false, + width: '15%', + }, + { + title: '建档时间', + dataIndex: 'createDate', + search: false, + width: '10%', + }, + { + title: '标的类型', + dataIndex: 'procurementType', + width: '8%', + search: false, + valueEnum: proTableValueEnum(dictData[procurementTypeEntrust]), + }, + { + title: '所属区域', + dataIndex: 'regionDictName', + search: false, + width: '10%', + }, + { + title: '操作', + valueType: 'option', + width: 150, + render: (_: any, record: any) => [ + , + removeFavorites(record)} + okText="确定" + cancelText="取消" + > + + , + ] + }, + ] + + /** + * 项目跟进 + * @param data + */ + const followUpProject = async (data: any) => { + data.returnURL = getReturnURL(); + await followUpAProjectManager(data); + setPurchaseCanOperate(); + history.push('/ProjectLayout/Manager/HomePageSectionList'); + }; + + /** + * 移除收藏 + * @param data + */ + const removeFavorites = async (data: any) => { + const params = { + id: data.notificationId, + projectId: data.id, + status: 'd', + } + spinSet(true); + await updateReadStatus(params).then(res => { + if (res?.code == 200) { + message.success('移除收藏成功'); + ref.current?.reload(); + } + }) + }; + + /** + * 获取返回路径 + * @returns + */ + const getReturnURL = () => { + let projectURLParams = JSON.parse(projectParams); + let params = `${'?current=' + projectURLParams.current}${isEmpty(projectURLParams.projectName) ? '' : '&projectName=' + projectURLParams.projectName}${isEmpty(projectURLParams.bidMethodDict) ? '' : '&bidMethodDict=' + projectURLParams.bidMethodDict}&tabs=favoritesList`; + return getUrlRelativePath() + params; + } + + return ( + +
+ { + setProjectParams(JSON.stringify(params)); + spinSet(true); + return await getFavoritesList({ + ...params, + basePageRequest: { pageNo: pageData.pageNo, pageSize: pageData.pageSize }, + }).then((res) => { + const result = { + data: res.data.records, + total: res.data.total, + success: res.success, + pageSize: res.data.size, + current: res.data.current + } + return result; + }).finally(() => { + isNotEmpty(window.location.search) && history.push(window.location.pathname); + spinSet(false); + }) + } + } + pagination={{ + defaultPageSize: 10, + defaultCurrent: tabs === 'favoritesList' ? isNotEmpty(current) ? Number(current) : 1 : 1, + size: "small", + showSizeChanger: false, + onChange: (page, pageSize) => pageDataSet({ pageNo: page, pageSize: pageSize }), + onShowSizeChange: (current, size) => pageDataSet({ pageNo: current, pageSize: size }), + }} + onReset={() => { pageDataSet({ pageNo: 1, pageSize: 10 }) }} + /> +
+
+ ) +} +export default FavoritesList; \ No newline at end of file diff --git a/src/pages/Project/ProjectManage/Supervision/components/ProjectManage.tsx b/src/pages/Project/ProjectManage/Supervision/components/ProjectManage.tsx new file mode 100644 index 0000000..e556efa --- /dev/null +++ b/src/pages/Project/ProjectManage/Supervision/components/ProjectManage.tsx @@ -0,0 +1,176 @@ +import { getUrlRelativePath, isEmpty, isNotEmpty, proTableValueEnum } from '@/utils/CommonUtils'; +import { followUpAProjectManager, getDicData, setPurchaseCanOperate } from '@/utils/session'; +import ProTable, { ProColumns } from '@ant-design/pro-table'; +import { Button, Spin } from 'antd'; +import React, { useState } from 'react'; +import { useHistory } from 'umi'; +import { getPage } from '../service'; + +interface ProjectManageProps { + projectName?: string | null, + bidMethodDict?: string | null, + current?: string | null, + tabs: string | null, +} +/** + * 项目管理列表 + * @param props + * @returns + */ +const ProjectManage: React.FC = (props) => { + const { projectName, bidMethodDict, current, tabs } = props + + const [spin, spinSet] = useState(false); + //查询分页数据 + const [pageData, pageDataSet] = useState({ + pageNo: tabs === 'projectList' ? isNotEmpty(current) ? Number(current) : 1 : 1, + pageSize: 10 + }); + //项目列表参数 + const [projectParams, setProjectParams] = useState(""); + //获取字典 + const getDict: any = getDicData(); + const dictData = JSON.parse(getDict); + //标的类型 + const procurementTypeEntrust = 'procurement_type=entrust'; + //采购方式 + const procurementModeEntrust = 'procurement_mode=entrust'; + const history = useHistory(); + + const columns: ProColumns[] = [ + { + title: '序号', + valueType: 'index', + width: 50, + }, + { + title: '采购方式', + dataIndex: 'bidMethodDict', + width: '8%', + valueEnum: proTableValueEnum(dictData[procurementModeEntrust]), + initialValue: tabs === 'projectList' ? isNotEmpty(bidMethodDict) ? bidMethodDict : null : null, + }, + { + title: '项目名称', + dataIndex: 'projectName', + initialValue: tabs === 'projectList' ? isNotEmpty(projectName) ? projectName : null : null, + }, + { + title: '项目编号', + dataIndex: 'ebpProjectNumber', + search: false, + width: '10%', + }, + { + title: '采购人', + dataIndex: 'tendereeOrgName', + search: false, + width: '15%', + }, + { + title: '建档时间', + dataIndex: 'createDate', + search: false, + width: '10%', + }, + { + title: '标的类型', + dataIndex: 'procurementType', + width: '8%', + search: false, + valueEnum: proTableValueEnum(dictData[procurementTypeEntrust]), + }, + { + title: '所属区域', + dataIndex: 'regionDictName', + search: false, + width: '10%', + }, + { + title: '操作', + valueType: 'option', + width: 150, + render: (_: any, record: any) => + ( + <> + + + ) + }, + ] + + /** + * 项目跟进 + * @param data + */ + const followUpProject = async (data: any) => { + data.returnURL = getReturnURL(); + await followUpAProjectManager(data); + setPurchaseCanOperate(); + history.push('/ProjectLayout/Manager/HomePageSectionList'); + }; + + /** + * 获取返回路径 + * @returns + */ + const getReturnURL = () => { + let projectURLParams = JSON.parse(projectParams); + let params = `${'?current=' + projectURLParams.current}${isEmpty(projectURLParams.projectName) ? '' : '&projectName=' + projectURLParams.projectName}${isEmpty(projectURLParams.bidMethodDict) ? '' : '&bidMethodDict=' + projectURLParams.bidMethodDict}&tabs=projectList`; + return getUrlRelativePath() + params; + } + + return ( + +
+ { + setProjectParams(JSON.stringify(params)); + spinSet(true); + return await getPage({ + ...params, + basePageRequest: { pageNo: pageData.pageNo, pageSize: pageData.pageSize }, + }).then((res) => { + const result = { + data: res.data.records, + total: res.data.total, + success: res.success, + pageSize: res.data.size, + current: res.data.current + } + return result; + }).finally(() => { + isNotEmpty(window.location.search) && history.push(window.location.pathname); + spinSet(false); + }) + } + } + pagination={{ + defaultPageSize: 10, + defaultCurrent: tabs === 'projectList' ? isNotEmpty(current) ? Number(current) : 1 : 1, + size: "small", + showSizeChanger: false, + onChange: (page, pageSize) => pageDataSet({ pageNo: page, pageSize: pageSize }), + onShowSizeChange: (current, size) => pageDataSet({ pageNo: current, pageSize: size }), + }} + onReset={() => { pageDataSet({ pageNo: 1, pageSize: 10 }) }} + /> +
+
+ ) +} +export default ProjectManage; \ No newline at end of file diff --git a/src/pages/Project/ProjectManage/Supervision/index.tsx b/src/pages/Project/ProjectManage/Supervision/index.tsx index e24ebbf..26db24d 100644 --- a/src/pages/Project/ProjectManage/Supervision/index.tsx +++ b/src/pages/Project/ProjectManage/Supervision/index.tsx @@ -1,136 +1,42 @@ -import { proTableValueEnum } from '@/utils/CommonUtils'; -import { followUpAProjectManager, getDicData, setPurchaseCanOperate } from '@/utils/session'; -import ProTable, { ProColumns } from '@ant-design/pro-table'; -import { Button, Card, Spin } from 'antd'; -import React, { useEffect, useState } from 'react'; -import { useHistory } from 'umi'; -import { getPage } from './service'; -/**/ +import { getURLInformation, getUrlParam, isNotEmpty } from '@/utils/CommonUtils'; +import { Card, Radio } from 'antd'; +import React, { useState } from 'react'; +import FavoritesList from './components/FavoritesList'; +import ProjectManage from './components/ProjectManage'; +/** + * 监督项目管理 + * @returns + */ const Index: React.FC<{}> = () => { - const [spin, spinSet] = useState(false); - //查询分页数据 - const [pageData, pageDataSet] = useState({ - pageNo: 1, - pageSize: 10 - }); - //获取字典 - const getDict: any = getDicData(); - const dictData = JSON.parse(getDict); - //标的类型 - const procurementTypeEntrust = 'procurement_type=entrust'; - //采购方式 - const procurementModeEntrust = 'procurement_mode=entrust'; - const history = useHistory(); - const columns: ProColumns[] = [ - { - title: '序号', - valueType: 'index', - width: 50, - }, - { - title: '采购方式', - dataIndex: 'bidMethodDict', - width: '8%', - valueEnum: proTableValueEnum(dictData[procurementModeEntrust]), - }, - { - title: '项目名称', - dataIndex: 'projectName', - }, - { - title: '项目编号', - dataIndex: 'ebpProjectNumber', - search: false, - width: '10%', - }, - { - title: '采购人', - dataIndex: 'tendereeOrgName', - search: false, - width: '15%', - }, - { - title: '建档时间', - dataIndex: 'createDate', - search: false, - width: '10%', - }, - { - title: '标的类型', - dataIndex: 'procurementType', - width: '8%', - search: false, - valueEnum: proTableValueEnum(dictData[procurementTypeEntrust]), - }, - { - title: '所属区域', - dataIndex: 'regionDictName', - search: false, - width: '10%', - }, - { - title: '操作', - valueType: 'option', - width: 150, - render: (_: any, record: any) => - ( - <> - - - ) - }, - ] - //================================================================================FUNC - /** - * 项目跟进 - * @param data - */ - const followUpProject = async (data: any) => { - await followUpAProjectManager(data); - setPurchaseCanOperate(); - history.push('/ProjectLayout/Manager/HomePageSectionList'); + //url项目名称 + const projectName = getUrlParam("projectName"); + //url采购方式 + const bidMethodDict = getURLInformation("bidMethodDict"); + //url分页信息 + const current = getURLInformation("current"); + //url标签信息 + const tabs = getURLInformation("tabs"); + //radio value + const [mode, setMode] = useState(isNotEmpty(tabs) ? String(tabs) : 'projectList'); + + const handleModeChange = (e: any) => { + const mode = e.target.value; + setMode(mode); }; + return ( - - - - getPage({ - ...params, - basePageRequest: { pageNo: pageData.pageNo, pageSize: pageData.pageSize }, - }).then((res) => { - const result = { - data: res.data.records, - total: res.data.total, - success: res.success, - pageSize: res.data.size, - current: res.data.current - } - return result; - }) - } - pagination={{ - defaultPageSize: 10, - showSizeChanger: false, - onChange: (page, pageSize) => pageDataSet({ pageNo: page, pageSize: pageSize }), - onShowSizeChange: (current, size) => pageDataSet({ pageNo: current, pageSize: size }), - }} - onReset={() => { pageDataSet({ pageNo: 1, pageSize: 10 }) }} - /> - + + + 项目管理 + 监督项目收藏列表 + + { + mode === 'projectList' ? ( + + ) : ( + + ) + } ) } diff --git a/src/pages/Project/ProjectManage/Supervision/service.ts b/src/pages/Project/ProjectManage/Supervision/service.ts index 329963a..2b3a22f 100644 --- a/src/pages/Project/ProjectManage/Supervision/service.ts +++ b/src/pages/Project/ProjectManage/Supervision/service.ts @@ -4,9 +4,29 @@ import request from '@/utils/request'; * @param params */ export async function getPage(params?: any) { - return request('/api/biz-service-ebtp-project/v1/projectRecord/supervisor/getPage',{ + return request('/api/biz-service-ebtp-project/v1/projectRecord/supervisor/getPage', { method: 'POST', - data:params, - + data: params, + }); +} +/** + * 查询项目监督收藏列表 + * @param params + */ +export async function getFavoritesList(params?: any) { + return request('/api/biz-service-ebtp-project/v1/notification/supervisor/getPage', { + 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/pages/SystemMessage/message/components/approvalDetail.tsx b/src/pages/SystemMessage/message/components/approvalDetail.tsx new file mode 100644 index 0000000..6b360f7 --- /dev/null +++ b/src/pages/SystemMessage/message/components/approvalDetail.tsx @@ -0,0 +1,179 @@ +import { Button, Form, Input, Modal } from "antd" +import React, { useEffect, useState } from "react" +import { describeSiteMsgDetail, getProjectById, selectMsgRead } from '../service' +import '@/assets/ld_style.less' +import { history } from 'umi'; +import { followUpAProjectManager, getDefId } from '@/utils/session'; + +const { TextArea } = Input; + +interface ApprovalDetailProps { + modalVisible: boolean; + approvalId: string; + dateNum: Number; + trelist: any[]; + onCancel: () => void; +} + +const layout = { + labelCol: { span: 6 }, + wrapperCol: { span: 15 }, +}; + +const ApprovalDetail: React.FC = (props) => { + const { modalVisible, approvalId, onCancel, trelist, dateNum } = props; + const [form] = Form.useForm(); + const [detailId, setDetailId] = useState(approvalId); // 详情id + const [lastVisible, setLastVisible] = useState(trelist?.indexOf(approvalId) == 0 ? true : false); // 上一条禁用 + const [nextVisible, setNextVisible] = useState(trelist?.indexOf(approvalId) == trelist?.length - 1 ? true : false); // 下一条禁用 + const [knowVisible, setKnowVisible] = useState(false); // 知道了禁用 + const [projectId, setProjectId] = useState(); // 项目id + const [roomType, setRoomType] = useState(); // 判断资审候审 + const [disFollowUp, setDisFollowUp] = useState(false) //跟进按钮隐藏 + + useEffect(() => { + Int(approvalId); + setDetailId(approvalId) + }, [approvalId]); + const Int = (detailId: any) => { + describeSiteMsgDetail(detailId).then(res => { + // if(res.code == 200){ + if (res?.servicecode) { + let detailMess = JSON.parse(res.servicecode) + setProjectId(detailMess.tp_id) + setRoomType(detailMess.room_type) + } else { + // message.error('项目数据错误,无法获取流程,请联系管理员!') + setDisFollowUp(true) + } + res.authorizestate == '0' ? setKnowVisible(false) : setKnowVisible(true) + form.setFieldsValue({ + "title": res.title, + "createtime": res.createtime, + "content": res.content + }); + // } + }); + }; + + const next = () => { // 下一条 + setLastVisible(false) + let current = trelist.indexOf(detailId) + if (current < trelist.length - 2 && current != trelist.length - 2) { + setDetailId(trelist[current + 1]) + Int(trelist[current + 1]) + } else if (current == trelist.length - 2) { + setDetailId(trelist[current + 1]) + Int(trelist[current + 1]) + setNextVisible(true) + } else { + setNextVisible(true) + } + } + + const last = () => { // 上一条 + setNextVisible(false) + let current: any = trelist.indexOf(detailId) + if (current > 0 && current != 1) { + setDetailId(trelist[current - 1]) + Int(trelist[current - 1]) + } else if (current == 1) { + setDetailId(trelist[current - 1]) + Int(trelist[current - 1]) + setLastVisible(true) + } else { + setLastVisible(true) + } + } + + const getRead = () => { // 知道了 + selectMsgRead(detailId).then(res => { + setKnowVisible(true) + }); + } + + const getFollow = async () => { // 跟进 + await getProjectById(projectId).then(async response => { + if (response?.code == 200 && response?.success == true) { + const resData = response?.data + await followUpAProjectManager(resData); + const defId = getDefId(); + if (roomType == '1' && (defId == 'bid_prequalification' || defId == 'comparison_one_prequalification')) { //公开招标资格预审,公开比选一阶段资格预审 + history.push('/ProjectLayout/ZYuShen/senior/Notice?roomType=1') + } else if (roomType == '2' && (defId == 'bid_prequalification' || defId == 'comparison_one_prequalification')) { //公开招标资格预审后审阶段,公开比选一阶段资格预审后审阶段 + history.push('/ProjectLayout/biddingAnnouncement/BiddingInvitationList?roomType=2') + } else if ( + defId == 'bid_qualification' || + defId == 'comparison_one' || + defId == 'comparison_multi' || + defId == 'recruit' || + defId == 'negotiation_competitive_public' + ) { //公开招标后审,公开比选一阶段后审,公开比选多阶段,招募单轮,竞争性谈判发公告 + history.push('/ProjectLayout/biddingAnnouncement/BiddingAnnouncementList') + } else if ( + defId == 'bid_invitation' || + defId == 'negotiation_competitive_invite' || + defId == 'negotiation_single' + ) { //邀请招标,竞争性谈判发邀请函,单一来源 + history.push('/ProjectLayout/biddingAnnouncement/BiddingInvitationList') + } else if ( + defId == 'recruit_multi' + ) { //多轮招募 + history.push('/ProjectLayout/ZZhaoMu/Bid/BiddingAnnouncement/BiddingAnnouncementList') + } + } + }) + } + + return ( + <> + onCancel()} + width={800} + centered + footer={[ + , + , + ]} + > +

您有 {dateNum} 条公告审批结束消息,当前只显示 6 条最新的公告审批结束提示,请到 history.push('/SystemMessage/message')}> 这里 查看全部提示信息

+
+ + + + + +