diff --git a/src/pages/LoadingPage/index.tsx b/src/pages/LoadingPage/index.tsx index b40b4cf..64a21e8 100644 --- a/src/pages/LoadingPage/index.tsx +++ b/src/pages/LoadingPage/index.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import { message, Spin } from 'antd'; -import { history } from '@umijs/max'; +import { history } from 'umi'; import { cloudReloadToken, cooperReloadToken, fgetUserMsg, getDictionaries, getTokenByCode } from './service'; import { getTotalURLInformation, getURLInformation, isNotEmpty } from '@/utils/CommonUtils'; import { refreshTokenApi } from '@/services/login'; @@ -74,19 +74,7 @@ const Loading: React.FC<{}> = () => { // return; // } // } else { - let role = userData.authorityList[0].roleCode; - let roleData = userData.authorityList[0]; - - const loginType = localStorage.getItem('loginType'); - if (loginType) { - const roleCode = `ebtp-${loginType}` - const targetRole = userData.authorityList.find((ite: any) => ite.roleCode == roleCode); - if (targetRole) { - role = targetRole.roleCode; - roleData = targetRole; - } - } - setUserData(userData, role, roleData); + setUserData(userData, userData.authorityList[0].roleCode, userData.authorityList[0]); // } await setDict();//存字典 setTimeout(() => { @@ -101,189 +89,220 @@ const Loading: React.FC<{}> = () => { //获取用户信息 async function getUserData(token: string, url: string, extra: any, status: number) { -// const res = { -// "userId": "ex-linjp29", -// "lastName": null, -// "firstName": null, -// "fullName": "林剑萍", -// "emailAddress": null, -// "loginName": "ex-linjp29", -// "mobilePhone": null, -// "officePhone": null, -// "sex": null, -// "employeeCategory": null, -// "userType": "1", -// "dateOfBirth": null, -// "age": null, -// "employeeNumber": "1743164896", -// "nationalityId": null, -// "nationality": null, -// "nationalIdentifier": null, -// "supervisorId": null, -// "organizationId": "101058278", -// "organizationName": "湖北信通通信有限公司", -// "orgCategory": null, -// "deptId": "101058278", -// "deptName": "湖北信通通信有限公司", -// "roleIds": null, -// "bussiGroupId": null, -// "positionId": null, -// "currentRoleCode": "undefined", -// "province": null, -// "authorityList": [ -// { -// "roleId": "000009", -// "roleName": "代理机构业务经理", -// "roleCode": "ebtp-agency-project-manager", -// "roleScope": "EBTP", -// "authorities": [ -// "ebtp-agency-project-manager", -// null, -// "ebtp-agency-project-manager", -// "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", -// "ebtp-agency-project-manager", -// "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", -// "ebtp-agency-project-manager", -// "ebtp-agency-project-manager", -// null, -// "ebtp-agency-project-manager", -// null, -// "ebtp-agency-project-manager", -// "ebtp-agency-project-manager", -// null, -// "ebtp-agency-project-manager,ebtp-expert,ebtp-agency-admin", -// null, -// null, -// "ebtp-agency-admin", -// null, -// null, -// null, -// null, -// null, -// null, -// null, -// "ebtp-agency-project-manager", -// "ebtp-agency-project-manager,ebtp-purchase", -// "ebtp-agency-project-manager,ebtp-purchase", -// "ebtp-agency-project-manager,ebtp-purchase", -// "ebtp-agency-project-manager,ebtp-purchase", -// "ebtp-agency-project-manager,ebtp-purchase", -// null, -// null, -// null, -// null, -// null, -// "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier", -// "ebtp-agency-project-manager,ebtp-supplier", -// "ebtp-agency-project-manager", -// "ebtp-agency-project-manager", -// null -// ] -// }, -// { -// "roleId": "000006", -// "roleName": "供应商", -// "roleCode": "ebtp-supplier", -// "roleScope": "EBTP", -// "authorities": [ -// "system:user:test", -// "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", -// "system:user:test", -// "ebtp-agency-project-manager", -// "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", -// "ebtp-supplier", -// "ebtp-supplier", -// "system:user:test", -// "system:user:test", -// "ebtp-agency-project-manager,ebtp-expert,ebtp-agency-admin", -// "ebtp-supplier", -// "system:user:test", -// "ebtp-supplier", -// "system:user:test", -// "ebtp-supplier", -// "ebtp-supplier", -// "ebtp-supplier", -// "ebtp-supplier", -// "ebtp-supplier", -// "ebtp-supplier", -// "ebtp-supplier", -// null, -// null, -// null, -// "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier", -// "ebtp-agency-project-manager,ebtp-supplier", -// "ebtp-supplier", -// "system:user:test", -// "system:user:test", -// "system:user:test", -// "ebtp-agency-project-manager", -// "system:user:test" -// ] -// } -// ] -// } -// if (res?.authorityList == null || res?.authorityList?.length == 0) { -// if (url == 'ExamineAndApprove/Announcement' || -// url == 'ExamineAndApprove/ChangeTheAnnouncement' || -// url == 'ExamineAndApprove/Publicity' || -// url == 'ExamineAndApprove/InvitationLetter' || -// url == 'ExamineAndApprove/ExternalReference' || -// url == 'ExamineAndApprove/FailureAnnouncement') { -// let newAuthority: any[] = [] -// newAuthority.push({ -// authorities: [null, "system:user:test", "system:user:test", "system:user:test", "system:user:test", null, null], -// roleCode: "ebtp-unicom-default", -// roleId: "20004", -// roleName: "联通普通用户", -// roleScope: "EBTP" -// }) -// res.authorityList = [...newAuthority]; -// await redirect(res, url, extra); -// } -// }else { -// await redirect(res, url, extra); -// } - fgetUserMsg(token).then(async res => { - if (res) { - if (res?.userType == null) { - error('401'); - } else { - if (res?.authorityList == null || res?.authorityList?.length == 0) { - if (url == 'ExamineAndApprove/Announcement' || - url == 'ExamineAndApprove/ChangeTheAnnouncement' || - url == 'ExamineAndApprove/Publicity' || - url == 'ExamineAndApprove/InvitationLetter' || - url == 'ExamineAndApprove/ExternalReference' || - url == 'ExamineAndApprove/FailureAnnouncement') { - const newAuthority: any[] = [] - debugger - newAuthority.push({ - authorities: [null, "system:user:test", "system:user:test", "system:user:test", "system:user:test", null, null], - roleCode: "ebtp-cosco-default", - roleId: "20004", - roleName: "普通用户", - roleScope: "EBTP" - }) - res.authorityList = [...newAuthority]; - await redirect(res, url, extra); - } else { - if (status == 0) { - // await refreshUserData(res?.userType, token, url, extra); - message.error("角色身份信息不存在").then(() => { - history.replace('/login'); - }); - } else { - error('401'); - } - } - } else { - await redirect(res, url, extra); - } + const res = { + "userId": "ex-wanghy623", + "lastName": null, + "firstName": null, + "fullName": "曹鹏", + "emailAddress": null, + "loginName": "ex-wanghy623", + "mobilePhone": null, + "officePhone": null, + "sex": null, + "employeeCategory": null, + "userType": "1", + "dateOfBirth": null, + "age": null, + "employeeNumber": "1753782355", + "nationalityId": null, + "nationality": null, + "nationalIdentifier": null, + "supervisorId": null, + "organizationId": "101152137", + "organizationName": "河北通信工程招投标有限公司", + "orgCategory": null, + "deptId": "101152137", + "deptName": "河北通信工程招投标有限公司", + "roleIds": null, + "bussiGroupId": null, + "positionId": null, + "currentRoleCode": "undefined", + "province": null, + "authorityList": [ + { + "roleId": "000007", + "roleName": "代理机构管理员", + "roleCode": "ebtp-agency-admin", + "roleScope": "EBTP", + "authorities": [ + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", + null, + "ebtp-agency-admin", + null, + null, + "ebtp-agency-project-manager,ebtp-expert,ebtp-agency-admin", + null, + "ebtp-agency-admin", + null, + null, + null, + null, + "ebtp-agency-admin", + null, + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier", + "ebtp-agency-project-manager,ebtp-supplier", + "ebtp-agency-project-manager", + "ebtp-agency-project-manager" + ] + }, + { + "roleId": "000009", + "roleName": "代理机构业务经理", + "roleCode": "ebtp-agency-project-manager", + "roleScope": "EBTP", + "authorities": [ + null, + "ebtp-agency-project-manager", + "ebtp-agency-project-manager", + null, + "ebtp-agency-project-manager", + null, + "ebtp-agency-project-manager", + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", + null, + "ebtp-agency-project-manager", + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", + "ebtp-agency-project-manager", + "ebtp-agency-project-manager", + null, + null, + "ebtp-agency-project-manager", + null, + "ebtp-agency-project-manager,ebtp-expert,ebtp-agency-admin", + null, + null, + "ebtp-agency-admin", + null, + null, + null, + null, + null, + null, + null, + "ebtp-agency-project-manager", + "ebtp-agency-project-manager,ebtp-purchase", + "ebtp-agency-project-manager,ebtp-purchase", + "ebtp-agency-project-manager,ebtp-purchase", + "ebtp-agency-project-manager,ebtp-purchase", + "ebtp-agency-project-manager,ebtp-purchase", + null, + null, + null, + null, + null, + null, + null, + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier", + "ebtp-agency-project-manager,ebtp-supplier", + "ebtp-agency-project-manager", + "ebtp-agency-project-manager", + null + ] + }, + { + "roleId": "000006", + "roleName": "供应商", + "roleCode": "ebtp-supplier", + "roleScope": "EBTP", + "authorities": [ + "ebtp-supplier", + "system:user:test", + "ebtp-supplier", + "system:user:test", + "ebtp-agency-project-manager", + "system:user:test", + null, + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", + "system:user:test", + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier,ebtp-agency-admin", + "ebtp-agency-project-manager,ebtp-expert,ebtp-agency-admin", + "system:user:test", + "ebtp-supplier", + null, + "ebtp-supplier", + "ebtp-supplier", + "ebtp-supplier", + "ebtp-supplier", + "system:user:test", + "ebtp-supplier", + "ebtp-supplier", + "ebtp-supplier", + "ebtp-supplier", + null, + null, + null, + null, + "ebtp-agency-project-manager,ebtp-expert,ebtp-supplier", + "ebtp-agency-project-manager,ebtp-supplier", + "ebtp-supplier", + "system:user:test", + "system:user:test", + "system:user:test", + "ebtp-agency-project-manager", + "system:user:test" + ] } - } else { - message.error("登录信息有误,请重新登录") + ] + } + if (res?.authorityList == null || res?.authorityList?.length == 0) { + if (url == 'ExamineAndApprove/Announcement' || + url == 'ExamineAndApprove/ChangeTheAnnouncement' || + url == 'ExamineAndApprove/Publicity' || + url == 'ExamineAndApprove/InvitationLetter' || + url == 'ExamineAndApprove/ExternalReference' || + url == 'ExamineAndApprove/FailureAnnouncement') { + let newAuthority: any[] = [] + newAuthority.push({ + authorities: [null, "system:user:test", "system:user:test", "system:user:test", "system:user:test", null, null], + roleCode: "ebtp-unicom-default", + roleId: "20004", + roleName: "联通普通用户", + roleScope: "EBTP" + }) + res.authorityList = [...newAuthority]; + await redirect(res, url, extra); } - }) + }else { + await redirect(res, url, extra); + } + // await fgetUserMsg(token).then(async res => { + // if (res) { + // if (res?.userType == null) { + // error('401'); + // } else { + // if (res?.authorityList == null || res?.authorityList?.length == 0) { + // if (url == 'ExamineAndApprove/Announcement' || + // url == 'ExamineAndApprove/ChangeTheAnnouncement' || + // url == 'ExamineAndApprove/Publicity' || + // url == 'ExamineAndApprove/InvitationLetter' || + // url == 'ExamineAndApprove/ExternalReference' || + // url == 'ExamineAndApprove/FailureAnnouncement') { + // let newAuthority: any[] = [] + // newAuthority.push({ + // authorities: [null, "system:user:test", "system:user:test", "system:user:test", "system:user:test", null, null], + // roleCode: "ebtp-unicom-default", + // roleId: "20004", + // roleName: "联通普通用户", + // roleScope: "EBTP" + // }) + // res.authorityList = [...newAuthority]; + // await redirect(res, url, extra); + // } else { + // if (status == 0) { + // await refreshUserData(res?.userType, token, url, extra); + // } else { + // error('401'); + // } + // } + // } else { + // await redirect(res, url, extra); + // } + // } + // } else { + // message.error("登录信息有误,请重新登录") + // } + // }) } //通过code取token async function getToken(code: string, data: any) { diff --git a/src/pages/MainPage/ProjectManager/purchaseManager.js b/src/pages/MainPage/ProjectManager/purchaseManager.js index a6916cd..fb38a7a 100644 --- a/src/pages/MainPage/ProjectManager/purchaseManager.js +++ b/src/pages/MainPage/ProjectManager/purchaseManager.js @@ -274,7 +274,7 @@ class manager extends PureComponent { <> @@ -157,8 +161,8 @@ const ProjectDocumentation: React.FC = () => { } /** * 加载标段数据 - * @param record - * @returns + * @param record + * @returns */ const createSection = (record: any, openingName: string) => { //标段信息 @@ -244,8 +248,8 @@ const ProjectDocumentation: React.FC = () => { } /** * 开标时间,评审开始时间字段显示 - * @param bidMethod - * @param examinationMethod + * @param bidMethod + * @param examinationMethod */ const openingTimeText = (bidMethod: string, examinationMethod: string | null) => { const bid = '开标'; @@ -410,7 +414,7 @@ const ProjectDocumentation: React.FC = () => { /** * 获取返回路径 - * @returns + * @returns */ const getReturnURL = () => { let projectURLParams = JSON.parse(projectParams); diff --git a/src/pages/ProjectFiles/dict.ts b/src/pages/ProjectFiles/dict.ts index 8843345..66d4db5 100644 --- a/src/pages/ProjectFiles/dict.ts +++ b/src/pages/ProjectFiles/dict.ts @@ -54,13 +54,13 @@ const regionOutsideOptions = [ // 币种 const currencyCodeOptions = [ { label: 'CNY', value: 'CNY' }, - { label: 'EUR', value: 'EUR' }, + // { label: 'EUR', value: 'EUR' }, { label: 'USD', value: 'USD' }, ]; const currencyCodeMap = new Map([ ['CNY','CNY'], - ['EUR','EUR'], + // ['EUR','EUR'], ['USD','USD'] ]) @@ -107,28 +107,35 @@ const tenderAgencyEnum = { // 报价方式 const quotationMethodDictEnum = { - 1: '总价', - 2: '单价', - 3: '优惠率', - 4: '折扣率', + 'quotation_method_1': '总价', + 'quotation_method_4': '单价', + 'quotation_method_3': '优惠率', + 'quotation_method_2': '折扣率', }; // 评价方法 const evalMethodDictEnum = { - 1: '最低价法', - 2: '综合评估法', - 3: '合理低价法', + 'eval_method_1': '最低价法', + 'eval_method_2': '综合评估法', + 'eval_method_3': '合理低价法', +}; + +const evalMethodDictMap = new Map([ + ['eval_method_1','1'], + ['eval_method_2','2'], + ['eval_method_3','2'] +]) + +// 流程类型 +const chooseProcessEnum = { + '1': '第一轮初审,固定流程', + '2': '第一轮初审详审,固定流程' }; // 资格审查方法 const ptcpModeEnum = { - 1: '合格制', - 2: '有限数量制', -}; - -// 流程类型 -const chooseProcessEnum = { - 1: '第一轮初审详审,固定流程', + 'ptcp_mode_1': '合格制', + 'ptcp_mode_2': '有限数量制', }; // 标的类别1 @@ -166,5 +173,6 @@ export { subjectType2Options, currencyCodeMap, fundsProviderOptionsMap, - openTenderFormMap + openTenderFormMap, + evalMethodDictMap }; diff --git a/src/pages/ProjectFiles/entrustIndex.tsx b/src/pages/ProjectFiles/entrustIndex.tsx index ba6ce42..9ca03ff 100644 --- a/src/pages/ProjectFiles/entrustIndex.tsx +++ b/src/pages/ProjectFiles/entrustIndex.tsx @@ -1,6 +1,6 @@ import {Button, message, Modal} from 'antd'; import React, { useRef } from 'react'; -import { history } from 'umi'; +import { history,useNavigate } from 'umi'; import { PageContainer } from '@ant-design/pro-layout'; import type { ProColumns, ActionType } from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table'; @@ -10,7 +10,7 @@ import { procurementMode } from './dict'; const ProjectFiles: React.FC = () => { const actionRef = useRef(); - + const navigate = useNavigate(); const columns: ProColumns[] = [ { title: '序号', @@ -93,40 +93,42 @@ const ProjectFiles: React.FC = () => { render: (text: any, record: any) => ( <> {( - )} {(record.status=== 4) &&( - )} {(record.status=== 1) && ( @@ -195,6 +197,11 @@ const ProjectFiles: React.FC = () => { }; } + const clearSessionData = () => { + sessionStorage.removeItem("projectData"); + sessionStorage.removeItem("opt"); + } + return (
@@ -209,6 +216,7 @@ const ProjectFiles: React.FC = () => { type="primary" key="primary" onClick={() => { + clearSessionData(); history.push('/ProjectFiles/file?action=create'); }} > diff --git a/src/pages/ProjectFiles/file.tsx b/src/pages/ProjectFiles/file.tsx index e3d0828..ce05562 100644 --- a/src/pages/ProjectFiles/file.tsx +++ b/src/pages/ProjectFiles/file.tsx @@ -2,7 +2,6 @@ import { CloseCircleOutlined, MinusCircleOutlined, PlusOutlined } from '@ant-des import {Button, Card, Col, Form, Popover, Row, message, Divider, Select, Input, Upload, Modal, Table} from 'antd'; import type { FormInstance } from 'antd'; import { history, useLocation } from '@umijs/max'; -import type { Location } from '@umijs/max'; import React, {useState, Fragment, useRef} from 'react'; import ProForm, { @@ -15,7 +14,7 @@ import ProForm, { } from '@ant-design/pro-form'; import { PageContainer, FooterToolbar } from '@ant-design/pro-layout'; import { - dispatch, getProjectOne, initProjectEntrustForCosco, + dispatch, initProjectEntrustForCosco, updateProjectEntrust } from './service'; import styles from './style.less'; @@ -40,7 +39,8 @@ import { currencyCodeMap, fundsProviderOptionsMap, suppQualifyEnumContent, - openTenderFormMap + openTenderFormMap, + evalMethodDictMap } from './dict'; import CitySelect from '@/components/CitySelect'; import {useEffect} from "react"; @@ -130,43 +130,13 @@ const map = new Map([ //模拟当前登录用户信息 const getUserMock = () => { - return { - "userId": "xiaorui", - "fullName": "萧睿", - "loginName": "萧睿", - "organizationId": '001', - "organizationName": '中远海运集团', - "deptId": "012", - "deptName": "采购部", - "mobilePhone": "13545674321", - "authorityList": [ - { - "roleId": "000006", - "roleName": "供应商", - "roleCode": "ebtp-supplier" - }, - { - "roleId": "000007", - "roleName": "代理机构管理员", - "roleCode": "ebtp-agency-admin" - }, - { - "roleId": "000009", - "roleName": "代理机构业务经理", - "roleCode": "ebtp-agency-project-manager" - }, - { - "roleId": "14", - "roleName": "采购经理(招标采购中心)", - "roleCode": "ebtp-purchase" - }, - { - "roleId": "20005", - "roleName": "EBTP系统管理员", - "roleCode": "ebtp-system-admin" - } - ] + const user = sessionStorage.getItem('userData')?JSON.parse(sessionStorage.getItem('userData')):null; + + if(!user){ + message.error("请先登录系统再进行操作!").then() + return; } + return user; } //模拟代理机构管理员信息 const getAgencyManagerMock = () => { @@ -184,7 +154,8 @@ const ProjectFileCreate: React.FC> = () => { const [suppQualifyDisabled,setSuppQualifyDisabled] = useState(false); const formRef = useRef(); const [form] = Form.useForm(); - const location = useLocation(); + const [labelValue,setLabelValue] = useState('标段预算'); + const location: any = useLocation(); const projectData: any | null = sessionStorage.getItem('projectData'); const recordInfo = location?.state?.record?location?.state?.record: projectData?JSON.parse(projectData): undefined; const myRoleCode = location?.state?.myRoleCode; @@ -193,11 +164,12 @@ const ProjectFileCreate: React.FC> = () => { const isDrafts = recordInfo?.status === 4;//ProjectEntrust表中 status 4 代表 草稿 const isEntrustProject = recordInfo?.organization === 'organization_1'; // 查看或者分派的时候只读 - const isView = opt === 'view'; - const isEdit = opt === 'edit'; + const isView = opt === 'view';//列表页查看 + const iView = opt === 'iview';//内嵌别的页面查看 + const isEdit = opt === 'edit';//编辑 const isUpgrade = opt === 'upgrade';//是否是 版本升级 const isAssignOpt = opt ==='assign';//分派 - const readOnly = (isView || isAssignOpt); + const readOnly = (isView || isAssignOpt || iView); // 编辑或者代理管理员分派的时候显示 const isAssign = isAssignOpt && isAgencyAdmin; // const id = query?.id; // 文件 id @@ -362,7 +334,6 @@ const ProjectFileCreate: React.FC> = () => { } try { - console.log(values); const sectionList = values?.bidSection; for(const j in sectionList){ const section = sectionList[j]; @@ -370,6 +341,8 @@ const ProjectFileCreate: React.FC> = () => { section.currencyName = values.currencyName; const categories = section.bidSectionCategory; const categoryList: any = []; + const total = 100; + let actTotal = 0; for(const i in categories){ const category = categories[i]; const categoryListItem = { @@ -377,10 +350,17 @@ const ProjectFileCreate: React.FC> = () => { subCategory: category.type[1], percent: category.percent } + actTotal += category.percent; categoryList.push(categoryListItem); } section.categoryList = categoryList; + if(total!= actTotal){ + + message.error("任意标段中,主要标的类别占比总和应为100!") + return; + } } + delete values.bidSection; delete values.regionDict; values.projectEntrustExpand = { @@ -463,11 +443,14 @@ const ProjectFileCreate: React.FC> = () => { }, render: (props, dom) => { if (readOnly && !isAssign) { + if(iView){ + return null; + } return ( )} @@ -978,10 +976,13 @@ const ProjectFileCreate: React.FC> = () => { return ( <> {currencyCode} @@ -1012,11 +1013,17 @@ const ProjectFileCreate: React.FC> = () => { valueEnum={evalMethodDictEnum} fieldProps={{ disabled: readOnly, + onChange: (value) => { + const chooseProcessValue = evalMethodDictMap.get(value); + const bidSection = form.getFieldValue('bidSection') + bidSection[field.name].chooseProcess = chooseProcessValue + form.setFieldValue(`bidSection`, bidSection); + } }} /> - > = () => { fieldProps={{ disabled: readOnly, }} - /> + />)} > = () => { rules={[{ required: true, message: '请选择流程类型' }]} valueEnum={chooseProcessEnum} fieldProps={{ - disabled: readOnly, + disabled: true, }} /> @@ -1041,8 +1048,24 @@ const ProjectFileCreate: React.FC> = () => { { + const valueInt = Number(value); + if(form.getFieldValue('bidSection')[field.name].evalMethodDict === 'eval_method_1'){ + if(valueInt % 2 == 0 || valueInt < 3){ + + return Promise.reject(new Error('评价方式为最低价发,要求专家人数为3人以上奇数!')); + } + }else { + if(valueInt % 2 == 0 || valueInt < 5){ + return Promise.reject(new Error('评价方式不是最低价发,要求专家人数为5人以上奇数!')); + } + } + return Promise.resolve(); + }}]} + fieldProps={{ + precision: 0, disabled: readOnly + }} min={0} /> @@ -1112,6 +1135,7 @@ const ProjectFileCreate: React.FC> = () => { { e.preventDefault(); @@ -1123,7 +1147,7 @@ const ProjectFileCreate: React.FC> = () => { > = () => { return Upload.LIST_IGNORE; } - const isLt20M = file.size / 1024 / 1024 < 20; + const isLt20M = file.size / 1024 / 1024 < 50; if (!isLt20M) { - message.error('文件大小不能超过 20MB!'); + message.error('文件大小不能超过 50MB!'); return Upload.LIST_IGNORE; } diff --git a/src/pages/ProjectFiles/index.tsx b/src/pages/ProjectFiles/index.tsx index bfe6cf9..a8ecbb1 100644 --- a/src/pages/ProjectFiles/index.tsx +++ b/src/pages/ProjectFiles/index.tsx @@ -1,6 +1,6 @@ import {Button, message, Modal, Table} from 'antd'; import React, {useEffect, useRef, useState} from 'react'; -import { history } from '@umijs/max'; +import { history,useNavigate } from '@umijs/max'; import { PageContainer } from '@ant-design/pro-layout'; import type { ProColumns, ActionType } from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table'; @@ -17,6 +17,7 @@ interface VersionData { versionNo: string; } const ProjectFiles: React.FC = () => { + const navigate = useNavigate(); const actionRef = useRef(); const [versionData, setVersionData] = useState([]); const [isModalOpen, setIsModalOpen] = useState(false); @@ -132,13 +133,13 @@ const ProjectFiles: React.FC = () => { <> {( )} @@ -151,39 +152,39 @@ const ProjectFiles: React.FC = () => { )} {(record.status === 4) &&( )} {(record.status=== 9) && ( )} {(record.status=== 1) && ( diff --git a/src/pages/ProjectFiles/service.ts b/src/pages/ProjectFiles/service.ts index b1dfb9c..c3256e8 100644 --- a/src/pages/ProjectFiles/service.ts +++ b/src/pages/ProjectFiles/service.ts @@ -1,6 +1,7 @@ // @ts-ignore /* eslint-disable */ -import { request } from '@umijs/max'; +// import { request } from '@umijs/max'; +import request from '@/utils/request'; // import { TableListItem } from './data'; const prefix = '/api/biz-service-ebtp-project/'; diff --git a/src/pages/ProjectFiles/style.less b/src/pages/ProjectFiles/style.less index 92835fe..56fb7c4 100644 --- a/src/pages/ProjectFiles/style.less +++ b/src/pages/ProjectFiles/style.less @@ -67,4 +67,12 @@ } } } -} \ No newline at end of file +} + +.pageContainer { + :global { + .ant-pro-page-container-warp { + display: none; + } + } +} diff --git a/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx b/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx index 0738821..fbacb83 100644 --- a/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx +++ b/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx @@ -35,6 +35,7 @@ const JudgingPanel: React.FC<{}> = () => { const [loading, loadingSet] = useState(false); const [sections, setSections] = useState([]); const [sectionsVal, setSectionsVal] = useState([]); + const [maxJuryNumber, setMaxJuryNumber] = useState(0); const [modalVis, setModalVis] = useState(false);//新增评委会 const [updateData, updateDataSet] = useState();//评委会modal数据 const [memberVis, setMemberVis] = useState(false); @@ -53,6 +54,10 @@ const JudgingPanel: React.FC<{}> = () => { //当前可编辑的行 const [editableKeys, setEditableRowKeys] = useState([]); const [tableData, setTableData] = useState([]); + const tableDataRef = useRef([]) + useEffect(() => { + tableDataRef.current = tableData + }, [tableData]) function getShouName() { const method = getProMethod(); let showNameT: any = { zbr: '', bb: '', pb: '', }//相关标段 标书费 保证金 服务费 @@ -338,6 +343,9 @@ const JudgingPanel: React.FC<{}> = () => { } setSections(data); setSectionsVal(secVals); + //获取所有标段中 专家数量得最大值 + const maxJuryNumber = Math.max(...sections.map((section: { juryNumber: any; }) => section.juryNumber)); + setMaxJuryNumber(maxJuryNumber); setIndeterminate(!!checked.length && checked.length < secVals.length); setCheckAll(checked.length === secVals.length); updateData && String(updateData?.reserveStatus) == "1" && getEarliestTime(data, checked);//初始化赋值数据 @@ -591,7 +599,7 @@ const JudgingPanel: React.FC<{}> = () => { -

专家申请基本信息

+

专家申请基本信息评标委员会人数:{{maxJuryNumber}}

= () => { {() => { const expertNumber = form.getFieldValue('expertNumber'); - if (!expertNumber || expertNumber <= 0) return null; + // if (!expertNumber || expertNumber <= 0) return null; return ( @@ -656,7 +664,25 @@ const JudgingPanel: React.FC<{}> = () => { setEditableRowKeys(keys); }, onValuesChange: (record, recordList) => { - setTableData(recordList); + let expertNumberInTable = 0; + const newTableData = [] + recordList.forEach((item) => { + if (item.extractNumber !== undefined) { + newTableData.push(item) + expertNumberInTable += item.extractNumber || 0 + } else { + const _item = tableDataRef.current.find(it => it.uid === item.uid) + if (_item) { + newTableData.push(_item) + expertNumberInTable += _item.extractNumber || 0 + } else { + newTableData.push(item) + expertNumberInTable += item.extractNumber || 0 + } + } + }) + form.setFieldValue('expertNumber',expertNumberInTable) + setTableData(newTableData); }, actionRender: (row, _, dom) => { return [dom.delete]; @@ -712,7 +738,8 @@ const JudgingPanel: React.FC<{}> = () => { dataIndex: 'extractNumber', width: '30%', renderFormItem: (_, { record }) => { - return ; + return ; }, formItemProps: { rules: [ @@ -736,8 +763,8 @@ const JudgingPanel: React.FC<{}> = () => { ]; /** * 校验函数 - * @param schemaData - * @returns + * @param schemaData + * @returns */ const checkData = (schemaData: any) => { let res = true; @@ -819,6 +846,7 @@ const JudgingPanel: React.FC<{}> = () => { //原下一步逻辑开始 let juryRoomList: any = []; form.validateFields().then(async (formVals) => { + // const formVals = form.getFieldsValue() const finalVals = { ...formVals, extractSpecialityList: tableData, @@ -835,6 +863,10 @@ const JudgingPanel: React.FC<{}> = () => { }) : pass = false; //招标人数需要大于5 需要取项目类型 const bidCount = parseInt(formVals.representativeNumber) + parseInt(formVals.expertNumber); + if(maxJuryNumber != bidCount){ + pass = false; + message.error("【直接录入专家数量】和【抽取专家数量】总和与建档信息标段设置专家最大数量不符!").then(); + } if (pass) { pass = checkMan(bidCount, parseInt(formVals.expertNumber)); } @@ -1766,4 +1798,4 @@ const JudgingPanel: React.FC<{}> = () => {
) } -export default JudgingPanel; \ No newline at end of file +export default JudgingPanel; diff --git a/src/pages/Tender/ProjectManager/JudgingPanel/List/preIndex.tsx b/src/pages/Tender/ProjectManager/JudgingPanel/List/preIndex.tsx index 7521dc3..ee49d10 100644 --- a/src/pages/Tender/ProjectManager/JudgingPanel/List/preIndex.tsx +++ b/src/pages/Tender/ProjectManager/JudgingPanel/List/preIndex.tsx @@ -52,6 +52,10 @@ const JudgingPanel: React.FC<{}> = () => { //当前可编辑的行 const [editableKeys, setEditableRowKeys] = useState([]); const [tableData, setTableData] = useState([]); + const tableDataRef = useRef([]) + useEffect(() => { + tableDataRef.current = tableData + }, [tableData]) function getShouName() { const method = getProMethod(); let showNameT: any = { zbr: '', bb: '', pb: '', }//相关标段 标书费 保证金 服务费 @@ -329,6 +333,7 @@ const JudgingPanel: React.FC<{}> = () => { } getShouName();//根据采购类型变名字 modalVis == true ? getSecs({ ...params }).then((res) => { + let data = []; let secVals = []; if (res.success) { @@ -615,7 +620,7 @@ const JudgingPanel: React.FC<{}> = () => { {() => { const expertNumber = form.getFieldValue('expertNumber'); - if (!expertNumber || expertNumber <= 0) return null; + // if (!expertNumber || expertNumber <= 0) return null; return ( @@ -642,7 +647,25 @@ const JudgingPanel: React.FC<{}> = () => { setEditableRowKeys(keys); }, onValuesChange: (record, recordList) => { - setTableData(recordList); + let expertNumberInTable = 0; + const newTableData = [] + recordList.forEach((item) => { + if (item.extractNumber !== undefined) { + newTableData.push(item) + expertNumberInTable += item.extractNumber || 0 + } else { + const _item = tableDataRef.current.find(it => it.uid === item.uid) + if (_item) { + newTableData.push(_item) + expertNumberInTable += _item.extractNumber || 0 + } else { + newTableData.push(item) + expertNumberInTable += item.extractNumber || 0 + } + } + }) + form.setFieldValue('expertNumber',expertNumberInTable) + setTableData(newTableData); }, actionRender: (row, _, dom) => { return [dom.delete]; @@ -697,8 +720,8 @@ const JudgingPanel: React.FC<{}> = () => { ]; /** * 校验函数 - * @param schemaData - * @returns + * @param schemaData + * @returns */ const checkData = (schemaData: any) => { let res = true; @@ -781,6 +804,10 @@ const JudgingPanel: React.FC<{}> = () => { }) : pass = false; //招标人数需要大于5 需要取项目类型 const bidCount = parseInt(formVals.representativeNumber) + parseInt(formVals.expertNumber); + if(bidCount % 2 == 0 || bidCount <5){ + pass = false; + message.error("专家人数应为5人以上奇数!"); + } if (pass) { pass = checkMan(bidCount, parseInt(formVals.expertNumber)); } @@ -1709,4 +1736,4 @@ const JudgingPanel: React.FC<{}> = () => { ) } -export default JudgingPanel; \ No newline at end of file +export default JudgingPanel; diff --git a/src/utils/request.ts b/src/utils/request.ts index e628a8f..f530104 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -56,8 +56,28 @@ const request = extend({ // errorHandler, // 默认错误处理 credentials: 'include', // 默认请求是否带上cookie }); + +/** + * 是否登录超时 限时30分钟 + */ +const isLoginTimeOut = () => { + const currentTime = new Date(); + if(sessionStorage.getItem('loginTime')){ + const loginTimeISOString = sessionStorage.getItem('loginTime'); + const loginTime = new Date(loginTimeISOString); + const diffInMinutes = (currentTime.getTime() - loginTime.getTime()) / (1000 * 60); + if (diffInMinutes > 30) { // 超过 30 分钟 + sessionStorage.removeItem('loginTime'); // 清除登录时间 + sessionStorage.removeItem('userData'); // 清除登录用户 + history.replace({ + pathname: '/internal-login' + }) + } + } +} // request拦截器, 改变url 或 options. request.interceptors.request.use(async (url, options) => { + isLoginTimeOut(); if ( options.method === 'post' || options.method === 'put' || diff --git a/src/utils/session.ts b/src/utils/session.ts index dcb1d91..53b499c 100644 --- a/src/utils/session.ts +++ b/src/utils/session.ts @@ -373,7 +373,7 @@ export function removePurchaseCanOperate() { } /** * 获取returnURL - * @returns + * @returns */ export function getReturnURL() { let returnURL = sessionStorage.getItem('returnURL'); @@ -382,7 +382,7 @@ export function getReturnURL() { /** * 获取getRoomReturnURL - * @returns + * @returns */ export function getRoomReturnURL() { let roomReturnURL = sessionStorage.getItem('roomReturnURL'); @@ -391,7 +391,7 @@ export function getRoomReturnURL() { /** * 获取当前评审室对应标段的报价类型(只能在评审室内使用) - * @returns + * @returns */ export function getSectionQuot() { let returnURL = sessionStorage.getItem('sectionQuot'); @@ -400,7 +400,7 @@ export function getSectionQuot() { /** * 根据评审室id获取标段的报价类型 - * @param roomId + * @param roomId * @returns 1-%(优惠率,折扣率) 0-元(总价,单价) */ export async function getQuotationMethodById(roomId: any) { @@ -427,7 +427,7 @@ export async function getQuotationMethodById(roomId: any) { /** * 根据评审室id获取是否开启线下评审 - * @param roomId + * @param roomId * @returns 1-%(优惠率,折扣率) 0-元(总价,单价) */ export async function getOfflineStatusById(roomId: any) { @@ -446,12 +446,13 @@ export async function getOfflineStatusById(roomId: any) { } /** * 存储角色信息 - * @param {总数据} userData - * @param {权限} role - * @param {当前角色} roleData + * @param {总数据} userData + * @param {权限} role + * @param {当前角色} roleData */ export function setUserData(userData: any, role: string, roleData: any): void { sessionStorage.setItem('userData', JSON.stringify(userData)); + sessionStorage.setItem('loginTime',new Date().toISOString()); sessionStorage.setItem('roleAuthority', JSON.stringify([role])); sessionStorage.setItem('roleData', JSON.stringify(roleData)); }