diff --git a/config/JuryRoom/router_menuJury.config.ts b/config/JuryRoom/router_menuJury.config.ts index ca1e891..ba8195c 100644 --- a/config/JuryRoom/router_menuJury.config.ts +++ b/config/JuryRoom/router_menuJury.config.ts @@ -38,6 +38,11 @@ export default [//评标 path: '/EvaRoom/Evaluation/projectManager/ReviewResults/Manager', component: './Evaluation/projectManager/ReviewResults/Manager', }, + //评审结果-线下评审-项目经理 + { + path: '/EvaRoom/Evaluation/projectManager/ReviewResults/ManagerOffline', + component: './Evaluation/projectManager/ReviewResults/ManagerOffline', + }, //评审结果-组长 { path: '/EvaRoom/Evaluation/expert/ReviewResults/GroupLeader', diff --git a/config/YuShen/router_yushen.ts b/config/YuShen/router_yushen.ts index 00f765c..21e0e43 100644 --- a/config/YuShen/router_yushen.ts +++ b/config/YuShen/router_yushen.ts @@ -39,7 +39,7 @@ export default //评委会设置 资审发售 项目经理 { path: '/ProjectLayout/ZYuShen/Tender/ProjectManager/JudgingPanel', - component: './Tender/ProjectManager/JudgingPanel/List' + component: './Tender/ProjectManager/JudgingPanel/List/preIndex' }, //澄清 资审发售 项目经理 { diff --git a/config/config.UAT.ts b/config/config.UAT.ts index a022290..6e23f3e 100644 --- a/config/config.UAT.ts +++ b/config/config.UAT.ts @@ -12,7 +12,7 @@ export default defineConfig({ //密码加密参数 REACT_APP_PASSWORD_CIPHERMODE:'1', - REACT_APP_PASSWORD_PUBLICKEY:'0428D625CEEB71CE823BD7D78DFEE7B122F2DA5C4D21E32253AD684D0FE21810394A799639C0CDFBFEB535A1DFD6A366A637E582CE0B1466A5FE7858841135DE6B', + REACT_APP_PASSWORD_PUBLICKEY:'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvLBkALIYR/x9Rv5TiXQGWAXTzraN/He80r9gQovSQ5oTP8qllL9+Oc1LdTijPFRsddHWg37umvFliwhmukU1NT+o2loGcKpyMHFkc/UPNjQLvd+YFR4nYhgP8l+dmRNOtQWawOt5dbksRKTghMjA+FKT2+itMsawSs1+Ic+zoIwIDAQAB', //当前环境 START_ENV:'UAT', diff --git a/config/config.dev.ts b/config/config.dev.ts index d7f0893..06c4372 100644 --- a/config/config.dev.ts +++ b/config/config.dev.ts @@ -12,7 +12,7 @@ export default defineConfig({ //密码加密参数 REACT_APP_PASSWORD_CIPHERMODE: '1', - REACT_APP_PASSWORD_PUBLICKEY: '0428D625CEEB71CE823BD7D78DFEE7B122F2DA5C4D21E32253AD684D0FE21810394A799639C0CDFBFEB535A1DFD6A366A637E582CE0B1466A5FE7858841135DE6B', + REACT_APP_PASSWORD_PUBLICKEY: 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvLBkALIYR/x9Rv5TiXQGWAXTzraN/He80r9gQovSQ5oTP8qllL9+Oc1LdTijPFRsddHWg37umvFliwhmukU1NT+o2loGcKpyMHFkc/UPNjQLvd+YFR4nYhgP8l+dmRNOtQWawOt5dbksRKTghMjA+FKT2+itMsawSs1+Ic+zoIwIDAQAB', //当前环境 START_ENV: 'DEV', diff --git a/config/config.prod.ts b/config/config.prod.ts index 61ff507..5fbd4a6 100644 --- a/config/config.prod.ts +++ b/config/config.prod.ts @@ -12,7 +12,7 @@ export default defineConfig({ //密码加密参数 REACT_APP_PASSWORD_CIPHERMODE:'1', - REACT_APP_PASSWORD_PUBLICKEY:'04819CF427F9150FEEBD91E8D2346F203FC47312D212022A967D8372EA30B9581CCEEFCE2670BDDAF2E8DA1620EA73948126078ED9FF9773AA3A94EE6C80035A18', + REACT_APP_PASSWORD_PUBLICKEY:'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvLBkALIYR/x9Rv5TiXQGWAXTzraN/He80r9gQovSQ5oTP8qllL9+Oc1LdTijPFRsddHWg37umvFliwhmukU1NT+o2loGcKpyMHFkc/UPNjQLvd+YFR4nYhgP8l+dmRNOtQWawOt5dbksRKTghMjA+FKT2+itMsawSs1+Ic+zoIwIDAQAB', //当前环境 START_ENV:'PROD', diff --git a/config/config.sim.ts b/config/config.sim.ts index 43156ec..ebda6bf 100644 --- a/config/config.sim.ts +++ b/config/config.sim.ts @@ -12,7 +12,7 @@ export default defineConfig({ //密码加密参数 REACT_APP_PASSWORD_CIPHERMODE: '1', - REACT_APP_PASSWORD_PUBLICKEY: '0428D625CEEB71CE823BD7D78DFEE7B122F2DA5C4D21E32253AD684D0FE21810394A799639C0CDFBFEB535A1DFD6A366A637E582CE0B1466A5FE7858841135DE6B', + REACT_APP_PASSWORD_PUBLICKEY: 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvLBkALIYR/x9Rv5TiXQGWAXTzraN/He80r9gQovSQ5oTP8qllL9+Oc1LdTijPFRsddHWg37umvFliwhmukU1NT+o2loGcKpyMHFkc/UPNjQLvd+YFR4nYhgP8l+dmRNOtQWawOt5dbksRKTghMjA+FKT2+itMsawSs1+Ic+zoIwIDAQAB', //当前环境 START_ENV: 'sim', diff --git a/config/config.ts b/config/config.ts index c3955ff..e708dfb 100644 --- a/config/config.ts +++ b/config/config.ts @@ -2,7 +2,10 @@ import { defineConfig } from 'umi'; import defaultSettings from './defaultSettings'; // import proxy from './proxy'; import PageRoutes from './router.config' +import theme from './theme'; + const { REACT_APP_ENV } = process.env; + export default defineConfig({ hash: true, antd: {}, @@ -25,10 +28,7 @@ export default defineConfig({ // umi routes: https://umijs.org/docs/routing routes: PageRoutes, // Theme for antd: https://ant.design/docs/react/customize-theme-cn - theme: { - // ...darkTheme, - 'primary-color': defaultSettings.primaryColor, - }, + theme, // @ts-ignore title: false, ignoreMomentLocale: true, diff --git a/config/defaultSettings.ts b/config/defaultSettings.ts index d281703..ca8c2e9 100644 --- a/config/defaultSettings.ts +++ b/config/defaultSettings.ts @@ -6,7 +6,7 @@ type DefaultSettings = ProSettings & { const proSettings: DefaultSettings = { navTheme: 'light', - primaryColor: '#b30000', + primaryColor: '#014F8F', layout: 'side', contentWidth: 'Fluid', fixedHeader: false, diff --git a/config/proxy.ts b/config/proxy.ts index 83636d7..ab6d58e 100644 --- a/config/proxy.ts +++ b/config/proxy.ts @@ -7,9 +7,9 @@ export default { // }, '/api/*': { // target: 'http://10.242.37.148:18022',//连接天宫的ng - target: 'http://localhost:3000',//连接天宫的ng + target: 'http://10.60.161.52:18030/',//连接天宫的ng changeOrigin: true, - pathRewrite: { '^': '' }, + pathRewrite: { '^/api': '' }, }, }, UAT: { @@ -38,11 +38,11 @@ export default { changeOrigin: true, pathRewrite: { '/api/biz-service-ebtp-process': '' }, }, - '/api/sys-manager-ebtp-project': { - target: 'http://localhost:18030', - changeOrigin: true, - pathRewrite: { '/api/sys-manager-ebtp-project': '' }, - }, + // '/api/sys-manager-ebtp-project': { + // target: 'http://localhost:18030', + // changeOrigin: true, + // pathRewrite: { '/api/sys-manager-ebtp-project': '' }, + // }, '/api/biz-service-ebtp-rsms': { target: 'http://localhost:18014', changeOrigin: true, diff --git a/config/router.config.ts b/config/router.config.ts index 6cbe387..50da76f 100644 --- a/config/router.config.ts +++ b/config/router.config.ts @@ -134,6 +134,11 @@ export default [ path: '/ProjectFiles/file', component: './ProjectFiles/file', }, + { + name: 'BidReOffer', + path: '/biddingAnnouncement/BiddingAnnoStructureForm', + component: './Bid/BiddingAnnouncement/structure/BiddingAnnoStructureForm', + }, //==============================================================引入的业务路由 ...approvalForm,//审批单 ...juryRoom,//评标室内所有路由 diff --git a/config/router_transfer.ts b/config/router_transfer.ts index 81d12df..b6adc34 100644 --- a/config/router_transfer.ts +++ b/config/router_transfer.ts @@ -1,5 +1,9 @@ const { LOGIN_PATH } = process.env; export default [ + { + path: '/internal-login', + component: './Login/internal', + }, // {//内部人员便捷登陆页 // path: '/loginFake', // component: './Login/index', diff --git a/config/theme.js b/config/theme.js new file mode 100644 index 0000000..3fdf767 --- /dev/null +++ b/config/theme.js @@ -0,0 +1,24 @@ +export default { + // 主题色 + 'primary-color': '#014F8F', + // 按钮圆角 + 'border-radius-base': '4px', + // layout background + 'layout-background': '#F5F7FA', + // 链接色 + 'link-color': '#014F8F', + // layout-header-background + 'layout-header-background': '#ffffff', + // error + 'error-color': '#D7000F', + // menu background + 'menu-list-bg': '#F2F6FC', + // menu item selected background + 'menu-item-selected-bg': '#D9ECFF', + // table header + 'table-header-bg': '#F2F6FC', + // table header text color + 'table-header-color': '#8F9298', + // table select row background + 'table-selected-row-bg': '#F2F6FC', +} \ No newline at end of file diff --git a/package.json b/package.json index 9fc119f..f3905d0 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "private": true, "description": "An out-of-box UI solution for enterprise applications", "scripts": { - "start-dev": "cross-env UMI_UI=none UMI_ENV=dev LOGIN_PATH=ebtp-frontend umi dev --port=3000", - "start-UAT": "cross-env UMI_UI=none UMI_ENV=UAT LOGIN_PATH=ebtp-frontend umi dev --port=3000", - "start-sim": "cross-env UMI_UI=none UMI_ENV=sim LOGIN_PATH=ebtp-frontend umi dev --port=3000", + "start-dev": "set NODE_OPTIONS=--openssl-legacy-provider & cross-env UMI_UI=none UMI_ENV=dev LOGIN_PATH=ebtp-frontend umi dev --port=3000", + "start-UAT": "set NODE_OPTIONS=--openssl-legacy-provider & cross-env UMI_UI=none UMI_ENV=UAT LOGIN_PATH=ebtp-frontend umi dev --port=3000", + "start-sim": "set NODE_OPTIONS=--openssl-legacy-provider & cross-env UMI_UI=none UMI_ENV=sim LOGIN_PATH=ebtp-frontend umi dev --port=3000", "start-prod": "cross-env UMI_UI=none UMI_ENV=prod LOGIN_PATH=prod/ebtp-frontend umi dev --port=3000", "build-dev": "cross-env UMI_ENV=dev LOGIN_PATH=ebtp-frontend umi build", "build-UAT": "cross-env UMI_ENV=UAT LOGIN_PATH=ebtp-frontend umi build", @@ -75,6 +75,7 @@ "dva": "2.4.1", "echarts": "^5.2.2", "echarts-for-react": "^3.0.2", + "jsencrypt": "^3.3.2", "lodash": "4.17.21", "moment": "^2.29.4", "omit.js": "2.0.2", diff --git a/src/assets/home.svg b/src/assets/home.svg new file mode 100644 index 0000000..8405c6c --- /dev/null +++ b/src/assets/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/shutdown.svg b/src/assets/shutdown.svg new file mode 100644 index 0000000..917c660 --- /dev/null +++ b/src/assets/shutdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/signPen/signPen.png b/src/assets/signPen/signPen.png new file mode 100644 index 0000000..02aa52c Binary files /dev/null and b/src/assets/signPen/signPen.png differ diff --git a/src/assets/styles.module.less b/src/assets/styles.module.less new file mode 100644 index 0000000..2081384 --- /dev/null +++ b/src/assets/styles.module.less @@ -0,0 +1,31 @@ +/** +* 手写签名用 +*/ +.container { + top: 10%; + left: 10%; + width: 100%; + height: 50vh; +} + +.sigContainer { + width: 100%; + height: 100%; + margin: 0 auto; + background-color: #fff; + cursor: auto; +} + +.sigPointer { + width: 100%; + height: 100%; + margin: 0 auto; + background-color: #fff; + cursor: url("./signPen/signPen.png"),Crosshair; +} + +.sigPad { + width: 100%; + height: 100%; + background: #fff; +} diff --git a/src/assets/user.svg b/src/assets/user.svg new file mode 100644 index 0000000..44c668d --- /dev/null +++ b/src/assets/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/baseStyle.less b/src/baseStyle.less index 3165e50..2dec159 100644 --- a/src/baseStyle.less +++ b/src/baseStyle.less @@ -3,12 +3,17 @@ top: 0; left: 0; .ant-pro-global-header{ - background-color: #b30000; + background-color: @layout-header-background; height: 56px; - color: #fff; + color: @primary-color; } } +// 通用页面布局样式 +.layout-container { + background-color: @layout-background; + min-height: 100vh; +} .ant-pro-sider-logo { background-color: #b30000; @@ -160,11 +165,11 @@ } -.ant-pro-table{ - .ant-card-body{ - padding: 0px; - } -} +// .ant-pro-table{ +// .ant-card-body{ +// padding: 0px; +// } +// } .ant-pro-table-search { padding: 10px 24px 6px 24px; @@ -308,3 +313,23 @@ input::-webkit-outer-spin-button, padding: 6px 24px; border-bottom: 1px solid #ddd; } + +#root { + .ant-table-tbody > tr.ant-table-row:hover > td, + .ant-table-tbody > tr > td.ant-table-cell-row-hover { + background-color: @table-selected-row-bg; + } +} + +// 控制左侧菜单背景色 +.ant-menu.ant-menu-sub.ant-menu-inline { + background-color: @menu-list-bg; + + .ant-menu-item-selected { + background-color: @menu-item-selected-bg; + } + .ant-menu-item-selected a { + color: @primary-color; + font-weight: bold; + } +} diff --git a/src/components/BiddingRoom/index.js b/src/components/BiddingRoom/index.js index dc412ce..986f754 100644 --- a/src/components/BiddingRoom/index.js +++ b/src/components/BiddingRoom/index.js @@ -5,7 +5,7 @@ import styles from './index.less'; import { connect } from "dva"; import { routerRedux } from 'dva/router'; import React, { useState, useEffect, useReducer } from 'react'; -import { getSessionUserData, getRoomId, getProMethod, getSessionRoleData, getIPassDecode, getDefId, getProId } from '@/utils/session'; +import { getSessionUserData, getRoomId, getRoomStatus, getProMethod, getSessionRoleData, getIPassDecode, getDefId, getProId, getOfflineStatusById } from '@/utils/session'; import { getURLInformation } from '@/utils/CommonUtils'; import { getLeader, isShowResult, isShowCount, getErrorStatus, getRiskStatus, isShowRiskModal, saveConfirm, isLeaderConfirm } from './service'; import logo from '@/images/opening/logo.svg' @@ -34,8 +34,13 @@ const BiddingRoom = (props) => { let data = getSessionUserData(); //获取比选一阶段二次项目,自定义流程,当前供应商 const isBxOneSecondCustom = sessionStorage.getItem("isBxOneSecondCustom"); + //评审方式:状态:0-默认,1-已确认配置分工及组长 + const roomJuryConfigStatus = sessionStorage.getItem("roomJuryConfigStatus"); + //评审方式:0-线上、1-线下 + const roomReviewMethod = sessionStorage.getItem("roomReviewMethod"); //获取评审室id const roomId = getRoomId(); + const roomStatus = getRoomStatus(); const [list, setList] = useState(); //风险提示文字弹窗控制 const [riskVisible, setRiskVisible] = useState(false); @@ -96,6 +101,28 @@ const BiddingRoom = (props) => { path: "/EvaRoom/Evaluation/projectManager/ReviewResults/Manager", text: "评审结果" }] + //项目经理角色 + let managerOffList = [ + { + id: 1, + path: "/EvaRoom", + text: "基本信息" + }, + { + id: 2, + path: "/EvaRoom/BiddingDocumentsDecrypt", + text: `${responseType}文件查看` + }, + { + id: 3, + path: "/EvaRoom/Evaluation/BidControl/BidControlManager", + text: "风险点展示" + }, + { + id: 8, + path: "/EvaRoom/Evaluation/projectManager/ReviewResults/ManagerEntry", + text: "评审结果录入" + }] let JuryList = [ { id: 1, @@ -179,13 +206,25 @@ const BiddingRoom = (props) => { //评审结果页签点击事件 const onclick = async (path, id) => { + await getOfflineStatusById(roomId) if ((role == 'ebtp-agency-project-manager' || role == 'ebtp-purchase') && id == 8) { //代理&采购经理进入评审结果 - const success = await isClickResult(); - if (success) { - history.push({ pathname: path }); - setSelectedPath(path); + if (roomReviewMethod == 0){ + const success = await isClickResult(); + if (success) { + history.push({ pathname: path }); + setSelectedPath(path); + } else { + message.info("未到评审结果环节,无法进入评审结果") + } } else { - message.info("未到评审结果环节,无法进入评审结果") + console.log("roomJuryConfigStatus", roomJuryConfigStatus) + + if (roomJuryConfigStatus == 1) { + history.push({ pathname: path }); + setSelectedPath(path); + } else { + message.info("未到评审结果环节,无法进入评审结果") + } } } else if (role == 'ebtp-expert' && id == 8) {//专家进入评审结果 const success = await isClickResult(); @@ -246,14 +285,14 @@ const BiddingRoom = (props) => { if (res?.data == "Review") { return "/EvaRoom/Evaluation/expert/ReviewResults/Jury" } else { - const result = await isLeaderConfirm({ assessRoomId: roomId });//供应商股权关系-专家组长是否确认风险 - if (result?.success && result?.data) { + //TODO zyx暂时不需要const result = await isLeaderConfirm({ assessRoomId: roomId });//供应商股权关系-专家组长是否确认风险 + //TODO zyx暂时不需要if (result?.success && result?.data) { return "/EvaRoom/Evaluation/expert/ReviewResults/GroupLeader" - } else { - setIsResult(true) - setRiskVisible(true) - return false; - } + //TODO zyx暂时不需要} else { + //TODO zyx暂时不需要 setIsResult(true) + //TODO zyx暂时不需要 setRiskVisible(true) + //TODO zyx暂时不需要 return false; + //TODO zyx暂时不需要} } } else { return false @@ -347,7 +386,11 @@ const BiddingRoom = (props) => { } //代理&项目经理 if (role == "ebtp-agency-project-manager" || role == "ebtp-purchase") {//代理和采购经理 - setList(managerList); + if(true){ + setList(managerOffList); + }else { + setList(managerList); + } } else if (role == "ebtp-expert") {//专家 setList(JuryList) } else if (role == "ebtp-supplier") {//供应商 diff --git a/src/components/CaptchaInput/index.less b/src/components/CaptchaInput/index.less new file mode 100644 index 0000000..fa599b1 --- /dev/null +++ b/src/components/CaptchaInput/index.less @@ -0,0 +1,48 @@ +.captchaContainer { + width: 100%; + + :global { + .ant-input-affix-wrapper { + padding-right: 4px; + } + } + + .captchaWrapper { + display: flex; + justify-content: end; + align-items: center; + gap: 8px; + height: 40px; + width: 120px; + } + + .captchaImage { + height: 40px; + width: 100%; + cursor: pointer; + border-radius: 4px; + border: 1px solid #d9d9d9; + object-fit: contain; + background: #fff; + + &:hover { + border-color: #40a9ff; + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + } + } + + .refreshIcon { + font-size: 16px; + color: #1890ff; + cursor: pointer; + transition: all 0.3s; + padding: 4px; + + &:hover { + color: #40a9ff; + transform: rotate(180deg); + background: rgba(24, 144, 255, 0.1); + border-radius: 4px; + } + } +} \ No newline at end of file diff --git a/src/components/CaptchaInput/index.tsx b/src/components/CaptchaInput/index.tsx new file mode 100644 index 0000000..02752ca --- /dev/null +++ b/src/components/CaptchaInput/index.tsx @@ -0,0 +1,72 @@ +import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react'; +import { Input, Spin } from 'antd'; +import { SafetyOutlined } from '@ant-design/icons'; +import styles from './index.less'; +import { getCaptcha } from '@/services/login'; + +interface CaptchaInputProps { + value?: { + captcha: string; + captchaToken: string; + }; + onChange?: (value: { captcha: string; captchaToken: string }) => void; + placeholder?: string; +} + +export interface CaptchaInputRef { + refresh: () => void; +} + +const CaptchaInput = forwardRef((props: CaptchaInputProps, ref) => { + const { value, onChange, placeholder = '请输入验证码' } = props; + const [imgUrl, setImgUrl] = useState(''); + const [captchaToken, setCaptchaToken] = useState(''); + const [loading, setLoading] = useState(false); + + // 获取验证码 + const fetchCaptcha = async () => { + setLoading(true); + try { + const res = await getCaptcha(); + if (res?.success) { + setImgUrl('data:image/png;base64,' + res.data.base64Image); + setCaptchaToken(res.data.code); + } + } catch (error) { + console.error('获取验证码失败:', error); + } finally { + setLoading(false); + } + }; + + // 组件挂载时获取验证码 + useEffect(() => { + fetchCaptcha(); + }, []); + + useImperativeHandle(ref, () => ({ + refresh: fetchCaptcha, + })); + + return ( +
+ onChange?.({ captcha: e.target.value, captchaToken: captchaToken })} + placeholder={placeholder} + maxLength={4} + prefix={} + suffix={ +
+ {loading ? : 验证码} +
+ } + /> +
+ ); +}); + +CaptchaInput.displayName = 'CaptchaInput'; + +export default CaptchaInput; \ No newline at end of file diff --git a/src/components/GlobalHeader/RightContent.tsx b/src/components/GlobalHeader/RightContent.tsx index ad7dc52..aad3ee8 100644 --- a/src/components/GlobalHeader/RightContent.tsx +++ b/src/components/GlobalHeader/RightContent.tsx @@ -9,27 +9,32 @@ import './index.less'; import { getMenu, getLogout } from './services' import { getSessionUserData } from "@/utils/session"; import { getToSecondUrl } from '@/pages/LoadingPage/service'; +import userIcon from '@/assets/user.svg'; +import homeIcon from '@/assets/home.svg'; +import shutdownIcon from '@/assets/shutdown.svg'; +import { logout } from './services'; +import cookie from 'react-cookies'; const GlobalHeaderRight: React.FC<{}> = (props) => { // let className = styles.right; - let data = getSessionUserData(); + const data = getSessionUserData(); const [dataMenu, setDataMenu] = React.useState([]); const urlRef = useRef(null); const handelRole = (item: any) => { sessionStorage.setItem('roleData', JSON.stringify(item)); sessionStorage.setItem('roleAuthority', JSON.stringify([item.roleCode])); - let params = { + const params = { roleIdList: [item.roleId] } history.push('/Dashboard') window.location.reload() - getMenu(params).then(res => { - if (res?.code == 1) { - setDataMenu(res?.data) - } else { - message.error("数据错误请联系管理员") - } - }) + // getMenu(params).then(res => { + // if (res?.code == 1) { + // setDataMenu(res?.data) + // } else { + // message.error("数据错误请联系管理员") + // } + // }) } //角色退出登录 const toLogout = () => { @@ -40,15 +45,21 @@ const GlobalHeaderRight: React.FC<{}> = (props) => { title: '请确认是否退出?', content: false, onOk() { - getLogout().then((res) => { + logout().then((res) => { if (res?.success) { - if (data?.userType == "0") {//联通智慧门户 - window.close(); - } else if (data?.userType == "1") {//合作方 - window.close(); - } else if (data?.userType == "2") {//专家 - window.location.href = "/userformal/login" - } + // if (data?.userType == "0") {//联通智慧门户 + // window.close(); + // } else if (data?.userType == "1") {//合作方 + // window.close(); + // } else if (data?.userType == "2") {//专家 + // window.location.href = "/userformal/login" + // } + message.success('退出登录成功'); + sessionStorage.clear(); + cookie.remove('mall3_token'); + setTimeout(() => { + history.push('/internal-login'); + }, 1000); } }) }, @@ -62,17 +73,17 @@ const GlobalHeaderRight: React.FC<{}> = (props) => { const droMenu = ( {data?.authorityList != undefined ? - data?.authorityList?.map((item: any, index: any) => ( - + data?.authorityList?.map((item: any) => ( + handelRole(item)}>{item.roleName} )) : null} - <> + {/* <> toLogout()}>退出登录 - + */} ); @@ -89,21 +100,35 @@ const GlobalHeaderRight: React.FC<{}> = (props) => { return (
- 中国联通智慧供应链平台 | 招标采购中心 +
+
+ +
+
+ 采购平台供应商统一管理系统 + CHINA COSCO SHIPPING CORPORATION LIMITED +
+
diff --git a/src/components/GlobalHeader/index.less b/src/components/GlobalHeader/index.less index 72eeb15..f3dfeec 100644 --- a/src/components/GlobalHeader/index.less +++ b/src/components/GlobalHeader/index.less @@ -25,8 +25,8 @@ float: left; line-height: 56px; font-size: 14px; - color: #fff; - padding: 0 14px; + color: inherit; + padding: 0 12px; list-style: none; span { @@ -35,7 +35,7 @@ } a { - color: #fff; + color: #131414 !important; } } } diff --git a/src/components/GlobalHeader/services.ts b/src/components/GlobalHeader/services.ts index 750f8a5..a6ba67f 100644 --- a/src/components/GlobalHeader/services.ts +++ b/src/components/GlobalHeader/services.ts @@ -22,3 +22,9 @@ export async function getLogout() { // 退出登录,注销 // params }); } + +export async function logout() { + return request('/api/v1/login/logout', { + method: 'post', + }); +} \ No newline at end of file diff --git a/src/global.less b/src/global.less index c85eb4b..af3d51a 100644 --- a/src/global.less +++ b/src/global.less @@ -51,7 +51,7 @@ ol { } // 兼容IE11 -@media screen and(-ms-high-contrast: active), (-ms-high-contrast: none) { +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { body .ant-design-pro > .ant-layout { min-height: 100vh; } diff --git a/src/models/bidev.js b/src/models/bidev.js index d4d0e79..067150e 100644 --- a/src/models/bidev.js +++ b/src/models/bidev.js @@ -1,4 +1,4 @@ -import { fetchManagerList,openBizassessroom,resetVerificationCode,fetchJuryList,fetchSupplierList +import { fetchManagerList,openBizassessroom,openOffBizassessroom,resetVerificationCode,fetchJuryList,fetchSupplierList ,fetchJuryMemInfo,updateJuryMemInfo,validateVerificationCode,fetchbidslist ,fetchPreSupplierList,fetchPreList,fetchPreListt,bxmultifetchPreListt,pushRedirectRe,getCheckedByRoomId,checkOpenBidSupplier,zmmultiOpenBizassessroom } from '../services/bidev'; import { message } from 'antd'; @@ -43,6 +43,23 @@ export default { } callback(); }, + // 开启线下评审室 + *openOffBizassessroom({payload,callback}, { call, put }){ + const response =yield call(openOffBizassessroom,payload) + if(response?.code==200){ + // 查询招标代理列表 + const params={ + pageNo:1, + pageSize:10, + reviewMethod:1, + roomType: getURLInformation('roomType'), + tpId:getProId()//项目id + } + yield put({ type: 'fetchManagerList', payload: {...params} }); + message.success("开启成功!") + } + callback(); + }, // 开启评审室(多轮招募) *zmmultiOpenBizassessroom({payload,callback}, { call, put }){ const response =yield call(zmmultiOpenBizassessroom,payload) diff --git a/src/pages/Agency/AgencyManager/components/SelectProvider.tsx b/src/pages/Agency/AgencyManager/components/SelectProvider.tsx index 40c3e25..8a300af 100644 --- a/src/pages/Agency/AgencyManager/components/SelectProvider.tsx +++ b/src/pages/Agency/AgencyManager/components/SelectProvider.tsx @@ -45,17 +45,19 @@ const SelectProvider: React.FC = ({ onSelect, visible = fal const columns: ProColumns[] = [ { title: '序号', valueType: 'index', width: 50, search: false, }, { title: '供应商名称', dataIndex: 'name', },//, ellipsis: true - { title: '供应商分类code', dataIndex: 'kindCode', hideInTable:true, - valueEnum: { 'EBTP': { text: '招标采购中心', status: 'EBTP' }, }, + { title: '供应商分类', dataIndex: 'kindCode', + valueEnum: { 'dvs': { text: '境内企业/机构', status: 'dvs' }, 'ovs': { text: '境外企业', status: 'ovs' },'pe': { text: '个人/机构', status: 'pe' },}, }, - { title: '供应商分类', dataIndex: 'kindName', - + { title: '供应商分类名', dataIndex: 'kindName', + hideInTable:true, },//, ellipsis: true//, ellipsis: true { title: '品类', dataIndex: 'goodsTypeName', }, { title: '准入时间', dataIndex: 'accessTime', },//, ellipsis: true { title: '准入人', dataIndex: 'accessUser', search: false, hideInTable:true,},//, ellipsis: true - { title: '状态', dataIndex: 'agent', },//, ellipsis: true + { title: '状态', dataIndex: 'agent', + valueEnum: { 0: { text: '未合作', status: 0 }, 1: { text: '已合作', status: 1 },2: { text: '失效', status: 2 },}, + },//, ellipsis: true { title: 'id', dataIndex: 'id', search: false,hideInTable:true,},//, ellipsis: true // { title: '创建时间', dataIndex: 'createDate', width: '10%', valueType: 'dateTime', search: false }, diff --git a/src/pages/Agency/AgencyManager/index.tsx b/src/pages/Agency/AgencyManager/index.tsx index a0eeb83..0f738fa 100644 --- a/src/pages/Agency/AgencyManager/index.tsx +++ b/src/pages/Agency/AgencyManager/index.tsx @@ -319,7 +319,7 @@ const [currentProviderId, setCurrentProviderId] = useState('');
工号: - {userData?.fullName || '-'} + {userData?.employeeNumber || '-'}
角色: @@ -327,11 +327,11 @@ const [currentProviderId, setCurrentProviderId] = useState('');
公司: - {userData?.fullName || '-'} + {userData?.organizationName || '-'}
部门: - {userData?.fullName || '-'} + {userData?.deptName || '-'}
diff --git a/src/pages/Bid/BiddingAnnouncement/service.ts b/src/pages/Bid/BiddingAnnouncement/service.ts index ba3929d..e7515a4 100644 --- a/src/pages/Bid/BiddingAnnouncement/service.ts +++ b/src/pages/Bid/BiddingAnnouncement/service.ts @@ -240,4 +240,41 @@ export async function saveAnno(params?: any) { ...params }, }) +} + + +/** + * 公告结构化-根据项目id获取结构化信息 + * @param projectId + * @returns + */ +export async function getAnnoStructuralValue(params?: any) { + return request('/api/biz-service-ebtp-bid/v1/bizannostructural/getStructuralValue/', { + method: "post", + data: { + ...params + }, + }) +} + +/** + * 公告结构化-保存数据 + * @param data + * @returns + */ +export async function saveAnnoStructuralFormData(data: any) { + return request('/api/biz-service-ebtp-bid/v1/bizannostructural/saveStructural', { + method: 'POST', + data: { ...data }, + }) +} + +/*招标文件-招标文件维护增加相关招标公告预览及备注信息*/ +export async function findAnnoByBsIds(params: any) { + return request('/api/biz-service-ebtp-bid/v1/bizannostructural/selectListByBsIds', { + method: "post", + data: [ + ...params + ] + }) } \ No newline at end of file diff --git a/src/pages/Bid/BiddingAnnouncement/structure/BiddingAnnoStructureForm.tsx b/src/pages/Bid/BiddingAnnouncement/structure/BiddingAnnoStructureForm.tsx index f3eed84..4f0e5ed 100644 --- a/src/pages/Bid/BiddingAnnouncement/structure/BiddingAnnoStructureForm.tsx +++ b/src/pages/Bid/BiddingAnnouncement/structure/BiddingAnnoStructureForm.tsx @@ -25,8 +25,8 @@ const formFileWrapperCol = { wrapperCol: { span: 9 }, }; const { Link } = Anchor; /** * 采购复盘-回填表 - * @param props - * @returns + * @param props + * @returns */ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { @@ -36,7 +36,7 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { const annoId = props?.location?.state?.annoId; const editInformation = props?.location?.state?.editStatus; // const annoId = "1732282646482624512"; - // 取查询条件 + // 取查询条件 const stucturalId = "1"; // 结构化信息 const [annoStructureData, setAnnoStructureData] = useState([]); @@ -71,7 +71,7 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { const [form] = Form.useForm(); /** * 折叠面板选择 - * @param key + * @param key */ const onCollapseChange = (key: string | string[]) => { setActiveKey(key as string[]); @@ -88,7 +88,7 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { /** * 获取公告结构化信息 - * @param id + * @param id */ const getStructuralList = async (id: any) => { try { @@ -156,7 +156,7 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { const item = annoStructureData?.groupVoList[i]; for (let j = 0, jlength = item?.assemblyVoList?.length; j < jlength; j++) { const jitem = item?.assemblyVoList[j]; - if (isEmpty(values?.[jitem?.code])) { // 空值或者类型为表格无需返回数据 || jitem?.type === 6 else + if (isEmpty(values?.[jitem?.code])) { // 空值或者类型为表格无需返回数据 || jitem?.type === 6 else if (jitem?.code === "annoNature") { structuralDataList.push({ assemblyId: jitem?.id, @@ -254,10 +254,10 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { useEffect(() => { const selectData = sectionSelectData.filter((item: any) => sectionSelectIds.indexOf(item?.sectionId) !== -1); - const amountSelectData = expenses1AmountSectionData.filter((item: any) => sectionSelectIds.indexOf(item?.sectionId) !== -1); + // const amountSelectData = expenses1AmountSectionData.filter((item: any) => sectionSelectIds.indexOf(item?.sectionId) !== -1); const tenderAskProjectData = tenderAskData.filter((item: any) => sectionSelectIds.indexOf(item?.sectionId) !== -1); form.setFieldsValue({ "sectionExpeses": selectData }) - form.setFieldsValue({ "expenses1Amount": amountSelectData }) + // form.setFieldsValue({ "expenses1Amount": amountSelectData }) form.setFieldsValue({ "tenderAskProject": tenderAskProjectData }) form.setFieldsValue({ "sectionNumber": sectionSelectIds.length }) }, [sectionSelectIds]) @@ -444,6 +444,159 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { ], }, ]; + //投标人资格能力要求-通用要求-表格 + const TenderCommonRequirementColumns: ProColumns[] = [ + { + title: '序号', + editable: false, + valueType: 'index', + width: "5%", + fixed: 'left', + }, + { + title: '资格条件', + dataIndex: 'condition', + key: 'condition', + width: "60%", + formItemProps: () => { + return { + rules: [{ required: true, message: '此项为必填项' }], + }; + }, + }, + { + title: '操作', + valueType: 'option', + width: 200, + render: (text, record, _, action) => [ + , + , + ], + }, + ]; + //投标人资格能力要求-通用要求-表格 + const TenderCreditRequirementColumns: ProColumns[] = [ + { + title: '序号', + editable: false, + valueType: 'index', + width: "5%", + fixed: 'left', + }, + { + title: '资格条件', + dataIndex: 'condition', + key: 'condition', + width: "60%", + formItemProps: () => { + return { + rules: [{ required: true, message: '此项为必填项' }], + }; + }, + }, + { + title: '操作', + valueType: 'option', + width: 200, + render: (text, record, _, action) => [ + , + , + ], + }, + ]; + //投标人资格能力要求-通用要求-表格 + const TenderOtherRequirementColumns: ProColumns[] = [ + { + title: '序号', + editable: false, + valueType: 'index', + width: "5%", + fixed: 'left', + }, + { + title: '资格条件', + dataIndex: 'condition', + key: 'condition', + width: "60%", + formItemProps: () => { + return { + rules: [{ required: true, message: '此项为必填项' }], + }; + }, + }, + { + title: '操作', + valueType: 'option', + width: 200, + render: (text, record, _, action) => [ + , + , + ], + }, + ]; //投标格式能力要求-投标格式能力要求-表格类型定义 type DataSourceType = { id: number; @@ -483,6 +636,108 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { /> ) } + //投标人资格能力要求-通用要求-表格 + const TenderCommonRequirementTableItem = (field: any) => { + const { value, onChange } = field; + //处理列头 + return ( + + rowKey="id" + style={{ width: "90%" }} + recordCreatorProps={{ + newRecordType: 'dataSource', + hidden: editInformation, + creatorButtonText: '新增', + record: () => ({ + id: Date.now(), + condition: "", + }), + }} + columns={TenderCommonRequirementColumns} + value={value ? value : []} + editable={{ + type: 'multiple', + onValuesChange: (record, recordList) => { + onChange(recordList) + }, + actionRender: (row, config, defaultDom) => { + return [ + defaultDom.save, + defaultDom.delete || defaultDom.cancel + ]; + }, + }} + /> + ) + } + //投标人资格能力要求-信誉要求-表格 + const TenderCreditRequirementTableItem = (field: any) => { + const { value, onChange } = field; + //处理列头 + return ( + + rowKey="id" + style={{ width: "90%" }} + recordCreatorProps={{ + newRecordType: 'dataSource', + hidden: editInformation, + creatorButtonText: '新增', + record: () => ({ + id: Date.now(), + condition: "", + }), + }} + columns={TenderCreditRequirementColumns} + value={value ? value : []} + editable={{ + type: 'multiple', + onValuesChange: (record, recordList) => { + onChange(recordList) + }, + actionRender: (row, config, defaultDom) => { + return [ + defaultDom.save, + defaultDom.delete || defaultDom.cancel + ]; + }, + }} + /> + ) + } + //投标人资格能力要求-其他要求-表格 + const TenderOtherRequirementTableItem = (field: any) => { + const { value, onChange } = field; + //处理列头 + return ( + + rowKey="id" + style={{ width: "90%" }} + recordCreatorProps={{ + newRecordType: 'dataSource', + hidden: editInformation, + creatorButtonText: '新增', + record: () => ({ + id: Date.now(), + condition: "", + }), + }} + columns={TenderOtherRequirementColumns} + value={value ? value : []} + editable={{ + type: 'multiple', + onValuesChange: (record, recordList) => { + onChange(recordList) + }, + actionRender: (row, config, defaultDom) => { + return [ + defaultDom.save, + defaultDom.delete || defaultDom.cancel + ]; + }, + }} + /> + ) + } //投标格式能力要求-投标格式能力要求-表格 const TenderAskProjectColumns: any[] = [ @@ -754,7 +1009,7 @@ const BiddingAnnoStructureForm: React.FC<{}> = (props: any) => { return } else if (groupVo.code === "anno" || assemblyVo?.code === "sections") { // 关联标段 return - } else if (assemblyVo?.type === "3") { // 3:复选 + } else if (assemblyVo?.type === "3") { // 3:复选 return } else if (assemblyVo?.type === "31") { // 31:换行复选 return = (props: any) => { return } else if (assemblyVo?.type === "9" && assemblyVo?.code === "tenderAsk") { // 表格-补充资格能力要求 return - } else if (assemblyVo?.type === "9" && assemblyVo?.code === "tenderAskProject") { // 表格-投标格式能力要求 + } + else if (assemblyVo?.type === "9" && assemblyVo?.code === "tenderCommonRequirement") { // 表格-投标人资格能力要求--通用要求 + return + } + else if (assemblyVo?.type === "9" && assemblyVo?.code === "tenderCreditRequirement") { // 表格-投标人资格能力要求--信誉要求 + return + } + else if (assemblyVo?.type === "9" && assemblyVo?.code === "tenderOtherRequirement") { // 表格-投标人资格能力要求--其他要求 + return + } + else if (assemblyVo?.type === "9" && assemblyVo?.code === "tenderAskProject") { // 表格-投标格式能力要求 return } else if (assemblyVo?.type === "9" && assemblyVo?.code === "expenses1Amount") { // 表格-招标文件费用 return diff --git a/src/pages/Bid/ReviewConfig/List/index.tsx b/src/pages/Bid/ReviewConfig/List/index.tsx index a73267b..5483b5b 100644 --- a/src/pages/Bid/ReviewConfig/List/index.tsx +++ b/src/pages/Bid/ReviewConfig/List/index.tsx @@ -205,8 +205,7 @@ const List: React.FC<{}> = () => { } useEffect(() => { //取项目id - //proIdSet(getProId());//TODO zyx-假数据 - proIdSet("1920644626460389376"); + proIdSet(getProId()); // getHaveConfigSections(); }, []); return ( diff --git a/src/pages/BidEvaluation/components/simpleUploadServis.ts b/src/pages/BidEvaluation/components/simpleUploadServis.ts index f74f39a..59ef38a 100644 --- a/src/pages/BidEvaluation/components/simpleUploadServis.ts +++ b/src/pages/BidEvaluation/components/simpleUploadServis.ts @@ -50,7 +50,7 @@ export async function finish(id: any) { * @param param */ export async function upReport(params: any) { - return request(`/api/biz-service-ebtp-evaluation/v1/review/report/save`, { + return request(`/api/biz-service-ebtp-rsms/v1/review/report/save`, { method:'POST', data: params, }) @@ -60,7 +60,7 @@ export async function upReport(params: any) { * @param param */ export async function serchReport(assessId: any) { - return request(`/api/biz-service-ebtp-evaluation/v1/review/report/${assessId}`, { + return request(`/api/biz-service-ebtp-rsms/v1/review/report/${assessId}`, { method: 'GET', }) } \ No newline at end of file diff --git a/src/pages/Calibration/BidAssessmentResults/index.tsx b/src/pages/Calibration/BidAssessmentResults/index.tsx index 86ddda1..3027407 100644 --- a/src/pages/Calibration/BidAssessmentResults/index.tsx +++ b/src/pages/Calibration/BidAssessmentResults/index.tsx @@ -1,12 +1,30 @@ import React, { useEffect, useMemo, useState } from 'react'; -import { Button, Card, Collapse, Form, Input, List, message, Popover, Select, Space, Spin, Typography } from "antd"; +import { + Button, + Card, + Collapse, + Form, + Input, + List, + message, + Modal, + Popover, + Select, + Space, + Spin, + Typography, + Checkbox +} from "antd"; import ProTable from "@ant-design/pro-table"; -import { getBidAssessmentResultList, getBidAssessmentResultsList, pushBidAssessmentResult, saveResult } from "./service" +import { getBidAssessmentResultList, getBidAssessmentResultsList, pushBidAssessmentResult, saveResult ,saveReviewResultDetail} from "./service" import CurrentTable from "./components/currentTable" import { getDefId, getProId, getProMethod } from "@/utils/session"; import { btnAuthority } from "@/utils/authority"; import { isEmpty } from '@/utils/CommonUtils'; +const CheckboxGroup = Checkbox.Group +const defaultCheckedList: any[] = []; +const plainOptions: any[] = []; const BidAssessmentResults: React.FC<{}> = (props) => { const [Refresh, setRefresh] = useState(0); @@ -19,6 +37,14 @@ const BidAssessmentResults: React.FC<{}> = (props) => { const [name, setName] = useState(''); //折叠面板 const [collapseActiveKeys, setCollapseActiveKeys] = useState(['0']); + // 用于控制定标结果审批弹窗的显示与隐藏 + const [isCalibrationModalVisible, setIsCalibrationModalVisible] = useState(false); + + const [indeterminate, setIndeterminate] = useState(false); // 复选框全选 + const [checkAll, setCheckAll] = useState(false); // 复选框全选 + const [checkedList, setCheckedList] = useState(defaultCheckedList); // 全选选中数组 + const [sectionsVal, setSectionsVal] = useState([]); // 选中数组id + const [plainList, setPlainList] = useState(plainOptions); // 选择标段 const FormItem = Form.Item; const { Option } = Select; @@ -77,13 +103,64 @@ const BidAssessmentResults: React.FC<{}> = (props) => { /*projectType :2 评标 1 资审*/ getBidAssessmentResultsList({ "projectId": proID, "roomType": "2", "sectionName": name }).then(res => { if (res.code == 200) { + // 关键:把接口返回的 res.data 赋值给 ListData setListData(res.data); + const newPlainList = res.data.map(item => ({ + sectionId: item.sectionId, + sectionName: item.sectionName + })); + setPlainList(newPlainList); + // 初始化 sectionsVal:所有标段的 ID 数组 + setSectionsVal(newPlainList.map(item => item.sectionId)); } }).finally(() => { setSpintype(false); }) }, [proID, Refresh]) + // 重置全选相关状态 + const resetCalibrationStates = () => { + setCheckedList(defaultCheckedList); // 清空已选 + setCheckAll(false); // 取消全选 + setIndeterminate(false); // 取消半选 + }; + + // 定标结果审批方法,点击按钮时调用,显示弹窗 + const calibrationResult = () => { + setIsCalibrationModalVisible(true); + }; + + // 假设点击确定按钮的回调,可根据实际需求处理选中的标段逻辑,这里简单打印 + const handleCalibrationModalOk = () => { + setIsCalibrationModalVisible(false); + console.log('点击了确定,可处理标段选择逻辑'); + resetCalibrationStates(); // 确定后也重置(可选,看业务需求) + }; + + // 关闭定标结果审批弹窗的方法 + const handleCalibrationModalCancel = () => { + setIsCalibrationModalVisible(false); + resetCalibrationStates(); // 关键:关闭时重置 + }; + + // 全选事件 + const onCheckAllChange = (e: any) => { + // 全选:checkedList = 所有标段 ID(sectionsVal) + // 取消全选:checkedList = [] + setCheckedList(e.target.checked ? sectionsVal : []); + setIndeterminate(false); + setCheckAll(e.target.checked); + }; + + // 子选项改变事件 + const onChange = (checkedList: any) => { + setCheckedList(checkedList); + // 半选状态:已选数量 >0 且 < 总数量 + setIndeterminate(!!checkedList.length && checkedList.length < sectionsVal.length); + // 全选状态:已选数量 === 总数量 + setCheckAll(checkedList.length === sectionsVal.length); + }; + /*推送评标结果*/ const pushResult = (record: any) => { setSpintype(true); @@ -117,7 +194,7 @@ const BidAssessmentResults: React.FC<{}> = (props) => { const [expandTotalScore, setExpandTotalScore] = useState(proDict == "procurement_mode_7" ? false : true); //单一简化 - function returnInput(name: any, name2: any, val: any, must: boolean, pattern?: boolean, hid?: boolean) { + function returnInput(name: any, name2: any, val: any, must: boolean, pattern?: boolean, hid?: boolean,id?: any) { let rule = [ { required: must }, { pattern: /^.{0,21}$/, message: '超长' } @@ -173,6 +250,36 @@ const BidAssessmentResults: React.FC<{}> = (props) => { ) } + function transformData(data) { + const result = []; + const idMap = {}; + + // 遍历对象的每个属性 + for (const key in data) { + if (data.hasOwnProperty(key)) { + // 分割字段名,获取属性类型和ID + const [type, id] = key.split('_'); + if (!idMap[id]) { + idMap[id] = { id }; + result.push(idMap[id]); + } + // 处理值的类型转换 + let value = data[key]; + if (value === "null") { + value = null; + } else if (type === 'contractedMoney' || type === 'taxRatePrice') { + // 确保金额字段是数字类型 + value = parseFloat(value) || null; + } else if (type === 'winnerBidder') { + // 将"是/否"转换为1/0 + value = value === "是" ? 1 : 0; + } + idMap[id][type] = value; + } + } + return result; + } + return ( = (props) => { width: 80, dataIndex: 'winnerBidder', render: (_: any, record: any) => { - return record.winnerBidder === 1 ? '是' : record.winnerBidder === 0 ? '否' : '-' + // const isEditable = defId === 'negotiation_single_simple' && record.pushStatus === "0"; + // if (isEditable) { + return returnSelect('winnerBidder_'+record.id, record.winnerBidder) + // return ( + // + // ); + // } + // return record.winnerBidder === 1 ? '是' : record.winnerBidder === 0 ? '否' : '-'; } }, { @@ -348,19 +473,19 @@ const BidAssessmentResults: React.FC<{}> = (props) => { width: 150, dataIndex: 'contractedMoney', render: (_: any, record: any) => { - if (defId === 'negotiation_single_simple' && record.pushStatus == "0") { + // if (defId === 'negotiation_single_simple' && record.pushStatus == "0") { return ( <> - {returnInput('contractedMoney', '拟签约金额', record.contractedMoney, false, true)} - {returnInput('id', '供应商id', record.id, false, false, true)} - {returnInput('resultId', '结果id', record.resultId, false, false, true)} - {returnInput('companyId', '公司id', record.companyId, false, false, true)} - {returnInput('companyName', '公司名称', record.companyName, false, false, true)} + {returnInput('contractedMoney_'+record.id, '拟签约金额', record.contractedMoney, false, true,false,record.id)} + {/*{returnInput('id', '供应商id', record.id, false, false, true,record.id)}*/} + {/*{returnInput('resultId', '结果id', record.resultId, false, false, true,record.id)}*/} + {/*{returnInput('companyId', '公司id', record.companyId, false, false, true,record.id)}*/} + {/*{returnInput('companyName', '公司名称', record.companyName, false, false, true,record.id)}*/} ) - } else { - return record.contractedMoney - } + // } else { + // return record.contractedMoney + // } } }, { @@ -369,11 +494,11 @@ const BidAssessmentResults: React.FC<{}> = (props) => { width: 150, dataIndex: 'taxRatePrice', render: (_: any, record: any) => { - if (defId === 'negotiation_single_simple' && record.pushStatus == "0") { - return returnInput('taxRatePrice', '增值税金额', record.taxRatePrice, false, true) - } else { - return record.taxRatePrice - } + // if (defId === 'negotiation_single_simple' && record.pushStatus == "0") { + return returnInput('taxRatePrice_'+record.id, '增值税金额', record.taxRatePrice, false, true,false,record.id) + // } else { + // return record.taxRatePrice + // } } }, ] @@ -429,6 +554,18 @@ const BidAssessmentResults: React.FC<{}> = (props) => { } + ]} pagination={{ @@ -443,12 +580,66 @@ const BidAssessmentResults: React.FC<{}> = (props) => { ) } + const calibrationResultsModal = ( + +
+ {/* 全选 - 单独一行 */} +
+ + 全选 + +
+ + {/* 子选项 - 统一缩进 */} +
+ + {plainList.map((item, index) => ( +
+ + {item.sectionName} + +
+ ))} +
+
+
+
+ ); + return ( <>
+ setName(event.target.value)} />