数据定价对接计算接口
Showing
3 changed files
with
140 additions
and
90 deletions
| ... | @@ -242,6 +242,15 @@ export const getPriceResult = (params) => { | ... | @@ -242,6 +242,15 @@ export const getPriceResult = (params) => { |
| 242 | }); | 242 | }); |
| 243 | }; | 243 | }; |
| 244 | 244 | ||
| 245 | // 计算数据定价 | ||
| 246 | export const calculatPrice = (params) => { | ||
| 247 | return request({ | ||
| 248 | url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/calculate-price`, | ||
| 249 | method: "post", | ||
| 250 | data: params, | ||
| 251 | }); | ||
| 252 | }; | ||
| 253 | |||
| 245 | // 删除数据定价 | 254 | // 删除数据定价 |
| 246 | export const deletePrice = (params) => { | 255 | export const deletePrice = (params) => { |
| 247 | return request({ | 256 | return request({ | ... | ... |
| ... | @@ -21,7 +21,8 @@ import { | ... | @@ -21,7 +21,8 @@ import { |
| 21 | savePrice, | 21 | savePrice, |
| 22 | getModelDemand, | 22 | getModelDemand, |
| 23 | getPriceResult, | 23 | getPriceResult, |
| 24 | exportModelScore | 24 | exportModelScore, |
| 25 | calculatPrice | ||
| 25 | } from '@/api/modules/dataPricing'; | 26 | } from '@/api/modules/dataPricing'; |
| 26 | import { changeNum } from "@/utils/common"; | 27 | import { changeNum } from "@/utils/common"; |
| 27 | 28 | ||
| ... | @@ -908,94 +909,8 @@ const calculatePrice = (pData) => { | ... | @@ -908,94 +909,8 @@ const calculatePrice = (pData) => { |
| 908 | } | 909 | } |
| 909 | }; | 910 | }; |
| 910 | 911 | ||
| 911 | // 计算结果和提交 | 912 | // 获取定价计算配置参数 |
| 912 | const checkForm = (type) => { | 913 | const getCalculateParams = (baseConfigFormObj, baseConfigFormInfo) => { |
| 913 | const baseConfigFormObj = baseConfigFormRef.value; | ||
| 914 | const baseConfigFormEl = baseConfigFormObj.ruleFormRef; | ||
| 915 | const baseConfigFormInfo = baseConfigFormObj.formInline; | ||
| 916 | baseConfigFormEl.validate((valid, errorItem) => { | ||
| 917 | if (valid) { | ||
| 918 | if (type == 'calculate') { | ||
| 919 | const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | ||
| 920 | exportData.value = resultInfo; | ||
| 921 | calculatePrice(signatoryData); | ||
| 922 | } else if (type == 'export') { | ||
| 923 | const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | ||
| 924 | exportData.value = resultInfo; | ||
| 925 | !dataTransactionPrice.value && calculatePrice(signatoryData); | ||
| 926 | loading.value = true; | ||
| 927 | let exportOut: any = {}; | ||
| 928 | // 估值对象信息 | ||
| 929 | const damName = typeMap.value.dataResourceGuid.find(f => f.damGuid == baseConfigFormInfo.dataResourceGuid)?.damName || ''; | ||
| 930 | exportOut.one = `因${baseConfigFormInfo.belongingEntityGuid}拟了解其所持有的\"${damName}\"相关数据资源的价格,为此需对该行为涉及的数据资源在不同应用场景下,基于数据资源持有单位的性质、信息化程度、数据稀缺性、需求匹配等情况下,为上述经济行为提供定价参考依据。`; | ||
| 931 | exportOut.two = `估值对象:${baseConfigFormInfo.belongingEntityGuid}持有的\"${damName}\"`; | ||
| 932 | // 估值范围信息 | ||
| 933 | const damNames = demandTableList.value.map(item => item.menuName) | ||
| 934 | let rangStr = `包含${damNames.join('、')}等${damNames.length}张表单,${damNames.length}张表共计${demandTableFieldAllNum.value}个字段`; | ||
| 935 | const dataTimeliness = pricingTargetList.value.find(p => p.dictionaryName == '时效性'); | ||
| 936 | const dataTimelinessStr = dataTimeliness ? typeMap.value[`dict_${dataTimeliness.guid}`].find(f => f.value == baseConfigFormInfo[`dict_${dataTimeliness.guid}`])?.label || '' : ''; | ||
| 937 | rangStr += dataTimelinessStr ? `,时间跨度为${dataTimelinessStr}的数据` : `的数据`; | ||
| 938 | damNames.length && (exportOut.two = `${exportOut.two}\n估值范围:${rangStr}`); | ||
| 939 | // 字典 | ||
| 940 | let dictList: any = [], hasModelScore = false; | ||
| 941 | const dictStr = exportData.value.map(e => { | ||
| 942 | // 检查是否有质量模型评分 | ||
| 943 | hasModelScore = hasModelScore || e.pricingTargetRSVOS.some( | ||
| 944 | t => t.targetType === '2' && t.functionName === '1' | ||
| 945 | ); | ||
| 946 | |||
| 947 | // 只有当维度指标数大于1时才处理明细 | ||
| 948 | if (e.pricingTargetRSVOS.length > 1) { | ||
| 949 | const targetStr = e.pricingTargetRSVOS | ||
| 950 | .map(t => `${t.targetName}为${changeNum(t.tNum, 2)}`) | ||
| 951 | .join('、'); | ||
| 952 | |||
| 953 | dictList.push(`${e.dimensionalityName}为${changeNum(e.sNum, 2)},其中${targetStr}`); | ||
| 954 | } | ||
| 955 | |||
| 956 | return `${e.dimensionalityName}为${changeNum(e.sNum, 2)}`; | ||
| 957 | }) | ||
| 958 | let dictListStr = `${dictStr.join(',')}。\n${dictList.join(';\n')}` | ||
| 959 | // 质量模型 | ||
| 960 | if (hasModelScore) { | ||
| 961 | const { largeCategoryScoreList = [], qualityScore = 0 } = qualityScoreData.value; | ||
| 962 | const qualityParts = [ | ||
| 963 | `数据的总体质量得分为${changeNum(qualityScore, 2)}` | ||
| 964 | ]; | ||
| 965 | |||
| 966 | if (largeCategoryScoreList.length) { | ||
| 967 | const categoryScores = largeCategoryScoreList.map( | ||
| 968 | q => `${q.largeCategoryName}方面得分为${changeNum(q.largeCategoryScore || 0, 2)}` | ||
| 969 | ); | ||
| 970 | qualityParts.push(`其中${categoryScores.join(',')}`); | ||
| 971 | } | ||
| 972 | |||
| 973 | dictListStr += `;\n${qualityParts.join('。')}`; | ||
| 974 | } | ||
| 975 | exportOut.three = `${baseConfigFormInfo.belongingEntityGuid}持有的"${damName}"的数据(患者人次)单价为${changeNum(dataTransactionPrice.value, 2)}元${dictListStr ? `;其中${dictListStr}` : '。'}`; | ||
| 976 | |||
| 977 | exportModelScore(exportOut).then((res: any) => { | ||
| 978 | loading.value = false; | ||
| 979 | if (res && !res.msg) { | ||
| 980 | ElMessage({ | ||
| 981 | type: "success", | ||
| 982 | message: '下载报告成功', | ||
| 983 | }); | ||
| 984 | download(res, `数据定价报告.doc`, 'word'); | ||
| 985 | } else { | ||
| 986 | res?.msg && ElMessage.error(res?.msg); | ||
| 987 | } | ||
| 988 | }).catch(() => { | ||
| 989 | loading.value = false; | ||
| 990 | ElMessage({ | ||
| 991 | type: "error", | ||
| 992 | message: '下载报告请求失败', | ||
| 993 | }); | ||
| 994 | }) | ||
| 995 | } else { | ||
| 996 | const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | ||
| 997 | exportData.value = resultInfo; | ||
| 998 | !dataTransactionPrice.value && calculatePrice(signatoryData); | ||
| 999 | const modelName = typeMap.value.modelGuid.find(d => d.guid == baseConfigFormInfo.modelGuid)?.modelName || ''; | 914 | const modelName = typeMap.value.modelGuid.find(d => d.guid == baseConfigFormInfo.modelGuid)?.modelName || ''; |
| 1000 | const dataResourceName = typeMap.value.dataResourceGuid.find(d => d.damGuid == baseConfigFormInfo.dataResourceGuid)?.damName || ''; | 915 | const dataResourceName = typeMap.value.dataResourceGuid.find(d => d.damGuid == baseConfigFormInfo.dataResourceGuid)?.damName || ''; |
| 1001 | const diseaseGuid = baseConfigFormInfo.diseaseGuid || ''; | 916 | const diseaseGuid = baseConfigFormInfo.diseaseGuid || ''; |
| ... | @@ -1028,7 +943,7 @@ const checkForm = (type) => { | ... | @@ -1028,7 +943,7 @@ const checkForm = (type) => { |
| 1028 | demandMatchingData.push({ | 943 | demandMatchingData.push({ |
| 1029 | demandTableName: item.demandTableName, | 944 | demandTableName: item.demandTableName, |
| 1030 | demandTableGuid: item.demandTableGuid || item.guid, // 需求表guid | 945 | demandTableGuid: item.demandTableGuid || item.guid, // 需求表guid |
| 1031 | dataTableGuid: item.dataTableGuid, // 数据资源表guid | 946 | dataTableGuid: item.dataTableGuid || '', // 数据资源表guid |
| 1032 | weightDemandTable: item.weightDemandTable, | 947 | weightDemandTable: item.weightDemandTable, |
| 1033 | dataFieldsNum: item.dataFieldsNum, | 948 | dataFieldsNum: item.dataFieldsNum, |
| 1034 | pricingDemandFieldRQVOS: item.dataFields.map(d => { | 949 | pricingDemandFieldRQVOS: item.dataFields.map(d => { |
| ... | @@ -1045,6 +960,131 @@ const checkForm = (type) => { | ... | @@ -1045,6 +960,131 @@ const checkForm = (type) => { |
| 1045 | }); | 960 | }); |
| 1046 | params.dataPricingDemandmatchingRQVOS = demandMatchingData; | 961 | params.dataPricingDemandmatchingRQVOS = demandMatchingData; |
| 1047 | guid && (params.guid = guid); | 962 | guid && (params.guid = guid); |
| 963 | return params; | ||
| 964 | } | ||
| 965 | |||
| 966 | // 获取定价计算结构 | ||
| 967 | const getCalculatPrice = async (params) => { | ||
| 968 | try { | ||
| 969 | const res: any = await calculatPrice(params); | ||
| 970 | loading.value = false; | ||
| 971 | if (res.code === proxy.$passCode) { | ||
| 972 | const data = res.data || {}; | ||
| 973 | console.log('getCalculatPrice', data); | ||
| 974 | return data; // 返回计算结果以便后续使用 | ||
| 975 | } else { | ||
| 976 | proxy.$ElMessage.error(res.msg); | ||
| 977 | throw new Error(res.msg); // 抛出错误以便 catch 捕获 | ||
| 978 | } | ||
| 979 | } catch (error) { | ||
| 980 | console.error('计算价格失败:', error); | ||
| 981 | loading.value = false; | ||
| 982 | throw error; // 重新抛出错误 | ||
| 983 | } | ||
| 984 | }; | ||
| 985 | |||
| 986 | // 计算结果和提交 | ||
| 987 | const checkForm = (type) => { | ||
| 988 | const baseConfigFormObj = baseConfigFormRef.value; | ||
| 989 | const baseConfigFormEl = baseConfigFormObj.ruleFormRef; | ||
| 990 | const baseConfigFormInfo = baseConfigFormObj.formInline; | ||
| 991 | baseConfigFormEl.validate(async (valid, errorItem) => { | ||
| 992 | if (valid) { | ||
| 993 | const params = getCalculateParams(baseConfigFormObj, baseConfigFormInfo); | ||
| 994 | loading.value = true; | ||
| 995 | // 先获取计算结果 | ||
| 996 | const priceData = await getCalculatPrice(params); | ||
| 997 | // 显示结果 | ||
| 998 | dataTransactionPrice.value = priceData.transactionPrice; | ||
| 999 | |||
| 1000 | if (type == 'calculate') { | ||
| 1001 | // const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | ||
| 1002 | // exportData.value = resultInfo; | ||
| 1003 | // calculatePrice(signatoryData); | ||
| 1004 | } else if (type == 'export') { | ||
| 1005 | // const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | ||
| 1006 | // exportData.value = resultInfo; | ||
| 1007 | // !dataTransactionPrice.value && calculatePrice(signatoryData); | ||
| 1008 | // loading.value = true; | ||
| 1009 | // let exportOut: any = {}; | ||
| 1010 | // // 估值对象信息 | ||
| 1011 | // const damName = typeMap.value.dataResourceGuid.find(f => f.damGuid == baseConfigFormInfo.dataResourceGuid)?.damName || ''; | ||
| 1012 | // exportOut.one = `因${baseConfigFormInfo.belongingEntityGuid}拟了解其所持有的\"${damName}\"相关数据资源的价格,为此需对该行为涉及的数据资源在不同应用场景下,基于数据资源持有单位的性质、信息化程度、数据稀缺性、需求匹配等情况下,为上述经济行为提供定价参考依据。`; | ||
| 1013 | // exportOut.two = `估值对象:${baseConfigFormInfo.belongingEntityGuid}持有的\"${damName}\"`; | ||
| 1014 | // // 估值范围信息 | ||
| 1015 | // const damNames = demandTableList.value.map(item => item.menuName) | ||
| 1016 | // let rangStr = `包含${damNames.join('、')}等${damNames.length}张表单,${damNames.length}张表共计${demandTableFieldAllNum.value}个字段`; | ||
| 1017 | // const dataTimeliness = pricingTargetList.value.find(p => p.dictionaryName == '时效性'); | ||
| 1018 | // const dataTimelinessStr = dataTimeliness ? typeMap.value[`dict_${dataTimeliness.guid}`].find(f => f.value == baseConfigFormInfo[`dict_${dataTimeliness.guid}`])?.label || '' : ''; | ||
| 1019 | // rangStr += dataTimelinessStr ? `,时间跨度为${dataTimelinessStr}的数据` : `的数据`; | ||
| 1020 | // damNames.length && (exportOut.two = `${exportOut.two}\n估值范围:${rangStr}`); | ||
| 1021 | // // 字典 | ||
| 1022 | // let dictList: any = [], hasModelScore = false; | ||
| 1023 | // const dictStr = exportData.value.map(e => { | ||
| 1024 | // // 检查是否有质量模型评分 | ||
| 1025 | // hasModelScore = hasModelScore || e.pricingTargetRSVOS.some( | ||
| 1026 | // t => t.targetType === '2' && t.functionName === '1' | ||
| 1027 | // ); | ||
| 1028 | |||
| 1029 | // // 只有当维度指标数大于1时才处理明细 | ||
| 1030 | // if (e.pricingTargetRSVOS.length > 1) { | ||
| 1031 | // const targetStr = e.pricingTargetRSVOS | ||
| 1032 | // .map(t => `${t.targetName}为${changeNum(t.tNum, 2)}`) | ||
| 1033 | // .join('、'); | ||
| 1034 | |||
| 1035 | // dictList.push(`${e.dimensionalityName}为${changeNum(e.sNum, 2)},其中${targetStr}`); | ||
| 1036 | // } | ||
| 1037 | |||
| 1038 | // return `${e.dimensionalityName}为${changeNum(e.sNum, 2)}`; | ||
| 1039 | // }) | ||
| 1040 | // let dictListStr = `${dictStr.join(',')}。\n${dictList.join(';\n')}` | ||
| 1041 | // // 质量模型 | ||
| 1042 | // if (hasModelScore) { | ||
| 1043 | // const { largeCategoryScoreList = [], qualityScore = 0 } = qualityScoreData.value; | ||
| 1044 | // const qualityParts = [ | ||
| 1045 | // `数据的总体质量得分为${changeNum(qualityScore, 2)}` | ||
| 1046 | // ]; | ||
| 1047 | |||
| 1048 | // if (largeCategoryScoreList.length) { | ||
| 1049 | // const categoryScores = largeCategoryScoreList.map( | ||
| 1050 | // q => `${q.largeCategoryName}方面得分为${changeNum(q.largeCategoryScore || 0, 2)}` | ||
| 1051 | // ); | ||
| 1052 | // qualityParts.push(`其中${categoryScores.join(',')}`); | ||
| 1053 | // } | ||
| 1054 | |||
| 1055 | // dictListStr += `;\n${qualityParts.join('。')}`; | ||
| 1056 | // } | ||
| 1057 | // exportOut.three = `${baseConfigFormInfo.belongingEntityGuid}持有的"${damName}"的数据(患者人次)单价为${changeNum(dataTransactionPrice.value, 2)}元${dictListStr ? `;其中${dictListStr}` : '。'}`; | ||
| 1058 | |||
| 1059 | loading.value = true; | ||
| 1060 | const exportOut = { | ||
| 1061 | one: priceData.one, | ||
| 1062 | two: priceData.two, | ||
| 1063 | three: priceData.three, | ||
| 1064 | } | ||
| 1065 | exportModelScore(exportOut).then((res: any) => { | ||
| 1066 | loading.value = false; | ||
| 1067 | if (res && !res.msg) { | ||
| 1068 | ElMessage({ | ||
| 1069 | type: "success", | ||
| 1070 | message: '下载报告成功', | ||
| 1071 | }); | ||
| 1072 | download(res, `数据定价报告.doc`, 'word'); | ||
| 1073 | } else { | ||
| 1074 | res?.msg && ElMessage.error(res?.msg); | ||
| 1075 | } | ||
| 1076 | }).catch(() => { | ||
| 1077 | loading.value = false; | ||
| 1078 | ElMessage({ | ||
| 1079 | type: "error", | ||
| 1080 | message: '下载报告请求失败', | ||
| 1081 | }); | ||
| 1082 | }) | ||
| 1083 | } else { | ||
| 1084 | // const { signatoryData, resultInfo } = reporting(baseConfigFormInfo); | ||
| 1085 | // exportData.value = resultInfo; | ||
| 1086 | // !dataTransactionPrice.value && calculatePrice(signatoryData); | ||
| 1087 | |||
| 1048 | loading.value = true; | 1088 | loading.value = true; |
| 1049 | savePrice(params).then((res: any) => { | 1089 | savePrice(params).then((res: any) => { |
| 1050 | loading.value = false; | 1090 | loading.value = false; | ... | ... |
| ... | @@ -1095,6 +1095,7 @@ const open = (msg, type, target) => { | ... | @@ -1095,6 +1095,7 @@ const open = (msg, type, target) => { |
| 1095 | } | 1095 | } |
| 1096 | }); | 1096 | }); |
| 1097 | }; | 1097 | }; |
| 1098 | |||
| 1098 | const drawerBtnClick = async (btn, info) => { | 1099 | const drawerBtnClick = async (btn, info) => { |
| 1099 | if (btn.value == "submit") { | 1100 | if (btn.value == "submit") { |
| 1100 | let params = { ...info }; | 1101 | let params = { ...info }; | ... | ... |
-
Please register or sign in to post a comment