diff --git a/config/router.ts b/config/router.ts index 8b2da6e..b073145 100644 --- a/config/router.ts +++ b/config/router.ts @@ -68,6 +68,11 @@ export default [ name: '租金测算', component: "@/pages/RentCalculation/index", }, + { + path: '/rentComparison/index', + name: '租金对比', + component: "@/pages/rentComparison/index", + }, ] diff --git a/src/assets/operation.png b/src/assets/operation.png new file mode 100644 index 0000000..b17df6c Binary files /dev/null and b/src/assets/operation.png differ diff --git a/src/models/user.ts b/src/models/user.ts index 1a01e87..a1f4f90 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -293,6 +293,12 @@ const UserModel: UserModelType = { name: '租金测算', component: "@/pages/RentCalculation/index", }, + { + path: '/rentComparison/index', + redirect: '', + name: '租金对比', + component: "@/pages/rentComparison/index", + }, ] } @@ -374,6 +380,7 @@ const UserModel: UserModelType = { "/operationReport/securityIssueList", "/operationReport/rectificationStatus", "/RentCalculation/index", + "/rentComparison/index", // '/examine/index', // '/examine/modal', // '/examine/question', diff --git a/src/pages/DigitalElectronics/index.tsx b/src/pages/DigitalElectronics/index.tsx index 6603b9d..441bd05 100644 --- a/src/pages/DigitalElectronics/index.tsx +++ b/src/pages/DigitalElectronics/index.tsx @@ -314,8 +314,6 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { // 撤回发票 const handleRevokeBill = async (detail: any) => { - console.log('detaildetaildetaildetail', detail); - let obj: any = { sellerTaxpayerId: publicParams.sellerTaxpayerId,//销方税号 orgCode: "",// 组织编号 @@ -343,7 +341,6 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { let responseOld = await handleGetForwardJDPJInterface(newTokenReq2) responseOld = JSON.parse(responseOld as any) - console.log('responseOldresponseOld', responseOld); if (responseOld && (responseOld.success || responseOld.errorCode == 10905)) { return { @@ -570,8 +567,6 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { SortStr: "BILLDETAIL_ID" }) - console.log('billDetailbillDetail', billDetail); - let billDetailReq: any = [] if (billDetail && billDetail.length > 0) { billDetail.forEach((item: any) => { @@ -688,7 +683,6 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { PageSize: 999999, SortStr: "BILLDETAIL_ID" }) - console.log('billDetailbillDetail', billDetail); let billDetailReq: any = [] if (billDetail && billDetail.length > 0) { @@ -767,7 +761,6 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { let response: any = await handleGetForwardJDPJInterface(newreq) let result: any = JSON.parse(response) - console.log('resultresultresult', result); return result } // 退回开票 diff --git a/src/pages/InvoiceSearch/index.tsx b/src/pages/InvoiceSearch/index.tsx index d368823..719fe72 100644 --- a/src/pages/InvoiceSearch/index.tsx +++ b/src/pages/InvoiceSearch/index.tsx @@ -34,7 +34,6 @@ const InvoiceSearch: React.FC = () => { // 查看详情 const handleViewDetail = (record: any) => { message.info('查看详情功能待开发'); - console.log('详情数据:', record); }; // 表格列定义 @@ -212,7 +211,6 @@ const InvoiceSearch: React.FC = () => { // 撤回 const handleRevoke = async (params: any) => { - console.log('paramsparamsparams', params); const queryData = { sellerTaxpayerId: "91530112MA7MQ2JR9U", serialNos: params.billNo || "", @@ -243,8 +241,6 @@ const InvoiceSearch: React.FC = () => { // 红冲 const handleRedReversal = async (params: any) => { // 整单红冲 不需要调用红冲接口 申请里面放蓝票信息 就是红冲 - console.log('paramsparams', params); - let obj: any = { billNo: "SRM_202509011370", billDate: "2025-09-01", @@ -291,7 +287,6 @@ const InvoiceSearch: React.FC = () => { } ] } - console.log('objobjobj', obj); // 构造原始数据 const originalData = [obj]; // 将record作为data数组的一项 @@ -307,7 +302,6 @@ const InvoiceSearch: React.FC = () => { }; const response = await handleGetKaiPiao(invoiceData, accessToken); - console.log('responseresponseresponse', response); // const queryData = { // billNo: params?.billNo || "", @@ -316,7 +310,6 @@ const InvoiceSearch: React.FC = () => { // sellerTaxpayerId: "91530112MA7MQ2JR9U", // redReason: "111", // }; - // console.log('queryDataqueryDataqueryData', queryData); // // 将data字段进行base64加密 // const dataString = JSON.stringify(queryData); @@ -329,11 +322,9 @@ const InvoiceSearch: React.FC = () => { // } // // 他这个接口 就一个地址 改不一样的参数就能调不一样的接口 // const data = await handleGetInvoiceSearch(req, accessToken) - // console.log('datadatadatadata', data); // if (data && data.success) { // let res = JSON.parse(decodeURIComponent(escape(atob(data.data)))) - // console.log('resresresresres', res); // if (res && res.length > 0) { // let result = res[0] // message.success(result.message) @@ -347,7 +338,6 @@ const InvoiceSearch: React.FC = () => { // 请求表格数据 const request = async (params: any) => { try { - console.log('查询参数:', params); let req: any = { appId: "FPY001", appSecret: "FPY001fpy@2023***", @@ -356,7 +346,6 @@ const InvoiceSearch: React.FC = () => { language: "" } const token = await handleGetAppToken(req) - console.log('tokentokentoken', token); let appToken: any = token.data.app_token @@ -369,7 +358,6 @@ const InvoiceSearch: React.FC = () => { } const accessToken: any = await handleGetSDToken(tokenReq) - console.log('accessTokenaccessTokenaccessToken', accessToken); setAppToken(appToken) setAccessToken(accessToken.data.access_token) @@ -391,17 +379,14 @@ const InvoiceSearch: React.FC = () => { data: encryptedData }; - console.log('最终请求参数:', requestParams); // 调用查询接口 (这里需要传入正确的code参数) const response = await handleGetInvoiceSearch(requestParams, accessToken.data.access_token); - console.log('responseresponseresponseresponse', response); if (response && response.success) { let res = JSON.parse(decodeURIComponent(escape(atob(response.data)))) - console.log('最终请求结果:', res); let result = res[0].invoiceList return { data: result || [], success: true }; diff --git a/src/pages/Invoicing/index.tsx b/src/pages/Invoicing/index.tsx index 132aa93..a2bb010 100644 --- a/src/pages/Invoicing/index.tsx +++ b/src/pages/Invoicing/index.tsx @@ -33,16 +33,11 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { // 开始刷脸认证的流程 const handleGetFacialAuthentication = async () => { let url = window.location.search.split('?')[1] - console.log('url', url); - const params = new URLSearchParams(url); - console.log('params', params); let resultObj: any = {}; for (const [key, value] of params.entries()) { resultObj[key] = value; } - console.log('resultObj', resultObj); - let code = "menuCloud" if (resultObj.UserIdEncrypted) { @@ -59,9 +54,7 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { // code: code // } // const data = await handleGetBWTokenFun(req) - // console.log('data', data); // let token = data.data.data.token - // console.log('token', token); let codeReq: any = { qrCodeType: 0, @@ -69,8 +62,6 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { } // 刷脸二维码的值 const qrCodeData = await handleGetCertifyQrcode('menuCloud', codeReq) - console.log('qrCodeData', qrCodeData); - console.log('321', qrCodeData.data.response.qrCode); let length = qrCodeData.data.response.qrCode.split(',') && qrCodeData.data.response.qrCode.split(',').length > 0 ? qrCodeData.data.response.qrCode.split(',').length : 0 let img = qrCodeData.data.response.qrCode.split(',')[length - 1] @@ -93,14 +84,13 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { certifyQueryType: 1 }) let res: any = resultData.data.response - console.log('res', res); if (res.certificationStatus == '1') { if (timerRef.current) { clearInterval(timerRef.current) timerRef.current = null } // instance.destroy(); - message.success({ content: '认证成功!' }) + message.success({ content: '认证成功!' }) setShowTable(true) } }, 2000); @@ -298,8 +288,6 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { render: (_, record) => { return { - console.log('record', record); - handleInvoicing(record) }}> 开票 @@ -325,16 +313,12 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { pushPhone: obj.pushPhone, // 交付手机 pushEmail: obj.pushEmail // 交付邮箱 } - console.log('req', req); // return const data = await handleGetDeliver('menuCloud', req) - console.log('data', data); } // 作废 const handleCancelInvoicing = async (obj: any) => { - console.log('obj', obj); - const req: any = { taxNo: BWDetailObj.taxNo, serialNo: obj.serialNo, @@ -350,7 +334,6 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { const handleGetUserInfo = async (UserIdEncrypted: string) => { const req: any = { UserIdEncrypted: UserIdEncrypted } const data = await handleGetUserInfoById(req) - console.log('handleGetUserInfo', data); let userDetail: any = data.Result_Data setUserInfo(userDetail) } @@ -375,7 +358,6 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { headerTitle={发票列表} search={{ span: 6 }} request={async (params: any) => { - console.log('params', params); // startOf('M'). let [state, end] = [moment().format('YYYY-MM-DD 00:00:00'), moment().format('YYYY-MM-DD 23:59:59')] const req: any = { @@ -387,9 +369,7 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { endDate: end || '' } const data = await handleGetInvoicePageTable('menuCloud', req) - console.log('data3232', data); let tableData: any = data.data.response - console.log('tableData3232', tableData); if (tableData.list && tableData.list.length > 0) { return { diff --git a/src/pages/RentCalculation/index.tsx b/src/pages/RentCalculation/index.tsx index 52291cd..c5ec184 100644 --- a/src/pages/RentCalculation/index.tsx +++ b/src/pages/RentCalculation/index.tsx @@ -1,6 +1,6 @@ import LeftSelectTree from "@/components/leftSelectTree/leftSelectTree"; import { ActionType, FormInstance, ProForm, ProFormDatePicker, ProFormDigit, ProFormSelect, ProFormText, ProTable } from "@ant-design/pro-components"; -import { Button, Col, Divider, message, Modal, Row } from "antd"; +import { Button, Col, Divider, message, Modal, Row, Tooltip } from "antd"; import { useEffect, useRef, useState } from "react"; import { connect } from "umi"; import './style.less' @@ -9,7 +9,7 @@ import { handleGetServerpartInfo } from "../serverpartAssets/service"; import { encryptAES } from "@/utils/handleAes"; import moment from "moment"; import { handleGetPassportInfoById } from "../DigitalElectronics/service"; - +import operation from '../../assets/operation.png' const RentCalculation: React.FC<{ currentUser: any }> = (props) => { const actionRef = useRef(); @@ -35,6 +35,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { const [currentRow, setCurrentRow] = useState() // 当前的用户信息 const [userInfoDetail, setUserInfoDetail] = useState() + const [rentCalculateModalLoading, setRentCalculateModalLoading] = useState(false) + // 租金实际分析的悬浮框 + const [analysisModal, setAnalysisModal] = useState(false) + // 租金分析的对象 + const [currentObj, setCurrentObj] = useState() + // 模拟数据 计数的 + const [proposalObj, setProposalObj] = useState({ + }) const operatingModels = [ '委托运营', @@ -42,6 +50,143 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { '保底收益一', '保底收益二' ]; + const SERVERPART_TYPEObj: any = { + 1000: "立标杆", + 2000: "提能级", + 3000: "稳营收", + 4000: "保功能", + } + + const top5Data: any = [ + { + SERVERPART_NAME: "大仓服务区", + preferredRating: 88, + tolerance: 12, + revenueTolerance: 8, + canReplace: true, + monthlyAverageRent: 560000, + monthlyAverageRentIncreaseData: 20000, + monthlyAverageRentIncreaseRate: 0.05, + REVENUE_AMOUNT: 800000, + REVENUE_AMOUNTIncreaseData: 15000, + REVENUE_AMOUNTIncreaseRate: 0.03, + SERVERPART_REVENUE: 3800000, + SERVERPART_REVENUEIncreaseData: 80000, + SERVERPART_REVENUEIncreaseRate: 0.022, + MINIMART_REVENUE: 420000, + MINIMART_REVENUEIncreaseData: 6000, + MINIMART_REVENUEIncreaseRate: 0.015, + SERVERPART_AVGFLOW: 13500, + AVGFLOWDiffIncreaseData: 500, + AVGFLOWDiffIncreaseRate: 0.037, + PROFIT_AMOUNT: 300000, + PROFIT_AMOUNTIncreaseData: 12000, + PROFIT_AMOUNTIncreaseRate: 0.04, + }, + { + SERVERPART_NAME: "地索坪服务区", + preferredRating: 92, + tolerance: 6, + revenueTolerance: 11, + canReplace: false, + monthlyAverageRent: 460000, + monthlyAverageRentIncreaseData: -15000, + monthlyAverageRentIncreaseRate: -0.03, + REVENUE_AMOUNT: 720000, + REVENUE_AMOUNTIncreaseData: -8000, + REVENUE_AMOUNTIncreaseRate: -0.011, + SERVERPART_REVENUE: 3100000, + SERVERPART_REVENUEIncreaseData: -60000, + SERVERPART_REVENUEIncreaseRate: -0.019, + MINIMART_REVENUE: 380000, + MINIMART_REVENUEIncreaseData: -4000, + MINIMART_REVENUEIncreaseRate: -0.01, + SERVERPART_AVGFLOW: 9800, + AVGFLOWDiffIncreaseData: -1200, + AVGFLOWDiffIncreaseRate: -0.109, + PROFIT_AMOUNT: 250000, + PROFIT_AMOUNTIncreaseData: -9000, + PROFIT_AMOUNTIncreaseRate: -0.035, + }, + + { + SERVERPART_NAME: "楚雄服务区", + preferredRating: 81, + tolerance: 9, + revenueTolerance: 7, + canReplace: true, + monthlyAverageRent: 380000, + monthlyAverageRentIncreaseData: 10000, + monthlyAverageRentIncreaseRate: 0.028, + REVENUE_AMOUNT: 600000, + REVENUE_AMOUNTIncreaseData: 5000, + REVENUE_AMOUNTIncreaseRate: 0.008, + SERVERPART_REVENUE: 2500000, + SERVERPART_REVENUEIncreaseData: 45000, + SERVERPART_REVENUEIncreaseRate: 0.018, + MINIMART_REVENUE: 300000, + MINIMART_REVENUEIncreaseData: 2000, + MINIMART_REVENUEIncreaseRate: 0.006, + SERVERPART_AVGFLOW: 11200, + AVGFLOWDiffIncreaseData: 200, + AVGFLOWDiffIncreaseRate: 0.018, + PROFIT_AMOUNT: 200000, + PROFIT_AMOUNTIncreaseData: 6000, + PROFIT_AMOUNTIncreaseRate: 0.03, + }, + + { + SERVERPART_NAME: "恐龙山服务区", + preferredRating: 76, + tolerance: 14, + revenueTolerance: 5, + canReplace: false, + monthlyAverageRent: 320000, + monthlyAverageRentIncreaseData: -8000, + monthlyAverageRentIncreaseRate: -0.025, + REVENUE_AMOUNT: 450000, + REVENUE_AMOUNTIncreaseData: -12000, + REVENUE_AMOUNTIncreaseRate: -0.026, + SERVERPART_REVENUE: 2100000, + SERVERPART_REVENUEIncreaseData: -30000, + SERVERPART_REVENUEIncreaseRate: -0.014, + MINIMART_REVENUE: 250000, + MINIMART_REVENUEIncreaseData: -3000, + MINIMART_REVENUEIncreaseRate: -0.012, + SERVERPART_AVGFLOW: 7300, + AVGFLOWDiffIncreaseData: -900, + AVGFLOWDiffIncreaseRate: -0.11, + PROFIT_AMOUNT: 160000, + PROFIT_AMOUNTIncreaseData: -5000, + PROFIT_AMOUNTIncreaseRate: -0.03, + }, + { + SERVERPART_NAME: "保山服务区", + preferredRating: 95, + tolerance: 4, + revenueTolerance: 3, + canReplace: true, + monthlyAverageRent: 680000, + monthlyAverageRentIncreaseData: 26000, + monthlyAverageRentIncreaseRate: 0.041, + REVENUE_AMOUNT: 960000, + REVENUE_AMOUNTIncreaseData: 30000, + REVENUE_AMOUNTIncreaseRate: 0.032, + SERVERPART_REVENUE: 4200000, + SERVERPART_REVENUEIncreaseData: 130000, + SERVERPART_REVENUEIncreaseRate: 0.032, + MINIMART_REVENUE: 520000, + MINIMART_REVENUEIncreaseData: 9000, + MINIMART_REVENUEIncreaseRate: 0.017, + SERVERPART_AVGFLOW: 15800, + AVGFLOWDiffIncreaseData: 850, + AVGFLOWDiffIncreaseRate: 0.056, + PROFIT_AMOUNT: 350000, + PROFIT_AMOUNTIncreaseData: 20000, + PROFIT_AMOUNTIncreaseRate: 0.061, + } + ] + const columns: any = [ { @@ -59,6 +204,44 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { align: 'center', width: 180, ellipsis: true, + // render: (_, record) => { + // return { + // setCurrentObj({ + // ...record, + // profitavg: 30, + // sumTotal: 12, + // min: 5, + // max: 13, + // MINTURNOVERMin: 600, + // MINTURNOVERMax: 600, + // avg: 8.6, + // MINTURNOVERAvg: 30, + // MINTURNOVER: 30, + // GUARANTEERATIO: 26, + // oldRate: 5, + // reduce: 13, + // nowRate: 9, + // BUSINESS_TYPEMINTURNOVER: 30, + // nowGUARANTEERATIO: 5, + // differenceGUARANTEERATIO: 4, + // addMINTURNOVER: 5, + // addMINTURNOVERRate: 5, + // currentThanRecently: true, + // recentREVENUE_AMOUNT: 1660000, + // nowProfit: 15, + // monthlyAverageRent: 150000, // 15 万元/月(≈180 万/年,符合高收益委托运营特征) + // REVENUE_AMOUNT: 138000, // ≈13.8 万元/月 + // SERVERPART_REVENUE: 1800000, // 180 万元/月 + // MINIMART_REVENUE: 260000, // 26 万元/月 + // SERVERPART_AVGFLOW: 10500, // 1.05 万辆/日 + // PROFIT_AMOUNT: 100000, // 10 万元/月 + // preferredRating: 60 + // }) + // setAnalysisModal(true) + // }}> + // {record?.SERVERPART_NAME || ""} + // + // } }, { title: "所属高速", @@ -76,6 +259,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { width: 150, ellipsis: true, }, + { + title: "运营模式", + dataIndex: "OPERATING_MODE", + hideInSearch: true, + align: 'center', + width: 120, + ellipsis: true, + }, { title: "站点类型", dataIndex: "STATION_TYPE", @@ -136,14 +327,6 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { width: 120, ellipsis: true, }, - { - title: "运营模式", - dataIndex: "OPERATING_MODE", - hideInSearch: true, - align: 'center', - width: 120, - ellipsis: true, - }, { title:
首次保底营业额(元)
, dataIndex: "FIRST_GUARANTEE_TURNOVER", @@ -201,10 +384,16 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { align: 'center', hideInSearch: true, render: (_: any, record: any) => ( - { - await handleDeleteRecord(record?.RENTCALCULATION_ID) - } - }>删除 + <> + { + setCurrentRow(record) + setRentCalculateModal(true) + }}>详情 + { + await handleDeleteRecord(record?.RENTCALCULATION_ID) + } + }>删除 + ) } ] @@ -215,7 +404,6 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { SPRegionType_ID: id } const data = await handleGetServerpartTree(req) - console.log('dsadasda', data); if (data && data.length > 0) { let list = data[0].children setServerPartList(list) @@ -230,15 +418,13 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { SERVERPARTId: id } const data = await handleGetServerpartInfo(req) - console.log('datadatadata', data); let list: any = [] if (data.RegionInfo && data.RegionInfo.length > 0) { data.RegionInfo.forEach((item: any) => { list.push({ label: item.SERVERPART_REGIONNAME, value: item.SERVERPART_REGION }) }) } - console.log('listlistlist', list); - + setSERVERPARTREGION(list) const newReq: any = { @@ -254,17 +440,16 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { value: encryptAES(JSON.stringify(newReq)) } const newData = await handlGetSPCONTRIBUTIONList(newreq) - console.log('newDatanewDatanewData', newData); if (newData && newData.length > 0) { let res: any = newData[0].SERVERPART_TYPE - selectFormRef.current?.setFieldsValue({ SERVERPART_TYPE: res }) + if (selectFormRef) { + selectFormRef.current?.setFieldsValue({ SERVERPART_TYPE: res }) + } } - setSERVERPARTREGION(list) } // 同步和新增方法 const handleAddUpdate = async (formData: any) => { - console.log('formDataformDataformData', formData); let req: any = {} if (currentRow?.RENTCALCULATION_ID) { req = { @@ -299,6 +484,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } const data = await handlSynchroRENTCALCULATION(newReq) + setRentCalculateModalLoading(false) if (data.Result_Code === 100) { message.success('同步成功') setShowSelectOperatingModel(false) @@ -367,6 +553,27 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } } + const truncateDecimal = (num: number) => { + if (!num && num !== 0) { + return 0 + } + // 先用 toFixed 保留两位小数以消除精度问题 + const fixedNum = parseFloat(num.toFixed(10)); + // 将数字转换为字符串 + let strNum = fixedNum.toString(); + + // 找到小数点的位置 + const dotIndex = strNum.indexOf('.'); + + // 如果有小数点且小数点后有至少两位,则截取 + if (dotIndex !== -1) { + strNum = strNum.substring(0, dotIndex + 3); + } + + // 转换回数字类型 + return parseFloat(strNum); + } + return (
@@ -389,7 +596,6 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { // 地址栏传参 UserIdEncrypted 为当前登录用户的加密id const search = window.location.search; const addressParams = Object.fromEntries(new URLSearchParams(search).entries()); - console.log('addressParamsaddressParams', addressParams); const reqtoken: any = { UserIdEncrypted: addressParams.UserIdEncrypted } @@ -406,6 +612,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }, PageIndex: 1, PageSize: 999999, + SortStr: "OPERATE_DATE desc" } let newReq: any = { name: "", @@ -428,6 +635,349 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { />
+ {/* 实际分析租金的悬浮框 */} + { + setAnalysisModal(false) + setCurrentObj(undefined) + + }} + footer={false} + > +
+
+
+
+ {currentObj?.SERVERPART_NAME} +
{SERVERPART_TYPEObj[currentObj?.SERVERPART_TYPE]}
+
+
{`${currentObj?.SERVERPART_NAME || ''}${currentObj?.EXPRESSWAY_NAME || ''}${currentObj?.OPERATING_MODE ? currentObj?.OPERATING_MODE + '项目' : ''}`}
+
+
+ +
+ + 招商分析 +
+
通过查询云南彩云驿所有经营项目数据:
+ +
+ {/* */} + 共找到类似项目({currentObj?.SERVERPART_TYPE ? SERVERPART_TYPEObj[currentObj?.SERVERPART_TYPE] : ''} + 服务区, + {currentObj?.OPERATING_MODE || ''} + 共计 + {currentObj?.sumTotal} + {/* {allListData && allListData.length > 0 ? allListData.length : 0} */} + 个) + 。大模型调用租金收益、门店营收、服务区整体营收、商超表现、车流量适应性等5项核心数据指标,对各候选项目的潜在收益及服务区适应性进行综合衡量,优化即将到期得 + {currentObj?.SERVERPART_NAME} + 的 + {currentObj?.SHOPSHORTNAME} + 具体分析如下: +
+ +
+
根据行业({currentObj?.SERVERPART_TYPE ? SERVERPART_TYPEObj[currentObj?.SERVERPART_TYPE] : ''}) + 常规提成比例11%,在营项目20个,商家平均净利润率约为:3.6%
+
{currentObj?.SERVERPART_TYPE ? SERVERPART_TYPEObj[currentObj?.SERVERPART_TYPE] : ''}{currentObj?.profitavg < 10 ? '商家经营存在困难,建议降低保底租金以减轻商家负担,提成比例适当降低或维持现状。' : + currentObj?.profitavg >= 10 && currentObj?.profitavg <= 20 ? '商家有一定盈利能力,建议维持行业平均提成比例,同时保底租金设置参考营收和行业水平。' : + currentObj?.profitavg > 20 ? '商家盈利能力强,可以适当提高提成比例,同时设定更高的保底租金。' : + ''} +
+
+ 彩云驿目前在营项目( + {currentObj?.SERVERPART_TYPE ? SERVERPART_TYPEObj[currentObj?.SERVERPART_TYPE] : ''} + 共计 + {currentObj?.sumTotal} + {/* {allListData && allListData.length > 0 ? allListData.length : 0} */} + 个)的提成比例为:{ + currentObj?.noRate ? '固定租金' : + {currentObj?.min === currentObj?.max ? + + {currentObj?.max}% + : + + {currentObj?.min}%— + {currentObj?.max}% + } + },保底租金为:{ + currentObj?.MINTURNOVERMin === currentObj?.MINTURNOVERMax ? + {currentObj?.MINTURNOVERMin} : + + {currentObj?.MINTURNOVERMin}万元— + {currentObj?.MINTURNOVERMax} + + }万元,平均提成比例:{currentObj?.noRate ? '固定租金' : {currentObj?.avg}%},平均保底租金为:{currentObj?.MINTURNOVERAvg}万元, +
+
+ {`${currentObj?.SERVERPART_NAME || ''}${currentObj?.EXPRESSWAY_NAME || ''}${currentObj?.OPERATING_MODE ? currentObj?.OPERATING_MODE + '项目' : ''}`}目前保底租金为{currentObj?.MINTURNOVER || ''}万/年, + { + currentObj?.BUSINESS_TYPE === 2000 ? + '' : + 提成比例{currentObj?.GUARANTEERATIO || '-'}%, + } + + 累计盈利:120万元 + +
+ + +
租金提成建议
+
提成比例{ + currentObj?.avgThanNowRate ? + + + {currentObj?.nowRate || ''}% + + — + {currentObj?.avg || ''}% + { + currentObj?.BUSINESS_TYPE === 2000 ? + (原合同固定租金:{currentObj?.BUSINESS_TYPEMINTURNOVER || ''}万/年) : + (原合同提成比例{currentObj?.nowGUARANTEERATIO || ''}% + { + currentObj?.differenceGUARANTEERATIO ? + ,{currentObj?.differenceGUARANTEERATIO > 0 ? '优于' : currentObj?.differenceGUARANTEERATIO < 0 ? '下浮' : ''}{currentObj?.differenceGUARANTEERATIO || ''}% : '' + } + ) + + } + : + + + {currentObj?.nowRate || ''}% + + { + currentObj?.BUSINESS_TYPE === 2000 ? + (原合同固定租金:{currentObj?.BUSINESS_TYPEMINTURNOVER || ''}万/年) : + (原合同提成比例{currentObj?.nowGUARANTEERATIO || ''}% + { + currentObj?.differenceGUARANTEERATIO ? + ,{currentObj?.differenceGUARANTEERATIO > 0 ? '优于' : currentObj?.differenceGUARANTEERATIO < 0 ? '下浮' : ''} + {currentObj?.differenceGUARANTEERATIO || ''}% + : '' + } + ) + } + + } +
+
保底租金 + { + currentObj?.MINTURNOVERAvgThanAvg ? + + {/* title={`${currentObj?.currentThanRecently ? '当前' : '上个'}合同年的对客销售总额${truncateDecimal(currentObj?.recentREVENUE_AMOUNT / 10000)}万元×${currentObj?.nowRate || ''}% = ${currentObj?.nowProfit}万元,保底租金${currentObj?.addMINTURNOVER>0?'优于':currentObj?.addMINTURNOVER<0?'下浮':''}${currentObj?.addMINTURNOVER}万/年。`} */} + 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}${currentObj?.addMINTURNOVER}万元,${currentObj?.addMINTURNOVERRate > 0 ? '提升' : currentObj?.addMINTURNOVERRate < 0 ? '降低' : ''}${Math.abs(currentObj?.addMINTURNOVERRate)}%`}> + {currentObj?.nowProfit}万元 + + — + {currentObj?.MINTURNOVERAvg}万元 + ({currentObj?.currentThanRecently ? '当前' : '上个'}合同年的对客销售总额{(currentObj?.recentREVENUE_AMOUNT / 10000)}万元×{currentObj?.nowRate || ''}% = {currentObj?.nowProfit}万元,原合同保底租金{currentObj?.BUSINESS_TYPE === 2000 ? currentObj?.BUSINESS_TYPEMINTURNOVER : currentObj?.nowMINTURNOVER}万元,{currentObj?.addMINTURNOVER > 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}{currentObj?.addMINTURNOVER}万/年) + + : + + 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}${currentObj?.addMINTURNOVER}万元,${currentObj?.addMINTURNOVERRate > 0 ? '提升' : currentObj?.addMINTURNOVERRate < 0 ? '降低' : ''}${Math.abs(currentObj?.addMINTURNOVERRate)}%`}> + {currentObj?.nowProfit}万元 + + ({currentObj?.currentThanRecently ? '当前' : '上个'}合同年的对客销售总额{(currentObj?.recentREVENUE_AMOUNT / 10000)}万元×{currentObj?.nowRate || ''}% = {currentObj?.nowProfit}万元,原合同保底租金{currentObj?.BUSINESS_TYPE === 2000 ? currentObj?.BUSINESS_TYPEMINTURNOVER : currentObj?.nowMINTURNOVER}万元,{currentObj?.addMINTURNOVER > 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}{currentObj?.addMINTURNOVER}万/年) + + + } +
+
+ +
+ 数据来源与核心指标 +
+ 核心数据: +
+
租金月均(万元):体现甲方的直接租金收益。(权重比例20%)
+
门店月均营收(万元):衡量门店的市场吸引力和实际营收表现。(权重比例35%)
+
服务区整体营收(万元):反映服务区的整体商业氛围和消费潜力。(权重比例10%)
+
商超月均收入(万元):作为基础消费需求的参考,体现服务区内的消费稳定性。(权重比例10%)
+
日均入区车流量(辆):指示潜在客流量,评估车流对门店经营的带动效果。(权重比例5%)
+
商家盈利稳定性(万元):综合考虑商家在一年周期内的盈利状况,体现项目的可持续经营能力。(权重比例20%)
+
+
+ 分析逻辑:通过加权计算得出门店的综合评分,以量化门店在各维度上的综合表现。最终评分结合关键指标差值,确保候选门店在整体及单项核心指标上均具备明显优势,以作为优选或续签判断依据。 +
+
+
+ +
+ + +
现有门店:{currentObj?.SERVERPART_NAME}({currentObj?.preferredRating || ''}分)
+
+ 现状数据: +
+
租金月均:{truncateDecimal(currentObj?.monthlyAverageRent / 10000)}万元
+
门店月均营收:{truncateDecimal(currentObj?.REVENUE_AMOUNT / 10000)}万元
+
服务区整体营收:{truncateDecimal(currentObj?.SERVERPART_REVENUE / 10000)}万元
+
商超月均:{truncateDecimal(currentObj?.MINIMART_REVENUE / 10000)}万元
+
日均入区车流量:{currentObj?.SERVERPART_AVGFLOW}
+
商家盈利稳定性:{truncateDecimal(currentObj?.PROFIT_AMOUNT / 10000)}万元
+
+
+
候选替换选项:
+
+ { + top5Data && top5Data?.length > 0 ? + top5Data.map((item: any, index: number) => { + return
+
{index + 1}、 {item.SERVERPART_NAME} ({item.preferredRating || ''}分)
+
+ 容差比对:车流容差率{item.tolerance ? item.tolerance + '%' : ''},营收容差{item.revenueTolerance ? item.revenueTolerance + '%' : ''}{item.canReplace ? '推荐替换' : '不建议替换'} +
租金月均: + {truncateDecimal(item.monthlyAverageRent / 10000)} + 万元( + {`${item.monthlyAverageRentIncreaseData < 0 ? '低于' : item.monthlyAverageRentIncreaseData > 0 ? '高于' : ''}`} + 现有{truncateDecimal(Math.abs(item.monthlyAverageRentIncreaseData / 10000))}万元 + ,{item.monthlyAverageRentIncreaseRate > 0 ? '优于' : item.monthlyAverageRentIncreaseRate < 0 ? '下浮' : ''} + {truncateDecimal(Math.abs(item.monthlyAverageRentIncreaseRate * 100))}% + ) +
+
门店月均营收: + {truncateDecimal(item.REVENUE_AMOUNT / 10000)} + 万元( + {`${item.REVENUE_AMOUNTIncreaseData < 0 ? '低于' : item.REVENUE_AMOUNTIncreaseData > 0 ? '高于' : ''}`} + 现有{truncateDecimal(Math.abs(item.REVENUE_AMOUNTIncreaseData / 10000))}万元 + ,{item.REVENUE_AMOUNTIncreaseRate > 0 ? '优于' : item.REVENUE_AMOUNTIncreaseRate < 0 ? '下浮' : ''} + {truncateDecimal(Math.abs(item.REVENUE_AMOUNTIncreaseRate * 100))}% + ) +
+
服务区整体营收: + {truncateDecimal(item.SERVERPART_REVENUE / 10000)} + 万元( + {`${item.SERVERPART_REVENUEIncreaseData < 0 ? '低于' : item.SERVERPART_REVENUEIncreaseData > 0 ? '高于' : ''}`} + 现有{truncateDecimal(Math.abs(item.SERVERPART_REVENUEIncreaseData / 10000))}万元 + ,{item.SERVERPART_REVENUEIncreaseRate > 0 ? '优于' : item.SERVERPART_REVENUEIncreaseRate < 0 ? '下浮' : ''} + {truncateDecimal(Math.abs(item.SERVERPART_REVENUEIncreaseRate * 100))}% + ) +
+
商超月均: + {truncateDecimal(item.MINIMART_REVENUE / 10000)} + 万元( + {`${item.MINIMART_REVENUEIncreaseData < 0 ? '低于' : item.MINIMART_REVENUEIncreaseData > 0 ? '高于' : ''}`} + 现有{truncateDecimal(Math.abs(item.MINIMART_REVENUEIncreaseData / 10000))}万元 + ,{item.MINIMART_REVENUEIncreaseRate > 0 ? '优于' : item.MINIMART_REVENUEIncreaseRate < 0 ? '下浮' : ''} + {truncateDecimal(Math.abs(item.MINIMART_REVENUEIncreaseRate * 100))}% + ) +
+
日均入区车流量: + {item.SERVERPART_AVGFLOW} + 辆( + {`${item.AVGFLOWDiffIncreaseData < 0 ? '低于' : item.AVGFLOWDiffIncreaseData > 0 ? '高于' : ''}`} + {truncateDecimal(Math.abs(item?.AVGFLOWDiffIncreaseData))} + ,{item.AVGFLOWDiffIncreaseRate > 0 ? '优于' : item.AVGFLOWDiffIncreaseRate < 0 ? '下浮' : ''} + {Math.abs(truncateDecimal(item.AVGFLOWDiffIncreaseRate * 100))}% + ,{item.tolerance > 10 ? '超出10%容差范围' : '未达到容差范围'}) +
+
商家盈利稳定性: + {truncateDecimal(item.PROFIT_AMOUNT / 10000)} + 万元( + {`${item.PROFIT_AMOUNTIncreaseData < 0 ? '低于' : item.PROFIT_AMOUNTIncreaseData > 0 ? '高于' : ''}`} + 现有{truncateDecimal(Math.abs(item.PROFIT_AMOUNTIncreaseData / 10000))}万元 + ,{item.PROFIT_AMOUNTIncreaseRate > 0 ? '优于' : item.PROFIT_AMOUNTIncreaseRate < 0 ? '下浮' : ''} + {truncateDecimal(Math.abs(item.PROFIT_AMOUNTIncreaseRate * 100))}% + ) +
+
+
+ }) : '' + } +
+
+ + +
+ 分析逻辑与流程 +
+ 步骤1:初步筛选 +
+ 通过B类服务区所有门店的综合评分,按租金、门店营收、车流量适应性等维度筛选出前五名候选门店作为潜在替换选项。 + 使用“低车流高营收”优先原则,筛选在车流量不显著高于目标门店的情况下,仍能保持高营收的候选门店。 +
+
+
+ 步骤2:多维对比分析 +
+ 将前五名候选门店的租金、门店营收、商超、车流量等数据与目标门店(如{currentObj?.SERVERPART_NAME || ''})现状对比,分析替换后可能产生的影响。 + 重点考量:是否符合“车流量不显著提升但营收提升显著”的替换条件;若入区车流量下降,营收至少提升5%;车流量提升不超过10%,营收需至少提升20%。 +
+
+
+ 步骤3:最终推荐 +
+ 根据候选门店的适应性得出结论,判断哪些替换选项可能带来增值效果,是否比现有的“{currentObj?.SERVERPART_NAME || ''}”表现更优。若候选选项不符合期望,则建议续签现有合同。 +
+
+
+
+ 保底租金和提成比例逻辑框架 +
+ 1. 利润率 +
+ {`高利润率(>20%): + 商家盈利能力强,可以适当提高提成比例,同时设定更高的保底租金。 + 中等利润率(10%-20%): + 商家有一定盈利能力,建议维持行业平均提成比例,同时保底租金设置参考营收和行业水平。 + 低利润率(<10%)或负值: + 商家经营存在困难,建议降低保底租金以减轻商家负担,提成比例适当降低或维持现状。`} +
+
+
+ 2. 当前提成比例 +
+ {`高提成(>30%): + 若商家利润率仍然较高,可以维持或小幅提高提成比例。 + 若利润率较低,则建议适当下调提成比例以减轻商家压力。 + 中等提成(20%-30%): + 若商家盈利稳定,可以适当上调至行业高区间。 + 若盈利困难,则建议维持现状或根据行业标准调整。 + 低提成(<20%): + 若商家盈利良好,可考虑提高至行业平均水平。`} +
+
+
+ 3. 业态特殊性 +
+ {`高盈利业态(如西式快餐、中餐馆): + 这些业态商业价值高,消费频次较高,建议设定较高的保底租金和提成比例。 + 低盈利业态(如其他面食、粽子等): + 这些业态盈利能力有限,建议降低保底租金,提成比例维持在低区间。 + 亏损业态: + 若业态存在战略意义(如提升服务区形象、吸引客流),建议通过降低保底租金、调整提成比例来吸引商家继续经营。 + 新兴或小众业态: + 可采用低保底租金和高提成比例的策略,以降低商家初期经营风险,同时鼓励其提高营收。`} +
+
+
+ 4. 综合考量甲方收益 +
+ 在保底租金和提成比例调整的同时,需要确保甲方的整体收益水平不下降。 +
+
+
+
+ 保底租金计算逻辑: +
+ 首先,选择项目近两个合同年中的最大对客销售额作为参考。如果本期项目销售额较高(因本期可能尚未结束),则基于本期预计全年营收进行预判,并按照行业标准提成比例进行保底租金的测算,确保商家经营的可持续性。为避免商家经营不善导致保底金额偏离实际,计算出的保底金额将与行业平均保底租金进行对比。如果行业标准较高,则显示保底租金建议的合理范围。 +
+ 保底提成比例计算逻辑: +
+ 根据行业业态的标准规则,结合服务区的车流量、商家的经营情况及行业的平均利润率,首先确定一个推荐的提成比例区间。车流量较大的服务区通常对应较高的提成比例,因此会根据车流量的大小推荐一个相应的标准提成比例。同时,通过对行业商家平均利润率的判断,如果实际利润率较高且超过了推荐的提成比例,系统将提供一个更高的提成比例范围供选择。此策略旨在通过合理的提成比例平衡甲方与商家的利益,确保项目的可持续盈利,同时促进商家的积极运营。 +
+
+
+
+ = (props) => { SortStr: "TYPE_INDEX,SERVERPARTTYPE_ID" } const data = await handleGetSERVERPARTTYPEList(req) - console.log('datadatadatadata', data); let list: any = [] if (data && data.length > 0) { data.forEach((item: any) => { @@ -554,6 +1103,8 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { /> { + + selectedOperatingModel === '委托运营' ? = (props) => { open={rentCalculateModal} onCancel={() => { setRentCalculateModal(false) + setCurrentRow(undefined) }} onOk={async () => { modalRef.current?.validateFields().then((res: any) => { @@ -607,6 +1159,19 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { handleAddUpdate(res) }) }} + footer={currentRow ? false :
+ + +
} >
= (props) => { layout={'horizontal'} labelCol={{ style: { width: 120 } }} request={async () => { - let formData: any = selectFormRef.current?.getFieldsValue({}) - if (formData) { + if (currentRow) { + handleGetServerPartList(currentRow?.SPREGIONTYPE_ID) + handleGetSERVERPARTREGION(currentRow?.SERVERPART_ID) return { - ...formData + ...currentRow, + SERVERPART_REGION: Number(currentRow?.SERVERPART_REGION) } } else { - return {} + let formData: any = selectFormRef.current?.getFieldsValue({}) + if (formData) { + return { + ...formData + } + } else { + return {} + } } }} > @@ -645,7 +1219,6 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { SortStr: "TYPE_INDEX,SERVERPARTTYPE_ID" } const data = await handleGetSERVERPARTTYPEList(req) - console.log('datadatadatadata', data); let list: any = [] if (data && data.length > 0) { data.forEach((item: any) => { @@ -690,6 +1263,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { { if (e && selectedOperatingModel === '委托运营') { @@ -731,6 +1305,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { @@ -745,6 +1320,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { { label: "观景台", value: "5000" }, { label: "休息区", value: "6000" }, ]} + readonly={currentRow} /> @@ -755,6 +1331,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { { label: "综合评分法", value: "综合评分法" }, ]} initialValue={"综合评分法"} + readonly={currentRow} /> @@ -769,6 +1346,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { { label: "加水", value: "加水" }, { label: "汽修", value: "汽修" }, ]} + readonly={currentRow} /> @@ -781,6 +1359,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { { label: "加盟", value: "加盟" }, { label: "保底收益", value: "保底收益" }, ]} + readonly={currentRow} /> @@ -789,8 +1368,11 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { name={'OPERATING_MODE'} options={[ { label: "委托运营", value: "委托运营" }, + { label: "加盟项目", value: "加盟项目" }, + { label: "保底收益", value: "保底收益" }, ]} - initialValue={"委托运营"} + initialValue={selectedOperatingModel || "委托运营"} + readonly={currentRow} /> @@ -798,23 +1380,26 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { label={'合同到期时间'} name={'CONTRACT_END_DATE'} width={'100%'} + readonly={currentRow} /> {/* 每个类型 实际需要填写计算的内容 都不一样 所以要区分了 */} { - selectedOperatingModel === '委托运营' ? + selectedOperatingModel === '委托运营' || currentRow?.OPERATING_MODE === '委托运营' ? <> 委托运营 集团公司成本价格 @@ -829,12 +1414,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } } }} + readonly={currentRow} /> 第三方评估测算年保底收益 @@ -877,6 +1464,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } } }} + readonly={currentRow} /> @@ -896,6 +1484,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } } }} + readonly={currentRow} /> @@ -906,6 +1495,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { width="100%" label={'合作期限'} name={'COOPERATION_TERM'} + readonly={currentRow} /> @@ -913,6 +1503,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { width="100%" label={'非招标启动时间'} name={'FIRSTSTART_DATE'} + readonly={currentRow} /> 首次招标 @@ -931,6 +1522,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } } }} + readonly={currentRow} /> @@ -938,6 +1530,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { label={'收益提点比例(%)'} name={'FIRST_PURCHASER_RATE'} initialValue={selectFormData?.isFirst === 1 ? 38 : 32} + readonly={currentRow} /> 二次招标 @@ -945,6 +1538,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { @@ -952,6 +1546,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { label={'收益提点比例(%)'} name={'SECOND_PURCHASER_RATE'} initialValue={32} + readonly={currentRow} /> 三次招标 @@ -959,6 +1554,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { @@ -966,12 +1562,13 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { label={'收益提点比例(%)'} name={'THIRD_PURCHASER_RATE'} initialValue={32} + readonly={currentRow} /> : - selectedOperatingModel === '加盟项目' ? + selectedOperatingModel === '加盟项目' || currentRow?.OPERATING_MODE === '加盟项目' ? <> {/* 业态定位 @@ -1012,6 +1609,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> 业态面积 @@ -1042,6 +1640,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } }} + readonly={currentRow} /> @@ -1069,6 +1668,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } }} + readonly={currentRow} /> @@ -1095,6 +1695,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> 集团公司成本价格 @@ -1122,6 +1723,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1149,6 +1751,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1175,6 +1778,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1199,6 +1803,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1224,6 +1829,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } }} + readonly={currentRow} /> @@ -1248,6 +1854,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1267,6 +1874,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> 第三方评估测算年保底收益(元) @@ -1294,6 +1902,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { modalRef.current?.setFieldsValue({ GUARANTEE_TOTAL: sum, totalGuaranteedIncomeAdd: (sum * 1.15 * rate).toFixed(2) }) } }} + readonly={currentRow} /> @@ -1319,6 +1928,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { modalRef.current?.setFieldsValue({ GUARANTEE_TOTAL: sum, totalGuaranteedIncomeAdd: (sum * 1.15 * rate).toFixed(2) }) } }} + readonly={currentRow} /> @@ -1344,6 +1954,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { modalRef.current?.setFieldsValue({ GUARANTEE_TOTAL: sum, totalGuaranteedIncomeAdd: (sum * 1.15 * rate).toFixed(2) }) } }} + readonly={currentRow} /> 保底收益 @@ -1376,6 +1987,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1395,12 +2007,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1421,12 +2035,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1434,36 +2050,42 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { @@ -1471,17 +2093,19 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { label={'非招标启动时间'} name={'FIRSTSTART_DATE'} width={'100%'} + readonly={currentRow} /> : - selectedOperatingModel === '保底收益一' ? + selectedOperatingModel === '保底收益一' || currentRow?.OPERATING_MODE === '保底收益一' ? <> 业态面积 @@ -1506,6 +2130,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1527,6 +2152,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } }} tooltip={"最小值为80"} + readonly={currentRow} /> @@ -1548,6 +2174,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } }} tooltip={"最小值为30"} + readonly={currentRow} /> @@ -1569,12 +2196,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } }} tooltip={"最小值为50"} + readonly={currentRow} /> @@ -1589,6 +2218,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> 第三方评估测算年保底收益(元) @@ -1616,6 +2246,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1642,6 +2273,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1671,6 +2303,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { modalRef.current?.setFieldsValue({ AREA_OFFER_AUTOSHOP: repairSum }) } }} + readonly={currentRow} /> 保底收益一 @@ -1695,18 +2328,21 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1725,6 +2361,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1747,6 +2384,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1764,6 +2402,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1772,30 +2411,35 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { 面积拆分物业费(元) @@ -1803,24 +2447,28 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { 测算结果 @@ -1828,12 +2476,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { @@ -1841,16 +2491,18 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { label={'首次非招标启动时间'} width={'100%'} name={'FIRSTSTART_DATE'} + readonly={currentRow} /> : - selectedOperatingModel === '保底收益二' ? + selectedOperatingModel === '保底收益二' || currentRow?.OPERATING_MODE === '保底收益二' ? <> 业态面积 @@ -1881,12 +2533,13 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { let sumObj2: any = modalRef.current?.getFieldsValue(["AREA_BUILDING_COMPREHENSIVE", "TOTAL_PROPERTY_FEE"]) - let repairPropertySum: number = Number((Number(sumObj2?.TOTAL_PROPERTY_FEE || 0) / Number(sumObj2?.AREA_BUILDING_COMPREHENSIVE || 0) * 0.1 * Number(e || 0)).toFixed(2)) + let repairPropertySum: number = sumObj2?.AREA_BUILDING_COMPREHENSIVE ? Number((Number(sumObj2?.TOTAL_PROPERTY_FEE || 0) / Number(sumObj2?.AREA_BUILDING_COMPREHENSIVE || 0) * 0.1 * Number(e || 0)).toFixed(2)) : 0 modalRef.current?.setFieldsValue({ AUTOSHOP_PROPERTY_FEE: repairPropertySum, }) } }} + readonly={currentRow} /> 原合同末年租金 @@ -1910,6 +2563,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> {/* @@ -1954,6 +2608,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -1974,6 +2629,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -2011,6 +2667,7 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { } }} + readonly={currentRow} /> @@ -2031,12 +2688,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { }) } }} + readonly={currentRow} /> @@ -2045,18 +2704,21 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { 测算结果 @@ -2068,13 +2730,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { onChange: (e: any) => { let sumObj: any = modalRef.current?.getFieldsValue(["AREA_AUTOSHOP", "AREA_BUILDING_COMPREHENSIVE"]) - let repairPropertySum: number = Number((Number(e || 0) / Number(sumObj?.AREA_BUILDING_COMPREHENSIVE || 0) * 0.1 * Number(sumObj?.AREA_AUTOSHOP || 0)).toFixed(2)) + let repairPropertySum: number = sumObj?.AREA_BUILDING_COMPREHENSIVE ? Number((Number(e || 0) / Number(sumObj?.AREA_BUILDING_COMPREHENSIVE || 0) * 0.1 * Number(sumObj?.AREA_AUTOSHOP || 0)).toFixed(2)) : 0 modalRef.current?.setFieldsValue({ AUTOSHOP_PROPERTY_FEE: repairPropertySum, }) } }} + readonly={currentRow} /> @@ -2085,25 +2748,28 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { onChange: (e: any) => { let sumObj: any = modalRef.current?.getFieldsValue(["AREA_AUTOSHOP", "TOTAL_PROPERTY_FEE"]) - let repairPropertySum: number = Number((Number(sumObj?.TOTAL_PROPERTY_FEE || 0) / Number(e || 0) * 0.1 * Number(sumObj?.AREA_AUTOSHOP || 0)).toFixed(2)) + let repairPropertySum: number = e ? Number((Number(sumObj?.TOTAL_PROPERTY_FEE || 0) / Number(e || 0) * 0.1 * Number(sumObj?.AREA_AUTOSHOP || 0)).toFixed(2)) : 0 modalRef.current?.setFieldsValue({ AUTOSHOP_PROPERTY_FEE: repairPropertySum, }) } }} + readonly={currentRow} /> @@ -2111,12 +2777,14 @@ const RentCalculation: React.FC<{ currentUser: any }> = (props) => { label={'首次招商启动时间'} width={'100%'} name={'FIRSTSTART_DATE'} + readonly={currentRow} /> : diff --git a/src/pages/RentCalculation/style.less b/src/pages/RentCalculation/style.less index 59a4dd0..1514ba8 100644 --- a/src/pages/RentCalculation/style.less +++ b/src/pages/RentCalculation/style.less @@ -31,7 +31,305 @@ } } - .rentCalculateModalContent::-webkit-scrollbar { display: none; +} + +.analysisModalBox { + .analysisModalContentBox { + width: 100%; + max-height: 700px; + overflow-y: auto; + + .serverPart { + display: flex; + //align-items: center; + justify-content: space-between; + width: 100%; + height: 70px; + border-bottom: 2px solid #EBEDF5; + margin-bottom: 16px; + + .serverPartBox { + width: 80px; + height: 60px; + border-radius: 8px; + overflow: hidden; + position: relative; + margin-right: 12px; + + .serverPartBoxBg { + width: 80px; + height: 80px; + position: absolute; + top: 0; + left: 0; + z-index: 1; + } + + .nameBox { + position: absolute; + z-index: 2; + top: 14px; + left: 10px; + display: flex; + flex-direction: column; + + .titleName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #2858CC; + line-height: 20px; + text-align: left; + font-style: normal; + } + + .labelName { + font-family: PingFangSC, PingFang SC; + font-weight: 500; + font-size: 12px; + color: #2858CC; + line-height: 12px; + text-align: left; + font-style: normal; + } + } + + .statusBox { + padding: 1px 4px; + box-sizing: border-box; + color: #fff; + font-size: 10px; + background: #2ABAC6; + border-radius: 0px 8px 0px 8px; + z-index: 2; + display: inline-block; + position: absolute; + top: 0; + right: 0; + } + } + + .serverPartDetail { + height: 60px; + display: flex; + flex-direction: column; + justify-content: space-between; + + .serverPartDetailTop { + display: flex; + align-items: center; + flex-wrap: wrap; + + .serverPartName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 20px; + color: #333333; + line-height: 28px; + text-align: left; + font-style: normal; + } + + .serverPartType { + margin-left: 8px; + background: linear-gradient(134deg, #FFEED1 0%, #FFE1CD 100%); + border-radius: 2px; + box-sizing: border-box; + color: #FFA509; + padding: 0 10px; + } + } + + .serverPartDetailBottom { + display: flex; + margin-top: 12px; + + .businessBox { + margin-right: 8px; + background: #E7F0FF; + box-sizing: border-box; + padding: 2px 8px; + border-radius: 2px; + display: flex; + align-items: center; + + .businessIcon { + width: 16px; + height: 16px; + margin-right: 4px; + } + + .businessText { + font-family: PingFangSC, PingFang SC; + font-weight: 400; + font-size: 14px; + color: #1E58BE; + line-height: 22px; + text-align: left; + font-style: normal; + margin-right: 4px; + white-space: nowrap; + } + + .businessValue { + font-family: DINAlternate, DINAlternate; + font-weight: bold; + font-size: 18px; + color: #1E58BE; + line-height: 22px; + text-align: left; + font-style: normal; + } + } + } + + .bigTitlte { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 20px; + color: #333333; + line-height: 28px; + text-align: left; + margin-bottom: 0 !important; + } + } + + .brandBox { + display: flex; + width: 250px; + flex-direction: column; + + .brandIcon { + width: 80px; + height: 80px; + } + + .brandName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #2858CC; + line-height: 20px; + text-align: left; + font-style: normal; + width: 170px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + } + } + + .operateLeft { + display: flex; + align-items: center; + margin-bottom: 6px; + + .operateIcon { + width: 24px; + height: 24px; + margin-right: 6px; + } + + .titleName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #183362; + line-height: 24px; + text-align: left; + font-style: normal; + + } + } + + .paragraph { + font-family: PingFangSC, PingFang SC; + font-size: 14px !important; + line-height: 28px !important; + + .keynote { + font-weight: 600; + color: #1890ff; + font-family: PingFangSC, PingFang SC; + } + + .beforeBluePoint { + position: relative; + } + + .beforeBluePoint::before { + content: ''; + width: 8px; + height: 8px; + border-radius: 50%; + background-color: #1890ff; + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 1rem; + } + + .titleName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #333333; + line-height: 20px; + text-align: left; + font-style: normal; + } + + .numberValue { + font-family: PingFangSC, PingFang SC; + font-weight: bold; + font-size: 14px; + color: #243F6E; + line-height: 28px; + text-align: left; + font-style: normal; + } + + .compare { + font-family: PingFangSC, PingFang SC; + font-weight: bold; + font-size: 14px; + color: #FE7628; + line-height: 28px; + text-align: left; + font-style: normal; + } + + .unit { + font-family: PingFangSC, PingFang SC; + font-weight: 400; + font-size: 14px; + color: #788395; + line-height: 22px; + text-align: left; + font-style: normal; + } + } + + .proposal { + text-indent: 2rem; + font-size: 14px !important; + line-height: 28px !important; + font-family: PingFangSC, PingFang SC; + + .keynote { + font-weight: 600; + color: #1890ff; + } + + .proposalTitle { + font-weight: 600; + color: #FE7628; + } + } + + } + } \ No newline at end of file diff --git a/src/pages/authority.ts b/src/pages/authority.ts index 3397ec9..8f78c8f 100644 --- a/src/pages/authority.ts +++ b/src/pages/authority.ts @@ -12,6 +12,7 @@ const authority: PageAuthority = { '/operationReport/securityIssueList': ['/operationReport/securityIssueList'], '/operationReport/rectificationStatus': ['/operationReport/rectificationStatus'], '/RentCalculation/index': ['/RentCalculation/index'], + '/rentComparison/index': ['/rentComparison/index'], }; diff --git a/src/pages/operationReport/index.tsx b/src/pages/operationReport/index.tsx index 8a109d9..a670e9c 100644 --- a/src/pages/operationReport/index.tsx +++ b/src/pages/operationReport/index.tsx @@ -136,8 +136,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { const handleAddUpdate = async (obj: any) => { // 用参数去判断 两个嵌套的子集 是否已经有数据了 没有的话 就提示 let list: any = [] - console.log('inspectionItemsTableDatainspectionItemsTableData', inspectionItemsTableData); - console.log('inspectionItemObjinspectionItemObjinspectionItemObj', inspectionItemObj); if (inspectionItemsTableData && inspectionItemsTableData.length > 0) { list = JSON.parse(JSON.stringify(inspectionItemsTableData)) list.forEach((item: any) => { @@ -162,9 +160,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { PATROL_TYPE: pageDataType || 1000, PATROLDETAILList: list } - console.log('reqreqreq', req); - - if (req.PATROLDETAILList && req.PATROLDETAILList.length > 0) { // 只要有一个子集就是 true @@ -188,7 +183,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { value: encryptAES(JSON.stringify(req)) } const data = await handleSynchroPATROL(newReq) - console.log('datadadsad', data); if (data.Result_Code === 100) { message.success('同步成功!') @@ -205,7 +199,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { SPRegionType_ID: id } const data = await handleGetServerpartTree(req) - console.log('dsadasda', data); if (data && data.length > 0) { let list = data[0].children setServerPartList(list) @@ -271,7 +264,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { // 拿到整改情况的录入数据 const handleGetRectificationStatusData = async (formData: any) => { - console.log('formDataformData', formData); const req: any = { ...formData, PATROL_ID: PATROLID, @@ -301,14 +293,12 @@ const OperationReport = ({ PATROLID }: DetailProps) => { SERVERPARTId: id } const data = await handleGetServerpartInfo(req) - console.log('datadatadata', data); let list: any = [] if (data.RegionInfo && data.RegionInfo.length > 0) { data.RegionInfo.forEach((item: any) => { list.push({ label: item.SERVERPART_REGIONNAME, value: item.SERVERPART_REGION }) }) } - console.log('listlistlist', list); setSERVERPARTREGION(list) } @@ -329,8 +319,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { } setSaveLoading(true) - console.log('resres', res); - handleAddUpdate(res) }) }}>保存 @@ -347,7 +335,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { // 地址栏传参 UserIdEncrypted 为当前登录用户的加密id const search = window.location.search; const addressParams = Object.fromEntries(new URLSearchParams(search).entries()); - console.log('addressParamsaddressParams', addressParams); const req: any = { UserIdEncrypted: addressParams.UserIdEncrypted } @@ -357,7 +344,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { if (addressParams.dataType) { setPageDataType(Number(addressParams.dataType)) } - console.log('PATROLIDPATROLIDPATROLIDPATROLID', PATROLID); if (PATROLID) { const req: any = { @@ -372,15 +358,12 @@ const OperationReport = ({ PATROLID }: DetailProps) => { value: encryptAES(JSON.stringify(req)) } const data = await handleGetPATROLList(newReq) - console.log('datadatadata3213', data); if (data && data.length > 0) { let detail: any = data[0] - console.log('detaildetail', detail); setCurrentRecord(detail) if (detail.PATROLDETAILList && detail.PATROLDETAILList.length > 0) { - console.log('sdada', detail.PATROLDETAILList); let list: any = detail.PATROLDETAILList setInspectionItemsTableData(list) @@ -443,7 +426,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { SortStr: "TYPE_INDEX,SERVERPARTTYPE_ID" } const data = await handleGetSERVERPARTTYPEList(req) - console.log('datadatadatadata', data); let list: any = [] if (data && data.length > 0) { data.forEach((item: any) => { @@ -458,7 +440,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { (option?.label ?? '').toLowerCase().includes(input.toLowerCase()), optionFilterProp: 'label', onChange: (value: any, option: any) => { - console.log('valuevalue', value); handleGetServerPartList(value) if (value) { formRef.current?.setFieldsValue({ SPREGIONTYPE_NAME: option.label }) @@ -492,7 +473,6 @@ const OperationReport = ({ PATROLID }: DetailProps) => { options={serverPartList} fieldProps={{ onChange: (e: any, option: any) => { - console.log('e', e); handleGetSERVERPARTREGION(e) if (e) { formRef.current?.setFieldsValue({ SERVERPART_NAME: option.label }) diff --git a/src/pages/operationReport/service.ts b/src/pages/operationReport/service.ts index e1088a9..deca2e5 100644 --- a/src/pages/operationReport/service.ts +++ b/src/pages/operationReport/service.ts @@ -1,3 +1,4 @@ +import requestCode from "@/utils/requestCode" import requestOld from "@/utils/requestOld" // 获取日常巡检表列表 @@ -159,6 +160,48 @@ export async function handlGetRENTCALCULATIONList(params: any) { } +// 拿到服务区合同列表 +export async function handlGetREGISTERCOMPACTList(params: any) { + const data = await requestOld(`/Compact/GetREGISTERCOMPACTList`, { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} + +// 根据合同获取提成比例列表 的列表 +export async function handlGetPERCENTAGEOFCOMMISSIONList(params: any) { + const data = await requestOld(`/Compact/GetPERCENTAGEOFCOMMISSIONList`, { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} + +// 获取营收和车流的 用来租金测算的基础数据 +export async function handlGetMonthAnalysis(params: any) { + const data = await requestCode(`/BigData/GetMonthAnalysis`, { + method: 'GET', + params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} + // 租金测算的列表接口 export async function handlGetDeleteRENTCALCULATION(params: any) { const data = await requestOld(`/Analysis/DeleteRENTCALCULATION`, { @@ -171,4 +214,4 @@ export async function handlGetDeleteRENTCALCULATION(params: any) { } return data -} \ No newline at end of file +} diff --git a/src/pages/redReversal/components/InvoiceDetial.tsx b/src/pages/redReversal/components/InvoiceDetial.tsx index 53ed170..78eeebc 100644 --- a/src/pages/redReversal/components/InvoiceDetial.tsx +++ b/src/pages/redReversal/components/InvoiceDetial.tsx @@ -60,6 +60,7 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow }: P align: 'left', width: 200, dataIndex: "TABLE_NAME", + ellipsis: true, render: (_, record) => { return isEdit ? { console.log('eee', e); @@ -76,9 +77,10 @@ const InvoiceDetail = ({ showDetail, setShowDetail, parentRow, setParentRow }: P }, { title:
商品条码
, - align: 'center', - width: 120, - dataIndex: "ITEM_ID" + align: 'left', + width: 150, + dataIndex: "ITEM_ID", + ellipsis: true }, { title:
规格型号
, diff --git a/src/pages/rentComparison/index.tsx b/src/pages/rentComparison/index.tsx new file mode 100644 index 0000000..8e9a3cb --- /dev/null +++ b/src/pages/rentComparison/index.tsx @@ -0,0 +1,583 @@ +import LeftSelectTree from "@/components/leftSelectTree/leftSelectTree"; +import { encryptAES } from "@/utils/handleAes"; +import { useRef, useState } from "react"; +import { connect } from "umi"; +import { handlGetMonthAnalysis, handlGetPERCENTAGEOFCOMMISSIONList, handlGetREGISTERCOMPACTList, handlGetRENTCALCULATIONList, handlGetSPCONTRIBUTIONList } from "../operationReport/service"; +import { handleGetPassportInfoById } from "../DigitalElectronics/service"; +import { ActionType, FormInstance, ProTable } from "@ant-design/pro-components"; +import moment from "moment"; +import { Modal, Tooltip } from "antd"; +import './style.less' +import operation from '../../assets/operation.png' + +const rentComparison: React.FC<{ currentUser: any }> = (props) => { + const actionRef = useRef(); + const formRef = useRef(); + // 树相关的属性和方法 + const [selectedId, setSelectedId] = useState() + const [collapsible, setCollapsible] = useState(false) + // 当前的用户信息 + const [userInfoDetail, setUserInfoDetail] = useState() + // 详情悬浮框 + const [detailModal, setDetailModal] = useState(false) + // 当前行数据 + const [currentRow, setCurrentRow] = useState() + // 表格的默认搜索条件 + const [searchParams, setSearchParams] = useState() + // 悬浮框里面 需要显示的内容的总体对象 + const [currentObj, setCurrentObj] = useState() + // 对比的 排名前五的数据 + const [top5Data, setTop5Data] = useState() + // 悬浮框在请求数据的时候的加载效果 + const [modalLoading, setModalLoading] = useState(false) + + const SERVERPART_TYPEObj: any = { + 1000: "立标杆", + 2000: "提能级", + 3000: "稳营收", + 4000: "保功能", + } + + + const columns: any = [ + { + title: "统计日期", + dataIndex: "staticDate", + hideInTable: true, + valueType: "dateRange", + initialValue: [moment().startOf('M'), moment()], + search: { + transform: (value: any) => { + return { + COMPACT_STARTDATE_End: moment().startOf('y').format('YYYY-MM-DD'), + COMPACT_ENDDATE_Start: moment().format('YYYY-MM-DD') + }; + }, + }, + fieldProps: { + picker: "day", + format: 'YYYY-MM-DD', + } + }, + { + title: "服务区名称", + dataIndex: "SERVERPART_NAME", + width: 150, + hideInSearch: true, + ellipsis: true, + align: 'center' + }, + { + title: "合同名称", + dataIndex: "COMPACT_NAME", + width: 300, + hideInSearch: true, + ellipsis: true, + align: 'center', + render: (_, record) => { + return record?.COMPACT_NAME ? + { + setModalLoading(true) + setCurrentRow(record) + setDetailModal(true) + }}>{record?.COMPACT_NAME || ""} : "" + } + }, + { + title: "合同格式", + dataIndex: "ISFORMAT", + width: 150, + hideInSearch: true, + ellipsis: true, + valueType: 'select', + valueEnum: { + 1000: "联合经营", + 2000: "委托运营管理", + 3000: "固定租金", + 4000: "业主自营", + }, + align: 'center' + }, + { + title:
合同金额(万元)
, + dataIndex: "COMPACT_AMOUNT", + width: 150, + hideInSearch: true, + ellipsis: true, + align: 'right', + valueType: 'digit' + }, + { + title:
履约保证金(万元)
, + dataIndex: "SECURITYDEPOSIT", + width: 150, + hideInSearch: true, + ellipsis: true, + align: 'right', + valueType: 'digit' + }, + { + title:
合同期限(天)
, + dataIndex: "DURATIONDAY", + width: 150, + hideInSearch: true, + ellipsis: true, + align: 'right', + valueType: 'digit' + }, + { + title: "开始时间", + dataIndex: "COMPACT_STARTDATE", + width: 150, + hideInSearch: true, + ellipsis: true, + align: 'center', + render: (_, record) => { + return record?.COMPACT_STARTDATE ? moment(record?.COMPACT_STARTDATE).format('YYYY-MM-DD') : "" + } + }, + { + title: "结束时间", + dataIndex: "COMPACT_ENDDATE", + width: 150, + hideInSearch: true, + ellipsis: true, + align: 'center', + render: (_, record) => { + return record?.COMPACT_ENDDATE ? moment(record?.COMPACT_ENDDATE).format('YYYY-MM-DD') : "" + } + }, + { + title: "甲方", + dataIndex: "FIRSTPART_NAME", + width: 250, + hideInSearch: true, + ellipsis: true, + align: 'center' + }, + { + title: "乙方", + dataIndex: "SECONDPART_NAME", + width: 250, + hideInSearch: true, + ellipsis: true, + align: 'center' + } + ] + + // 租金对比 + const handleGetRentComparison = async () => { + console.log('dsakdas', currentRow); + // 先拿到当前合同的提成比例 + const req: any = { + searchParameter: { + REGISTERCOMPACT_IDS: currentRow?.REGISTERCOMPACT_ID, + STARTDATE_End: searchParams?.COMPACT_ENDDATE_Start || "", + ENDDATE_Start: searchParams?.COMPACT_STARTDATE_End || "", + }, + PageIndex: 1, + PageSize: 999999, + } + console.log('reqreqreqreq', req); + let newReq: any = { + name: "", + value: encryptAES(JSON.stringify(req)) + } + const data = await handlGetPERCENTAGEOFCOMMISSIONList(newReq) + console.log('dakdjsakldjsa', data); + // 可能会查出来多条 我们取最新的 就是后面的那条 + // 提成比例的数据 这是取出当期的 + let commissionObj: any = {} + if (data && data.length > 0) { + commissionObj = data[data.length - 1] + } + + // 现在取出上一期的 + let previousReq: any = { + searchParameter: { + REGISTERCOMPACT_IDS: currentRow?.REGISTERCOMPACT_ID, + STARTDATE_End: moment(searchParams?.COMPACT_ENDDATE_Start).subtract(1, 'y').format('YYYY-MM-DD'), + ENDDATE_Start: moment(searchParams?.COMPACT_STARTDATE_End).subtract(1, 'y').format('YYYY-MM-DD'), + }, + PageIndex: 1, + PageSize: 999999, + } + let newPreviousReq: any = { + name: "", + value: encryptAES(JSON.stringify(previousReq)) + } + + const previousData = await handlGetPERCENTAGEOFCOMMISSIONList(newPreviousReq) + console.log('previousDatapreviousDatapreviousData', previousData); + // 拿到上一期的数据 + let commissionObjPrevious: any = {} + if (previousData && previousData.length > 0) { + commissionObjPrevious = previousData[previousData.length - 1] + } + console.log('commissionObjPreviouscommissionObjPreviouscommissionObjPrevious', commissionObjPrevious); + + // 拿到营收数据 + // 这里的时间 先写死 25年1月到8月 + const revenueReq: any = { + StatisticsDate: "2025/12/31", + StartDate: "2025/01/01", + EndDate: "2025/08/31", + Serverpart_ID: currentRow?.SERVERPART_ID + } + + + const revenueData: any = await handlGetMonthAnalysis(revenueReq) + console.log('revenueDatarevenueDatarevenueData', revenueData); + // 这是一个月一个月给的营收数据的数组 我们算全年的 就 取平均 然后 *12 + let yearRevenueSum: number = 0 + if (revenueData && revenueData.length > 0) { + // 取营收的平均值 车流当前显示的内容 不需要车流数据了 + let revenueSum: number = 0 + let revenueAvg: number = 0 + revenueData.forEach((item: any) => { + revenueSum += item.RevenueAmount + }) + revenueAvg = Number((revenueSum / revenueData.length).toFixed(2)) + yearRevenueSum = revenueAvg * 12 + } + + // 全年营收 + console.log('yearRevenueSumyearRevenueSumyearRevenueSumyearRevenueSum', yearRevenueSum); + // 提成比例的数据对象 + console.log('commissionObjcommissionObj', commissionObj); + let nowProfit: number = Number(((Number(yearRevenueSum) * Number(commissionObj.GUARANTEERATIO / 100)) / 10000).toFixed(2)) + let res: any = { + ...currentRow, + noRate: commissionObj.GUARANTEERATIO ? false : true, + max: commissionObj?.EXCESSRATIO || commissionObj?.GUARANTEERATIO || "", + min: commissionObj?.GUARANTEERATIO || "", + MINTURNOVERMin: commissionObj?.MINTURNOVER || "", + MINTURNOVERMax: commissionObj?.MINTURNOVER || "", + avg: commissionObj?.GUARANTEERATIO || "", + MINTURNOVERAvg: commissionObj?.MINTURNOVER || "", + MINTURNOVER: commissionObj?.MINTURNOVER || "", + GUARANTEERATIO: commissionObj?.GUARANTEERATIO || "", + profit: Number((yearRevenueSum / 10000).toFixed(2)), + avgThanNowRate: commissionObjPrevious.GUARANTEERATIO > commissionObj.GUARANTEERATIO, + oldRate: commissionObjPrevious.GUARANTEERATIO, + reduce: commissionObjPrevious.GUARANTEERATIO - commissionObj.GUARANTEERATIO, + nowRate: commissionObj.GUARANTEERATIO, + BUSINESS_TYPEMINTURNOVER: commissionObjPrevious.MINTURNOVER, + nowGUARANTEERATIO: commissionObjPrevious.GUARANTEERATIO, + differenceGUARANTEERATIO: commissionObj.GUARANTEERATIO - commissionObjPrevious.GUARANTEERATIO, + + MINTURNOVERAvgThanAvg: commissionObjPrevious.MINTURNOVER > commissionObj.MINTURNOVER, + addMINTURNOVER: nowProfit - commissionObj.MINTURNOVER, + addMINTURNOVERRate: commissionObjPrevious.MINTURNOVER ? (nowProfit / commissionObjPrevious.MINTURNOVER * 100).toFixed(2) : "", + nowProfit: nowProfit, + currentThanRecently: commissionObj.MINTURNOVER > commissionObjPrevious.MINTURNOVER, + recentREVENUE_AMOUNT: Number((yearRevenueSum).toFixed(2)), + nowMINTURNOVER: commissionObj.MINTURNOVER + } + + // 这里再添加判断 之前是有业态 所以知道行业提成比例 现在也没有业态 那么就拿我们之前租金测算出来的 第三次比例 当作 他的比例去计算 + if (res.noRate) { + let contributionReq: any = { + searchParameter: { + SERVERPART_IDS: currentRow?.SERVERPART_ID + }, + PageIndex: 1, + PageSize: 999999, + } + + let newContributionReq: any = { + name: "", + value: encryptAES(JSON.stringify(contributionReq)) + } + const contributionData = await handlGetSPCONTRIBUTIONList(newContributionReq) + console.log('contributionDatacontributionDatacontributionData', contributionData); + // 拿到分类定级 + if (contributionData && contributionData.length > 0) { + let SERVERPART_TYPEStr: string = contributionData[0].SERVERPART_TYPE + + + const req: any = { + searchParameter: { + SERVERPART_IDS: currentRow?.SERVERPART_ID, + SERVERPART_TYPES: SERVERPART_TYPEStr, + RENTCALCULATION_STATE: 1 + }, + PageIndex: 1, + PageSize: 999999, + SortStr: "OPERATE_DATE desc" + } + let newReq: any = { + name: "", + value: encryptAES(JSON.stringify(req)) + } + const data = await handlGetRENTCALCULATIONList(newReq) + console.log('dskadjaskldjaslkdjsal', data); + if (data && data.length > 0) { + // 建议提成比例 + let newGUARANTEERATIO: number = Number(data[0].THIRD_PURCHASER_RATE) + let nowProfit: number = Number(((Number(yearRevenueSum) * Number(newGUARANTEERATIO / 100)) / 10000).toFixed(2)) + + res = { + ...res, + avgThanNowRate: false, + nowRate: newGUARANTEERATIO, + oldRate: newGUARANTEERATIO, + MINTURNOVERAvgThanAvg: nowProfit < commissionObj?.MINTURNOVER, + nowProfit: nowProfit, + addMINTURNOVER: nowProfit - commissionObj.MINTURNOVER, + addMINTURNOVERRate: commissionObjPrevious.MINTURNOVER ? (nowProfit / commissionObjPrevious.MINTURNOVER * 100).toFixed(2) : "", + currentThanRecently: commissionObj.MINTURNOVER > commissionObjPrevious.MINTURNOVER, + recentREVENUE_AMOUNT: Number((yearRevenueSum).toFixed(2)), + nowMINTURNOVER: commissionObj.MINTURNOVER + + + + } + } + } + } + + + console.log('dklashdoashldjashkl', res); + + setCurrentObj(res) + + setModalLoading(false) + } + + const truncateDecimal = (num: number) => { + if (!num && num !== 0) { + return 0 + } + // 先用 toFixed 保留两位小数以消除精度问题 + const fixedNum = parseFloat(num.toFixed(10)); + // 将数字转换为字符串 + let strNum = fixedNum.toString(); + + // 找到小数点的位置 + const dotIndex = strNum.indexOf('.'); + + // 如果有小数点且小数点后有至少两位,则截取 + if (dotIndex !== -1) { + strNum = strNum.substring(0, dotIndex + 3); + } + + // 转换回数字类型 + return parseFloat(strNum); + } + + return ( +
+ +
+ { + // 地址栏传参 UserIdEncrypted 为当前登录用户的加密id + const search = window.location.search; + const addressParams = Object.fromEntries(new URLSearchParams(search).entries()); + const reqtoken: any = { + UserIdEncrypted: addressParams.UserIdEncrypted + } + const userInfo = await handleGetPassportInfoById(reqtoken) + setUserInfoDetail(userInfo) + if (!selectedId) { + return { data: [], success: true } + } + + const req: any = { + searchParameter: { + COMPACT_TYPE: 530001, + COMPACT_DETAILS: 1000, + SERVERPART_IDS: selectedId, + COMPACT_STARTDATE_End: params?.COMPACT_STARTDATE_End || "", + COMPACT_ENDDATE_Start: params?.COMPACT_ENDDATE_Start || "", + }, + PageIndex: 1, + PageSize: 999999, + SortStr: "MODIFYDATE desc" + } + let newReq: any = { + name: "", + value: encryptAES(JSON.stringify(req)) + } + setSearchParams(params) + const data = await handlGetREGISTERCOMPACTList(newReq) + console.log('datadatadatadata', data); + + if (data && data.length > 0) { + return { data, success: true } + } + return { data: [], success: true } + }} + toolbar={{ + actions: [ + + ] + }} + /> +
+ + + { + setCurrentRow(undefined) + setDetailModal(false) + }} + footer={false} + afterOpenChange={(open: boolean) => { + if (open) { + // 获取租金对比的数据 并计算数据 + handleGetRentComparison() + } + }} + loading={modalLoading} + > +
+
+
+
+ {currentObj?.SERVERPART_NAME} +
{SERVERPART_TYPEObj[currentObj?.SERVERPART_TYPE]}
+
+
{`${currentObj?.COMPACT_NAME || ''}`}
+
+
+ +
+ + 招商分析 +
+
通过查询云南彩云驿所有经营项目数据:
+ +
+ 大模型调用租金收益和服务区整体营收,2项核心数据指标,对各候选项目的潜在收益及服务区适应性进行综合衡量,优化即将到期得 + {currentObj?.SERVERPART_NAME} + 的 + {currentObj?.COMPACT_NAME} + 具体分析如下: +
+ +
+
+ 当前在营项目的提成比例为:{ + currentObj?.noRate ? '固定租金' : + {currentObj?.min === currentObj?.max ? + + {currentObj?.max}% + : + + {currentObj?.min}%— + {currentObj?.max}% + } + },保底租金为:{ + currentObj?.MINTURNOVERMin === currentObj?.MINTURNOVERMax ? + {currentObj?.MINTURNOVERMin} : + + {currentObj?.MINTURNOVERMin}万元— + {currentObj?.MINTURNOVERMax} + + }万元,平均提成比例:{currentObj?.noRate ? '固定租金' : {currentObj?.avg}%},平均保底租金为:{currentObj?.MINTURNOVERAvg}万元, +
+
+ {`${currentObj?.COMPACT_NAME}`}目前保底租金为{currentObj?.MINTURNOVER || ''}万/年, + { + currentObj?.noRate ? + '' : + 提成比例{currentObj?.GUARANTEERATIO || '-'}%, + } + + 累计盈利:{currentObj?.profit || ''}万元 + +
+ + +
租金提成建议
+
提成比例{ + currentObj?.avgThanNowRate ? + + + {currentObj?.nowRate || ''}% + + — + {currentObj?.avg || ''}% + { + currentObj?.BUSINESS_TYPE === 2000 ? + (原合同固定租金:{currentObj?.BUSINESS_TYPEMINTURNOVER || ''}万/年) : + (原合同提成比例{currentObj?.nowGUARANTEERATIO || ''}% + { + currentObj?.differenceGUARANTEERATIO ? + ,{currentObj?.differenceGUARANTEERATIO > 0 ? '优于' : currentObj?.differenceGUARANTEERATIO < 0 ? '下浮' : ''}{currentObj?.differenceGUARANTEERATIO || ''}% : '' + } + ) + + } + : + + + {currentObj?.nowRate || ''}% + + { + currentObj?.noRate ? + (原合同固定租金:{currentObj?.BUSINESS_TYPEMINTURNOVER || ''}万/年) : + (原合同提成比例{currentObj?.nowGUARANTEERATIO || ''}% + { + currentObj?.differenceGUARANTEERATIO ? + ,{currentObj?.differenceGUARANTEERATIO > 0 ? '优于' : currentObj?.differenceGUARANTEERATIO < 0 ? '下浮' : ''} + {currentObj?.differenceGUARANTEERATIO || ''}% + : '' + } + ) + } + + } +
+
保底租金 + { + currentObj?.MINTURNOVERAvgThanAvg ? + + {/* title={`${currentObj?.currentThanRecently ? '当前' : '上个'}合同年的对客销售总额${truncateDecimal(currentObj?.recentREVENUE_AMOUNT / 10000)}万元×${currentObj?.nowRate || ''}% = ${currentObj?.nowProfit}万元,保底租金${currentObj?.addMINTURNOVER>0?'优于':currentObj?.addMINTURNOVER<0?'下浮':''}${currentObj?.addMINTURNOVER}万/年。`} */} + 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}${currentObj?.addMINTURNOVER}万元,${currentObj?.addMINTURNOVERRate > 0 ? '提升' : currentObj?.addMINTURNOVERRate < 0 ? '降低' : ''}${Math.abs(currentObj?.addMINTURNOVERRate)}%`}> + {currentObj?.nowProfit}万元 + + — + {currentObj?.MINTURNOVERAvg}万元 + ({currentObj?.currentThanRecently ? '当前' : '上个'}合同年的对客销售总额{((currentObj?.recentREVENUE_AMOUNT / 10000).toFixed(2))}万元×{currentObj?.nowRate || ''}% = {currentObj?.nowProfit}万元,原合同保底租金{currentObj?.BUSINESS_TYPE === 2000 ? currentObj?.BUSINESS_TYPEMINTURNOVER : currentObj?.nowMINTURNOVER}万元,{currentObj?.addMINTURNOVER > 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}{currentObj?.addMINTURNOVER}万/年) + + : + + 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}${currentObj?.addMINTURNOVER}万元,${currentObj?.addMINTURNOVERRate > 0 ? '提升' : currentObj?.addMINTURNOVERRate < 0 ? '降低' : ''}${Math.abs(currentObj?.addMINTURNOVERRate)}%`}> + {currentObj?.nowProfit}万元 + + ({currentObj?.currentThanRecently ? '当前' : '上个'}合同年的对客销售总额{((currentObj?.recentREVENUE_AMOUNT / 10000).toFixed(2))}万元×{currentObj?.nowRate || ''}% = {currentObj?.nowProfit}万元,原合同保底租金{currentObj?.BUSINESS_TYPE === 2000 ? currentObj?.BUSINESS_TYPEMINTURNOVER : currentObj?.nowMINTURNOVER}万元,{currentObj?.addMINTURNOVER > 0 ? '优于' : currentObj?.addMINTURNOVER < 0 ? '下浮' : ''}{currentObj?.addMINTURNOVER}万/年) + + + } +
+
+ +
+
+
+ ) +} + +export default connect(({ user }: ConnectState) => ({ + currentUser: user.data +}))(rentComparison); \ No newline at end of file diff --git a/src/pages/rentComparison/style.less b/src/pages/rentComparison/style.less new file mode 100644 index 0000000..9f17584 --- /dev/null +++ b/src/pages/rentComparison/style.less @@ -0,0 +1,297 @@ +.rentComparisonModalBox { + .analysisModalContentBox { + width: 100%; + max-height: 700px; + overflow-y: auto; + + .serverPart { + display: flex; + //align-items: center; + justify-content: space-between; + width: 100%; + height: 70px; + border-bottom: 2px solid #EBEDF5; + margin-bottom: 16px; + + .serverPartBox { + width: 80px; + height: 60px; + border-radius: 8px; + overflow: hidden; + position: relative; + margin-right: 12px; + + .serverPartBoxBg { + width: 80px; + height: 80px; + position: absolute; + top: 0; + left: 0; + z-index: 1; + } + + .nameBox { + position: absolute; + z-index: 2; + top: 14px; + left: 10px; + display: flex; + flex-direction: column; + + .titleName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #2858CC; + line-height: 20px; + text-align: left; + font-style: normal; + } + + .labelName { + font-family: PingFangSC, PingFang SC; + font-weight: 500; + font-size: 12px; + color: #2858CC; + line-height: 12px; + text-align: left; + font-style: normal; + } + } + + .statusBox { + padding: 1px 4px; + box-sizing: border-box; + color: #fff; + font-size: 10px; + background: #2ABAC6; + border-radius: 0px 8px 0px 8px; + z-index: 2; + display: inline-block; + position: absolute; + top: 0; + right: 0; + } + } + + .serverPartDetail { + height: 60px; + display: flex; + flex-direction: column; + justify-content: space-between; + + .serverPartDetailTop { + display: flex; + align-items: center; + flex-wrap: wrap; + + .serverPartName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 20px; + color: #333333; + line-height: 28px; + text-align: left; + font-style: normal; + } + + .serverPartType { + margin-left: 8px; + background: linear-gradient(134deg, #FFEED1 0%, #FFE1CD 100%); + border-radius: 2px; + box-sizing: border-box; + color: #FFA509; + padding: 0 10px; + } + } + + .serverPartDetailBottom { + display: flex; + margin-top: 12px; + + .businessBox { + margin-right: 8px; + background: #E7F0FF; + box-sizing: border-box; + padding: 2px 8px; + border-radius: 2px; + display: flex; + align-items: center; + + .businessIcon { + width: 16px; + height: 16px; + margin-right: 4px; + } + + .businessText { + font-family: PingFangSC, PingFang SC; + font-weight: 400; + font-size: 14px; + color: #1E58BE; + line-height: 22px; + text-align: left; + font-style: normal; + margin-right: 4px; + white-space: nowrap; + } + + .businessValue { + font-family: DINAlternate, DINAlternate; + font-weight: bold; + font-size: 18px; + color: #1E58BE; + line-height: 22px; + text-align: left; + font-style: normal; + } + } + } + + .bigTitlte { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 20px; + color: #333333; + line-height: 28px; + text-align: left; + margin-bottom: 0 !important; + } + } + + .brandBox { + display: flex; + width: 250px; + flex-direction: column; + + .brandIcon { + width: 80px; + height: 80px; + } + + .brandName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #2858CC; + line-height: 20px; + text-align: left; + font-style: normal; + width: 170px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + } + } + + .operateLeft { + display: flex; + align-items: center; + margin-bottom: 6px; + + .operateIcon { + width: 24px; + height: 24px; + margin-right: 6px; + } + + .titleName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #183362; + line-height: 24px; + text-align: left; + font-style: normal; + + } + } + + .paragraph { + font-family: PingFangSC, PingFang SC; + font-size: 14px !important; + line-height: 28px !important; + + .keynote { + font-weight: 600; + color: #1890ff; + font-family: PingFangSC, PingFang SC; + } + + .beforeBluePoint { + position: relative; + } + + .beforeBluePoint::before { + content: ''; + width: 8px; + height: 8px; + border-radius: 50%; + background-color: #1890ff; + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 1rem; + } + + .titleName { + font-family: PingFangSC, PingFang SC; + font-weight: 600; + font-size: 14px; + color: #333333; + line-height: 20px; + text-align: left; + font-style: normal; + } + + .numberValue { + font-family: PingFangSC, PingFang SC; + font-weight: bold; + font-size: 14px; + color: #243F6E; + line-height: 28px; + text-align: left; + font-style: normal; + } + + .compare { + font-family: PingFangSC, PingFang SC; + font-weight: bold; + font-size: 14px; + color: #FE7628; + line-height: 28px; + text-align: left; + font-style: normal; + } + + .unit { + font-family: PingFangSC, PingFang SC; + font-weight: 400; + font-size: 14px; + color: #788395; + line-height: 22px; + text-align: left; + font-style: normal; + } + } + + .proposal { + text-indent: 2rem; + font-size: 14px !important; + line-height: 28px !important; + font-family: PingFangSC, PingFang SC; + + .keynote { + font-weight: 600; + color: #1890ff; + } + + .proposalTitle { + font-weight: 600; + color: #FE7628; + } + } + + } +} \ No newline at end of file diff --git a/src/pages/serverpartAssets/index.tsx b/src/pages/serverpartAssets/index.tsx index a92eb0f..d9dc525 100644 --- a/src/pages/serverpartAssets/index.tsx +++ b/src/pages/serverpartAssets/index.tsx @@ -109,7 +109,6 @@ const ServerpartAssets = () => { : '' : record?.level === 4 ? record?.PROPERTYASSETS_CODE ? { - console.log('record', record); setCurrentRow(record) setAssetsDrawer(true) }}> @@ -156,7 +155,6 @@ const ServerpartAssets = () => { valueType: 'treeSelect', request: async () => { const list = await getFieldEnumTree({ FieldExplainField: 'PROPERTYASSETS_TYPE', notformate: true }) - console.log('list2222', list); let obj: any = [] if (list && list.length > 0) { list.forEach((item: any) => { @@ -231,14 +229,12 @@ const ServerpartAssets = () => { record?.PROPERTYASSETS_CODE ? <> { - console.log('record', record); setCurrentRow(record) setAssetsDrawer(true) }}>编辑 { - console.log('record', record); const req: any = { Id: record?.PROPERTYASSETS_ID, OperateId: currentUser?.ID, @@ -261,7 +257,6 @@ const ServerpartAssets = () => { { record?.SHOPNAME ? { - console.log('record', record); setCurrentRow(record) setAssetsDrawer(true) }}>编辑 : '' @@ -329,7 +324,6 @@ const ServerpartAssets = () => { // 历史表格的提交 const handleSubHistoryTableData = async () => { let list: any = historyTableRef.current?.selectModalRowList - console.log('list', list); let reqList: any = [] list.forEach((item: any) => { reqList.push({ @@ -360,7 +354,6 @@ const ServerpartAssets = () => { UserIdEncrypted: id } const data = await handleGetPassportInfoById(req) - console.log('datae2e12e1', data); setCurrentUser(data) return data } @@ -380,7 +373,6 @@ const ServerpartAssets = () => { useEffect(() => { const search = window.location.search; const addressParams = Object.fromEntries(new URLSearchParams(search).entries()); - console.log('addressParamsaddressParamsaddressParams', addressParams); handleGetUserInfo(addressParams.UserIdEncrypted) handleGetServerList() }, []) @@ -472,7 +464,6 @@ const ServerpartAssets = () => { } setSearchParams(params) const data = await handleGetPROPERTYASSETSTreeList(req) - console.log('data', data); if (data && data.length > 0) { // 每层都加上level 第一层显示片区 第二层显示服务区 第三层显示方位 第四层显示资产编码 data.forEach((item: any, index: number) => { @@ -589,12 +580,9 @@ const ServerpartAssets = () => { title={'请选择门店进行关联'} onOk={() => { let shopIdList: any = relatedShopRef.current?.selectModalRowList - console.log('shopIdList', shopIdList); let shopId: any = {} if (shopIdList && shopIdList.length > 0) { shopId = shopIdList[0] - console.log('shopId', shopId); - } // 选中的整行对象 因为要回显关联的门店 setSelectShopId(shopId)